主页 > imtoken钱包下载2.0版本 > 比特币交易是什么样的?
比特币交易是什么样的?
交易是什么样的
比特币采用区块链技术,所以它产生的所有区块(一个区块包含很多笔交易)都是透明可查的,你可以进入这个网站:查询。
binfun 选择 BTC 历史区块中的一笔交易:
交易号为: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",
}
]
}
你不是一脸懵逼吗? 这是正确的。 本次交易主要由vin和vout组成。 不懂的话,我们先从熟悉的数字说起:vout中有"value": 0.01500000和"value": 0.08450000。 我理解这两个数字。 这是转账号码。
就是刚才从比特币地址1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK发送到另一个比特币地址1GdK9UzpHBzqzX2A9JFP3Di4weBwqgmoQA的钱。
听说比特币地址是用Base58编码的。 我们不知道Base58编码是什么,也不敢问。 反正估计跟Base64差不多。
于是binfun在不知不觉中从网上下载了一个脚本bitcoin.sh,并对地址进行了Base58解码:
. bitcoin.sh
decodeBase58 1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK
得到了:
007f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a801974ac6
这串十六进制数有点眼熟,是不是跟上面看到的一样
{
"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是交易id的缩写。 我们当前的txid为0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2(下图中简称为txid0627052b)
但是在vin中引用
"txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
(下图中简称为txid7957a35f)
这看起来有点绕,具体含义如下图所示:
所以scriptSig是“解锁脚本”的意思,内容是用户A用自己的私钥签名,证明我是地址A私钥的拥有者,我有权使用地址锁定的余额一种 。
那么问题又来了,用户A的钱是从哪里来的呢? ? ? 事实上,如果一直追根溯源,每个人的比特币最终都来自一个叫做coinbase的特殊交易。 Coinbase交易是没有vin的,coinbase交易是由挖矿的矿工产生的,所以挖出来的币都是“新币”。 用户转出的币,如果追溯上去,都是矿工挖出来的。
解锁和锁定脚本
现在我们知道有解锁资金的解锁脚本和锁定资金的锁定脚本,解锁脚本在“vin”中,锁定脚本在“vout”中。
那么这些脚本是什么样的呢? 比特币交易脚本语言是一种基于堆栈的执行语言,具有反向波兰表达式。
在介绍解锁和锁定脚本之前,我们先介绍一下比特币的私钥、公钥和比特币地址之间的关系。
关于比特币公钥和私钥的特点,你只需要知道这两点:
私钥经过椭圆算法生成公钥,公钥经过哈希算法(即公钥哈希)生成比特币地址。 这个过程是不可逆的,也就是说不能从公钥推导出私钥,但是私钥可以生成公钥。
一段用私钥加密的文本只能用公钥解密,用公钥加密的文本只能用私钥解密。 这是一种非对称加密算法。
vout中一个典型的锁定脚本如下:
OP_DUP OP_HASH160
OP_EQUALVERIFY OP_CHECKSIG
应该注意的是,
它是公钥的哈希值(可以从中得出比特币地址),锁定脚本指定拥有公钥哈希值的私钥的人来解锁脚本。
一个典型的vin中的解锁脚本如下:
解锁脚本提供签名以及
公钥比特币长什么样,签名是用私钥加密交易生成的。
验证脚本时,需要将两个脚本组合起来,如下所示:
OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
以上运行规则类似于逆波兰表达式的栈脚本,流程如下:
首先要验证的是解锁脚本提供的公钥。 执行HASH160哈希运算后,判断是否与锁定脚本中提供的比特币地址(公钥哈希)一致。
然后,验证的是解锁脚本提供的签名。 验证节点将使用公钥对签名进行解密,并确认解密后的文本是否正确。
上面最关键的一点是使用公钥解密签名,这样比特币的拥有者就可以在不泄露私钥的情况下证明所有权,只需要使用私钥生成签名即可。 那么私钥加密的文本是什么呢? 或者换句话说,公钥解密签名后的文字是什么? 好吧,我说的是以下段落的本质:
"scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
以下将txid7957a35f称为交易A,将txid0627052b称为交易B。
从各种来源,我们可以提取以下信息:
那么问题来了,如何用私钥加密交易B——生成签名,然后将生成的签名放入交易B的scriptSig中。
答案是这样的,签名生成的步骤如下:
将对应事务A输出中的锁定脚本填入事务B中的解锁脚本字段。
第一步生成的文本加入little-endian 4字节签名类型0x01(灰色部分),并计算两次SHA256。
然后用私钥对第二步计算出的SHA256文本进行加密,最后得到签名。
从以上步骤可以看出,由于交易B的scriptSig字段在交易A的输出中先填充了locking script,签名生成后比特币长什么样,将签名放在scriptSig中,这样交易B就完全生成! ! !
下图中的sigScript为解锁脚本,pkScript为锁定脚本。
参考资料:http://www.infoq.com/cn/articles/deep-understanding-of-bitcoin-transaction-script
原创不易,“赞”“看”是我的动力!