Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
189 0 0
交易的构造、签名与广播  t. ^; k( [8 [% L
上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。
! p& t9 p) C/ U# F: y  ^% I; q1 F  W( A普通交易
2 h. w, x6 K" U- i0 I1. 找出未花费的币(unspent output)/ G4 L  q- d) w1 E  a
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
0 y, y( z- @0 Q5 j9 O& m执行:3 `6 ~: V  |; i; h5 b) _: Z$ \2 U
bitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'1 Y# ^; q4 x4 ?
输出:
% k- l+ T/ e; u8 `[
% F  O2 f! P% Y( U2 t! j    {& r5 v( n& O; U7 J/ L
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",- C3 r3 k6 V( k4 Y: J( ^2 E
        "vout" : 0,
* e, E( e0 ^$ u/ S: L1 W% q        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
* f* |- P( H, W        "account" : "",; z8 R7 \3 t! G! D
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
# f& N) z4 B: h0 S6 `% b7 b( [0 H        "amount" : 0.19900000,
6 B! k: }3 T1 y8 ^, {/ b' \        "confirmations" : 1* R6 d$ A6 @$ u8 u! L3 x/ Z
    }6 B$ n( X& l8 I
]
( p. ]3 y/ ]( q# S1 G' p我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
. w7 w: t$ O7 m: j8 x( Y2. 创建待发送交易  ^* T% i) v, U( i: 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 ,将此作为找零发回给自己。; N$ W% w, e- O+ x3 f) i
执行:
' z% X- K( S' A5 G2 U& t, Ubitcoind createrawtransaction \% C" [* r% a& m3 S7 X2 A
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \0 D2 R& s: F" ]3 @
'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'8 h4 a! n8 v; w( a& [# S9 S
输出:
$ K) P( ~+ ?) T6 U010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000: C- |6 j& D4 S: f9 q! \) i' W6 C0 X
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。2 P' w7 A0 h8 _7 f* o4 Y+ v/ V1 h
执行:; N: i3 U& f2 |/ m' I
bitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'
  b6 N! Z6 h! Q+ T" _输出:
- C  o& Z+ ?# h4 Q+ l/ `{
* r' [3 K+ T  C, I    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
8 I7 n& s6 g+ ]4 b% Z    "version" : 1,& F* l7 E6 K) |4 a  q& K7 s+ x4 U
    "locktime" : 0,9 P0 {2 e  }+ c/ V/ c8 W+ h# ?# J* l
    "vin" : [6 x+ v4 V- {, C1 H
        {
# b5 s* ]# P4 ?6 @' k6 A& K            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",$ r, U( V" _3 t
            "vout" : 0,
% D# b" }& ]6 e2 L  x. W0 C            "scriptSig" : {+ s1 w* H( C, O9 q( g' i
                "asm" : "",, g5 C7 I7 h3 a( F
                "hex" : ""0 J4 p7 n' C+ L) }
            },' d% Y8 `, f' C, r: W# |
            "sequence" : 4294967295
4 H& @. C6 x9 `2 U8 p" O        }( T  [4 \" i9 G
    ],
" s# V& ?2 O. L6 k    "vout" : [
$ c/ J% ]9 L! O! D6 _( Y0 I        {2 v' A/ @# F0 N9 C& v' y8 e
            "value" : 0.10000000,
2 L9 K2 L3 @! m+ e# \' J; w            "n" : 0,* J3 b; |& u' c3 r  A" n
            "scriptPubKey" : {
: F- V# s4 C7 p                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",% j. u/ k- X4 |8 r" T+ Y" Z
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
. {" \$ {1 \! o( v) q4 T; n                "reqSigs" : 1,
5 U5 ~5 B7 X: T3 p  E                "type" : "pubkeyhash",/ p  e. _1 M: h& j5 x
                "addresses" : [6 Y6 Z2 R9 U0 l8 Y( c+ g8 {
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"
/ [" `0 N) D7 G  g+ L' k                ]% s  M& I; \/ h0 h* r
            }
1 S# L. [7 k+ h8 h        },
% W1 _0 |- H7 k/ \        {: u# A6 F( r/ D) {- _) ~
            "value" : 0.09890000,8 d! W/ I4 S/ H. [0 z! s
            "n" : 1,8 K* y7 }) v. j5 u3 K& l7 c7 f# {
            "scriptPubKey" : {* P3 |3 U$ _( {$ g/ a- q' U$ }
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
7 d* a8 N7 @3 C( }0 p: u2 L                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
+ W( r, A6 i4 L" p0 {                "reqSigs" : 1,
- k, Q; H+ g& l' u                "type" : "pubkeyhash",) B3 d& f% Z" t9 _2 L0 ?/ I
                "addresses" : [0 @: n) H$ F4 c+ q7 e
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"4 c' V" ^8 x# b1 w( I5 m8 p
                ]
6 L+ Y1 e8 Y$ [* Q* g            }
( _, c1 e7 _# d& M% k6 l) D        }' ^6 y& ?8 a: G6 U0 g! ^
    ], M- j: d' `( W/ A) U8 q
}
( E5 V- {" Y* x3 y2 j) G至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。+ f0 b+ H6 N! M; w/ U# h% y8 `, m2 ~
在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。
7 R7 [0 d  j' s& a3. 签名
) j& @  S) h: G6 |: W  J* l3 l交易签名使用命令:
5 u, r  ?4 x: ^% C- |4 v! C. gsignrawtransaction  \
( i8 n0 m% H- x% Z  |7 m5 M[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \- i& S8 B0 r7 \7 U, m4 m6 J
[sighashtype="ALL"]
) {# s3 h0 }. ]第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;8 k! J. n5 b8 s2 `% H- t4 E# }: q) k" W
第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;
& h) A1 H% \. F) V2 P" L6 U) d

/ |: [  x  w+ y2 [6 u5 t签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
" h+ J! t: G1 }: s$ A* h执行:
. {1 a+ _- Q5 T  dbitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 13 B( ~. P8 `( y0 [& \2 U
输出:- H$ h0 E& g2 G6 u
{5 V6 x$ n& K: B) ^  a8 {. M
    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
1 G! o; n, @8 D7 Q    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
* g3 L, u% b9 l    "version" : 1,
6 |) }* H/ D' l) z" Z9 z$ i    "locktime" : 0,5 V- [% B# [- c1 G2 F
    "vin" : [7 M* S$ b8 }; |& ?. q
        {
, g! Z7 }& R5 g  c7 i  N            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
) e. m$ \8 E) A9 x9 l/ {            "vout" : 0,
; _9 W$ l, k, j$ N  }/ r7 Y; A9 a            "scriptSig" : {- n8 y5 S) M. ]2 y6 O( M. P1 ^
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",  p% P2 s) B* g' ]1 [+ [
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"9 t7 Y: C9 c9 d3 u  j6 Z
            },
8 F$ E- B9 D! O6 j- G$ e            "sequence" : 42949672951 I# a" H' G. e+ \/ W2 z' Y
        }
+ V/ l9 `5 o  k; A9 `9 R* H    ],7 W$ B0 P6 p/ R9 k
    "vout" : [
3 W) p+ W  z, P; v. l4 \5 c        {
" R5 V& ^( W& v, g, \            "value" : 0.19900000,
2 S: S" |" M& z( a            "n" : 0,
& r5 Q8 |* \8 Q8 i% K$ ~            "scriptPubKey" : {
8 A& T% z" B2 l: d) u; O/ f                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",8 h. t# Y( N- }. z
                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",& \" n2 u$ ^# f+ b5 `: u
                "reqSigs" : 1,$ F+ }/ [$ E6 A  X: m0 U  a
                "type" : "pubkeyhash",- e8 _' _+ [% a6 j& ~
                "addresses" : [8 c# D8 Y) J! f
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
: @9 e- C/ K% f0 L  F1 ]1 L8 Z                ]
/ y. J3 L9 L$ T4 v4 Y( F3 l            }2 r4 b( R4 j! K
        }
9 Z3 {! K3 }/ O* m0 v  }$ i    ],
& i1 S2 E, C8 @! t7 c5 i( w    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
# g$ E& E: {  T  f) t& L( k    "confirmations" : 19,
9 `% }: t/ G& a( a    "time" : 1383235737,7 S) j' N0 ?: M  \' ~/ ~) E5 R
    "blocktime" : 1383235737
7 e/ l5 q2 a# Q: f, Z}" b! G, }+ r2 {$ J' O7 h; F
scriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
: a  ~7 W. E$ z# x$ U签名使用ECDSA算法,对其,“空白交易”签名之,执行:
4 g& J, ~9 r  y" t" i6 }bitcoind signrawtransaction \
1 ^; F, B- J" x! |# ^* _  u"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \
* ]1 I1 m! \$ h8 I" ]'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'0 k1 b' l- a; R) M+ e
输出:  [0 V! \( F3 |+ _
{/ X  Q+ ~' j( A8 X0 y
    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",6 [% X2 X+ O9 @( g7 W* Q
    "complete" : true- e* S8 a( }3 L" I
}
" M% z- I8 ~' {1 ]  ?& H签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
4 a3 p) e" n) V8 y, N" f3 d% W最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。
* N: g( c! R& k- F执行:# `1 s9 A8 v, M: g) V& V
bitcoind sendrawtransaction \
5 S7 I4 A5 n( y: o+ K"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"% s7 c; g8 Q1 e8 C$ j) a- u0 I
输出:& u2 A) A1 Y4 Y$ B' y' n- ]4 H
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d
- B5 \6 u" y- B* K  _+ R返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。5 R+ [% n' ?3 k& t5 E  S( p
合成地址交易/ _2 X5 {$ |/ b0 ]6 L
合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:, y. X6 B) j( z
m {pubkey}...{pubkey} n OP_CHECKMULTISIG
- Q( }8 w6 E, f, s+ vM和N需满足:
, p) c; M# D/ ^* ^  t10 u7 r: B8 ?) H0 v
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
7 `$ \6 a9 r6 \" j/ n2 ^2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;; A' E8 o$ ~: v, D+ h( M) t
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;
8 m$ o; [2 i: p/ Y6 [9 k% Q合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.
- G( \: T( ^6 Y; @$ m首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。) W, N  B! u; }9 d
# No.1! n$ ^. m# i+ _+ R
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
- a  W$ V5 @/ g' K# No.2
8 {1 f3 B- Y: `- k04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk9 ~  ]+ }5 x" N/ O
# No.3
) k9 s6 Q+ C# G2 B8 O( I- `8 }048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw
' o+ k2 k2 @7 Y, d% l使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.5 S! i. N8 g$ J7 }/ u
输入:
, N8 b  m* g6 H8 o% a1 qbitcoind createmultisig 2 \
% ?8 z' c$ [. k* x; l'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'
7 S7 I" s: P% J$ T输出:
& D% d6 n- r) F6 f9 y{2 R$ T( u8 }# [  o6 F' g
    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
$ p+ H4 z$ r$ @& R" l" ^    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"
' Z/ X! ~* W8 n& n7 L0 i}/ L: \+ m. O) S- q8 y( P
得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
/ Y1 E/ G# p4 t转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5