比特币(btc)交易所钱包开发 - 1 - 认识数据结构

比特币记账方式

比特币和以太坊一样,也是一个账本。不过比特币和以太坊的记账方式差别还是很大的。

以太坊的记账方式是余额,余额以地址一一对应。

比特币的记账方式为UTXO(Unspent Transaction Output),翻译出来大概是未消费交易输出。而地址的余额就是该地址所剩余的所有的UTXO金额的总和。

比特币的交易信息我们可以从区块链浏览器blockchair上查看。

例如,我们查看地址1ANjYHibCQ6FzagLfeXubC8SQYDfUS5wAJ的余额为23,969.00001200 BTC

然后我们查看这个地址的UXTO有4个

我们把这4个UXTO的金额0.00000600+0.00000600+23,968.00000000+1.00000000加起来便是23,969.00001200 BTC

所以比特币没有余额只有UXTO

比特币转账方式

我们再看一眼比特币的交易信息

我们看到,交易分为输入和输出。输入可以有多个,输出也可以有多个。

输入的金额总和-输出的金额总和=手续费。

所以我们需要注意一种情况,比如我们有一个地址1A的UXTO金额为0.5BTC,我们想给地址1B打0.1个BTC。那么在不考虑手续费的情况下,我们则需要构造这样一个交易,注意,程序是不会自动帮我们创建找零输出的

转账详细数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"txid": "766ea01f70f4259597fb6d07af42b9408dfe8147e1fecd6dfd16663054c4b1d6",
"hash": "766ea01f70f4259597fb6d07af42b9408dfe8147e1fecd6dfd16663054c4b1d6",
"version": 1,
"size": 225,
"vsize": 225,
"weight": 900,
"locktime": 0,
"vin": [
{
"txid": "5c2e50b7cb317a36a8fa52d32846727340925cf40868ad47f66ecf9cb2350509",
"vout": 1,
"scriptSig": {
"asm": "30440220344879b01bc208a5e3203505ce3be289fa3ec34e313d35219fee7bb0f4e41f9202204901ce1cf45706695f049df0da70652e98c21814f1f229bbecf6c00b32f4fccf[ALL] 02d62848a4d57a7fb4ff324202084d6ce1b0507d01a30646a96db1d9bdb8b5bb62",
"hex": "4730440220344879b01bc208a5e3203505ce3be289fa3ec34e313d35219fee7bb0f4e41f9202204901ce1cf45706695f049df0da70652e98c21814f1f229bbecf6c00b32f4fccf012102d62848a4d57a7fb4ff324202084d6ce1b0507d01a30646a96db1d9bdb8b5bb62"
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 23968,
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 66d5609d270a82f82fa15e74fce4f27fd178eb1d OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91466d5609d270a82f82fa15e74fce4f27fd178eb1d88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"1ANjYHibCQ6FzagLfeXubC8SQYDfUS5wAJ"
]
}
},
{
"value": 61977.12686354,
"n": 1,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 4d4bbd82d5a2350a4d48922483068f56d43f00dc OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a9144d4bbd82d5a2350a4d48922483068f56d43f00dc88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"183hmJGRuTEi2YDCWy5iozY8rZtFwVgahM"
]
}
}
]
}

vin[].txid 为输入的UXTO的交易id,vin[].vout为交易的输出索引。这两个数据便标示了唯一一个输出。所以这里需要注意,创建交易的输入数据是以之前的交易数据为基础的,而不是以地址为基础的。

vout里主要包含地址和金额两个数据。需要注意的是,这里的地址是一个数组格式,因为这里涉及到多重签名。

这样我们就了解了比特币和以太坊交易的数据结构的区别,而在链的概念上他们基本是相同的。


坚持原创技术分享,您的支持鼓励我继续创作!