Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
190 0 0
交易的构造、签名与广播+ ^9 u1 q- _6 }* t  K- T3 ]
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
6 {, v- R* d0 w( G2 n普通交易  \6 {. C. H. P$ D
1. 找出未花费的币(unspent output); d) v# x0 ]* a- I/ i8 Z# A
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
, Q* A0 D) W. j4 M执行:
9 @, O% Z  F9 a5 m! t/ [& J4 L; _$ xbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
( T( N0 h/ _1 r$ ~输出:. A! Z6 P6 w( U' F: n. o/ |
[
' T; c* I% y  n" `  C! f, ^    {! X; \* b) ?$ {$ C( D! k3 q! V% b
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",6 K% D# [- v. a! K; S  \
        "vout" : 0,
' [' u# f  `/ l, {: l# h# C/ W        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
4 m- r5 l& q0 k! ]" c        "account" : "",& n9 J1 v4 D) a# V
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",+ a$ D: `( B2 {$ E4 U$ N( J
        "amount" : 0.19900000,
- {7 i' {* i6 O3 i        "confirmations" : 1
4 S) o' D, y6 a# ~+ @/ v# J1 Y  t    }, ]1 ~5 I% W# |2 _& v; f4 H
]
/ i5 ]6 y+ @3 M5 |- X5 u. U我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
0 [' e# H! a# U$ L  {/ j2. 创建待发送交易
& W3 D) `! z- l创建待发送交易,由命令: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 ,将此作为找零发回给自己。
. [% [1 E, V# ]" }# L" ?& O执行:" ^" b6 E7 M) V" P, d8 h
bitcoind createrawtransaction \
6 Q: ?" c/ m( P4 ^* H: a'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
( _( m- ]1 N2 [5 D% C2 ]'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'$ r* x' V; K" M* Z" A% \
输出:& b8 d. @- [4 y3 t1 X8 v
010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000
0 I: z" @$ Z3 Y- H/ H: i/ P通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。
5 e% {: w" _/ ~. s- {执行:& Y/ `2 c8 g/ O! E9 u8 n0 J% b
bitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'8 Q$ g3 w% R. F  E$ c1 Z$ P
输出:: Y2 |5 o  z9 B1 Z1 N+ [% Y
{
& `( O. ^. q& l, e( b5 f    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",8 O- ?0 b% c4 Y
    "version" : 1,
  ~9 R. A3 q& Z1 W* P9 h; L4 x    "locktime" : 0,
& g5 u. Q& J0 Y6 L9 k  n    "vin" : [* y4 d/ h5 e. m8 F8 _: |  W* R
        {( E: [" `9 Q! y
            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
- q( T8 f8 j0 K9 K1 ]            "vout" : 0,
0 _% H/ r" m2 p0 s7 W            "scriptSig" : {
% A6 x, j0 L  h' D7 L                "asm" : "",
! o8 M! }& e$ H9 W- r9 E                "hex" : ""9 K- Y. `3 L$ J! ^3 B$ @" ]7 a
            },8 Y" }. ?) k4 v& i0 T$ y
            "sequence" : 4294967295
) H7 u, ]0 ~( V" v        }% N3 P  `& e5 j; V! ^9 s
    ],4 Y- N7 M; @# c$ D' J* {
    "vout" : [
9 k9 ]( I$ k$ T  n2 J        {* D4 [1 [( q9 n* E2 g9 d- f
            "value" : 0.10000000,
; ~4 C3 |' ^5 @3 G2 X  D- U            "n" : 0,* [# A+ }. {9 o+ }7 Q
            "scriptPubKey" : {
# {* \$ I' A& ]! Y& _6 F                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",, V+ K1 C! s; D: Y
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",( O- x+ z8 }( u* Q. b* e
                "reqSigs" : 1,
  L. ]5 c/ D$ g9 ]) f# [% t0 l! U                "type" : "pubkeyhash",; V" Z1 ?& ]7 z! p7 R1 V3 d
                "addresses" : [
! p& W" a$ h  R( m$ {' ?! k                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"- F) r7 ?3 k4 j+ B; g5 x0 p. ^
                ]
" Z6 J5 f, ^9 i$ O/ m            }4 |: P- \, ?  _& K: t: U& {" A, E
        },' e/ p  A8 m  \, h) v
        {
, A4 J' J3 n/ }4 b0 P$ S1 p            "value" : 0.09890000,  v0 Y! l4 A1 j9 g: b
            "n" : 1,
; K; M- A: ~- h            "scriptPubKey" : {5 |9 H0 f$ B& }* K& B
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",/ i8 i4 Y# E- J0 c
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
% V. I9 q0 R  H  i                "reqSigs" : 1,
9 u0 y) H- ~, o& L$ Y                "type" : "pubkeyhash",
2 N" i! Y- z8 z- l                "addresses" : [7 T; |: }' D- r
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
0 a" @& s! S8 u                ]
" o* V0 |$ I* u6 e7 |            }+ z) o6 q6 q* ~5 _( K0 ^  r
        }+ U. b+ F9 S# G( m) s
    ]2 M' p0 e% b# l! t0 [
}$ E4 a9 `+ I7 X9 m8 Y4 |" z
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
& P1 ^0 `2 ]5 u- M* s在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。
; Y$ F0 l' Z+ w  X8 ]1 }( f3. 签名
( Z6 {' b2 a" S: Y/ R+ O: V0 q* e交易签名使用命令:
4 A; k6 X; ~  hsignrawtransaction  \
  s6 Y7 n3 w2 E$ J* [5 N[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \" N- C8 i8 W. R( `. H
[sighashtype="ALL"]: F, |0 h/ p( `, |( r2 R6 i- n/ \9 r
第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;) \; D' I6 k/ C' t6 ~: ^& q
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;7 ]9 s' @/ d2 S, G9 b8 I. v
( I, ^/ d  ?) h# |7 a
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。# u& E7 K( C# t8 }. b; v2 [' ~& h
执行:" v" v! y+ J3 j' D+ J# `
bitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1. l! h) o" K5 ?$ A* u$ n8 N
输出:
" z' l: G+ ^% d$ \/ b6 W{0 ~- J5 N: ^" }3 X  L/ `# O
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",6 A* a+ N: Z6 Y/ _" f+ r
    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",! C5 l$ y& A& n- \" n
    "version" : 1,5 r  |0 J# @0 O5 {/ I4 ~
    "locktime" : 0,
  V4 k# y$ A" H% Y5 {) g    "vin" : [; u: O. `* X* u% h
        {9 M" X" T' L3 A  O
            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",0 B4 j& s5 d; A
            "vout" : 0,
2 Q6 G2 E$ W5 L3 O- ^9 I+ w            "scriptSig" : {) \& ?3 y6 _% q9 A: x, R4 r
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",. {9 c: Y- o# J3 S
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"
: q+ G' f3 Z5 O; ]5 L% K            },
% j+ U3 I3 q( d  x; i; f            "sequence" : 4294967295
6 h- Z! L. O$ Y3 w( a# n        }
* U/ F# v* ?+ L5 O, B    ],
5 `3 U+ k1 c& Q/ A9 M* W    "vout" : [
( s: R$ U$ @4 m. s  ?# s* ?+ ~        {
; N! M- l2 w$ E            "value" : 0.19900000,! s+ L6 s  v/ ?6 q
            "n" : 0,: Z9 w  f6 ^: U9 }4 k# [6 K
            "scriptPubKey" : {# g5 p* a! `! l+ u  a# }- Z
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
$ Z" z) n+ m. R) [7 x                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",) n- l9 \9 O% E6 d3 A
                "reqSigs" : 1," b: [2 A7 i& X( m% U7 |- E
                "type" : "pubkeyhash",/ H; h! p4 H0 k2 u0 ]' X. x2 T
                "addresses" : [
% x8 h0 _6 ]& }5 t                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
9 K5 ~* i4 b6 H; D) y, y                ]; p7 b) Z( B7 z" e
            }
* f" Y- \  f0 D; ~. D% U* y8 ^        }# J4 g1 U+ ~% z2 G  M
    ],: z5 `- p( }4 w8 K8 e
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",1 n6 x* ^4 l2 C2 I8 x
    "confirmations" : 19,  r- X# o2 `% f4 Z% {1 z
    "time" : 1383235737,
* [4 b/ A; d. W2 v1 G    "blocktime" : 1383235737; X2 w; p5 C! a7 W4 G3 D
}
- {9 r$ {5 w7 ]scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
" x8 t& q) N8 Q, U" e& @* Z( o0 n. g签名使用ECDSA算法,对其,“空白交易”签名之,执行:
8 x' ^" N2 d  U4 Dbitcoind signrawtransaction \) C5 N; V/ p: s2 @1 n4 d8 ^
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \' _9 M, i* U5 E0 f
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
; Y8 ?2 _: q: d% H* U3 n输出:+ j: H8 s& C( o& P& V0 ~  u' T
{
! n3 r5 r% r, p2 \* I    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",, e4 J5 H) }. p: W% O
    "complete" : true* `* q( f) o% Z! W  w) [) Q
}
+ O4 v' y5 I2 P: `签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
5 p2 Z$ _4 G2 i- e" H最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。: ^0 s% [1 z+ H( [& R7 X) c' e
执行:3 W7 D7 n9 j( V5 @& {4 l8 K
bitcoind sendrawtransaction \
2 U+ v3 P  r1 {# m9 n3 J& i"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
" n$ s/ f- p9 x$ C& ^, f# K输出:9 y5 \6 l, O3 e- r" v
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
" ~1 x) _) q* a! U返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。
0 J# j6 u# t4 R合成地址交易
: b2 r& v! z+ Z, P7 M, p. T* i合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:
- X! T; ]0 t$ f1 sm {pubkey}...{pubkey} n OP_CHECKMULTISIG
/ _; g  V" K$ n% h! KM和N需满足:
/ p5 @0 h+ ~2 x% x$ V  a1( |2 C! l  X  B5 e: E" e
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;2 A0 Z, c7 [& ^* X" G! b* b
2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
( \5 w1 Y3 k2 g. g) A3 S; v6 C3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;
. K! Q0 z3 x2 K" h" u$ j合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
8 Q5 X7 Q; {, M# ]& p* V: j* _+ e首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。* |- |$ G+ H1 K& V% d# C6 b( Z
# No.1
. f' [* d9 a; R, l0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
+ O! E( u( c( j" v% x3 j" g4 z/ H# No.2
: \5 {' p* ~) w! u% U04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
5 C% L0 K# k* Q9 ~4 y: N. N# No.3
3 M' c" d% r( d/ Q048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
# d6 Y) O7 B# i4 m( C/ `6 w! o使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.
( b' b8 {& U' b+ W$ M' N3 ?* z输入:
  h4 {. \& ~8 u8 h3 d0 P( Y2 [bitcoind createmultisig 2 \
* D6 s5 X' f" E+ {'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'1 T$ \7 h) Z7 Z# Z* _
输出:, v1 o& h! C2 i  E
{) J# c5 k7 l3 C4 e1 v
    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
! P% }5 d" C. _5 w) I    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
% K: `; U6 M9 n) a}1 ~/ {1 Y, [" D& v! U; e* u: K
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。( u, m2 Z" E% c' k. J
转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5