比特币交易脚本
比特币交易脚本
P2PK(Pay to Public Key)
input script:
PUSHDATA(Sig)
output script:
PUSHDATA(PubKey)
CHECKSIG
- 把输入脚本中的签名压入栈
- 把输出中的公钥压入栈
- 把栈顶的两个两个元素弹出来,用公钥检查签名是否正确
- 正确则返回 TRUE,否则交易非法
P2PKH(Pay to Public Key Hash)
input script:
PUSHDATA(Sig)
PUSHDATA(PubKey)
output script:
DUP
HASH160
PUSHDATA(PubKeyHash)
EQUALVERIFY
CHECKSIG
- 把签名压入栈
- 把公钥压入栈
- DUP,把栈顶的元素复制一遍压入栈
- HASH160,弹出栈顶值取哈希,再压回栈顶,此时栈顶为公钥的哈希值
- 把输出脚本中提供的哈希值压入栈
- EQUALVERIFY,弹出栈顶两个元素,比较是否相等,若相等,两个元素就消失
- 此时栈中只剩下 PubKey 和 Sig,把栈顶的两个两个元素弹出来,用公钥检查签名是否正确
- 正确则返回 TRUE,否则交易非法
P2SH(Pay to Script Hash)
采用 BIP16 方案
- input script 要给出一些签名(数目不定)及一段序列化的 redeemScript(赎回脚本)
- 验证第一步:序列化的 redeemScript 是否与 output script 中的哈希匹配
- 反序列化并执行 redeemScript,验证 input script 中给出的签名是否正确
- redeemScript 的形式
- P2PK
- P2PKH
- 多重签名形式
用 P2SH 实现 P2PK
常见应用场景:对多重签名的支持
私钥泄露、私钥丢失
redeemScript:
PUSHDATA(PubKey)
CHECKSIG
input script:
PUSHDATA(Sig)
PUSHDATA(serialized redeemScript)
output script:
HASH160
PUSHDATA(redeemScriptHash)
EQUAL
第一阶段:
- 把输入脚本的 Sig 压入栈
- 取哈希,得到赎回脚本的哈希
- 把输出脚本里的哈希压入栈
- 使用 EQUAL 进行比较,相等则两个哈希消失,此时只剩下最初的 Sig
第二阶段:
- 把 PubKey 压入栈
- CHECKSIG 进行验证
- 验证完成返回 TRUE
用 P2SH 实现多重签名
把繁冗从输入脚本转移给输出脚本
input script:
×
PUSHDATA(Sig_1)
PUSHDATA(Sig_2)
…
PUSHDATA(Sig_M)
PUSHDATA(serialized RedeemScript)
output script:
HASH160
PUSHDATA(RedeemScriptHash)
EQUAL
第一阶段:
- 把 FALSE(即×)压入栈
- 把 Sig_1 和 Sig_2 两个签名压入栈
- 序列化的输入脚本,作为数据压入栈
- 序列化输入脚本的数据取哈希
- 把输出脚本中提供的哈希压入栈
- EQUAL 判断,TRUE 则两个哈希消失
第二阶段: - 把 M 压入栈
- 把三个公钥依次压入栈
- 把 N 压入栈
- 最后检查多重签名的正确性
Proof of Burn
output script:
RETURN
[zero or more ops or text]
其中 RETURN 的作用是 无条件地返回错误
,代码运行到这里就会终止,也就没有办法执行后续内容
- 作用:
- 用于 销毁比特币 的一种方法
- 保护知识产权
比特币交易脚本
http://example.com/2024/07/15/比特币交易脚本/