Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
185 0 0
交易的构造、签名与广播4 O% \% I. v+ h0 L2 [! R
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
* l7 q# U' d- N  y3 V0 Z' v: e0 h$ }普通交易
7 A7 r2 j* A. [: n: @/ q; A9 w1. 找出未花费的币(unspent output)
- J: `; @- F& x8 l/ j7 i) w通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
$ z' ~# v- ]) f- f执行:
- U1 Y1 ^9 m3 D$ w" Wbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
: o4 k" k0 x. @( C7 [: r# f; [2 V输出:
( Y/ l9 C3 Y0 K) |! m[3 a- E7 w. d/ O8 \1 v
    {
) O1 J0 }1 P; n; @        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",/ ]$ `% j  l  @8 [3 n
        "vout" : 0,) R" g' p- _! J& j3 ?0 x! Q
        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",6 s- B( k" Z* _% u
        "account" : "",
% c7 E. w9 |4 j' S4 ]9 `( |6 A        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",' T+ D: n4 }" a, A  ^
        "amount" : 0.19900000,
5 B, R* K( P) y" `, Z+ e        "confirmations" : 1+ P, V! u% j( K; B2 o% |. C. u9 H
    }
% V) ~5 \5 `8 s. @. W# _) F]
- ?* R& m' |6 S1 f. U! a2 U5 H. t我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。0 T6 t6 Y5 ~6 U. Z
2. 创建待发送交易) e, A6 q3 ~2 f3 k/ x" x4 d2 e
创建待发送交易,由命令: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 ,将此作为找零发回给自己。  X( Z3 @9 e8 m6 S2 q- E
执行:7 c- R% q, C. Z. W2 U& s5 c
bitcoind createrawtransaction \* H( C( t2 x4 h: N1 }+ B
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \( U9 S% l, |9 d9 A3 C) d+ n. M
'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'
0 D% \- O) L# v/ ~) m% U输出:
$ K0 m! }$ V2 v* k8 @1 S010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000
+ o( A5 P0 F* T, u7 D" E5 j3 U) t通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。+ r  A& j$ Y1 @
执行:% x" ]& l1 V0 K' _9 x" Y5 z
bitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'
; F. E8 |8 F0 j6 {3 ]. n* p输出:
# w+ G+ M3 S6 \/ M( w& Q' C- Y8 J{$ x' d- i* a1 p. l+ [) U
    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0"," Z  {( e0 U/ `: O; x7 C3 X
    "version" : 1,
6 w1 B' a6 N& A; q0 R& Q( n    "locktime" : 0,
. e$ [  Q3 y' D    "vin" : [
, H+ [' J7 L& y, \6 D. I8 k$ I        {
- R, b# G. }! w0 [2 O+ Q0 _2 w! s            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",. b7 l; A4 P' t5 u# i+ Z  c7 j
            "vout" : 0,
, {$ ~7 C/ @* |1 p2 G4 J. B            "scriptSig" : {& A* q9 N! S4 j
                "asm" : "",) v8 C, O. i0 ]5 `2 y1 x5 {
                "hex" : ""
4 T' E$ ]0 t( Q1 T' E3 y1 @/ f            },
5 b! R3 |5 ]* S. ]8 x            "sequence" : 4294967295
/ G* J- Y2 l/ ~8 Q        }
) _# E! f% B, a0 Q$ H    ],, v) @# P* t3 |4 I
    "vout" : [& j# `2 ~+ M: W
        {2 p, L9 q( U; R9 K' R
            "value" : 0.10000000,
6 O  ]. A( l  n3 a2 U8 \5 X0 T$ o* P! S% T            "n" : 0,
. R( @) X9 V3 Q: ]3 o            "scriptPubKey" : {" @% C3 f5 i2 ?
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",- w4 b  m( X% t8 ]: X7 K2 @2 x2 N; r' z
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
* R# b. g5 m+ I                "reqSigs" : 1,
/ H! B/ b6 ?- p. f5 R) [: U                "type" : "pubkeyhash",* w* p- C' Z) v# s* X6 f
                "addresses" : [
+ A* Q3 W1 N( i+ v7 d4 w                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
& k6 X/ f# @% Z" _, C                ]
/ j& B# ^5 J" C$ F4 C            }
4 L' {4 q8 M2 L        }," M# J8 U5 |4 c3 |
        {9 [  T* F: V, a% x2 T; t/ V. @
            "value" : 0.09890000,
0 b' ^( k, b- M& G            "n" : 1,
' V+ e, \' ?. [" b+ a" l            "scriptPubKey" : {
4 [1 }6 Z7 b: K. N: j( L3 g                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
6 t0 F. b% ^) t$ A- R  G0 W                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",: x$ B( @) x& S& M7 t  x* Z) }" }
                "reqSigs" : 1," b$ U4 S5 L- \# f) F
                "type" : "pubkeyhash",
7 Z6 e. X% L) ^! Q+ k# t# r! h                "addresses" : [, t+ M% o2 {) z; ]
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
. \& `9 m; B8 c- p7 M' H                ]
( m/ F' K" r# \# p- V- Q            }
- R2 s% I' ?+ a        }5 _5 x' ~( E. `4 L* M1 B9 j
    ]" m: S; f  S  k. u. w4 ^( _2 g
}8 n. ~, }- K9 @. ^5 x: w' U$ g1 S
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。) p' ^) F. V: E1 J0 w
在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。2 m* _* l3 N+ l/ @1 W; F: H7 l
3. 签名
1 n3 g2 Z1 U) w7 \8 ^; P! v* e交易签名使用命令:& x' `& m' J& `9 |5 d* t# Q- W* X
signrawtransaction  \: M: m( h: e0 v% D) ^
[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \
( E2 A  K8 S+ e[sighashtype="ALL"], S3 D7 o  t! t* \9 u; W
第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;& O2 G& o5 g7 S5 }
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;3 p8 P; \! P: q! O" J2 x' `+ _
- O( G9 t- S/ F' f* v5 x  d' w
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。- s- S2 t& j( N) _, }
执行:6 y" ?6 t  J  @! {5 E' V& Q% w
bitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1
/ ^5 a1 @/ l$ S& P输出:
$ H7 b2 q/ U" k! z8 S. v{
5 ~7 v, r2 h$ k- k" s7 \3 ?; w    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",7 U$ h2 p  R8 l& z4 `
    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
5 \- w1 A/ L4 q+ H* G5 ?    "version" : 1,. c# W. F! z" L4 C- R; F
    "locktime" : 0,* J9 K9 o- ^# @8 u, J. O. a
    "vin" : [
8 z% u' I, }, G# C$ s- i- x        {
9 d  h1 M( E) k8 Y& v  a            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
; v8 h4 ?7 z, b; L5 z            "vout" : 0,
5 S. l' q! B" L. z            "scriptSig" : {& k/ v  Y" @1 z0 R2 h/ E: |% Y
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",7 Z5 T; ^$ h! {  L/ v: I
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"& |" e, a8 h! I3 B
            },
: w1 Q8 W1 ^, V- }" X+ L  _% x            "sequence" : 4294967295
% y% F/ R0 W' P4 R# v        }! K3 l, _" }# `" I7 t2 _# z+ N; p
    ],/ j4 O& m* U& B: p
    "vout" : [" h: r3 B& A# D$ _
        {
) V# l, G* A1 L( S, S& z0 N* ^; L            "value" : 0.19900000,
8 H0 r9 f+ t9 I9 r* l( e7 D            "n" : 0,
: [, P2 m  N% E$ [' G' v            "scriptPubKey" : {
# X8 C8 `0 N' ~. n* ?; ]                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
( [$ X4 E; c5 _/ a                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
9 [1 T+ [' B3 ~* O                "reqSigs" : 1,6 ?: J3 g) X# f) D& ~" Q# q- ?
                "type" : "pubkeyhash",
' e4 P( d1 T' E                "addresses" : [- G4 d8 C" V% R  ]; S& O6 v8 v9 B# U
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"& G, B! D  [0 ~8 U, N0 @) j% r' c
                ]* b. F/ e  _3 Z9 n( H
            }
, t3 B6 S8 j& R1 H( k: j        }3 _; K- Q0 }  R! t$ g6 R) v6 T3 E, L8 z
    ],
8 a$ r% c  ?! I7 R; ^$ g    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",; F  a) a/ Z( T$ S
    "confirmations" : 19,
+ l" q$ e0 C+ t* W5 b- w    "time" : 1383235737,
% J) k  Q7 b( i; N- E" ~5 F# v  H    "blocktime" : 1383235737
( o( U: q( I; d4 ^9 H% j5 g}# r+ i# \9 D% j( C
scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
- P) H$ c- k  `签名使用ECDSA算法,对其,“空白交易”签名之,执行:
% E* c$ }! A: {bitcoind signrawtransaction \5 \1 L0 ]5 P9 f6 g  X& c
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \' g4 ?  o7 L' p$ r6 F% F
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
( V+ _/ G5 I+ `* z, u' F. k输出:! A3 R# N1 I; g$ S' @# R
{
- ^  F' A. g. l4 t" h' o    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
4 z2 W  c& k+ q4 ^, [    "complete" : true* U3 T! J) N+ q" W2 @8 o
}1 |& ]& S5 s2 c* |3 A
签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
+ S) D6 P% e! A最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
; J1 [1 V4 K' U9 E7 H执行:; ^' m1 @+ H" r$ Q$ f5 R
bitcoind sendrawtransaction \( E/ v2 q4 o# T, u9 |3 H
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
, p' }8 ]" a! U: }2 f; E输出:$ b' t' f: d* ~* `
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
6 B% K/ x- U' X  T返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。0 n/ c1 P$ L2 f6 H8 e5 \9 c
合成地址交易
% ^* P% f  D/ ~, \合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:* G  W$ ]0 E5 l' ^: L
m {pubkey}...{pubkey} n OP_CHECKMULTISIG4 N$ E& H" B0 h
M和N需满足:, ?. Y: u8 H/ \- L6 J
1% M3 I7 S+ ]4 Q
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
4 I% ?2 J/ T% f6 s2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;, A& {+ ~! Z6 l1 k
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;
2 M- M0 n# e6 D; @) t  q  q合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.! P  X& K7 m  m# \' g
首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
7 {9 ~2 a6 L: y6 G) E# No.1; T: o+ ?7 L  r3 b
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
. b: B; M' k/ R1 V" `+ A# No.2 6 @$ b* D% P' Z/ I5 q7 I: h  D
04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
+ A0 `, S( _( p+ ~! F8 L# No.31 h3 p8 i: i1 V8 g# `4 U$ }. K
048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw5 T6 G* O4 ~7 t7 @1 b
使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.2 r0 ^/ S4 J" z6 j" h
输入:7 W( y3 {; r7 Y
bitcoind createmultisig 2 \; o7 g& K* a2 ]0 J
'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'9 ?& Z7 e. B0 _: N, @3 V& ~! Z9 g
输出:6 |, \) V6 s" B% d1 M# n, ~4 @
{
: {7 W5 i8 T9 G! G' T+ Y8 u    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",( S8 A$ I5 U0 [
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae") C9 I/ B/ r) o+ e- l
}6 r' k, H$ [6 x, {6 @+ S
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
. c, |( Y0 O- J4 Z转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5