比特币交易脚本

比特币交易脚本

P2PK(Pay to Public Key)

input script:
PUSHDATA(Sig)
output script:
PUSHDATA(PubKey)
CHECKSIG

  1. 把输入脚本中的签名压入栈
  2. 把输出中的公钥压入栈
  3. 把栈顶的两个两个元素弹出来,用公钥检查签名是否正确
  4. 正确则返回 TRUE,否则交易非法

P2PKH(Pay to Public Key Hash)

input script:
PUSHDATA(Sig)
PUSHDATA(PubKey)
output script:
DUP
HASH160
PUSHDATA(PubKeyHash)
EQUALVERIFY
CHECKSIG

  1. 把签名压入栈
  2. 把公钥压入栈
  3. DUP,把栈顶的元素复制一遍压入栈
  4. HASH160,弹出栈顶值取哈希,再压回栈顶,此时栈顶为公钥的哈希值
  5. 把输出脚本中提供的哈希值压入栈
  6. EQUALVERIFY,弹出栈顶两个元素,比较是否相等,若相等,两个元素就消失
  7. 此时栈中只剩下 PubKey 和 Sig,把栈顶的两个两个元素弹出来,用公钥检查签名是否正确
  8. 正确则返回 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

第一阶段:

  1. 把输入脚本的 Sig 压入栈
  2. 取哈希,得到赎回脚本的哈希
  3. 把输出脚本里的哈希压入栈
  4. 使用 EQUAL 进行比较,相等则两个哈希消失,此时只剩下最初的 Sig

第二阶段:

  1. 把 PubKey 压入栈
  2. CHECKSIG 进行验证
  3. 验证完成返回 TRUE

用 P2SH 实现多重签名

把繁冗从输入脚本转移给输出脚本

input script:
×
PUSHDATA(Sig_1)
PUSHDATA(Sig_2)

PUSHDATA(Sig_M)
PUSHDATA(serialized RedeemScript)
output script:
HASH160
PUSHDATA(RedeemScriptHash)
EQUAL

第一阶段:

  1. 把 FALSE(即×)压入栈
  2. 把 Sig_1 和 Sig_2 两个签名压入栈
  3. 序列化的输入脚本,作为数据压入栈
  4. 序列化输入脚本的数据取哈希
  5. 把输出脚本中提供的哈希压入栈
  6. EQUAL 判断,TRUE 则两个哈希消失
    第二阶段:
  7. 把 M 压入栈
  8. 把三个公钥依次压入栈
  9. 把 N 压入栈
  10. 最后检查多重签名的正确性

Proof of Burn

output script:
RETURN
[zero or more ops or text]
其中 RETURN 的作用是 无条件地返回错误,代码运行到这里就会终止,也就没有办法执行后续内容

  • 作用:
    • 用于 销毁比特币 的一种方法
    • 保护知识产权

比特币交易脚本
http://example.com/2024/07/15/比特币交易脚本/
作者
Tsglz
发布于
2024年7月15日
许可协议