Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
275 0 0
交易的构造、签名与广播
9 j( b( }/ x+ ]! E- v1 |上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
/ H9 E3 g5 x: U/ ?) [" Q, }普通交易
, Z& `+ z0 \8 f+ K, x1. 找出未花费的币(unspent output)' }$ T: L3 M# h: t' ?1 ~! b
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
* }0 t2 S) W& ?* ?执行:
2 `! d. w9 _9 F, Z& c. Nbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
5 S8 }: ^' j4 m: H8 ?# z; d3 a输出:5 W) g% Z% Q  T- u8 o8 I& T
[& s$ p/ F+ w9 B& `
    {: e; v' z3 i# {4 u  X
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
. l9 C. |1 A. R! I        "vout" : 0,
' f: k6 J! ^1 M* r% A        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",' _3 O" W# k" Q8 Z8 A
        "account" : "",
4 a$ O) u7 O& A4 w  c0 K        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",& w  I' k! l  Q0 M$ f& x
        "amount" : 0.19900000,
! h0 L& k7 |, |1 I6 O        "confirmations" : 1& e0 c4 F! E( G9 q! i+ c
    }. I* u" ?* C4 F# m# ?' p/ Z
]( m3 V: T& Q" A, T
我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。2 P, S2 ^, t5 X& Y1 H. x: P; F
2. 创建待发送交易/ ?4 [* D, k: W& D
创建待发送交易,由命令:createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...}来完成。我们将 0.1 BTC发送至 1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x ,并支付 0.0001 BTC做为矿工费。输入交易的额度为 0.199 ,输出为 0.1 + 0.0001 = 0.1001 ,那么还剩余: 0.199 - 0.1001 = 0.0989 ,将此作为找零发回给自己。
( ~  f: w: V8 w5 G# A) [执行:
& |5 J* x0 a/ i: A. Dbitcoind createrawtransaction \* Y! N6 a! E, D
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
; M$ J* j8 L6 t. j'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'" G/ `/ V5 L% v& Q9 i7 G
输出:( X- }9 S6 t- k, U; x
010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000
  L2 c+ [$ v( Y  z* w/ K通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。
9 z* T# n: `# S+ M- _2 b+ u& \执行:
) j% V+ Y! _7 t9 q: y6 abitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'5 w4 X+ U8 t5 E( z' a
输出:
7 A* y4 b( R7 X8 n& S{
4 i+ N7 W* {9 }6 c) N: {; j; O% I& ]    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
! V, o8 y1 t3 P    "version" : 1,
7 `0 G; e. H+ z: v3 t. ?- Q/ l    "locktime" : 0,
5 c4 T8 \" m7 ]5 q4 b    "vin" : [$ F$ c, {: D6 W6 a
        {
( ]0 G; T) m9 k( l7 U, w            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156"," k  Q; @2 |/ l, u
            "vout" : 0,
2 e+ ~: i5 E- q            "scriptSig" : {
% z8 u, I/ a" U                "asm" : "",
, A0 }1 w4 {5 d                "hex" : ""
# w* P: f6 }4 O6 d% a7 V! C$ }! \/ D  ?            },7 v+ o! U: c* K5 t
            "sequence" : 4294967295
- a2 `+ v( N; \. P% Z. X$ c! d        }! \' O& c+ z1 G3 x' F- g9 A( P
    ],( S7 l. M- z# X0 g0 o
    "vout" : [
* s" d0 x2 t1 Z        {# l- B3 u$ D2 o
            "value" : 0.10000000,/ \" l; O) ~7 r3 e4 i
            "n" : 0,' e, ~' L0 N0 q% i$ a
            "scriptPubKey" : {0 r" B8 F, u& ^: H4 d9 U! z+ ~$ l! ~
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",
* o+ Z  G( R# W! X; T$ e7 _                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",0 G0 ]/ o- q$ {
                "reqSigs" : 1,
9 O( z6 g* L: [3 g5 m8 z. |) T                "type" : "pubkeyhash",0 H2 n4 e0 e+ I! ?4 P- Q, S
                "addresses" : [
+ I* ?$ l" A2 _2 _6 w                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
% k' Q! Q  z/ ~                ]; ^3 x( @5 o7 M& }3 `8 V+ }- b
            }$ G& Q- N8 B/ u7 H
        },4 k7 V0 i- |: k; O2 x& k
        {
, I7 O1 r5 H2 v; s            "value" : 0.09890000,
$ l6 G. s0 K' g( }6 G7 M            "n" : 1,8 `" {; Q1 u. V
            "scriptPubKey" : {' A8 y! |( s* X) O( L- u
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
7 D9 F" n% A$ z: q. c) v                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",; g( D- n3 |/ Y4 ~0 o/ \
                "reqSigs" : 1,& K, P: l# }( i
                "type" : "pubkeyhash",0 z- t) F/ T4 s( e1 B
                "addresses" : [
& D" n! b/ T$ Y1 I                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
2 p4 z* T! E! L6 [( l                ]. N- U2 D# W: p8 t1 R
            }
( J- |, X3 F9 V8 p' R        }8 ~, E! _6 H, ]
    ]  @% C0 `: C/ I4 X+ R; m
}: i0 [! Y% A! o; x
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。5 V) I7 N& x( d, D* Q  T& `1 k* U
在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。9 u3 a( X3 f0 A2 b9 e
3. 签名
" y0 G( `1 N  Y交易签名使用命令:
, \" ^! ^7 N; J' ]: Dsignrawtransaction  \% y9 h) a/ b7 l8 K; q' L+ W0 F
[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \- C8 Y& }3 x; j
[sighashtype="ALL"]0 c" O2 K* w3 z2 O
第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;
; \0 Z. ~, f+ ^  F: j第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;4 }2 @# m6 j: [' D4 e% h
3 D% O, g; F0 p. Q
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
; w5 {" U( M% a3 d+ x0 A执行:
9 D! r! Y/ b3 t7 K. D/ ?; Abitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1
: p/ }, v/ @! m输出:
# I- A) J/ @( p1 |" o- n" z  G{4 ~, |) ~2 |$ J5 p8 W7 F
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
4 G7 [1 V9 R8 Z' X# j    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
, Q- |# y, i9 H& Z6 T, G    "version" : 1,
' ?1 G0 |! F" T& e; v    "locktime" : 0,: [5 U' c* ?9 r7 F! \3 k
    "vin" : [$ p: j4 I) b- |2 _$ Y7 c8 J
        {) i. t# d! N  B, B
            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
, ^8 d, z7 b7 H, R' p. g  G- q            "vout" : 0,
+ X# I' e/ r( T  Q            "scriptSig" : {
2 ?- t6 g. J' H4 h                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",' w+ ?1 ^9 R& p9 C& }3 X
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"
6 e4 q: d6 e' J5 D) Q% B            },6 T- n# N8 o9 R
            "sequence" : 4294967295
# Q7 k: V# T. z+ F9 \; ]6 o        }9 j& [" p2 v1 b
    ],
& s/ \- s; F. z: O    "vout" : [- B& [- \/ J2 L
        {
) x( }+ ]7 G2 g4 M8 h+ N2 I            "value" : 0.19900000,* H" c" @/ u) ~! q
            "n" : 0,
8 A: p! |. s. k% n7 h( \$ v            "scriptPubKey" : {
, U2 ^6 z( P6 G2 S3 K6 ]0 Y                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
6 }" Z% K0 M& m: r5 B- G                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
1 H2 }) P0 M2 `; E# m                "reqSigs" : 1,. n) ~) `5 z/ @2 i$ \
                "type" : "pubkeyhash",4 X# B4 g) [4 @+ l( m" q
                "addresses" : [% m6 X- Y8 G3 {6 L
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"# A7 x  i! Z. L1 `
                ]
' ?) B6 v" K$ r2 I/ H8 b            }
7 g1 v* Z4 [3 \5 g/ h- \        }8 E% m! R$ k3 e* H
    ],
# O" C3 x: E& r5 y    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
- v! x+ e- a4 s* e    "confirmations" : 19,
; G2 j: \. N* J: F    "time" : 1383235737,
+ u8 \+ [. d7 s, K; X    "blocktime" : 1383235737/ @* P# l( L; M" D/ g' K
}
8 {& N6 U  A. [& c6 Z1 mscriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
/ n+ U9 t+ v, n! P5 f$ S; b( k1 K8 ]签名使用ECDSA算法,对其,“空白交易”签名之,执行:$ i; K2 D2 ^" E
bitcoind signrawtransaction \
/ V  s6 Y. t/ q# N* R"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
4 X+ h! a6 X+ m& v) e'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
9 I( s% f$ z' ]8 b输出:
( L5 {0 G" u! V' |* T! t- ^7 J! S{
# ?9 Z! \$ o. d. X( [    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
, K) z' }" V' K, \! n    "complete" : true2 k/ Y0 v% J1 @& G& _, h0 y
}, x9 W, f) F: Z* Y* |' N
签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
. l/ Z. t9 I/ V5 f) Q/ F最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
, @/ J, Y1 V+ N4 {# y0 I2 {执行:
" \: _0 J9 o( A. e8 d) Obitcoind sendrawtransaction \6 D/ p$ r4 @! _; \; t
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"2 j3 D1 F1 c0 S% W/ w4 Y) \; {
输出:3 |+ j) F* G! R# |6 H& b  _; v5 J: c
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d/ l  [# m- N5 n/ E8 x1 N
返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。+ B. P& W. Z- |( N6 w% ?4 [& i; u& ~
合成地址交易1 u9 m  B2 _8 l5 F: ?
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:6 Y; U0 E! h8 W( [( Y6 a6 B0 j! |
m {pubkey}...{pubkey} n OP_CHECKMULTISIG1 N, j$ P( d5 Y1 ^# s* s
M和N需满足:* z6 w. K$ {* t% Y" f
1  B" a7 i4 E( V6 ]" z/ L  `
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;' D9 H: ^, U" B( q! R/ ~) v* B7 x
2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;$ o& n. W- X! I% ^+ ~& K. g& ?6 A
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;4 n0 p) H4 {/ J! s
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
9 [: t  j3 ?: i0 ^" u7 }首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
; d+ a, I( B; p, B) H! d# No.15 e' u; Q! p# p4 p. Z; G( m/ F
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
8 O2 B, v" a; y6 Z0 b+ E# No.2
  Q: `; d9 Z; ]) D04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
# \0 p/ T0 s2 ~- O& k* d+ y# No.3
. a* w/ R; {, F7 j( e/ Z048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
2 G6 E; X$ b+ \. _/ f+ q使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.
0 W4 H# o+ i' w! k5 D' ~6 W: C7 U. I3 w输入:" Z5 G& G9 I5 h: F3 y6 ^; }; n
bitcoind createmultisig 2 \
) c. M( M/ u% R- k'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'  ^" _( d- O) W
输出:
7 O* H) W' d. x0 s{
+ B: [" g: c5 o7 P5 h    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
7 l% J+ y! d0 |7 @+ t9 F    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
7 y" A, i; m/ M' l- _: z$ |}* f1 M- M: U& u5 S( ]
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。4 P5 e& l1 g; C/ X9 }
转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5