Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

解锁UTXO中的scriptPubKey

有个胖子他姓杨
139 0 0
Bitcoin使用的是UTXO模式,一笔交易得包含至少一个vin和一个vout,还没有被使用的vout称为UTXO(unspent transaction output),只要你能够解锁UTXO中的scriptPubKey,你就能消费其中的余额。所以其实转账时,并不是转账给某个地址,而是设定了使用这个币的条件。
9 F# R/ ]- v; f; g& |' T+ s! t% `script
1 L: N5 D% k6 i- SscriptPubKey不是简单的就是一个公钥,而是一段script代码,它决定了消费这笔钱的条件。它由bitcoin规定的script words组成。[1]前面提到的“解锁scriptPubKey”指的是“你能给scriptPubKey传入数值,使它返回的结果为true”。
* u$ o3 R' a2 Y* x  q5 Y: o不同的script可以支持不同的应用场景,比如常用的P2PKH、P2SH交易,前者用于支付给个人,后者使用多重签名,需要多个人同时签名才能消费。他们的scriptPubKey分别是这样的:
/ y3 ]* s( h$ a% zP2PKH: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIGP2SH: OP_HASH160  OP_EQUAL! ]5 M: o& \3 C9 I; e6 P( l

3 N* ^+ E; K+ w# R) `: Z( Z一点代码的改变,就可以创建完全不同的逻辑,决定需要满足什么条件才能消费这笔钱。这也是bitcoin script的强大之处。通过编写script,甚至可以支持侧链、闪电网络。
$ Z" f2 X% J" r# _* S) hP2PKH交易" b# K4 O, R6 R# V  Z0 M4 o. Y2 O" ?
P2PKH(pay to pulic key hash)是最常见的交易形式,用于支付给个人,它的script的形式是这样的:
& ~5 T4 R* B4 P, G" q; X  nscriptPubKey: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG1 E: f4 d; t7 O% d$ Y6 F
scriptSig:  - J7 _5 ?! }& ]2 ?
它用到的命令OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG在 https://en.bitcoin.it/wiki/Script 的对照表中都可以找到对应的意义。比如OP_HASH160表示执行两次hash运算,依次用SHA-256、RIPEMD-160算法。# i# p, C1 u) `1 ]

# U9 \& W4 e1 X* {0 f( c地址
: _9 u4 e/ H6 q" ~  Y2 P& Y9 |scriptPubKey的可以看作是P2PKH交易的地址,也就是说接收转账的时候需要告诉对方的是自己的(等于RIPEMD-160(SHA-256(public key))),而不是public key本身。
- ]3 n; S- }: T3 G为了迎合人的习惯,减少地址的长度,可以对地址进行Base58编码。相比Base64编码,Base58编码不使用(0, O, l, I),因为人容易搞混淆。然后还会在地址前面加上地址使用的规范的版本号,以实现向后兼容。编码后的地址是给人看的,计算机处理的时候会先解码。
8 D% ]9 @' p; n8 S生成地址的过程[2]:: [: P1 p) S6 ]
$ t$ f3 J/ R- I1 A
举例
# V+ M% b" X' }3 I3 N比如有一笔交易,Alice转出500个BTC给Bob。使用命令bitcoin-cli getrawtransaction txid 1查看交易的完整信息,它包含了交易的scriptSig, scriptPubKey。(末尾加上1,表示将返回可读形式的结果,否则得到是hex格式。)5 G: |8 d7 c8 f* \4 X
$ getrawtransaction 963e9c337a8d7277194313abd2df70646e5cc1c8d7e36ebf2acf5d8fd66e10dc 1
. z3 c/ ~" C9 Q# \# I' h返回结果包括vin和vout
4 ~+ A" f" \  @vin
" k& C5 [" j1 j+ }0 ~vin需要指定它UTXO的txid,和用于解锁这个UTXO的scriptSig。8 Z; P" X5 K- {. E2 P" i3 P) E, ]
"vin": [
( B% u6 d) h' J. q    {& d9 i8 G9 p" X4 G7 V
      "txid": "75ff1170e017ba20bb20a9bf2f3c7cd4390a72f1d5eb4af35cbd8851aa303fb6",* {5 Q" S" y2 }- `$ {
      "vout": 1,
! l1 `5 g( q+ {" Z$ ?      "scriptSig": {/ p# y4 ^6 i- g% C1 i
        "asm": "0014bd392459da24fbbd84beb55604f2e9a0d9524b1e",
0 N! q" u3 P, E2 }, {        "hex": "160014bd392459da24fbbd84beb55604f2e9a0d9524b1e"
# ^- W5 l3 i2 l! w      },
2 E* X# U, F$ {! X; N% D6 X      "txinwitness": [
* b, _- x6 ]% I: i        "3044022003b07eafbddef7e8d36b1591b39166fc01810e0490d7fbe88cb77e5cc38cf75c0220015db647488ecb83a1ab467880698ac7f32beb74c3ae3c1bab14fc0e9fade68601",
' L& B3 I% [! ^! }/ s! ?1 z  v$ C        "022058a9a3a8e1415b7db0aca473c1df5d47634a0da44e4c25dc2a14739d189ee4"" T- I5 Q: x( w' l1 o
      ],1 A! Y1 F6 q& X! U# C( W
      "sequence": 4294967293
( W% ~' p# ?; w7 r0 h: O( t; w    }
2 S  }6 L: g/ E: L3 [% U  ],2 o9 H+ L9 v- u# k5 `1 q: Y
vout
& L3 e7 I! i# d, O6 q. ovout需要指定转账金额,和这些金额的解锁条件scriptPubKey。. w6 e$ _- k* W& Z, W5 }5 l5 b
"vout": [
; \6 T8 }6 w% D2 c    {
  ~; [: I' e0 s      "value": 500.00000000,
# L) O. p5 @1 {% S6 p9 i. [8 `      "n": 0,8 \( `) @; Y- V
      "scriptPubKey": {7 {8 a" N1 k* b& \. u: F. j5 s* d
        "asm": "OP_DUP OP_HASH160 e7c1345fc8f87c68170b3aa798a956c2fe6a9eff OP_EQUALVERIFY OP_CHECKSIG",. C7 D+ D8 P! ]- Y7 a% A
        "hex": "76a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac",
  v; n, L# k+ R+ X) U2 s        "reqSigs": 1,
. l8 D* c+ m1 B0 z( `7 H        "type": "pubkeyhash",- u) p: _( b9 G9 o7 ^# z" E
        "addresses": [& J3 L. Z- Y& P+ f7 Y) e3 Z1 E
          "n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi"
6 K/ I6 H. z0 {0 f: N! W        ]2 r6 q8 H: }- W3 w0 z
      }
/ ?' T8 f) Y' u/ r+ z* w) d    },
9 r. j! A8 Y, Z3 `6 C    ...
- E  d/ y( d9 w" L) O# W  ],
' B3 n8 P* O% o7 e# s: fAlice转账500BTC给Bob后,Bob创建了新的交易,转了一些BTC给Carol。Bob的这笔转账交易的vin需要包含scriptSig,P2PKH交易的scriptSig的格式是 ,即公钥加电子签名。
1 q6 v3 n! d: [  s$ s) t矿工收到交易后,会对其进行验证。验证内容是:前一笔交易(Alice转账给Bob)的vout中scriptPubKey,和新交易(Bob转账给Carol)的vin中的scriptSig。
9 Q# ~0 n$ M' f# j* e! G# x6 G$ @+ ~先将scriptSig添加到scriptPubKey前面,拼起来,得到  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG。计算前一步得到的script,如果结果为true,则通过验证。[3]6 `3 s/ z" m7 z  M+ ]: {! V

5 c; C% q3 W! c2 q, Xscript的计算
8 X* u/ D& G7 j5 C3 I  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG1 M2 ]* E3 [' H' G/ j+ P! W6 x- _
script从左到右一步一步,基于栈模式执行:
( T8 Q: g1 G3 q2 Z$ O; D# _! h% b4 J/ t: \- ^
计算步骤:[3:1][4]
6 |) q+ }1 h. Y% I: 存入: 存入OP_DUP:复制一份添加到栈(因为最后一步OP_CHECKSIG要用到)`OP_HASH160:计算的hash:存入OP_EQUALVERIFY:比较前面两个hash是否相等,如果相等就继续执行,否则退出OP_CHECKSIG:使用检验,只有由对应的私钥创建的才能通过检验。因为只有Bob有这个私钥,所以只有他创建的才能通过检验,从而也就只有它能消费这个UTXO。
. x6 T4 b/ H! }% f; C' m7 M$ n: q7 m, h! I* X
todo- |! r" w" g, ^9 h9 g

* b: |' ?: T3 R9 X9 n# P 是对什么内容的签名?& K% Y1 @' e" G- F- P, A. @' P% n
P2PKH相比P2PK有什么优势吗,为什么要多加个hash环节?" F& w, B3 H7 T# D0 {- B
P2SH(pay to script hash)的地址是script的hash,具体是怎么实现multisig的?" o1 U' J2 u8 v  y* p% W
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

有个胖子他姓杨 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    10