sanshamo 2019-06-26
在上篇文章中,着重介绍了数字签名,在这篇文章中,深入到比特币交易源码的部分进行探究,并回答以下问题:
有一些关键词,翻译成中文后,完全失去了原来的意思了。本文约定关键词如下:
比特币白皮书中对电子货币进行了定义:
将一枚电子货币定义为**数字签名链**( a chain of digital signatures)。电子货币从所有者转移给下一个人是通过,所有者使用私钥,对交易 Transactions 和下一个人的公钥进行数字签名,并将数字签名附在这枚电子货币(数字签名链)的后面。收款人对数字签名进行检验,就能校验自己是否收到了电子货币。
一枚电子货币,从被创造出来开始,在不断地被交易,被附上数字签名。我们可以等价的认为一枚电子货币,就是一条数字签名链。如:
在比特币中,一枚电子货币的价值由 value 来衡量,单位是 satoshi。1 BTC = 100,000,000 satoshi。一笔交易本质就是价值的转移,即所有者对他的一枚或多枚电子货币进行数字签名,即 inputs。比特币系统验证后,创建一枚或多枚属于收款人的电子货币,即 outputs。注意一枚电子货币,就像一张人民币一样,不能撕开成两半用,但是可以将其兑换成若干个等值的电子货币。
举个例子:Alice 支付 Bob 价值 0.2 BTC 的电子货币,Bob 收到一个 0.15 BTC 的电子货币,并且找零给 Alice 一个 0.05 BTC 的电子货币。
当这笔交易结束后,Alice 那一枚 0.2 BTC 的电子货币,就被比特币系统这个“造币厂”作废了,而“造币厂”同时发行两枚新的电子货币,一枚 0.15 BTC 的电子货币给了 Bob,一枚 0.05 BTC 的电子货币找零给了 Alice。只有不被“造币厂”作废的电子货币,才能用于交易,这样就能够防止 double-spend。“造币厂”发行的电子货币称为 output,其中,没有作废的电子货币称为 Unspent Transaction Output,缩写为 UTXO。
下图这是一笔早期比特币交易。
主要包含四个独立的部分:
transaction 的一般格式
名称 | 描述 |
---|---|
version | 比特币系统的版本号 |
hash | 本次交易的 hash 值 |
inputs | 由 input 组成的数组 |
outputs | 由 output 组成的数组 |
lockTime | 值为 0,立刻执行交易;值不为 0,在指定区块高度或时间戳执行交易。 |
output 的数据格式
名称 | 描述 |
---|---|
value | 电子货币的价值,单位 BTC |
scriptPubKey | 通常是收款人公钥等组成的锁定脚本 |
input 的数据格式
名称 | 描述 |
---|---|
prevTxId | 上一笔交易的 hash 值 |
outputIndex | 上一笔交易 outputs 的 index |
scriptSig | 通常由付款人的数字签名和收款人的公钥等组成的解锁脚本。 |
注意,input 实际上是一个引用。在计算交易时,是通过 prevTxId 和 outputIndex 属性,找到上次交易的 output 作为本次交易实际的 input。
参考文章: