Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
186 0 0
交易的构造、签名与广播
! J% X. U8 I" X) D+ u6 g6 ^  F* x上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。3 P% L( O: Z4 R" i
普通交易" F3 D5 i8 h  W$ {# T" t7 i  B
1. 找出未花费的币(unspent output)
, E/ w) c; ?0 d6 e% e) W通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
' A* f; w7 z) R) h! N执行:
- W# [0 h- T/ K' F5 Pbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'2 Z" R9 [2 i, b' ^4 W% m
输出:
  i  I3 l: a& r" S2 @0 q9 c% c[
- U  W% `( A: n; h0 M    {
/ ^* n6 C: h! b" |# X! h/ e* ]        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
+ M1 |2 q5 n2 W: D4 p$ z, s        "vout" : 0,' K& ]7 U6 j0 N2 _' Q& ^/ N" d
        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",3 Q9 k* u* s/ _1 R7 s
        "account" : "",- e) V3 o% j% U, J) x* A
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
' |/ j2 m2 S8 y% R2 c$ E% h+ h        "amount" : 0.19900000,
7 W6 Y) a; R) M2 V# {, y! N6 D8 G1 I9 W        "confirmations" : 16 g1 ~" O9 Z$ I1 y. X- ]2 H( A0 o
    }
  d; l8 {  J% ~+ C: F4 j]/ U& E$ G( m. w: O9 P( M
我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
. Q6 s+ X4 B5 P2 z" h, X2. 创建待发送交易
8 r: _3 p. K, y: q' g; _创建待发送交易,由命令: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 ,将此作为找零发回给自己。
3 q/ y# x% c  ?* g$ g执行:" @; i+ A6 o$ l) a: o
bitcoind createrawtransaction \: @2 ^6 b& \$ U/ F' Z& y
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
9 `8 X/ ]4 w+ @, A% [7 T+ o'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'- B+ e0 A8 P- G* d, i  `( c2 x  l
输出:
! j% }+ K7 e* n010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" h3 u$ u, @& {
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。
6 B( Y2 k0 p# w7 L5 e' A' w执行:
  Z( F2 O  m3 B$ J- dbitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'8 b( D: i% ~* c- _9 x) }
输出:7 i: v' Q$ ]# W" e+ h- d' t! D( J
{, z. D* e6 T% n" u$ R& @8 u. B: _
    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
9 M+ B4 j2 a/ X$ }! E$ f: q$ u3 b    "version" : 1,, z$ R, P3 h: U5 X
    "locktime" : 0,9 B% M% g7 U' L# S7 z, x/ P$ s  }9 j
    "vin" : [+ g& u8 [+ C( i5 ]0 \: {8 W( O: c
        {' |  A9 K2 I$ p7 a. L. w
            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",9 j5 U" c9 J% }; `; V% t9 O
            "vout" : 0,
1 D2 O, l2 `" i7 m            "scriptSig" : {6 J) ~9 J% H. }7 j
                "asm" : "",8 d, y% w- `1 ?0 N' W' f* Y7 d
                "hex" : ""$ o7 t8 P2 w# }
            },
. s4 Y, H! a, N+ ?6 n1 x2 M  e            "sequence" : 4294967295
- N7 ]7 \: V( y  A/ n6 [        }- R# x- h: Q3 H7 B. j( g
    ],' y3 I6 T7 r' w) b: n5 }( \
    "vout" : [+ P) ?% w8 ~/ R3 |
        {# }( V- ]( v) }
            "value" : 0.10000000,1 z8 O$ `( v% X5 x; N
            "n" : 0,5 V: K! B( |# T8 y6 L" X5 p& m  b
            "scriptPubKey" : {% y0 Z3 S0 \2 w/ A
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",$ J% C; J4 ?* g& l# f' M+ v$ P
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",! T: e4 h8 W9 r: Y$ _
                "reqSigs" : 1,
2 j9 L8 E. G: b+ G5 f                "type" : "pubkeyhash",; y) h+ K2 e# U
                "addresses" : [
0 z$ v  w& x/ e                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"- W  r' v3 P/ W$ w9 A4 B5 U
                ]
7 L& V( J2 W! C1 O$ v* e            }
( n3 y$ \& J3 L        },
( @) h& M/ Z' o; R% q6 q' V        {
  J1 s& D1 `: a' f/ b, S1 z5 R            "value" : 0.09890000,9 {$ M& j* B. s+ I% m5 w( Q! p% q- d
            "n" : 1,* u' N4 i3 w0 U; m% J2 C
            "scriptPubKey" : {1 V6 ~3 {' N3 T- d9 m
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",8 \1 h% N: w/ d2 j. U
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"," w" s: v1 A3 C( [- V5 B
                "reqSigs" : 1,! t+ T" i. C6 C
                "type" : "pubkeyhash",9 [& L  v! w$ Y* h. \
                "addresses" : [( F$ J2 s+ W  u% q6 [" X; J* x9 N
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"# I+ O( M; K0 A2 Q3 Z% F+ D
                ]* Q- a9 C% I, [8 W6 J
            }
& M5 s/ w, {7 ]        }
% `' y/ N7 Z5 N4 o' U* K    ]
; ^/ i' _" i1 q; }; M5 @}
% `8 s7 `' ~$ d& K! O7 n至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。6 W8 A- H" [' _" @2 Y( U
在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。* R- V; z' w) u/ B. N& i9 r, v
3. 签名9 h: I% N2 j6 h7 ]8 {; s0 B
交易签名使用命令:
8 k1 V* u/ h, e; |1 ?7 N. n" Asignrawtransaction  \
6 j  \2 x" [# m% G: _& l. l$ {[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \4 o0 I4 n3 D# i3 `6 R4 U9 ~
[sighashtype="ALL"]
' s6 ?# C" `0 W; x4 |- m第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;8 c  @5 A( ^2 l9 T3 N' E- N
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;; q; w. N! n) p% }* H# s5 _. W5 q
2 y8 Q1 D( X! C* x
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
8 ~) {7 k$ L" B$ W5 O& E执行:
  w& \$ W: |& p. x. Kbitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1
. Q, e- x$ j1 H  P0 t5 M+ V9 W输出:
! b6 Q4 G/ a: m{- d4 ^& C3 a3 U4 H& M
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
! e9 L3 ~( n$ Z" `' p' U- \6 u- D    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",3 k! T5 _, `$ D7 x
    "version" : 1,; P% o2 t7 `1 i& a! ]" @
    "locktime" : 0,8 g* L* p! l; Y* ?
    "vin" : [2 B2 u1 |  x$ J0 @' G- _
        {
  Q" {3 h0 x& [8 F2 l            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
0 I. A7 p  H% A; A$ v- s# V( @' w: [3 D            "vout" : 0,5 P  n* J1 ~- i1 l$ Y4 E
            "scriptSig" : {
* D5 F' G' H5 _; u& D                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",! R' E9 Y3 _0 @" D  @% M
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4", |0 C) e2 X& {- d0 s
            },
* k6 N" N0 O) w! V- U0 n% C( K            "sequence" : 4294967295
7 x3 e- H% r2 t9 X        }6 t; n4 M# V; T) |8 e& w
    ],: Q  u9 A# s1 S9 r% g
    "vout" : [3 n2 b5 M! V, O/ H0 f) U% ~- f/ ~, u
        {
4 S2 M0 D# w7 c- ?# r0 ^, z# e            "value" : 0.19900000,
. L6 G; g. j2 ]  K5 b& w% q            "n" : 0,
( G8 [- }% [2 F# d2 k8 x            "scriptPubKey" : {8 v5 N$ F' j# b4 p2 N
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
* N9 y, C  S2 c" I3 [2 @0 ]                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
; \) ^) _# P" B% T2 z  I, F                "reqSigs" : 1,
( W1 p3 l/ H# Y& r                "type" : "pubkeyhash",) I, `/ t! K0 X5 [% G
                "addresses" : [; v3 m7 r9 o, m) o% u8 ?7 a
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"3 p$ z5 I" `6 d* \; C3 Y
                ]
1 A% h7 i- i. j- T' |            }8 q+ u. ]7 Y" v, t
        }+ Z- Z$ G+ K4 p8 f2 O
    ],, v0 d$ H4 U& G/ j- r
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",/ I! o1 Q6 c! @/ ~7 n
    "confirmations" : 19,8 b* o. y# r7 ?
    "time" : 1383235737,
. e: T: e8 r, _( _  u% j5 L8 U    "blocktime" : 1383235737+ `+ y, B: V1 C
}4 [1 y# ^8 `7 [% I$ z% ]
scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。* D; v" m+ ?/ v' ^: n' P9 U/ Q
签名使用ECDSA算法,对其,“空白交易”签名之,执行:, }# n: j" ^- @, S0 w
bitcoind signrawtransaction \4 k/ L7 N1 ]  y+ L6 a
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
4 }+ P' ]% j  {5 C3 U2 d'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
. Z6 x/ N, X! w, f输出:
- Q. L1 y4 ?0 o; }# T' x{" t3 |# w, c; |7 V& ]
    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
' u4 Z. U; \. C# k, C    "complete" : true2 g$ A/ d8 H8 b2 H) {% K2 _/ z0 y
}
, B& a$ k, c( e* x3 r5 M% b签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
& j& d, x" e+ Z0 r! |) |最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。% L) K* \5 _. K7 U4 e
执行:% Y/ z9 ~# b0 ]  \
bitcoind sendrawtransaction \
  P! r8 Y1 j# f2 o5 i"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"( f& g6 r2 K# v
输出:
$ m+ p& P: Y; k% Q) p2 Db5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
% T5 D7 m- a, A: s3 Z返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。! I1 Z6 C# D3 P8 [
合成地址交易
4 J- w; X1 }9 C1 z5 O1 T$ n7 R4 w合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:1 O" P" g. y' X/ q6 D- R! y# I/ X
m {pubkey}...{pubkey} n OP_CHECKMULTISIG
% A: J# Y) A& K% H3 _M和N需满足:& K- D$ Y# `5 K* i7 q& X- ?
1
4 v2 Q& W- n7 t6 a" s6 a4 ?1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
2 t. W5 i  J/ K$ s9 z9 y4 K; @2 D2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
" W7 I6 c1 r1 g3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;
  E0 H# |+ \" w9 d合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.& o" i2 Z: r' Q5 T  K) B
首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
: z: k: v" C1 W" [1 {. v# No.1! W8 j! r1 n0 R" Q
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
3 j  F! ~/ x. H0 T! B4 J# No.2
* A( ]" w* z% b1 N: j( [; L6 x: r0 \# ^04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
  ?- o% X( z! n( ]8 |# No.3( C, @' B, D% T% ^/ X8 N) k
048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
  w5 W7 o0 z4 p; `0 z0 B使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.5 X* r6 \: T9 V6 Y
输入:4 s) b  m- j1 o5 r& p8 \& m8 P5 @5 c
bitcoind createmultisig 2 \
" `# t2 E! p- D; A6 B'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'
# M; J, j' V. `4 }  q; Y. a输出:
! C& o0 G- P. q8 @8 d$ y{0 V- P$ X2 a8 c
    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",# m" r4 d4 J; @' a( k
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
2 K: b. k7 L1 d: x3 ^1 }}! {, J% |& I- p4 f& |" p
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。1 n1 S( U, A$ w# G$ R
转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5