在上篇文章中,着重介绍了数字签名,在这篇文章中,深入到比特币交易源码的部分进行探究,并回答以下问题:
- 如何给电子货币一个单位。
- 如何将一个电子货币进行分割成多个电子货币。
- 如何将多个电子货币进行整合成一个电子货币。
- 如何表示一个没有被花费电子货币。
- 电子货币的交易流程是什么。
定义
有一些关键词,翻译成中文后,完全失去了原来的意思了。本文约定关键词如下:
- inputs: 交易输入的集合,由一个或多个 input 组成
- input: 一个交易输入。一个交易输入通常是由一个 UTXO 和数字签名等信息组成
- outputs: 交易输出的集合
- output: 交易输出的新的电子货币。通常是由电子货币的值和验证数字签名的脚本组成
- double-spend: 双花。一枚电子货币可能被两次或多次
- UTXO: Unspent Transaction Output 的缩写。通常引用一个 output
- tx: Bitcoin transaction 的缩写。交易。
- txid: Transaction id 的缩写。指的是交易的 hash 值。
- satoshi: 1 BTC = 100,000,000 satoshi
电子货币
比特币白皮书中对电子货币进行了定义:
将一枚电子货币定义为数字签名链( a chain of digital signatures)。电子货币从所有者转移给下一个人是通过,所有者使用私钥,对交易 Transactions 和下一个人的公钥进行数字签名,并将数字签名附在这枚电子货币(数字签名链)的后面。收款人对数字签名进行检验,就能校验自己是否收到了电子货币。
一枚电子货币,从被创造出来开始,在不断地被交易,被附上数字签名。我们可以等价的认为一枚电子货币,就是一条数字签名链。如:
- Owner 0 将他的数字签名和 Owner 1 的公钥附在了第一笔交易的尾端(从左到右)
- 比特币系统验证无误后,这枚电子货币就属于了 Owner 1。
- 此时 Owner 1 拥有的电子货币为: ... => Owner 0
- Owner 1 将他的数字签名和 Owner 2 的公钥附在了第二笔交易的尾端
- 比特币系统验证无误后,这枚电子货币就属于了 Owner 2。
- 此时 Owner 2 拥有的电子货币为: ... => Owner 0 => Owner 1
- 第三笔交易也是类似...
使用电子货币进行交易
在比特币中,一枚电子货币的价值由 value 来衡量,单位是 satoshi。1 BTC = 100,000,000 satoshi。一笔交易本质就是价值的转移,即所有者对他的一枚或多枚电子货币进行数字签名,即 inputs。比特币系统验证后,创建一枚或多枚属于收款人的电子货币,即 outputs。注意一枚电子货币,就像一张人民币一样,不能撕开成两半用,但是可以将其兑换成若干个等值的电子货币。
举个例子:Alice 支付 Bob 价值 0.2 BTC 的电子货币,Bob 收到一个 0.15 BTC 的电子货币,并且找零给 Alice 一个 0.05 BTC 的电子货币。
- Alice 创建一次交易。
- Alice 选择一枚价值 0.2 BTC 的电子货币作为本次交易的 inputs。
- Alice 付给 Bob 一枚价值 0.15 BTC 的电子货币,并找零给自己 0.05 BTC 的电子货币,这部分是本次交易的 outputs。
- 比特币系统验证通过后,Bob 就收到了一枚 0.15 BTC 的电子货币。
当这笔交易结束后,Alice 那一枚 0.2 BTC 的电子货币,就被比特币系统这个“造币厂”作废了,而“造币厂”同时发行两枚新的电子货币,一枚 0.15 BTC 的电子货币给了 Bob,一枚 0.05 BTC 的电子货币找零给了 Alice。只有不被“造币厂”作废的电子货币,才能用于交易,这样就能够防止 double-spend。“造币厂”发行的电子货币称为 output,其中,没有作废的电子货币称为 Unspent Transaction Output,缩写为 UTXO。
交易的数据格式
下图这是一笔早期比特币交易。
image.png主要包含四个独立的部分:
- 黄色部分表示的是:hash - txid(Transaction ID)
- 蓝色大括号表示的是:交易的描述信息和元数据
- 粉红色部分表示的是:inputs
- 绿色部分表示的是:outputs
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。这样,每一个Tx Input都和之前的某个Tx Output关联了起来。这就在代码层面上定义了一条数字签名链即一枚电子货币。
image.png虽然本节谈论的是电子货币,但重心却在于交易,这是因为货币本身依附于交易而存在的。
我是这样理解的货币的。财富是一切能够满足人类物质需求和精神需求的事物。在财富的需求端,人类对财富的种类需求各式各样,张三需要吃饱,李四想要精神自由。在财富的生产端,由于生产要素的不同和社会分工的存在,生产的财富种类也各式各样。货币的诞生,就是是为了满足人类对财富交易的需求。因此我们可以说,货币的本源是交易,而不是一般等价物的本身。在探究比特币系统的实现上,我们也可以发现它淡化了“货币”的概念,专注于“交易”本身。
参考文章:
Bitcoin: A Peer-to-Peer Electronic Cash System
How a Bitcoin Transaction Works
比特币源码研读班-蒋宏伟
网友评论