比特币交易(二)
在上篇文章中,着重介绍了数字签名,在这篇文章中,深入到比特币交易源码的部分进行探究,并回答以下问题:
- 如何给电子货币一个单位。
- 如何将一个电子货币进行分割成多个电子货币。
- 如何将多个电子货币进行整合成一个电子货币。
- 如何表示一个没有被花费电子货币。
- 电子货币的交易流程是什么。
定义
有一些关键词,翻译成中文后,完全失去了原来的意思了。本文约定关键词如下:
- 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's 将他的数字签名和 Owner 1's 的公钥附在了第一笔交易的尾端(从左到右)
- 比特币系统验证无误后,这枚电子货币就属于了 Owner 1's。
- Owner 1's 将他的数字签名和 Owner 2's 的公钥附在了第二笔交易的尾端
- 比特币系统验证无误后,这枚电子货币就属于了 Owner 2's。
- 第三笔交易也是类似...
使用电子货币进行交易
在比特币中,一枚电子货币的价值由 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。
交易的数据格式
下图这是一笔早期比特币交易。
主要包含四个独立的部分:
- 黄色部分表示的是: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。
参考文章: