Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

比特币交易构成(二)

梦的衣裳323
278 0 0
交易的构造、签名与广播
5 u  F: Y! w2 M' z上篇介绍了交易结构、签名等,为了更直观的认识比特币,借助bitcoind演示手动构造并广播交易的完整过程。/ |, a! J" }* ~
普通交易
8 W3 R9 t- j* @6 j$ i0 G1. 找出未花费的币(unspent output): e: ~; n1 _2 o  b7 o. ^1 y; o
通过命令:listunspent [minconf=1] [maxconf=9999999] ["address",...]列出某个地址未花费的币(交易),minconf/maxconf表示该笔收入交易的确认数范围,如果需要列出还未确认的交易,需将minconf设置为0。
2 H1 x" J7 j9 V& ^执行:
7 u& ^! J+ J, g* o$ n3 w" o. @bitcoind listunspent 0 100 '["1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"]'1 \; {/ F, @. m- n
输出:4 j. g' }; p% `; N6 m
[4 ~+ {7 p2 E7 F1 O; k
    {* B0 S* b* P- _+ ?, w1 F0 m6 l7 M6 H
        "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
& D6 y: r1 o9 L7 L        "vout" : 0,
: n3 I' ^1 P: F; ^8 n4 Y        "address" : "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3",
" j0 X$ ~2 K3 H5 m! u        "account" : "",  G8 u, Y( h1 ?
        "scriptPubKey" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",. ?) X" ~( j' @
        "amount" : 0.19900000,
( F8 p, l4 G% C: }- t        "confirmations" : 15 C8 W* \" K( W$ C$ p( L' ?: E4 e
    }- N* G" t7 _0 \& k
]* X+ S7 \/ f% s% j6 A$ y' g; I3 `9 U
我们找到该地址的一个未花费交易,位于交易296ea7bf981b4499…9f0a41e589132156的第0个位置。
2 E3 J4 R6 l$ q/ i( |2 ]2. 创建待发送交易7 |- f+ u: o9 L+ h2 z- O
创建待发送交易,由命令: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 v) [! H5 O! P# U% O; \$ e  E执行:
) A1 L( N8 J2 F  {' lbitcoind createrawtransaction \5 T+ q8 Z. U+ C2 |7 W8 S
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0}]' \7 Q. `0 t" t. n; d4 F( l: R4 @2 n3 }& y
'{"1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x":0.1, "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3":0.0989}'
/ q' ?; x1 R  w) z4 V: T! T输出:" l$ z4 J4 Y3 i8 G
010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000/ k; K) g  Y. |/ ~4 G
通过命令:decoderawtransaction ,可以将此段十六进制字符串解码。
$ X0 y$ o8 [& R, I( a" Z! o8 ^( q执行:
" e  _" l5 p8 k; sbitcoind decoderawtransaction '010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000'
" R  J, Z% V( z: m输出:% N1 F, B. m: y1 g% g$ f0 ^3 D
{
6 v4 Z; e0 N$ m$ j8 z1 m( `) B1 S    "txid" : "54f773a3fdf7cb3292fc76b46c97e536348b3a0715886dbfd2f60e115fb3a8f0",
0 ?$ s# r$ y1 v1 L6 ]2 s* A9 k    "version" : 1,
* `! s4 S1 e1 e; I+ O: o    "locktime" : 0,
5 l0 }+ q! ~: w+ Y) `- X" {+ f    "vin" : [) N/ P$ h' w0 g  e8 B: p( f
        {4 Y9 b$ |# Y  d& k: o  @
            "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",
- M3 F( _& u! o- s            "vout" : 0,
  g" B3 q* G. M/ e# }9 |3 a            "scriptSig" : {4 ?: E2 E- `; U
                "asm" : "",
; Z* T0 m8 [, c; q                "hex" : ""
/ Z% C* S& S8 T# U( {% y' C7 @+ H! x            },  {* ^9 ?2 Y  B9 I
            "sequence" : 42949672955 M1 y* ]. f- X  H
        }+ @  b( z- E) b6 o3 K  o3 c
    ],
4 E" V+ y, ^6 Z& T/ l    "vout" : [
8 X- |& K% y1 q7 j+ G        {/ y2 }# g; D4 L# X( @
            "value" : 0.10000000,, K0 ?2 [0 `9 c1 r$ n1 ~! s  k
            "n" : 0,
0 z3 f4 n. f$ O! `; m, x0 h            "scriptPubKey" : {
5 f) {' L6 Z2 B" E' }/ d8 E' b( X                "asm" : "OP_DUP OP_HASH160 fdc7990956642433ea75cabdcc0a9447c5d2b4ee OP_EQUALVERIFY OP_CHECKSIG",+ e( K$ Z) `1 O' z( p2 F
                "hex" : "76a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88ac",
- b0 n; ?  l$ U! G                "reqSigs" : 1,% @* W% B* K, f$ X' v$ D
                "type" : "pubkeyhash",7 F( y+ T# h4 G; S6 g& C$ W6 T
                "addresses" : [* t+ d/ |& C: }7 L
                    "1Q8s4qDRbCbFypG5AFNR9tFC57PStkPX1x"8 A1 G$ \4 J6 E" D( j2 _
                ]- A  I8 j+ }& \( X  }! w& U
            }
8 s8 X. l4 y  P- M) o! S# O7 F! D        },
2 x" O# }8 Z( F3 y        {" Z7 s) z9 `# ^3 o3 b
            "value" : 0.09890000,, j$ o- R5 o2 v  U! q0 K* {
            "n" : 1,
  `- D& T; H$ j& z: z3 x0 H            "scriptPubKey" : {. A/ L1 e8 U) ~' B
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
5 t0 T) i2 ^5 N                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",
" g- u" @, g( g4 P) k2 g                "reqSigs" : 1,$ d8 P2 e2 \  m! G+ V
                "type" : "pubkeyhash",
! j$ Q1 F. O/ p+ B; [                "addresses" : [; d' {# ~9 B& x
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
8 k# _& \! q* b/ C/ J3 `" o                ]( {2 t  K5 m# X6 Y+ a. _, A& {2 ?
            }
& V  k' y0 z& S, [- W+ L4 r. l        }( u& i. L3 @% F8 d5 g" X6 w
    ]
+ Z/ u2 m& J; \, o}, P% P" j& {1 N2 Q/ P
至此,一个“空白交易”就构造好了,尚未使用私钥对交易进行签名,字段scriptSig是留空的,无签名的交易是无效的。此时的Tx ID并不是最终的Tx ID,填入签名后Tx ID会发生变化。
' ~& I+ o9 p3 ^9 s9 I; K在手动创建交易时,务必注意输入、输出的值,非常容易犯错的是忘记构造找零输出(如非必要勿手动构造交易)。曾经有人构造交易时忘记找零,发生了支付 200 BTC 的矿工费的人间惨剧,所幸的是收录该笔交易的Block由著名挖矿团队“烤猫(Friedcat)”挖得,该团队非常厚道的退回了多余费用。' L  |9 L1 M! v1 ~
3. 签名
3 ~0 q- c5 {+ S- d  J0 d& X9 |交易签名使用命令:1 ]( k+ }7 I2 x0 W
signrawtransaction  \
$ c8 z$ [' F( y. ~3 t[{"txid":txid,"vout":n,"scriptPubKey":hex,"redeemScript":hex},...] [,...] \
5 {9 T" u5 Y+ Y" W[sighashtype="ALL"]/ r4 s4 W+ T+ e5 u4 ~4 X
第一个参数是创建的待签名交易的十六进制字符串;第二个参数有点类似创建交易时的参数,不过需要多出一个公钥字段scriptPubKey,其他节点验证交易时是通过公钥和签名来完成的,所以要提供公钥;如果是合成地址,则需要提供redeemScript;
5 [1 r8 |; k: b: ^; b' Z9 u第三个参数是即将花费的币所在地址的私钥,用来对交易进行签名,如果该地址私钥已经导入至bitcoind中,则无需显式提供;
最后一个参数表示签名类型,在上一篇里,介绍了三种交易签名类型;& |) @4 D3 P, ?

) ?+ ?$ F2 O* F3 {! O4 l签名之前需要找到scriptPubKey,提取输入交易信息即可获取(也可以根据其公钥自行计算),由命令:getrawtransaction  [verbose=0]完成。
5 F( p, g6 v1 m# o! k执行:
3 V) ]& I5 M$ I: Mbitcoind getrawtransaction 296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156 1$ U( r, _5 E4 F% {# G
输出:+ v: w" i' ]) M6 S3 @
{
5 X' c# W5 ?7 R3 K" F0 M    "hex" : "01000000010511331f639e974283d3909496787a660583dc88f41598d177e225b5f352314a000000006c493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4ffffffff0160a62f01000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",7 M3 g5 L/ Q: S( X: n+ F3 C
    "txid" : "296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156",* g- d# v) ^2 N2 B0 _0 g: O6 M
    "version" : 1,
8 ?, J, L3 C# _    "locktime" : 0,
$ h* V. f, u$ _& ]; W    "vin" : [$ K7 K7 W/ G+ I# N. F
        {
: H& l! ?) H+ O: J& Q# Q. F: X            "txid" : "4a3152f3b525e277d19815f488dc8305667a78969490d38342979e631f331105",
9 W; e6 t  p9 M, C! E! J0 |' s            "vout" : 0,9 V+ ^- l& T' U3 _2 c" J& N
            "scriptSig" : {- X# D# ~$ F$ p8 N3 R
                "asm" : "3046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d401 03cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4",, I1 U0 V7 e. g' J
                "hex" : "493046022100be8c796122ec598295e6dfd6664a20a7e20704a17f76d3d925c9ec421ca60bc1022100cf9f2d7b9f24285f7c119c91f24521e5483f6b141de6ee55658fa70116ee04d4012103cad07f6de0b181891b5291a5bc82b228fe6509699648b0b53556dc0057eeb5a4"
. ?1 w4 C; W+ ~* H# R( G            },, j) f7 m! o: j2 f) T  x" B2 _/ e
            "sequence" : 4294967295, U; E) _* C% y9 v, I
        }
8 @4 |0 ^+ v+ V4 x; u/ I1 j8 z    ],: j  s- w4 j& }' ]9 Y$ T
    "vout" : [" }: O7 x1 o" d) L
        {
' w+ `! U. S3 ^5 R" L            "value" : 0.19900000,
0 Q5 E  o7 x5 f. G$ x" w+ a            "n" : 0,. N# A5 G/ {! t  |
            "scriptPubKey" : {1 o. l4 w/ F/ ?/ V* f4 p, ^
                "asm" : "OP_DUP OP_HASH160 d6c492056f3f99692b56967a42b8ad44ce76b67a OP_EQUALVERIFY OP_CHECKSIG",
' ~: u6 l6 D, |, G: m                "hex" : "76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac",' y/ [2 y  G. w" Z
                "reqSigs" : 1,# [) f; r; n# }. v$ E9 `
                "type" : "pubkeyhash",
- G9 Y7 ?8 w& w1 f- w1 P                "addresses" : [/ F/ |2 d: n/ v4 j7 H4 o
                    "1Lab618UuWjLmVA1Q64tHZXcLoc4397ZX3"
4 N* T1 L% v: @' A                ]9 c  S. Y0 q; W2 L
            }
; W1 l6 N$ T, @        }6 L5 o; W: ?+ ~7 Z
    ],
! v) c" T* t! y, M0 |, M9 [6 U    "blockhash" : "000000000000000488f18f7659acd85b2bd06a5ed2c4439eea74a8b968d16656",
" A" G1 a3 I  N    "confirmations" : 19,) z. x% j5 l; n5 w  W. `
    "time" : 1383235737,
$ b& H/ a# F6 n9 V    "blocktime" : 1383235737
1 x1 @3 a) p* X+ g/ y3 W; T# w}
4 e5 j/ K8 q; N  y- ZscriptPubKey位于”vout”[0]->”scriptPubKey”->”hex”,即: 76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac 。
7 p  b* B' z* N7 t1 e2 P签名使用ECDSA算法,对其,“空白交易”签名之,执行:8 f% A% i0 _! q7 H" y( @
bitcoind signrawtransaction \
2 u9 j0 Q/ B1 t"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e290000000000ffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000" \' N: z1 R( I$ M5 C: f
'[{"txid":"296ea7bf981b44999d689853d17fe0ceb852a8a34e68fcd19f0a41e589132156","vout":0,"scriptPubKey":"76a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac"}]'- t/ x5 n* x5 i; o. a
输出:
6 w( s3 T: H( O& [5 W{
/ t9 `) @6 U8 g$ j* g" N    "hex" : "010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000",
8 M9 Y4 e" v& [3 e3 Q* K% w% A% O    "complete" : true
7 I7 u. r; Y5 c2 r}
  X, V2 T6 a+ y" ^+ P$ c0 J# p5 c签名后,签名值会填入上文所述的空字段中,从而得到一个完整的交易。可通过上文介绍的命令decoderawtransaction 解码查看之。
! j3 t8 b1 I* A9 p# w1 {最后一步,就是将其广播出去,等待网络传播至所有节点,约10~60秒广播至全球节点,取决与你的节点的网络连接状况。稍后一些时刻,就会进入Block中。广播由命令sendrawtransaction 来完成。如果没有运行节点,可以通过公共节点的API进行广播,例如:blockchain.info/pushtx。* Z! [( R5 Z" A- G$ D- b1 m
执行:
: r$ ^& u. f* W  j: l8 \& Tbitcoind sendrawtransaction \/ c$ @, h" g7 j* [. M2 p
"010000000156211389e5410a9fd1fc684ea3a852b8cee07fd15398689d99441b98bfa76e29000000008c493046022100f9da4f53a6a4a8317f6e7e9cd9a7b76e0f5e95dcdf70f1b1e2b3548eaa3a6975022100858d48aed79da8873e09b0e41691f7f3e518ce9a88ea3d03f7b32eb818f6068801410477c075474b6798c6e2254d3d06c1ae3b91318ca5cc62d18398697208549f798e28efb6c55971a1de68cca81215dd53686c31ad8155cdc03563bf3f73ce87b4aaffffffff0280969800000000001976a914fdc7990956642433ea75cabdcc0a9447c5d2b4ee88acd0e89600000000001976a914d6c492056f3f99692b56967a42b8ad44ce76b67a88ac00000000"
2 q$ ?5 o0 P/ c/ B) W. D; n- c9 J* {输出:1 O1 f% |! Z$ j/ I: B
b5f8da1ea9e02ec3cc0765f9600f49945e94ed4b0c88ed0648896bf3e213205d; c* S" c$ f. u" E: g) ]& F7 C
返回的是Transaction Hash值,即该交易的ID。至此,交易构造、签名、发送的完整过程完成了。2 ^2 ~2 K3 V8 T1 U
合成地址交易
7 q) J" J5 |" [5 E# z6 u合成地址以3开头,可以实现多方管理资产,极大提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个M-of-N的模式:
6 ^. T/ ^$ m7 {$ v9 h7 Q9 T. pm {pubkey}...{pubkey} n OP_CHECKMULTISIG- ?- ?0 E) d3 q1 D3 s! X
M和N需满足:
& S  A8 Z& u6 K, G, p2 ~7 V1! f. V* f/ K' f6 P6 Y- P" g
1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把都可以保障不受损失;
  {! h- G, X% I. q' m5 W7 S) h2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥任意2把私钥可签名发币,三方不完全信任的情形,即中介交易中,非常适用;5 H2 v7 y/ i, U  O: P) {
3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用多方共同管理重要资产,但任何一方遗失私钥均造成严重损失;& Y7 g% ^" ?# j3 T4 V$ M# {! F7 R
合成地址的交易构造、签名、发送过程与普通交易类似,这里只介绍如何创建一个合成地址。大神Gavin Andresen已经演示过,下面内容摘自其gist.0 l( N+ r/ O# o( p# s+ n  S
首先,需要三对公钥、私钥。公钥创建地址、私钥用于签名。
# E* ]  G9 l1 t; [. C# No.1$ o7 R- G& v# d
0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86 / 5JaTXbAUmfPYZFRwrYaALK48fN6sFJp4rHqq2QSXs8ucfpE4yQU
5 o% w- b5 R" R2 O0 d/ I4 u. y9 a# No.2 * ~' g8 T. I+ a3 m) G# w
04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874 / 5Jb7fCeh1Wtm4yBBg3q3XbT6B525i17kVhy3vMC9AqfR6FH2qGk
. O$ p- d8 O* D) n( y: h# No.34 J" _( |: {3 }2 m" t7 G, m# O
048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213 / 5JFjmGo5Fww9p8gvx48qBYDJNAzR9pmH5S389axMtDyPT8ddqmw% h4 v- S9 v5 d* Y" W" S; ~' Z
使用命令:createmultisig  来合成,其中key为公钥,创建地址时仅需公钥。创建类型是2 of 3.
! R7 z6 J8 T5 y) _2 f# n7 Z8 u输入:$ [: s+ b: v  l) X; p
bitcoind createmultisig 2 \- ?5 G" G0 K( u
'["0491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f86","04865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec6874","048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d46213"]'
1 `+ i3 J8 h. @输出:4 ~. U" U. j5 l! V: H- K8 m. G3 m
{
( D, ^5 v0 q2 a4 o8 U. ^    "address" : "3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC",
4 n( ]; a- q' z& ~) Q: I    "redeemScript" : "52410491bba2510912a5bd37da1fb5b1673010e43d2c6d812c514e91bfa9f2eb129e1c183329db55bd868e209aac2fbc02cb33d98fe74bf23f0c235d6126b1d8334f864104865c40293a680cb9c020e7b1e106d8c1916d3cef99aa431a56d253e69256dac09ef122b1a986818a7cb624532f062c1d1f8722084861c5c3291ccffef4ec687441048d2455d2403e08708fc1f556002f1b6cd83f992d085097f9974ab08a28838f07896fbab08f39495e15fa6fad6edbfb1e754e35fa1c7844c41f322a1863d4621353ae"% H* W: @2 K5 b
}
. A* |* y7 C% a9 T# R5 P5 j得到的合成地址是:3QJmV3qfvL9SuYo34YihAf3sRCW3qSinyC,该地址没有公钥,仅有redeemScript,作用与公钥相同。后续的构造、签名、发送过程与上文普通地址交易类似,略去。
. A( c/ h) o' y$ ~' ~- o转自比特币实验室
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

梦的衣裳323 小学生
  • 粉丝

    0

  • 关注

    0

  • 主题

    5