Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
279 0 0
交易的构造、签名与广播! }0 E3 @5 O4 z1 y5 v9 d8 n/ X
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。2 S4 u6 ^; k7 g7 h+ a8 y' T8 l
普通交易3 ^! D; ]- S& f4 V5 i7 a! D# u
1. 找出未花费的币(unspent output)) k  V6 d& \% ?  w6 u
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。0 H) s; v: c) ~. A7 e+ h. Q- Z# {
执行:( t% b( k1 ]- T+ U* b- P0 z1 T
bitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'  _/ Q5 `1 g0 T2 @# z" c3 G: e
输出:% j$ s' z' D# s
[
( p( f. k5 ^! J# G& A# M( e1 K% Q( }    {& |) s; p9 j( x* H* z: a
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
; K! `7 v& U5 g2 F% f6 {' [, W        "vout" : 0,
0 v. }: c! o4 Z- ?( A        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
5 t8 d! {: v. {        "account" : "",
) x9 r- B8 y- q2 J3 W4 ?        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",5 Y' `5 z1 ]& }# |
        "amount" : 0.19900000,9 `/ C6 v) l* l" I/ M- J" x2 w  y
        "confirmations" : 1  i; M  J/ @7 y' t6 c; l" f
    }& j4 S! c6 ?# k5 H3 V3 E  u3 w
]
$ Y( U% o) p2 u# H9 s1 x我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。/ p  \9 D; ~3 j' b
2. 创建待发送交易* I4 [9 Y8 Z0 @- E1 k
创建待发送交易,由命令: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 ,将此作为找零发回给自己。
9 w& Y8 K: K) N执行:! u  N' O5 @8 L/ k
bitcoind createrawtransaction \  W( s2 b3 ?% y8 J
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
2 R. j3 N) K1 a$ ?- w'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'
1 N* W/ y, h/ Y# M. K输出:
- X7 h, P, }/ P# H$ U$ d- s2 X010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000  A9 X  |2 Y  P  i) t6 P- Z- e
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。
$ Q+ V" _. R, F+ P执行:
6 j& b( y" o" {5 mbitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000': s) [% L1 S: G: @/ N1 t
输出:; t( c- b2 S2 A/ ~
{9 F2 W$ X' B/ W
    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
( I- K# U0 L; w$ }; J0 R+ H$ ~    "version" : 1,# ]- a- n+ o9 q5 |! g
    "locktime" : 0,
/ h2 @( {* `3 \% M1 Q# H    "vin" : [
/ `( V8 ~: k1 z        {' ^: N  p0 {1 I# c9 q( j( H- z
            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",: g+ m, h. D# R' _
            "vout" : 0,/ M- W% ]9 k: E) e1 ~
            "scriptSig" : {
* y, B9 k, t# U/ c8 r' e$ S" O                "asm" : "",0 I* Z7 h  a0 ?: R( o% a, h% m" Q
                "hex" : ""
/ m4 K6 y) f  w6 V2 C            },- Z! ?4 q5 M! V& U- B& t8 M
            "sequence" : 4294967295
, q0 T8 h( @2 e        }
4 Y# c* B. }- q    ],
( N% {) }$ j+ o; c! n    "vout" : [- U9 W( l7 a4 \) M
        {4 Z6 l, u- X+ p1 j8 M6 T
            "value" : 0.10000000,! K4 b+ ^: [1 c6 p0 q& u1 H
            "n" : 0,. w  F& ?! p( g9 L8 w) ]
            "scriptPubKey" : {
; [- r$ c; B' H6 [! m6 \* p1 n                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",9 S, E) A# J$ V- ~& r+ J
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
0 g  p/ b/ C7 M0 v* e! e                "reqSigs" : 1,
+ E, [8 `# o. b3 o0 ^7 u                "type" : "pubkeyhash",
) _/ o3 y, p5 u! f% i7 g4 q. L2 ~                "addresses" : [, J4 [2 z" v, H( ?9 X
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"( S6 {6 y7 ^& a& F2 k1 i
                ]# |3 U0 I1 E2 r- |
            }
% B5 \( h2 `8 M4 t. ], `, N        },3 j& A7 X/ g9 b7 Y. l) d
        {
9 R' B" I5 ]1 T9 d8 }            "value" : 0.09890000,
) x" h& ]& H, q; y  a: J' z: M            "n" : 1,
" ?. B2 w, u5 s# x% w            "scriptPubKey" : {
7 p3 a) W; D! T2 }                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",  y9 j/ B! v- m( ^, B; t9 D) S$ [
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",8 o; P* F: |9 [  i6 B2 h5 \
                "reqSigs" : 1,9 `2 [% ^7 \! n0 `
                "type" : "pubkeyhash",
* z5 z8 |" b3 E+ y" ?* d4 B& x  {  l                "addresses" : [
! n& V+ ?" p6 ^5 z/ J: h7 {                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"5 i% h1 c2 A# r
                ]
0 l! A, O# C; f" p9 L* I+ L            }; J) T  `0 y* b  H: L2 ^1 }: t
        }  ]' n1 Y& F6 M0 i  S* ?
    ]% y; y$ ~1 _! h: w1 e* f
}7 x; p& \) L2 x# ^7 o% I7 f1 H
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
. Z. E5 P# D( b; R+ u( m5 L/ \在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。8 \# y$ D3 m! H7 t8 D# [+ [% ?2 Q
3. 签名
9 N; n+ a, |8 a8 f8 c9 F4 u* P9 o0 I交易签名使用命令:+ b3 ^) U1 ~: `5 z5 T$ e& U8 S2 F
signrawtransaction  \
! C7 F2 @( P4 V5 P$ J* e[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \# ^/ I; E  S; e0 ~: u5 C+ |
[sighashtype="ALL"]
& g1 A9 F9 [5 I第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;7 @8 u& @6 K1 I# l- [, [0 F8 b& k
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;
" T' W. z/ D& P9 n$ X; Z3 T" D/ {6 p+ [
. U5 m4 z* _; J
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。0 g) b/ P* R7 l4 }7 B
执行:
0 r! B2 x1 u0 Ibitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1
/ Q: o1 E& }( O3 {' l$ p输出:
" m; ~" ^- {' k8 e+ r# s{" m6 |; y0 T* V" U0 D
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
( u; l% k$ C+ Y+ w: j6 T" s$ p    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",% S" q, D7 a% m, O6 V# J/ K
    "version" : 1,! h2 j; B6 g# _' J) k% q
    "locktime" : 0,5 K3 p4 K, u* V( O
    "vin" : [
' D( s/ ]  d" \$ O        {/ Z6 X+ |" W2 m
            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
3 ]7 p  p, x# }8 i/ w5 [            "vout" : 0,
8 ?# O  Z. |( y" x* y            "scriptSig" : {
0 f/ q3 O+ c, F/ x# W  y                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",& i; a& d9 C/ Y$ w- |( p
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4") L1 ?9 H7 C1 C) s0 P- H, |
            },
% ]. w* [! W6 K( s6 e& n" z) h) G3 ~            "sequence" : 4294967295
  j, N, Z/ ?" o  s5 j$ U- y        }$ D  _/ r/ l' ~) ~1 e
    ],5 d. c7 K# u/ f% x9 o
    "vout" : [1 j( v  A3 U; }, J- n% H6 v
        {
# [: Q- \) j8 u9 B- P            "value" : 0.19900000,
" \1 A/ h! c  X6 N! w            "n" : 0,9 D; n) K7 ^2 r
            "scriptPubKey" : {6 x- A7 g" s! j7 G# q, X
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
% H- |0 [4 F( c                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",9 f2 J6 K  R/ Y) g5 x' v
                "reqSigs" : 1,
5 U9 p! }& [6 a7 Z7 }3 y* l. B                "type" : "pubkeyhash",& p0 R( }0 d' t) x0 }- _
                "addresses" : [0 q( I" O' I, |, T* C, m
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"; \. F: b( q+ p. q
                ]/ f4 V! @/ |: H( Z6 k4 o! {
            }. b, C$ D/ L5 j1 _% }8 u( |4 A9 l
        }
' P, o  k& g& y7 \3 n8 d& z( _    ],  n. y4 P7 J3 w* R4 R9 I) f
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",  X/ ^" m  W3 d3 ]: Q! ]
    "confirmations" : 19,
. Q: \. g! z2 |* G* L    "time" : 1383235737,0 @' A7 D* a; G" E
    "blocktime" : 1383235737
5 ]4 K, g. W. V/ d}
" o$ t9 G6 g' F0 E' t+ UscriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。5 q8 |) M  `8 |8 {* V& ]6 E
签名使用ECDSA算法,对其,“空白交易”签名之,执行:
% f7 t8 ~6 a! @+ s4 O- G6 ^bitcoind signrawtransaction \
. }& \7 l# L9 u3 X, d0 O. b$ n"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
1 D" M; j; t6 g! K2 }4 s'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
  ~" S2 o; ]1 W7 l5 f3 C1 C输出:' Z1 @& T( z; @* Y. D
{- }% t- v# {9 [% p+ i, P! Q
    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",6 Q$ k+ t8 H8 r  Q. ]4 y
    "complete" : true$ }, ?* t; k. h6 H% H7 b' V: y  N
}
  z2 L' a2 b/ m3 A) O" N$ ~签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。+ S; l) {/ C" ~7 [  z5 T
最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
3 ?' y1 Y- p* z) o5 I/ u9 k执行:
  N8 f5 n" D7 V) ~. L, G+ E! {7 T& Rbitcoind sendrawtransaction \: L% g# M$ j5 Y$ }: F
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
+ Q7 p* U3 c! h: _& N输出:
% M3 A6 m5 a8 _) W" \- gb5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d0 J! d$ h8 F; z) G% s6 y
返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。- |9 o* ?) d5 X2 x1 _
合成地址交易# e5 @: ^; n* G( j
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:! r; @' z. E9 d) }8 r. u
m {pubkey}...{pubkey} n OP_CHECKMULTISIG1 F) e% n3 J% E
M和N需满足:
, m! m) X! E* m( d- ]$ K* d1. |! D+ A/ ]' V1 m  Q" i* T
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;+ Q& s# D0 A/ X1 c# r0 ?3 c
2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;; Z! t2 ~0 y  q& g0 `! w
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;2 _4 n+ ]5 I8 j7 q6 D" X
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
1 s" H, Z( w1 _首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
8 T$ N& b5 b8 D, `9 V: K+ B' F# No.1; g6 t' W: H* @" U$ z. ]. w
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU8 D! t$ v/ P) x7 j. Y& j0 U
# No.2 $ j: t# C7 @8 m' g+ t2 P! D
04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk5 s0 L7 |5 H. h2 _4 ~8 Y( g
# No.3; T& B9 x6 q+ W3 {- [
048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw: P0 a; @: ]6 g6 T9 r7 c9 I
使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.- k5 z2 y1 k. q0 L7 c8 r" v
输入:% V  d) U( ]( r3 P% \
bitcoind createmultisig 2 \
  H* M6 Y" t) U7 k# k7 f# n- {'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'1 y4 W8 M# I/ L4 j& w! L
输出:4 U2 j0 C* k( R4 K3 Y
{
6 _- `& g+ p" W: I1 M- B9 Q    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",- X7 ?+ ^, A/ u- T6 c* _/ M
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
. d7 L- c6 y) a+ w% G}7 @1 @6 o) ?: y9 s! a9 ~) D
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
6 p1 O  L+ T, R8 b) `0 b转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5