Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

解锁UTXO中的scriptPubKey

有个胖子他姓杨
166 0 0
Bitcoin使用的是UTXO模式,一笔交易得包含至少一个vin和一个vout,还没有被使用的vout称为UTXO(unspent transaction output),只要你能够解锁UTXO中的scriptPubKey,你就能消费其中的余额。所以其实转账时,并不是转账给某个地址,而是设定了使用这个币的条件。$ `  C+ `0 j. K5 v" [7 ~
script5 R1 I7 O& @2 g  ?$ Q) p) b
scriptPubKey不是简单的就是一个公钥,而是一段script代码,它决定了消费这笔钱的条件。它由bitcoin规定的script words组成。[1]前面提到的“解锁scriptPubKey”指的是“你能给scriptPubKey传入数值,使它返回的结果为true”。" m8 M+ ^2 v2 b. S" p
不同的script可以支持不同的应用场景,比如常用的P2PKH、P2SH交易,前者用于支付给个人,后者使用多重签名,需要多个人同时签名才能消费。他们的scriptPubKey分别是这样的:$ t1 L5 C! r9 B6 j% P
P2PKH: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIGP2SH: OP_HASH160  OP_EQUAL# t, C" ^7 K( _9 {" Y
2 N5 x1 h7 D) A4 g9 W
一点代码的改变,就可以创建完全不同的逻辑,决定需要满足什么条件才能消费这笔钱。这也是bitcoin script的强大之处。通过编写script,甚至可以支持侧链、闪电网络。4 G8 s/ f! T+ t
P2PKH交易+ k; D/ J, Y. Z5 X# @- q( `
P2PKH(pay to pulic key hash)是最常见的交易形式,用于支付给个人,它的script的形式是这样的:
. O: W& j. `7 i$ ]- ZscriptPubKey: OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG
, ?' K1 H3 w5 |; ?2 ^scriptSig:  ' D; r; Q: u% c, p- R
它用到的命令OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG在 https://en.bitcoin.it/wiki/Script 的对照表中都可以找到对应的意义。比如OP_HASH160表示执行两次hash运算,依次用SHA-256、RIPEMD-160算法。
7 m$ B& H; E& h) z: {. h) x1 w/ ]+ t& H' S6 H
地址
9 G; ?5 n" [" [- }0 E7 sscriptPubKey的可以看作是P2PKH交易的地址,也就是说接收转账的时候需要告诉对方的是自己的(等于RIPEMD-160(SHA-256(public key))),而不是public key本身。
9 L$ [" n2 I( c1 w+ ~$ L$ O为了迎合人的习惯,减少地址的长度,可以对地址进行Base58编码。相比Base64编码,Base58编码不使用(0, O, l, I),因为人容易搞混淆。然后还会在地址前面加上地址使用的规范的版本号,以实现向后兼容。编码后的地址是给人看的,计算机处理的时候会先解码。
& P' Q( y3 j+ j9 {2 }; H生成地址的过程[2]:
$ I* v8 [4 l6 ?+ g( W: Y0 F. X
/ E# j# D. w  q6 u6 B5 O举例
2 {. o6 N! ?0 X比如有一笔交易,Alice转出500个BTC给Bob。使用命令bitcoin-cli getrawtransaction txid 1查看交易的完整信息,它包含了交易的scriptSig, scriptPubKey。(末尾加上1,表示将返回可读形式的结果,否则得到是hex格式。), B  ^5 P$ A1 U* }
$ getrawtransaction 963e9c337a8d7277194313abd2df70646e5cc1c8d7e36ebf2acf5d8fd66e10dc 1
" P+ R  y- G) _- B3 u返回结果包括vin和vout
8 v/ a) z+ `2 Yvin
! V- a8 q9 r' W% o" h4 q" w: n) E4 Svin需要指定它UTXO的txid,和用于解锁这个UTXO的scriptSig。
3 [1 F: L# L$ }! I7 @' S  W, v"vin": [8 A5 @4 R, q' P- P" L
    {' h5 X5 U, l3 f8 A6 `
      "txid": "75ff1170e017ba20bb20a9bf2f3c7cd4390a72f1d5eb4af35cbd8851aa303fb6",
# P# [: B9 ~/ X      "vout": 1,' c/ Y+ y/ q0 A: U$ R: k5 |
      "scriptSig": {
0 n% [' o6 J8 {0 ?        "asm": "0014bd392459da24fbbd84beb55604f2e9a0d9524b1e",
! |9 A0 ?1 ^5 p% u, \3 C        "hex": "160014bd392459da24fbbd84beb55604f2e9a0d9524b1e"3 I' `' c2 ?2 S
      },2 U$ C; w7 o4 D6 o
      "txinwitness": [
6 A- U" {, s4 u& v/ n) X5 w        "3044022003b07eafbddef7e8d36b1591b39166fc01810e0490d7fbe88cb77e5cc38cf75c0220015db647488ecb83a1ab467880698ac7f32beb74c3ae3c1bab14fc0e9fade68601",
5 k/ K- B: C1 K        "022058a9a3a8e1415b7db0aca473c1df5d47634a0da44e4c25dc2a14739d189ee4"1 F9 ]0 U" c. R, ~! D' `+ }
      ],
6 x: y9 N+ |* O7 Q. c: b      "sequence": 4294967293, D1 j9 j! C9 A4 |5 ?4 ?) C( C
    }
' E$ W7 h2 D: C# I2 _# v  ],7 W% ^/ M% u6 y) X2 q
vout
! R" I: {* O3 P9 P# H: svout需要指定转账金额,和这些金额的解锁条件scriptPubKey。* I- w6 l- i/ Y( J5 C" H: i/ w' d" U6 T
"vout": [, j) w  z8 p1 f1 A: A) M
    {: T- o$ H1 |, n9 r
      "value": 500.00000000,: r, L: z$ _+ h9 u! i4 D
      "n": 0,
' b% |( B) H4 d( Q- |      "scriptPubKey": {5 P' k2 _" N$ _. {8 C
        "asm": "OP_DUP OP_HASH160 e7c1345fc8f87c68170b3aa798a956c2fe6a9eff OP_EQUALVERIFY OP_CHECKSIG",9 _) O* P; Q  `
        "hex": "76a914e7c1345fc8f87c68170b3aa798a956c2fe6a9eff88ac",* h. d' x+ i0 q* Z
        "reqSigs": 1,
' b( M5 R8 v' b8 y7 s3 ~6 u9 m        "type": "pubkeyhash",5 T) @, ^2 f* c& y6 F3 j
        "addresses": [
" O( J6 _  u! L8 v  J, A2 f          "n2eMqTT929pb1RDNuqEnxdaLau1rxy3efi"* B0 x8 I; ^6 u1 H+ Y3 @
        ]' D! ^$ ~7 n# A, l
      }# d' w3 h9 O7 F, b8 T! J( P
    },
* U3 t7 a4 P0 p& l3 l* y" `    ...* C6 v6 `4 g) X3 I. ~: J! _) z- V5 R
  ],* _- c# c  u3 w' a$ e
Alice转账500BTC给Bob后,Bob创建了新的交易,转了一些BTC给Carol。Bob的这笔转账交易的vin需要包含scriptSig,P2PKH交易的scriptSig的格式是 ,即公钥加电子签名。7 p  a3 r3 j+ F. l- W# z$ S. G* |6 r
矿工收到交易后,会对其进行验证。验证内容是:前一笔交易(Alice转账给Bob)的vout中scriptPubKey,和新交易(Bob转账给Carol)的vin中的scriptSig。1 G0 M3 H* z) h5 n4 s0 E
先将scriptSig添加到scriptPubKey前面,拼起来,得到  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG。计算前一步得到的script,如果结果为true,则通过验证。[3]+ f. m! b! @5 K) d, z5 v

, t9 b6 r$ T0 e9 Pscript的计算
9 V' }6 Z6 V6 P# `% |. H  M  OP_DUP OP_HASH160  OP_EQUALVERIFY OP_CHECKSIG
8 |3 Y8 T+ E! k' O1 Xscript从左到右一步一步,基于栈模式执行:
( I  b) D: p$ k& B+ k# s* N4 F* K4 b% y0 c
计算步骤:[3:1][4]
. `" H* J% h5 f6 y' v; r: 存入: 存入OP_DUP:复制一份添加到栈(因为最后一步OP_CHECKSIG要用到)`OP_HASH160:计算的hash:存入OP_EQUALVERIFY:比较前面两个hash是否相等,如果相等就继续执行,否则退出OP_CHECKSIG:使用检验,只有由对应的私钥创建的才能通过检验。因为只有Bob有这个私钥,所以只有他创建的才能通过检验,从而也就只有它能消费这个UTXO。: A! S8 }$ C4 [* W9 j9 h! T  n) l
8 m" {/ _5 D  L4 l$ O0 a" M2 Z! P
todo7 Q! w# ]3 {: _+ |0 m
& {8 g) d3 V+ T6 }3 }9 J
是对什么内容的签名?
, i5 l: I1 [7 H+ l P2PKH相比P2PK有什么优势吗,为什么要多加个hash环节?' p# C% f3 s+ H
P2SH(pay to script hash)的地址是script的hash,具体是怎么实现multisig的?, x& G: ^" I: X5 n
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

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

    0

  • 关注

    0

  • 主题

    10