Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
154 0 0
交易的构造、签名与广播
, J7 ?4 C; f4 w7 D7 {, r上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。! L' c3 I5 j0 I% u
普通交易
. E, s. n, S( j- N1. 找出未花费的币(unspent output)" w" j6 ?. |) Z
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。( E8 W8 r5 `' ^
执行:
; X! l4 q$ x( \7 }, ibitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
3 W7 ^( R" |' W8 X$ G: {! a输出:
: O7 Q; m# r' N( Z9 Z0 O: t[
& x9 s! p4 \+ u    {' ?/ o3 I$ o( _5 m( ^: \( y
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
$ y: |7 o! q1 A  o        "vout" : 0,
0 P# I" U7 r. G2 t" w6 ~4 l        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",/ [& J4 K1 S1 R! `  H
        "account" : "",# {3 P3 s6 z. y
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
/ v! |# x* r4 d( m8 `. L        "amount" : 0.19900000,
& Y: x, |" t* Q9 M3 u. a        "confirmations" : 1
+ _8 K7 q. u% Z- D    }( q7 U4 _5 O$ X: O) P% e7 c
]& T# x3 R# A# }+ }& E, A* T
我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
+ d/ d0 x" P, o1 N2. 创建待发送交易
: C( N+ ?, ], i9 D% ?3 D+ s创建待发送交易,由命令: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 ,将此作为找零发回给自己。6 d( X. O5 L3 P; F+ D2 V
执行:: a: {. K2 V# j$ w
bitcoind createrawtransaction \$ t  V/ e: H# h$ k7 Y) m3 N- d
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \" R  t% e! `- \3 W* M
'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'. u2 q# T0 m# ^, s4 w
输出:! M+ m) c( A3 B3 P
010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000) |; ?/ u+ G4 E7 A3 S7 g
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。0 ?+ K0 K/ Z$ w' \6 P
执行:# n+ W) d2 m% |2 y# n$ W) N$ W, D
bitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'6 [: [8 Y# o& [
输出:' U/ C1 z! v3 z4 @8 {$ s
{! L5 U% Q- t7 h, _: {) n
    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",# f5 e' I8 `. N9 r
    "version" : 1,1 n4 C7 ]7 N2 l" \. Y
    "locktime" : 0,
6 y: W" H' T/ j; u    "vin" : [
2 R+ D. @3 T% p7 T! k        {6 Y2 T8 W! I% d" Q# W) Y) Q6 U9 D
            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
7 _( k) U6 a) W5 e. K            "vout" : 0,$ U+ u- X% y: ~' R- n
            "scriptSig" : {& _$ }) P0 l4 f
                "asm" : "",
# `( b8 L, a" \/ j; x- K. u1 L( t( o                "hex" : ""9 `; j; `; q# [) Q/ Z2 |
            },
; Z( `( _, N0 u3 s- J1 e2 {0 B) c            "sequence" : 4294967295. G" U0 b- c. k; z
        }* d! P0 c. T6 M, u* J1 Q
    ],
7 r+ e$ T1 f4 ^9 e( b; w    "vout" : [
6 u3 K. E6 X" C' I. q9 _        {
* y3 p' j8 b( d. F            "value" : 0.10000000,
9 g! K' k/ ~5 g0 y9 B            "n" : 0,
, N% ]# g7 t/ V2 |1 t' ?            "scriptPubKey" : {$ a7 U$ ^- q. c( X5 ]( t$ D
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",; H# L0 T0 C1 G$ g1 h
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
8 w& a& {" |3 N2 t  r: h; l" v                "reqSigs" : 1,
* Q& s; h) D7 l/ z- l. c( w- I                "type" : "pubkeyhash",: `1 j+ o1 P# p9 a" t  G1 x
                "addresses" : [
$ O: }& o6 f; O& w+ a* H+ p                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
3 r. O$ n. k' A' ]- f7 l6 k9 K                ]1 _4 ?! M9 Z7 s5 q7 w
            }
, F( N/ t4 t8 u        },* K, w" ^) w: ]
        {0 C8 b+ v2 q& [3 [
            "value" : 0.09890000,( R9 V4 G- |# ?5 }
            "n" : 1,/ D8 Z; }% _3 _  M0 M7 \' r2 ]
            "scriptPubKey" : {- E1 U6 [" u9 K+ T" }
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
" r. O8 m# X" q& V: T                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
  c) J! x# d" Y8 [3 I; X                "reqSigs" : 1,
) ^! O# W: e9 i2 b  _% s9 U0 i. i                "type" : "pubkeyhash",
+ y4 P' h0 x6 y1 l! }. }                "addresses" : [
3 p& _3 i* V& o: c                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"3 }' V( d# h1 F, [) U* n" A
                ]
& j4 }: d7 w8 Z( w2 g            }
! X# L; |! i: \, @) C, f8 q: m        }2 P5 K1 e& @. ~4 b
    ]) \. s$ `( h( n& G; ^
}; V+ w% E! s% t, q9 j
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。$ a5 d' b, v* o* @- G5 |) |0 P/ u
在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。
+ V. U: d; `& M8 r! _: t. b$ a3. 签名
& _2 q) F* @: v$ ]交易签名使用命令:  f1 G( n  |/ M( f7 B
signrawtransaction  \- n% \+ i( ~" ?2 _& p- F2 t4 ~4 }' d
[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \
  P; S; _5 M- s  ^; N$ H3 t$ {[sighashtype="ALL"]
" k# B$ C# o. G+ f9 H& y第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;( q/ ]7 k$ h4 D% L1 X; n/ O9 j
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;
6 S5 m( v! x5 F# t
: I: |/ u7 O2 A( q
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。3 b0 U9 k* P: D" V  @2 {. F
执行:. g: h4 F* d6 A" ?9 Y, j
bitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 15 o. n  o- W/ Q+ F# ^
输出:
& _$ r7 |0 z- S{
- g) v, |0 q, p$ X# _7 c) S    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
- _" [: X0 B2 @" i( E7 G    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
4 x2 h# R$ ~3 l0 m5 {3 O, S; _    "version" : 1,
% E' V5 ^1 T* K5 X1 E+ V3 E3 D    "locktime" : 0,  U! g' Q' ^6 F7 C8 W1 x
    "vin" : [
* [/ H- Q+ m; V; c; m        {; F4 _. t# N) O
            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",+ ^1 D% U9 i7 J# T, j+ y5 o
            "vout" : 0,
# o5 F% S8 z. \7 z4 a' i7 o0 k9 \            "scriptSig" : {, F9 V' \1 ^4 R& G) Z
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",
6 N+ s% M$ q" w                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"
& Q6 C6 S' ^) {1 H            },3 b' ]. a( H: ~& ^0 f
            "sequence" : 4294967295
+ F# f2 c& W2 H        }. s6 ?: j1 j& A$ E
    ],/ j. o+ b  m8 o8 E* X' \
    "vout" : [
4 {" q' V' L, `0 Y+ r        {
( G- P; T: y0 f            "value" : 0.19900000,1 I5 @, d$ Z" P! c6 `4 b( E
            "n" : 0,
  U7 [, _3 {( c            "scriptPubKey" : {1 x0 n' x) s/ s& i
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
) G  T: I8 A* r; v8 c/ T  L5 \& w) r                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",* g: l; a/ r) ?8 e2 X4 i
                "reqSigs" : 1,1 V0 S6 P4 O. t  t' H$ I
                "type" : "pubkeyhash",
, D' g# d: ~2 z: r" |; p3 V! }                "addresses" : [  M$ t  \, m: h% a' T  q
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"+ Z1 U2 O# X: L. y, Y: z
                ]
' {, @' K! e& G! q            }
7 ]- F1 m/ w) ^        }
9 {3 I0 }4 x& ~5 k: J' o) `# |    ],' p) ?' d$ v0 N
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
% ], X0 U# i) g, A  K    "confirmations" : 19,
9 R  H' F4 K$ ?( d* S' J    "time" : 1383235737,
! D' y' x) Z5 p7 J) _    "blocktime" : 1383235737
. q7 B" f3 q3 N" j/ \2 J! \}
: e: ]. X1 b: ^0 |scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
  s" A- s: g; H" `  f. m签名使用ECDSA算法,对其,“空白交易”签名之,执行:- |; n) |& Y( S7 \) z! Y" b! ^
bitcoind signrawtransaction \; c3 O5 X) _  y4 Q0 u0 c
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
# T5 j7 e& q! Z- P4 P'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
" u$ t8 r0 X" l# }( \- Z" r输出:* s. B. z2 F# i8 ^
{# x7 C7 ~. Y$ r* h, F) t8 D$ Z
    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
3 g/ i8 e1 w* \1 g    "complete" : true6 B( `( |2 G1 o+ l2 Z9 [6 o+ I
}
; S' p( N% o3 b) N. N! P签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。) ?$ y8 t/ U0 s( S
最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
8 b  f0 `( k7 \执行:
4 C: i9 a" H. V' mbitcoind sendrawtransaction \
8 Z& ]* d1 U8 T: z: M% ^"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"5 F- _; [$ K+ E! j4 n6 X
输出:
" ^/ M" p0 K. u9 o  {: e' I7 j- Sb5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
  z3 b% ^' j4 H+ Y返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。- k9 y" l% v, v& P
合成地址交易8 j: k: m+ g  @% T$ r( z
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:  f+ Z5 X- q9 [
m {pubkey}...{pubkey} n OP_CHECKMULTISIG
& x' t) F" ^+ i; W! f& V. n; UM和N需满足:
# r8 T+ k# Y, ]# a/ C9 l2 I1
3 Y0 z7 @/ W  a  m$ [: n1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
1 N, O/ O( M& D$ D8 H+ f$ Q" l2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
. L# J( a3 a! I# F3 v3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;& k. Y( \' g  S0 p
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
: Z6 y. R9 K# Q+ `$ D1 y- b! e首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。* q% ^9 o5 J" q# ]. M
# No.1
- O0 _: d% e4 x* k8 n1 K, @0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU" N$ t3 F2 D6 l" x
# No.2
# B$ K5 I' s  I: D5 \; G04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
; |! a$ \% U; a' l0 Q+ Z# No.3
$ s% C2 M$ ^% [& I/ a6 x048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw/ ?- Q& f% ^2 f( @8 C
使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3., O7 R5 c8 u6 j
输入:  g0 W* C/ V' I. {, z) V. ~
bitcoind createmultisig 2 \
. |/ ]' H% ]7 ?2 X/ p'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'4 v- X2 j7 K5 t) D# A
输出:
* a+ Q; P" G6 R, L$ u{  u5 i, u- L7 H8 C  _5 L+ Q, H2 O0 |
    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",4 H; u' J0 Y" i8 M
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
9 L3 w$ k9 Q2 {+ Q4 ^}
. s0 e  L& {" I' Z9 p  ]0 S得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
; X- o! O8 ~5 c) F3 ?转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5