比特币的交易消息到底长啥样?

比特币的交易消息到底长啥样?

交易(transaction)长啥样

比特币使用的是区块链技术,所以它的所有产生的区块(一个区块里面包含很多条交易)都是透明可查的,可进这个网站:https://btc.com/stats/pool/BTC.com 进行查询。

binfun选取BTC历史区块里面的一条transaction:
https://btc.com/0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2

该条transaction的编号为:0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2

该交易的内容如截图:

比特币的交易消息到底长啥样?

从上图我们可以看到“输入”中的账户1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK把0.1个BTC分别转给了“输出”中的账户1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA(该账户收到了0.01500000个BTC)
和1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK(该账户也就是原账户发送给了自己0.08450000个BTC)。

所以这交易就是账户1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK转了0.015个BTC给1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA。

但是输出中的0.0845 + 0.015 = 0.0995,并不等于0.1啊,这是因为去掉的0.0005就是矿工费。

进一步看看

上面的那张图片实际上把这条交易可视化了,这条交易的真实样子是长这样的:

{ "version": 1, "locktime": 0, "vin": [ { "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18", "vout": 0, "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf", "sequence": 4294967295 } ], "vout": [ { "value": 0.01500000, "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG" }, { "value": 0.08450000, "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG", } ] }

是不是一脸懵逼,懵逼就对了。这条交易主要由vinvout两大块组成。看不懂我们就从似曾相识的数字看起:vout里面有个"value": 0.01500000和"value": 0.08450000,这两个数字我懂,这就是转账数字啊。

就是刚才的比特币地址1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK发送给另一个比特币地址1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA的钱嘛。

听说比特币地址是由Base58编码的,Base58编码是啥咱也不知道,咱也不敢问,反正估计和Base64大差不差。

于是binfun毫不知情地从https://github.com/grondilu/bitcoin-bash-tools上下载了一个脚本bitcoin.sh,一顿猛操作对地址进行Base58解码:

. bitcoin.sh decodeBase58 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK

得到了:

007f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a801974ac6

这串16进制数有点眼熟啊,这不就和上面看到的

{ "value": 0.08450000, "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG", }

7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8

非常接近了,就是多出了头上的"00"和尾巴上的"01974ac6"

其中头上的"00"代表了主网版本号,而"01974ac6"代表了校验和,这个校验和可以由以下python命令生成:

import hashlib import codecs key = codecs.decode('007f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8', 'hex') r = hashlib.new('sha256', key).digest() r = hashlib.new('sha256', r).digest() print(codecs.encode(r, 'hex').decode("utf-8")) 01974ac64161c88c363cc701200f529e517ab8a68d11e5f9e46bdb459cc34cd9

可以看到该校验和由连续两次的sha256后的结果,取该结果的前四个字节,也就是01974ac6

以上过程就是类似比特币地址和比特币公钥的转换过程。

再仔细看看

为了便于理解,我们可以认为在vout中,以上所述的两个比特币地址中分别获得了0.015和0.0845个BTC。

换句话说vout就是把比特币“锁定”在上述两个比特币地址中,上面出现的scriptPubKey就是所谓的“锁定脚本”。

那么vin是干啥的,就是解锁呀,让我们再看一眼vin

"vin": [ { "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18", "vout": 0, "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf", "sequence": 4294967295 } ],

以上的txid是transaction id的缩写,我们当前的txid是0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2
(下图中用txid0627052b简写)

但是vin中却引用了

"txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

(下图中用txid7957a35f简写)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyywwf.html