前四章摘要:http://www.jianshu.com/p/26368d2e1486
第五章 交易
比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络中得以传播和通过验证,并最终添加入全球比特币区块链。
我们将会剖析比特币交易的多种形式、所包含的信息、如何被创建、如何被验证、如何被永久记录。
5.1 比特币交易的生命周期
创建---被一个或多个签名加密--->广播网络中-->被大多数节点接受
5.1.1 创建比特币交易
一笔交易本质上就是一个以货币转移为目的的工具。
比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。一旦一笔交易被创建,而且是合法创建并签名的,则这笔交易就是有效的。
5.1.2 广播交易至比特币网络
本质上,一笔比特币交易只是300-400字节的数据,而且必须被发送到任意一个比特币节点。由于这笔交易是经过签名的且不含任何机密信息、私钥和密码,因此可以被任何潜在的便利网络公开地传播。
比特币交易可以通过未加密网络(WiFi 蓝牙 条形码 等)被发送到比特币网络。甚至可以通过无线电和卫星等方式传输。
5.1.3 比特币交易在比特币网络中的传播
比特币网络是一个P2P网络,意味着每一个节点都连接到一些其他节点上(其他节点是在启动点对点协议的时候被发现的)。
一旦一笔交易被发送到任何一个节点上,就会被该节点验证。如果被验证有效,这个节点就会传播到这个节点所连接的其他节点。同时给予交易发起者以反馈。一般而言,一笔有效的交易在几秒钟之内可以传播到所有节点。
5.2 交易结构
一笔交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从起始点转移到目标地址的代码信息。
大小 | 字段 | 描述 |
---|---|---|
4 字节 | 版本 | 明确这笔交易参照的规则 |
1-9 字节 | 输入数量 | 被包含的输入的数量 |
不定 | 输入 | 一个或多个交易输入 |
1-9 字节 | 输出数量 | 被包含的输出的数量 |
不定 | 输出 | 一个或多个输出 |
4 字节 | 时钟时间 | 一个 UNIX 时间戳或区块号 |
5.3 交易的输出和输入
比特币交易的基本单位是 UTXO (Unspent Transaction Output)未经使用的交易输出。UTXO 是不能再分割、被所有者锁住或记录与区块链中的并被整个网络识别成货币单位的一定量的比特币货币。
实际上,并不存在存储比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。而比特币钱包中的比特币余额是通过扫描区块链并聚合所有属于该账号的UTXO得到的。
一笔交易可以有任意数值,但必须从用户可用的UTXO中创建出来。所有这些复杂的、由可以支付的UTXO完成的组合,都是用户的钱包完成的,用户并不可知。
被消耗的UTXO被称为交易输入,由交易创建的UTXO称为交易输出。通过这种方式,一定量的btc价值在不同所有者之间转移,在交易链中消耗和创建UTXO。通过使用所有者的签名来解锁UTXO,并通过使用新的所有者的比特币地址来锁定并创建UTXO。
一个区块里的首个交易比较特殊,叫 Coinbase 交易,是支付给矿工的。只有输出,没有输入。
5.3.1 交易输出
输出被区块链记录下来,UTXO 被每一个全节点比特币客户端在一个存储于内存中的数据库所追踪,也称为“UTXO集”
交易输出包含两个部分:
- 一定量的比特币,聪 是最小的比特币单位。
- 一个锁定脚本,提出支付输出所必须被满足的条件以“锁住”这笔总额。
5.3.2 交易输入
简单地说,交易输入是指向UTXO的指针。它们指向特定的UTXO,并被交易哈希和在区块链中记录UTXO的序列号作为参
考。
若想支付UTXO,一个交易的输入也需要包含一个解锁脚本,用来满足UTXO的支付条件。解锁脚本通常是一个签名,用来证明对于在锁定脚本中的比特币地址拥有所有权。
5.3.3 交易费
大多数交易包含交易费,这是为了在网络安全方面给矿工的补偿。
交易费作为激励机制,被挖出这个区块的矿工所得,并且记录在区块链中,而交易费基于交易的尺寸,用千字节来计算,而不是比特币的价值。交易费提高会提高处理优先级。
5.3.4 把交易费加到交易中
交易费 = 求和 (所有输入) - 求和(所有输出)
5.4 交易链条和孤立交易
目的:多方交易,保护隐私
如何处理:交易链被传送时并不会按照相同的顺序,在节点收到一个子交易的时候,不会立即抛弃,而是放到一个临时池中,等着接受父交易。没有父交易的交易池被称为孤立交易池。一旦受到父交易,所有与这个父交易创建的UTXO有关的孤立块会释放出来,递归地重新验证。
孤立交易数量(取决于MAX_ORPHAN_TRANSACTIONS)是有限制的,这是为了防止拒绝服务攻击。(Dos)
5.5 比特币交易脚本和脚本语言
脚本创建(锁定与解锁)
比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。
锁定脚本是一个放在一个输入者的“障碍”,明确了花费这比输出的条件。也叫脚本公钥代码。
解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它被允许输出被消费。由于常常包含一个数字签名,称作scriptSig。
随着堆栈的传递被分别执行,首先,执行解锁脚本,如果解锁脚本在执行过程中未报错,主堆栈将被复制,然后脚本将被执行。结果为真,代表该输入是一个能使用该UTXO的有效授权。
比特币脚本语言包含许多操作,但都故意限定为一种重要的方式----没有循环或者复杂流控制功能以外的其他条件的流控制,保证了脚本语言的图灵非完备性,意味着脚本的复杂性有限,交易可执行的次数也可预见。可以防止交易激活机制被当作薄弱环节加以利用。
5.6 标准交易
5.6.1 P2PKH(pay-to-public-key-hash)
比特币网络上大多数交易是这种,含有一个锁定脚本,该脚本由公钥哈希实现组织输出的功能,公钥哈希即为比特币地址。由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥创设的数字签名得以解锁。
5.6.2 P2PK(pay-to-public-key)
与P2PKH相比,P2PK模式更为简单。与P2PKH模式含有公钥哈希的模式不同,在P2PK脚本模式中,公钥本身已经存储在
锁定脚本中,而且代码长度也更短。在coinbase交易中最为常见。
5.5.3 多重签名
M-N组合 多重签名脚本:公钥个数为N,至少需要M个菜可以解锁。
5.6.4 数据输出(OP_RETURN操作符)
OP_Return 允许开发者在交易输出上增加40字节的非交易数据。然后,与伪交易型的UTXO不同,OP_Return 创造了⼀种明确的可复查的⾮交易型输出,此类数据无需存储于UTXO集。 OP_Return 输出被记录在区块链上,它们会消耗磁盘空间,也会导致区块链规模的增加,但它们不存储在UTXO集中,因此也不会使得UTXO内存膨胀,更不会以消耗代价高昂的内存为代价使全节点都不堪重负。
5.6.5 P2SH(pay-to-script-hash)(其实没太看明白)
旨在使复杂脚本的运用能与直接向比特币地址支付一样简单,复杂的锁定脚本被电子指纹所代替,电子指纹为密码学哈希。
将脚本哈希编译为一个地址,P2SH地址是基于Base编码的一个含有20个字节哈希的脚本,就像比特币地址是基于base58编码的一个含有20个字节的公钥。以5开头,
优点:
代码更短,构建脚本任务给接受者