Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

解锁UTXO中的scriptPubKey

有个胖子他姓杨
277 0 0
Bitcoin使用的是UTXO模式,一笔交易得包含至少一个vin和一个vout,还没有被使用的vout称为UTXO(unspent transaction output),只要你能够解锁UTXO中的scriptPubKey,你就能消费其中的余额。所以其实转账时,并不是转账给某个地址,而是设定了使用这个币的条件。
6 q* a# i& e  zscript! w7 e2 m! s+ ?$ [6 `% y* R* M
scriptPubKey不是简单的就是一个公钥,而是一段script代码,它决定了消费这笔钱的条件。它由bitcoin规定的script words组成。[1]前面提到的“解锁scriptPubKey”指的是“你能给scriptPubKey传入数值,使它返回的结果为true”。
5 o+ ]2 s* f+ M* S3 t不同的script可以支持不同的应用场景,比如常用的P2PKH、P2SH交易,前者用于支付给个人,后者使用多重签名,需要多个人同时签名才能消费。他们的scriptPubKey分别是这样的:
) z1 u" X1 B. c, u  {P2PKH: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIGP2SH: OP_HASH160  OP_EQUAL
" c8 m( `* |. O. u7 O, N3 e
* [, _; R" ~6 r5 b& k/ G
一点代码的改变,就可以创建完全不同的逻辑,决定需要满足什么条件才能消费这笔钱。这也是bitcoin script的强大之处。通过编写script,甚至可以支持侧链、闪电网络。- X+ u2 e7 R" g
P2PKH交易( H- w9 X1 H2 ]; k
P2PKH(pay to pulic key hash)是最常见的交易形式,用于支付给个人,它的script的形式是这样的:) ^+ I" U; o$ ^9 S2 c8 H6 M& i8 q
scriptPubKey: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG5 i/ r6 N' @  ^+ \
scriptSig:  
/ t2 [1 {) ]7 F9 w( ^. f它用到的命令OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG在 https://en.bitcoin.it/wiki/Script 的对照表中都可以找到对应的意义。比如OP_HASH160表示执行两次hash运算,依次用SHA-256、RIPEMD-160算法。
! W  {) K8 r  I* O" C) v
7 b* O. S3 J# A地址
1 n; K( Z6 z! g7 E3 R, ^scriptPubKey的可以看作是P2PKH交易的地址,也就是说接收转账的时候需要告诉对方的是自己的(等于RIPEMD-160(SHA-256(public key))),而不是public key本身。
! _1 y! l8 C: C3 I为了迎合人的习惯,减少地址的长度,可以对地址进行Base58编码。相比Base64编码,Base58编码不使用(0, O, l, I),因为人容易搞混淆。然后还会在地址前面加上地址使用的规范的版本号,以实现向后兼容。编码后的地址是给人看的,计算机处理的时候会先解码。1 g- D1 k1 e% B/ ?0 D
生成地址的过程[2]:
/ v( T. I7 l, g' J- a
$ y! {  K* h: C3 t举例2 y' i1 S9 |0 O+ y8 _
比如有一笔交易,Alice转出500个BTC给Bob。使用命令bitcoin-cli getrawtransaction txid 1查看交易的完整信息,它包含了交易的scriptSig, scriptPubKey。(末尾加上1,表示将返回可读形式的结果,否则得到是hex格式。)% R  |# m  t! j" M3 x3 S0 ]
$ getrawtransaction 963e9c337a8d7277194313abd2df70646e5cc1c8d7e36ebf2acf5d8fd66e10dc 1" L5 v* j: @0 s
返回结果包括vin和vout6 g5 N+ ~9 w1 s; S; Y. p/ B) G3 Q. j
vin
6 w% r. k* Y/ ^vin需要指定它UTXO的txid,和用于解锁这个UTXO的scriptSig。
" Q( z$ f0 s; P% [: ?+ ]$ D) t"vin": [$ t. k9 U0 K8 X8 Q3 z. u6 T- L4 K
    {: J( i; l+ p8 v& Y) J0 F; h( F
      "txid": "75ff1170e017ba20bb20a9bf2f3c7cd4390a72f1d5eb4af35cbd8851aa303fb6",
2 y: o2 b& U* z- i: n. m* s0 c      "vout": 1,
, L5 Z4 {( O: A( ]$ _% q$ k0 ~      "scriptSig": {3 ^9 h) f2 P, g
        "asm": "0014bd392459da24fbbd84beb55604f2e9a0d9524b1e",
" F5 h  }( y* }% D, c0 h: {* N        "hex": "160014bd392459da24fbbd84beb55604f2e9a0d9524b1e"/ x2 e7 E" M1 e0 ]
      },
" e/ j# X  w: u6 @6 Q3 v* Z3 R      "txinwitness": [
" l- y; ^* I  L6 m: q+ X6 H        "3044022003b07eafbddef7e8d36b1591b39166fc01810e0490d7fbe88cb77e5cc38cf75c0220015db647488ecb83a1ab467880698ac7f32beb74c3ae3c1bab14fc0e9fade68601",
2 V7 @+ e( Z, F+ g        "022058a9a3a8e1415b7db0aca473c1df5d47634a0da44e4c25dc2a14739d189ee4"
6 V; f+ ~# p" Q" N" |      ],
7 U" ]3 x" h: ?: f8 g      "sequence": 4294967293
2 J) q) Q6 q2 K0 l7 c    }
/ u0 \/ A, d! ~- f$ }/ R' z  ],9 ^* L0 ?4 I- C5 p
vout; ?4 O6 ^: V' L2 ?* r6 v: f
vout需要指定转账金额,和这些金额的解锁条件scriptPubKey。
5 E" T2 |1 B+ \! b3 [5 y "vout": [
, {3 H" [2 o& q9 Q; H; R    {
, Y( S+ G6 a* h; a      "value": 500.00000000,' o3 p( e, I. _, c4 g5 C! Z7 O
      "n": 0,9 @- r- f! n  q3 I! `7 a* r
      "scriptPubKey": {
) |0 s8 F* b; Q        "asm": "OP_DUP OP_HASH160 e7c1345fc8f87c68170b3aa798a956c2fe6a9eff OP_EQUALVERIFY OP_CHECKSIG",3 B  r* g7 ?: H! v8 y; V
        "hex": "76a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac",% [' t3 y! b' i& ?, \# S
        "reqSigs": 1,
2 H# j' M/ @8 [& B/ D% [        "type": "pubkeyhash",
4 _8 p, z" G: F% b) I        "addresses": [
/ m& F! T9 g# v( B/ E4 x! c; L          "n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi"( D: D9 P, J1 U3 A4 v) ?
        ]
1 O2 V/ ]7 f( ^/ u  d$ B      }" G& `9 _( |3 q! ]3 ]
    },
7 w3 `4 [% t+ F4 X  C& h    ...# N% O5 Z/ X- D
  ],
+ ?4 Q( X8 l5 k" F! }. TAlice转账500BTC给Bob后,Bob创建了新的交易,转了一些BTC给Carol。Bob的这笔转账交易的vin需要包含scriptSig,P2PKH交易的scriptSig的格式是 ,即公钥加电子签名。
1 u8 W% X6 ~8 h% K/ J% K矿工收到交易后,会对其进行验证。验证内容是:前一笔交易(Alice转账给Bob)的vout中scriptPubKey,和新交易(Bob转账给Carol)的vin中的scriptSig。
* s5 y) Q# O7 a先将scriptSig添加到scriptPubKey前面,拼起来,得到  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG。计算前一步得到的script,如果结果为true,则通过验证。[3]3 i  u1 ?/ u& }9 }4 t4 }1 e7 @: `4 _
6 Z  ]$ {- P% j! z& s; u: p3 l
script的计算4 T" `* \. S' h- \# u
  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG; d6 k0 p$ Z( I. g
script从左到右一步一步,基于栈模式执行:
( Z% B  Z& E; j% _( `6 L$ m) }) J" `! d- t) A  P3 _2 i
计算步骤:[3:1][4]8 {0 T' T/ k% ]/ E( W1 _
: 存入: 存入OP_DUP:复制一份添加到栈(因为最后一步OP_CHECKSIG要用到)`OP_HASH160:计算的hash:存入OP_EQUALVERIFY:比较前面两个hash是否相等,如果相等就继续执行,否则退出OP_CHECKSIG:使用检验,只有由对应的私钥创建的才能通过检验。因为只有Bob有这个私钥,所以只有他创建的才能通过检验,从而也就只有它能消费这个UTXO。7 n& E0 @2 T- a) N8 |! G

2 L9 Z7 r' Y' O! p$ d& y: Z2 `& ltodo
$ H( |* G/ h! y7 H, q  p2 r2 a) |: t# r( E% C8 Q& Z( W( |
是对什么内容的签名?) g. S& D! f: u  W( u3 z  h
P2PKH相比P2PK有什么优势吗,为什么要多加个hash环节?2 G' a1 i3 x$ f2 L8 }5 c# x- q' ~
P2SH(pay to script hash)的地址是script的hash,具体是怎么实现multisig的?
3 n: t- Z4 b9 M3 N
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10