GitHub
深入技术
P2MS

P2MS

P2MS - Pay to Multi Signature, 意为支付到多重签名。将 UTXO 锁定到多个公钥,需要其中一部分公钥的签名才能解锁。

锁定脚本

P2MS 锁定脚本的操作码模板:

OP_<M> <公钥1> <公钥2> ... <公钥N> OP_<N> OP_CHECKMULTISIG

  • M 表示需要多少个签名
  • N 表示锁定的公钥个数

以下是一个 P2MS 2-of-3 多重签名锁定脚本的示例:

OP_204d81fd577272bbe73308c93009eec5dc9fc319fc1ee2e7066e17220a5d47a18314578be2faea34b9f1f8ca078f8621acd4bc22897b03daa422b9bf56646b342a204ec3afff0b2b66e8152e9018fe3be3fc92b30bf886b3487a525997d00fd9da2d012dce5d5275854adc3106572a5d1e12d4211b228429f5a7b2f7ba92eb0475bb104b49b496684b02855bc32f5daefa2e2e406db4418f3b86bca5195600951c7d918cdbe5e6d3736ec2abf2dd7610995c3086976b2c0c7b4e459d10b34a316d5a5e7OP_3OP_CHECKMULTISIG

P2MS 是一个标准的多签锁定脚本, 最多支持 3 个公钥。但可以将 P2MS 包裹在 P2SH 中,则可以使用最多 15 个公钥。

解锁脚本

要解锁 P2MS 锁定脚本, 需要提供 M 个签名, 并且需要在解锁脚本前加 OP_0 :

OP_03045022100af204ef91b8dba5884df50f87219ccef22014c21dd05aa44470d4ed800b7f6e40220428fe058684db1bb2bfb6061bff67048592c574effc217f0d150daedcf367876013045022100e8547aa2c2a2761a5a28806d3ae0d1bbf0aeff782f9081dfea67b86cacb321340220771a166929469c34959daf726a2ac0c253f9aff391e58a3c7cb46d8b7e0fdc4801

脚本执行

脚本的执行过程如下:

脚本执行模拟

模拟脚本在栈中的执行过程
原始交易数据
交易输入
解锁脚本
锁定脚本
Stack

OP_CHECKMULTISIG 依次弹出以下元素:

  • 锁定脚本中的公钥个数 N
  • 锁定脚本中的所有公钥
  • 锁定脚本中的需要签名的个数 M
  • 解锁脚本的所有签名
  • 额外的值(通常是 OP_0, 用于解决 OP_CHECKMULTISIG 会多弹出一个元素的 bug)

检查 M 个签名是否有效匹配 N 个公钥中的任意 M 个。如果所有签名都有效,且数量正确,则将 OP_1 入栈。否则将 OP_0 入栈

Copyright © 2024 HeapUp