Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
316 0 0
交易的构造、签名与广播4 {, k& I. u! s* @* ]
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。( x* ~. J( t  y/ s; A, A$ V! `
普通交易
( s, V5 _0 f8 _8 N; t: U5 t+ _1. 找出未花费的币(unspent output)
. l3 y% X" i+ C6 _通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
! ]: ?) W' b, u# h' ?* C8 p执行:1 t7 k) n+ Y( {% n1 f$ s  m+ @* W
bitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'4 F# t" r0 X0 U) w+ x* g& P4 L4 H
输出:: ~  O( E! Z; U0 U
[
6 e( v2 r3 [, Z    {! k; p# ~( a3 @( M" y; E, O4 I1 Q
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
5 W& n$ I. i9 x. [        "vout" : 0," j0 S" k) h" c0 F; ?) m" d) S
        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
8 A5 n: H0 k. g' q. d  e        "account" : "",5 M- V0 e3 u) y1 O" g
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
' n% Y3 \3 W' s( J: R; ?7 `        "amount" : 0.19900000,
2 C& R. ~  M/ ]% I        "confirmations" : 1
* K/ h* L% d! X4 l7 H    }
* |  ~4 {9 I3 x9 _]
9 L" D/ }* H! i9 d0 A我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。( s$ @- h/ s/ R8 y" P) P
2. 创建待发送交易
- i8 b7 M* |; p创建待发送交易,由命令: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 ,将此作为找零发回给自己。
. |* s/ ~$ b' d6 g执行:
3 D; }0 R# _# {bitcoind createrawtransaction \6 F5 e& ]+ @4 n
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \
( p$ K0 r! e/ G# c' ?1 f'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}', g  M: T) N  h8 A; u
输出:
* g5 J$ a! j: p+ \- v5 ]: r8 E010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000' ~3 I) f& }$ I6 v
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。# {2 s+ u: B8 a" R# l! J$ s
执行:
$ K# v8 b5 E. [4 Q4 O2 hbitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'  N1 `2 A+ |, |: ?1 ?
输出:
  i3 {4 i, _; v+ m& A{8 s7 A  l& J8 s. q
    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",& z" [7 W- a6 m0 `3 e
    "version" : 1,# h) J  A+ L( u4 w) d
    "locktime" : 0,
0 x% U" M/ w% b, \7 |1 A: ]    "vin" : [
- E! \! t7 h! ~! [8 [) P# H8 k        {
) K; Q1 J9 i6 H" S; M- r            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",0 U- \0 e* P! W3 ^8 [
            "vout" : 0,, O3 }! [- N' B/ U
            "scriptSig" : {2 l* ?  Y/ n3 `/ {5 H4 p
                "asm" : "",! U# I1 ]+ |3 L& c2 [
                "hex" : ""
( Z* P' ?6 o" W* O" K  R6 D% Z$ Q            }," a9 N0 B# v! z) j
            "sequence" : 42949672957 ~  a1 z6 L  [$ b+ Y/ [; |
        }
1 {( f* l3 k+ A2 w    ],$ i6 d8 L( B$ C  X9 O0 I. _
    "vout" : [
3 C" R( y8 n" H; T        {7 R# f- }: a, S; v6 ~5 `
            "value" : 0.10000000,
8 s7 E" j; S& m+ @9 ]$ n- I% w            "n" : 0,: }* T; G8 k2 u( \7 }
            "scriptPubKey" : {; q& @2 n) n6 o8 S
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",% k& Z8 B; }, r# L6 a' C
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",: E4 v" {- m' A8 R2 |, [+ s% {- |
                "reqSigs" : 1,
& n9 ^6 b+ z# I! v                "type" : "pubkeyhash",
, }' Q2 I( C1 l5 I  j- b                "addresses" : [$ t8 A0 L+ M, {6 i1 B  }
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
3 b+ p* s$ D! O+ i5 {                ]. E9 z; \! U8 v+ B  w. |) |
            }
( ]6 @8 ?: H5 w% I  P        },
4 J0 }; L  y" P. p        {
  r2 M! T% b2 k, b2 ?' z            "value" : 0.09890000,# [' d" i* \/ D* D
            "n" : 1,
) ]! _. l/ j' `' p' |7 g0 w  N            "scriptPubKey" : {. t" d. \$ {1 d: B, a& b
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
: S' _2 ?3 X8 u7 j$ @  ^8 F                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
3 Q. r6 Q; q5 F) }                "reqSigs" : 1,/ o9 O% g4 L! L( W7 L# {  i6 v
                "type" : "pubkeyhash",
5 w$ F* ~9 \: e# \$ R4 ^$ E                "addresses" : [
/ Z+ R. E7 o2 j( h" ?5 ^& r4 q                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
; ~) j, `2 r( l6 {  R  k! A                ]& Q% P0 g9 H2 f
            }
) N, i) }9 ]0 F3 ~; G        }+ g. J: X. l8 r3 ]& I" O
    ]/ S; E6 C! m5 f! D. S
}
$ G9 ^7 t2 {) j/ {% j2 ?) r: R3 n至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
  d8 j" ^- X  A( P# Z% }在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。$ c/ l$ R. f2 B/ n3 k5 l( {6 o
3. 签名
) S# O: w: E; a$ O; u交易签名使用命令:
$ z% h8 i% \- k2 gsignrawtransaction  \
2 V6 o+ C, y! I( h1 t! d) i[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \9 L7 N- a: c  J% w: d4 F+ Z$ |
[sighashtype="ALL"]  E" `4 N" U. [4 o0 S8 R. i
第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;1 A; J& ]3 j4 L6 s9 c- H
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;
& [# W8 u$ {; S/ y
) I/ j& B' i  A& o& S
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。* ^. B2 [) i6 x
执行:
  r! ]) \$ I& [% ^* h- abitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 18 o" c( \' N7 U6 `
输出:
/ F& e5 `# [- K2 L{) @- \/ b; ~, t8 i- R/ R
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
) E& t4 U5 K' Q$ n    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
# m# N! B. b  l  j6 g4 z    "version" : 1,* t4 l# P3 }6 [5 O  @
    "locktime" : 0,4 ]( a+ l% \7 f, Q6 a& ^
    "vin" : [$ |  P4 M. H+ e5 r
        {
* ?: \& Y/ {+ `+ t! @& K            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",$ Z' v. B% E/ ^' W7 T
            "vout" : 0,
: I- R* Y/ p  D4 k9 g( C            "scriptSig" : {; K, s9 t' Y" m5 |1 x( e1 q  _3 u
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",2 [- Q$ M5 A& I
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"
3 w7 Q5 \% ^8 P; T            },6 @$ L+ N7 M, e- @! M
            "sequence" : 4294967295
* \% t1 q3 x) G        }
) V" [4 a! ]. _# m; Z6 }4 w( k- c    ],
; J! i3 X4 B* C    "vout" : [9 [# t5 Z- c0 [6 _& u
        {! A9 p  C5 t( X0 c0 e
            "value" : 0.19900000,, R0 D! ?6 w8 g. K
            "n" : 0,
5 {+ S2 j0 j% a" f. P            "scriptPubKey" : {
; r7 i" u9 p( w2 I8 W                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
  T& o2 e1 l/ ~( W                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
+ `4 Y& ^0 z. o# V& @$ U8 G) {                "reqSigs" : 1,
0 z) x$ T. m& P3 b3 b                "type" : "pubkeyhash",
3 e0 S0 d6 X( }, q' G  m                "addresses" : [2 v: `: I1 T' a% t; q  ?. i! k: ?! x
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
6 M' B9 E5 d- }, r! L                ]
6 R& n2 q' S' T. p            }0 i$ s3 C* \4 Y6 c7 N8 |
        }
8 O5 x* g/ W3 N& v( d    ],% o3 F& X8 j7 R; L. E2 V3 y
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",8 M3 E0 I5 [9 ?
    "confirmations" : 19,
* t7 B. s; w3 M1 N; ^    "time" : 1383235737,  ^; q+ l1 R) z1 }* e, ?
    "blocktime" : 1383235737! u$ N1 L( Y$ _$ _- [
}
/ I5 ?! u7 j$ d. G! b) X4 qscriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。; s8 _' v# F- B5 f* K
签名使用ECDSA算法,对其,“空白交易”签名之,执行:1 J$ r. D5 j, Z: }! ^* y) W
bitcoind signrawtransaction \
5 X) i0 t/ P8 J1 Y# N"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
0 _. V  E/ N8 e  }'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'
% ^. [# G3 B5 k  h6 g5 i5 O5 ]6 f8 _输出:
& P$ a/ x5 E5 N* U+ F; |+ r2 [{* {# w9 y* z# l; [  Y, Z2 m; t
    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",& E# |; E0 R3 e7 [  y  G" c; W! H
    "complete" : true) B9 F9 \: U6 w" M2 y4 `: A
}( P  `  \' n# i$ h  G2 y: n
签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。4 r6 t! o' @8 }2 P
最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。! Z" Z! t1 E' H% _& G
执行:: D5 O) e4 s% o8 Z# r) l
bitcoind sendrawtransaction \
$ i8 D' F' R2 V; v3 w% j5 ], z"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
7 m5 Q0 J6 y% P# N输出:
6 b" u$ X! u' K' ^* _5 y5 B$ Gb5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d/ P* C( B* x% C: K7 B
返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。
7 E, A( F4 P) e4 f& F5 d- {合成地址交易
* {$ v2 y9 Z% ~) ~合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:
5 v$ g& c+ R2 Dm {pubkey}...{pubkey} n OP_CHECKMULTISIG
, l7 U: T$ ?& B9 \4 G6 sM和N需满足:1 t4 N7 c6 D8 ~5 E4 R# E  t
1
- p/ J, {$ F' ^/ M# V1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;+ r' ^' S4 F$ ~8 k
2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;2 q, W0 o5 y% s& U. l
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;) z6 _& [$ y8 v& v
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.4 I* E5 ^5 P1 P
首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。; M1 l/ p1 w$ t& ?4 D8 ^; L! {8 ^: W8 Z
# No.1
+ k/ x$ j! X) G2 u7 A0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
8 F/ y7 x' z$ `4 b# ^) i4 b7 ?# No.2
: E2 ]. B/ y& ?5 l2 f) t2 ]04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk, W. P/ n- V0 ]  T  [5 Q8 }
# No.3
' A7 b  x6 i- |6 ]9 ~' {! i048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
, p! }8 k% J5 m' X" ^9 t使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.6 U- m& ~) y. J; h$ p1 s1 X
输入:5 \* g. E8 ]: U' x+ r2 d
bitcoind createmultisig 2 \! F% ^% u/ v0 T$ ~* L/ m% ~9 |
'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'9 B9 m0 n. Y% ^4 s
输出:
  @" ]( N" J9 q' U. L{  x4 o+ T% p9 R' N& w
    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",; M, t0 f% G! U- K$ ?+ @! J
    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"6 p, d: _2 S9 T, e
}
' h0 k- u) K  x& A2 m得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
8 x/ @  G! f, e1 E转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5