A. 比特币交易构成 你知道多少
交易类型
产量交易(Generation)
每个Block都对应一个产量交易(Generation TX),该类交易是没有输入交易的,挖出的新币是所有币的源头。
合成地址交易(Script Hash)
该类交易的接收地址不是通常意义的地址,而是一个合成地址,以3开头,需要几对公私钥一起生成合成地址,在生成过程中可以指定,几对公私钥中的几个签名以后,就可以消费该地址的比特币。
通用地址交易(Pubkey Hash)
该类是最常见的交易类型,由N个输入、M个输出构成。
输入和输出可以御桥旦简单的理解成,发出币的地址就是输入,收到币的地址就是输出。
数据结构
字镇扰段
数据类型
字段大小
字段描述
versionuint32_t
4交易数据结构的版本号tx_in countvar_int1+输入交易的数量tx_intx_in[]41+输入交易的数组,每个输入=41字节
tx_out countvar_int1+输出地址的数量tx_outtx_out[]9+输入地址的数组,每个输入=9字节lock_timeuint32_t4
lock_time是一个多意字段,表示在某个高度的Block之前或某个时间点之前该交易处于锁消慎定态,无法收录进Block。
值
含义
0立即生效 500000000含义为Block高度,处于该Block之前为锁定(不生效)= 500000000含义为Unix时间戳,处于该时刻之前为锁定(不生效)
若该笔交易的所有输入交易的sequence字段,均为INT32最大值(0xffffffff),则忽略lock_time字段。否则,该交易在未达到Block高度或达到某个时刻之前,是不会被收录进Block中的。
示例
为了演示方便,我们读取稍早期的块数据,以高度116219 Block为例。
# ~ bitcoind getblock
{
hash : ,
confirmations : 144667,
size : 1536,
height : 116219,
version : 1,
merkleroot : ,
tx : [
,
,
,
,
],
time : 1301705313,
nonce : 1826107553,
bits : 1b00f339,
difficulty : 68977.78463021,
previousblockhash : ,
nextblockhash :
}
该Block里面有5笔交易,第一笔为Generation TX,解析出来看一下具体内容:
# ~ bitcoind getrawtransaction 1
{
hex : ,
txid : ,
version : 1,
locktime : 0,
vin : [
{
coinbase : 0439f3001b0134,
sequence : 4294967295
}
],
vout : [
{
value : 50.01000000,
n : 0,
scriptPubKey : {
asm : OP_CHECKSIG,
hex : 41ac,
reqSigs : 1,
type : pubkey,
addresses : [
]
}
}
],
blockhash : ,
confirmations : 145029,
time : 1301705313,
blocktime : 1301705313
}
Generation TX的输入不是一个交易,而带有coinbase字段的结构。该字段的值由挖出此Block的人填写,这是一种“特权”:可以把信息写入货币系统(大家很喜欢用系统中的数据结构字段名来命名站点,例如blockchain、coinbase等,这些词的各种后缀域名都被抢注一空)。中本聪在比特币的第一个交易中的写入的coinbase值是:
coinbase:722062616e6b731
将该段16进制转换为ASCII字符,就是那段著名的创世块留言:
The Times 03/Jan/2009 Chancellor on brink of second lout for banks1
接下来展示的是一个三个输入、两个输出的普通交易:
# ~ bitcoind getrawtransaction 1
{
hex : ,
txid : ,
version : 1,
locktime : 0,
vin : [
{
txid : ,
vout : 0,
scriptSig : {
asm : 01 ,
hex :
},
sequence : 4294967295
},
{
txid : ,
vout : 1,
scriptSig : {
asm : 01 ,
hex :
},
sequence : 4294967295
},
{
txid : ,
vout : 1,
scriptSig : {
asm : 1d01 ,
hex :
},
sequence : 4294967295
}
],
vout : [
{
value : 0.84000000,
n : 0,
scriptPubKey : {
asm : OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG,
hex : 76a91488ac,
reqSigs : 1,
type : pubkeyhash,
addresses : [
]
}
},
{
value : 156.83000000,
n : 1,
scriptPubKey : {
asm : OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG,
hex : 76a91488ac,
reqSigs : 1,
type : pubkeyhash,
addresses : [
]
}
}
],
blockhash : ,
confirmations : 147751,
time : 1301705313,
blocktime : 1301705313
}5859606162636465666768
字段hex记录了所有相关信息,后面显示的是hex解析出来的各类字段信息。下面把逐个分解hex内容(hex可以从上面的直接看到):
01000000 // 版本号,UINT32
03 // Tx输入数量,变长INT。3个输入。
/*** 第一组Input Tx ***/
// Tx Hash,固定32字节
00000000 // 消费的Tx位于前向交易输出的第0个,UINT32,固定4字节
8a // 签名的长度, 0x8A = 138字节
// 138字节长度的签名,含有两个部分:公钥+签名
47 // 签名长度,0x47 = 71字节
01
41 // 公钥长度,0x41 = 65字节
ffffffff // sequence,0xffffffff = 4294967295, UINT32, 固定4字节
/*** 第二组Input Tx。与上同理,省略分解 ***/
ffff
/*** 第三组Input Tx ***/
2fffffffff
02 // Tx输出数量,变长INT。两个输出。
/*** 第一组输出 ***/
00bd010500000000 // 输出的币值,UINT64,8个字节。字节序需翻转,~= 0x000000000501bd00 = 84000000 satoshi
19 // 输出目