Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
217 0 0
交易的构造、签名与广播: I, c* @0 m9 h$ k
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
$ C2 r. P  B5 N3 \. o普通交易
! ~6 R) ?0 D+ A2 q1. 找出未花费的币(unspent output)* D: i! `, H! s1 D, |; ^
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。: s( E6 y) ?  `9 Z5 z: z
执行:
2 d9 C6 e9 i; i0 [3 U* i0 F. D& Lbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
( F; C0 w5 [4 X. _. }- n输出:
% L3 i1 g/ R) e[
; ]& g, T2 D3 t; j    {1 W8 n2 J" T* Z6 `# h: ^
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",0 k) _9 y# I0 x1 @
        "vout" : 0,
9 M5 S! c  m0 q9 {* h: W        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
2 b" D! K8 V0 O4 x: C( B        "account" : "",0 {& x2 N. ~7 B% [
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
* f) P4 w3 G; ]+ z6 `/ l- g        "amount" : 0.19900000,+ e7 B% E; J( l; P0 o, N! d2 S
        "confirmations" : 1' L4 Z$ K7 {6 E0 h: \
    }
. Z5 o$ C; g; m$ L]
: N! `6 `5 ]% s我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。$ c9 o9 y. d$ b! l6 O) M# x
2. 创建待发送交易& P9 ]7 p- U: n
创建待发送交易,由命令: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 ,将此作为找零发回给自己。
2 a6 h) S6 a3 F( U执行:/ P- e4 n- Q* j; U+ D
bitcoind createrawtransaction \
6 \9 g, G: \( h) A" ^( ?3 h'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
1 R# S# g; D$ @" ~'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}', ]& P( P+ w5 S2 j1 s( @
输出:
& k! D+ i: S  G3 r$ V$ M. T010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000# E4 Q8 O( m* ]7 \2 S5 |
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。0 H5 c( M" e2 |% F
执行:$ n# r& d. o5 T" S- m# E. F1 F
bitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'
) Z  f7 S* M' X4 t输出:
) q: I9 k/ \, B0 S{
" L' ^7 N; i9 W2 b! |    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
4 [6 @% U; G  ~' p4 U    "version" : 1,% o9 ^  D: _! b+ }$ r
    "locktime" : 0,. j" Q$ T) M$ v' H( g9 `1 S3 \
    "vin" : [' j( Y* R0 O, e$ i0 F& I
        {
0 o& Z" B: @( r: d            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",/ Q" v9 M0 ^2 [' w% m
            "vout" : 0,. Z; ^/ \% N6 s" E
            "scriptSig" : {) j8 c/ {2 l& L  j! d
                "asm" : "",
% L2 n! ~( G5 e# I+ L7 H. y5 j                "hex" : ""
2 m0 ^0 i3 y. \# p6 \5 ], \: R, Z; f' N2 q            },$ j# c0 _7 M; f0 c. c. @7 B
            "sequence" : 4294967295
# l! |5 T0 N: Q9 p/ \, L. m        }
& x" S- t3 d' o    ],' b+ j/ M# a/ x' R9 h+ I
    "vout" : [
0 s& Q+ q8 \- h$ u- O9 f5 z        {
1 k7 Q1 Y" d7 i" O. v# n            "value" : 0.10000000,0 u* p6 H" H0 I+ ~' |8 i
            "n" : 0,$ E( h8 t/ ], ?$ T
            "scriptPubKey" : {
* c$ X* C0 {' ^/ a                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",  R% A% V" i' r2 h$ B
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",/ r7 \* P/ |8 `0 I7 T9 k
                "reqSigs" : 1,8 I! D/ ^* A  c8 Y  W( L
                "type" : "pubkeyhash",
- \; b6 p4 R  f1 N, T                "addresses" : [6 O/ K. A. P- V6 G3 A* q! F) I: ^
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
( a9 Q3 G  t5 x' u! W5 n- `: W                ]
8 m. d4 j: M& U+ \; K6 M            }
& U6 d3 U0 M% m( {        },7 K' t' l  i3 B& X& O7 P/ O
        {3 o$ j/ u( W2 Z8 N
            "value" : 0.09890000,
+ S8 G# {* [( Q) _4 ~            "n" : 1,
1 U7 T- N# J  A. Y' i3 i* G* w            "scriptPubKey" : {) e* X7 k+ A. M- D; `
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",6 `% z* A2 g) ]' G4 |( R
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",$ H2 Q% a: H2 O0 g. D
                "reqSigs" : 1,
. ?; y! L" Z5 p; u# V# |/ p                "type" : "pubkeyhash",$ g1 ?9 b& v' E& ?+ U
                "addresses" : [
6 p! G7 C5 G% Z: ^1 C; ]                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
9 w' t% s# h; j, o+ b! ~+ _; Y                ]' C8 j4 {6 h- O* U! C
            }2 h5 g; V, p& a9 ?; ]! b+ R! E
        }
7 c$ W" |4 ?/ v5 C% F/ m    ]
' L" f! {) }. E, Z' }1 _; Y}' {- B  F* }+ P) s
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
' c9 T7 v# J1 t% y3 i2 ?在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。/ l/ }( f4 v2 n% [: r, H8 z7 n
3. 签名
0 J) r6 n& ?4 m0 |9 y. N" m/ ?交易签名使用命令:7 I5 Y; }+ q4 \5 P0 C4 z( T7 U
signrawtransaction  \7 i) G$ d( J  f* a6 S
[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \. @8 |# _% Y+ E. O1 \& e
[sighashtype="ALL"]
2 B& E; N4 _: ~1 K. ?, N第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;: u4 ~/ }5 O- U# a3 u
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;0 W' d/ f* P3 h: x& F

5 f: Y& M/ X' f9 _+ s签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
9 J4 ~# z) B% ^, P& v  U- b执行:
2 }7 f  b( m6 zbitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1
8 N5 {" Z9 B) Q# T+ N8 |5 ^输出:
8 Y; B3 n" H2 r+ l$ ^{3 \0 Z2 L0 {+ ^' }) _6 ^! `' v
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",5 T2 s# k0 @" A  M8 r  G
    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
! F* [: B# l- v% l3 v  N    "version" : 1,$ q. W, s& w2 F. `, M( K  B; _
    "locktime" : 0,' \$ O9 A/ ?$ I" I( `& p0 H9 i
    "vin" : [  P. m& [1 l. D0 ^) S! D( O% f
        {
2 A7 Z" r- E3 S( o( q4 D            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",& a( F; g' ^/ v% c4 b. ~- _
            "vout" : 0,
* A0 h6 A7 a0 z( R5 P  c/ L: z3 ?            "scriptSig" : {" e- Y% t" ~2 r6 P7 ?
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",5 Q3 {  p8 V* S8 p2 C
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"7 O4 M" b  `! j/ W) J
            },
- x0 e% @1 [. H, M) k" s            "sequence" : 4294967295, Z; @: |1 S5 Q9 y  }
        }
3 s0 g; s0 x4 o; ?4 ~$ _    ],
. S4 F4 M# ?& n, y8 X8 Q    "vout" : [& a9 |" ?8 a% {
        {
& K+ H* M! E. G% N            "value" : 0.19900000,. q6 v1 J$ d! k
            "n" : 0,
+ a( e$ @5 F3 F- q. V            "scriptPubKey" : {! n" M7 b  a! X7 Q) D4 n& q+ B7 q0 D
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
7 R1 n' F4 _9 ]- `9 ]) m                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
/ x! f* D1 J6 N0 D1 x2 [: h                "reqSigs" : 1,6 _5 r+ \$ _& x. F$ q9 @% m
                "type" : "pubkeyhash",
* I! E: t# b: h& W9 J                "addresses" : [
; e0 E% A: ^* k                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"0 ~) Z# c. S% W
                ]
7 L. t7 r% m2 E# Q7 Q            }
; J! o8 G; S7 C' t: D( ^        }" g7 v& Z0 y8 @4 G
    ],2 I. f- w& F% C' g) t* z
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
0 ~' _' O0 y# Z; y; Y    "confirmations" : 19,
7 Q3 I2 b' g8 W1 }/ v    "time" : 1383235737,' r/ y: H! U6 x
    "blocktime" : 13832357377 [' C8 S9 a! J- w
}
: J1 |. [( k* gscriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。! b9 X- ^5 C2 x- r
签名使用ECDSA算法,对其,“空白交易”签名之,执行:6 E* q1 Y! B( f( N# [. s) s
bitcoind signrawtransaction \- K$ N0 _, L* g; F
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
: X- A" @* u. L7 \1 C) A. ['[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
  e/ \3 T( F8 x: F* W" M2 d输出:
. ~8 A! o6 l0 o{
8 r8 p" A9 z' B' f* _    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",# h7 c- ]( g9 n& ?7 E! w" ~
    "complete" : true
- F1 J% e1 R4 Y3 W/ i" Q}: Q& h$ L, \' @% r1 n/ X- w1 v! s4 C
签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。) ]" z4 V2 [$ K4 ~! M
最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
$ `6 Z: r7 S3 P( n执行:$ s5 \. q. |8 j4 L/ o, @
bitcoind sendrawtransaction \0 w7 w6 [' Y# R. K& E8 E
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
3 V# D9 _+ `& Z. t+ M. g输出:
  n, b& u; a% \6 Q) o; zb5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
  K* N' I( m* s$ l5 E3 Q返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。+ _; ~% B; |7 h2 w; N% ~
合成地址交易" I3 Z" ~# K, c6 S" k/ K
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:/ Q6 k; b' O3 @2 S
m {pubkey}...{pubkey} n OP_CHECKMULTISIG' t/ j. o( M8 W, m3 h/ q
M和N需满足:/ {- B6 j5 O5 {7 y! @7 @; V
1
- y- P8 p9 x) J, m' H2 V' m1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;4 B% @( V/ ?, F& \+ F7 t; Q+ d
2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
- w# z+ x7 G! E. R9 a: |1 u3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;# ~9 G. W& A/ D" o
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.5 z0 ^. c0 I" j% k( ?) o
首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
; b  j; ?0 Z; {4 O- C# No.1
9 L5 w5 v7 i9 u0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
; ~- s3 q. C: V# No.2
' O+ H, c9 Y7 I  d04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
+ U# E% b, {1 |5 G# No.3. p' V  X8 v4 j& G" O- M
048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
# k% z3 }- O( |  r; c7 U使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.; {/ r' W7 c( ~9 X# e
输入:
8 ~$ G8 O8 t2 Q; V" a' Z5 q4 B2 Dbitcoind createmultisig 2 \
8 \: l8 O# p7 [9 g'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'
. W/ w# n2 l( ^3 i3 h+ k输出:5 r5 b4 ]' N8 J7 a" N
{
$ E0 x, t8 \6 K3 Q2 A4 B% w    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC"," B# Z$ n+ M9 x) f4 Y
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
& u2 y0 w7 I" e' o2 h! @}
7 Y6 j; f+ {% e3 O; I得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。( [6 c2 k1 r! C* @
转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5