Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
285 0 0
交易的构造、签名与广播
: g! k3 g1 b+ E; K# s上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
/ ^: J3 R9 Q5 Z. R普通交易( H6 e- P/ `- }) W+ {2 l2 g9 t; n
1. 找出未花费的币(unspent output)$ N2 G: d. M5 u& I) o& u/ ^. f
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
% ]+ R* X, L1 \4 ?执行:
) d" j, O' O* Jbitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'
3 n  J$ W2 V  C输出:
6 H" g4 J; E9 S[
" ?; a- A% u+ `9 _" |# k- C3 G    {3 N7 x! e& e/ K0 W5 |2 x
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
1 r& ?& u: U* t" A  X; {9 `1 J6 ]" K, L        "vout" : 0,
( w1 Y) z% i' l3 w2 u6 I        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",8 s7 _. _1 K6 V
        "account" : "",
9 d0 |4 Q. ]; }3 k9 v        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
0 L' F4 I# \3 _; o4 m4 I        "amount" : 0.19900000,% p; }$ w1 a. T  t/ ^
        "confirmations" : 1
* ?* N! m! g9 t4 y& @    }0 S$ g, V. b; R; u& X
]
$ A, h/ a; Q' b( J' p我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
( j( K1 a' H. P8 T2. 创建待发送交易
6 r% \/ p% l! P9 M; r" A创建待发送交易,由命令: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 ,将此作为找零发回给自己。& d. q+ Z2 j5 D0 K+ D/ z
执行:* |3 B4 p- S$ x! \
bitcoind createrawtransaction \3 S" y' {; Z3 v
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \" m! o7 _* Y  O8 m+ q' ]! I$ X% w3 P; k
'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'
. a- U) u9 \+ \# K' _* ^输出:
9 P6 c2 R6 d6 A( @5 ~010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000+ c9 v, W  a$ M2 r5 q6 V' _" S# B# P
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。0 M' w: y, o8 B; O- Y
执行:
0 G5 P$ E5 T: A8 N0 e2 @; obitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'* U2 f4 W9 q7 c
输出:3 f; H, Y% D0 c# N8 I
{
% j( g/ O& g/ O/ s5 n* H    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
) w+ x9 b4 h. A8 j; O0 ?6 _    "version" : 1,
: O- ?* t% ~9 t6 m9 s; h    "locktime" : 0,
7 u: t; C  i  ^, S, ]    "vin" : [
1 |0 a+ _' A& [5 W" c, b        {
5 s$ X9 u6 L& y6 }! H5 h  d9 O            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",/ h1 }: Y+ }. {" v4 A
            "vout" : 0,
) _% e( E( p7 m2 V2 _2 R            "scriptSig" : {- v' }8 Z0 o3 ?* s2 N  b% s; |
                "asm" : "",
" S# M4 z( Q' G; d1 X  J+ l                "hex" : ""0 u& s4 ]% I, w; p* }' Z8 M- W
            },( g1 L) S6 t3 ^; ?5 Z
            "sequence" : 42949672953 ]1 R. I" V- r
        }( W, \2 w7 J6 t3 }6 ?) V+ B- h
    ],/ N! o$ \- h' S( Q& O+ z3 ?: O
    "vout" : [0 ]1 h& ]9 g4 r2 p* p$ q) {5 T+ I
        {3 U  O" J4 @+ m3 g0 G* `$ L/ Q) T
            "value" : 0.10000000,
6 k5 y# @' H( R4 {  F" c            "n" : 0,- D8 E* P( f# x9 n8 h7 T
            "scriptPubKey" : {: q& T9 W1 s5 y+ [/ [! s8 P
                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",
; d, w! L6 y7 n) _( |                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
. E5 Y" e: t4 G' B5 N                "reqSigs" : 1,
$ _& X% H- H. j0 N2 N                "type" : "pubkeyhash",, F! J( l: `8 n# u
                "addresses" : [. |% R; j$ _0 e" e3 W! N# Y. {: C
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"$ |) i$ m3 E4 c8 E" s4 n
                ]5 O: Q0 {, u( w: L
            }2 J3 r- ]9 E; i9 j1 L
        },3 }7 w. P+ @* x3 m, x. ?
        {7 @8 I) |3 r8 s8 H1 k7 s4 \
            "value" : 0.09890000,5 o5 y% O: a( A' R% X" Z: I" G
            "n" : 1,
6 w$ ]. ~$ ^$ @% I& f, v            "scriptPubKey" : {
, G  A- [, O5 Q$ a" d5 z0 ]                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",8 n% r" Q( P: F$ S) s% q0 C
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",' h' T. [$ H. ^8 `. ?
                "reqSigs" : 1,
& t. I  y- |# }6 U7 ?& j, J& B. P                "type" : "pubkeyhash",* H; U) X! D  q
                "addresses" : [
3 Y# c, I  d% }! e                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"9 G" V5 L, R; f2 B0 ~( M% j
                ]0 [' d+ {. H& q# u/ p  e% B
            }
! V4 [1 p: u; f        }0 o) A. {2 y& q  r# h+ K# {' i; d
    ]
0 r. E$ K0 L2 H}2 d' E; v% w# Q) m% A$ y
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
! }* T2 L1 [6 j6 l  E* L' y2 G# R在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。1 I' t; P3 L" _9 Z: X6 j& Z. n
3. 签名% k4 P  k5 I; o" k; K; F
交易签名使用命令:
" y- p' Z' o7 ~2 T( k: v$ I5 @signrawtransaction  \
4 L, s& K% W1 H; ]& n* L- O[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \+ R1 l/ B* }. V4 m0 V. ~2 o
[sighashtype="ALL"]
6 s6 U8 X$ Q; n第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;
# p, b4 m. |) R8 I+ C# H第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;( Z" ]: ]. N' L
: }2 q, v6 a$ m1 C0 B: T
签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
7 x! f1 D8 |) J1 Y执行:" j/ E6 V$ P/ G
bitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1  E: @5 O; I% D) C- R1 M
输出:
+ V' r5 B  K. ^0 i" b5 ^8 m) V/ `{1 v" v2 O" {+ n3 }
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",8 d4 E' U: a: |  g
    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",/ k2 ]7 n1 l1 x- r# O, b5 v, D
    "version" : 1,, Q% _  A4 @  g2 |, p) g/ C
    "locktime" : 0,+ X1 N' W" R, w0 I2 M: C8 N$ `
    "vin" : [0 d& [; E* j: b
        {4 n/ M5 ^9 v9 @5 N
            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
) c8 b6 w( \$ H' }  G            "vout" : 0,9 L4 X% ^" ~2 i1 b, ?( z2 I/ \
            "scriptSig" : {
: r" x& r1 v; K$ h1 r                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",: B! L) `" z' |' R' t7 K
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"8 ^; V; x& V: Q% c% H
            },( x! z+ u5 M$ U1 |' Y
            "sequence" : 42949672950 r( q2 O6 x# M/ i/ p; {
        }" k* I3 T( B. E( @& d) U; o
    ],
  i# b7 ]4 u: I; x& C6 ~  A    "vout" : [& d4 L3 u4 p( g; l% y/ L
        {) t$ g1 A& O9 q3 b! j) F6 W
            "value" : 0.19900000,
- ?# }- X6 M) O9 B! k- M            "n" : 0,
9 r4 x$ A2 c9 r  o5 a" ^% Y! D. l$ C            "scriptPubKey" : {
3 g, H4 u$ t1 O0 O                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
# @+ @* |2 i( |  e% O                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
5 L5 W% [4 N4 w: X& w0 _- ]                "reqSigs" : 1,
$ y6 D4 K3 _+ h2 ]                "type" : "pubkeyhash",' X4 \4 ?/ l5 w  W
                "addresses" : [2 t0 o2 _' S( u# d% C, a& i8 B% n, }
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
3 N6 h$ {5 B+ x: c6 ?; ^                ]
& G$ i$ _. w" p  ?" E1 X            }
5 z9 G' v3 {/ F9 }        }5 r3 k3 ?: I6 z% `; f
    ],! b& F, i8 [/ m5 m. X$ S
    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
3 [( `7 w7 f+ }$ v. X; I$ v: V. e    "confirmations" : 19,7 ?( q9 |, L5 Y# [, K0 n0 b* h% {
    "time" : 1383235737,# X& O0 S6 O4 Q4 L" l
    "blocktime" : 13832357377 t) D6 d0 \! j" B% E/ W
}, M, U* e# n' r* S, b! s
scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。$ l5 M/ o. b2 Y$ R7 J9 h5 l
签名使用ECDSA算法,对其,“空白交易”签名之,执行:
2 @0 a5 \9 ^& j4 N3 O1 ~& Bbitcoind signrawtransaction \. ^. G8 X+ N/ w) h
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \) U' W# k* Y2 j" h
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'' Q* @5 }" o) E5 S8 u
输出:
* P- z8 ^1 w# O{
4 t# R! x. a9 q& X+ X: Q    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
. k, Z' w7 B. ]  [& i) l    "complete" : true+ v9 _, x6 v8 u' H
}* \5 o4 X, |6 i/ \" G! M! e
签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
/ L' o. A+ s# [* Y; z最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。+ U! G. F! B/ Z8 t4 g7 v
执行:
) f9 A6 s( n! Q3 \5 pbitcoind sendrawtransaction \: U: o9 f2 J1 ?8 E
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
2 F* w7 F. t# c, ?5 e$ }% n输出:* E# `" ^7 W$ j! ]- x8 H
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d; ]  n, o2 k( `9 @
返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。
, u( j: \' q+ u" j合成地址交易! j- Z% y8 p  P0 K" |+ \; w9 T
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:
7 n% p( s! {& W# m* ym {pubkey}...{pubkey} n OP_CHECKMULTISIG7 A) p1 W8 U5 L" M7 {4 ?0 d3 F* l
M和N需满足:
9 B; L: v' h) F2 i! [3 h" P( \1
- P, x- }' {8 f) P9 P# I1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
1 T( s  V) O0 K# J; q3 W1 ~2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;
, S5 W# t; M3 z& L/ [" \3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;0 Y- Y% g5 W% I2 ^  R
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
7 |% y3 t) Z( u# A首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。/ i9 K; E/ h' _! i5 ?1 n4 r* M
# No.1
; Q4 g% }+ D7 M4 z0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU8 l4 N# V$ g3 H, {+ u
# No.2
7 a# b; B/ A7 K' ^) a04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk8 b4 ?7 ?' N- h' [
# No.3
  n1 Y! A; q" j6 Y5 L+ S& x: h. s8 Y  P048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw8 `4 R- z: d: a( G% w6 i, i
使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3., d- b1 d0 V0 `8 L: }
输入:. ~: J& c" s' g! i
bitcoind createmultisig 2 \
9 x0 r& k  K- m2 q'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]') r$ e* r0 r. x4 L
输出:
3 q1 l" g" |! s; |: S8 ]9 i- m{
+ Q2 _: B1 i5 e    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
  _3 y% ?+ ~1 ^. ]* l- {% E    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
4 @- l6 {, x% k+ l" o! Z7 P}
3 e9 O1 L8 Q8 e$ ~得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。/ E* w" A9 j/ d8 B2 M
转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5