目录
0、比特币交易流程
从交易的生命周期来看,比特币系统的交易流程如下步骤:
(1)源节点创建交易,并验证目的节点的地址;
(2)源节点对交易进行签名加密;
(3)源节点将该交易进行广播至全网其他节点;
(4)全网节点接收交易并验证其有效性,直到该交易被全网大多数节点验证和接受;
(5)交易暂存于节点内存池,并判断是否孤立交易;
(6)交易被打包至节点本地区块中;
(7)全网共识结束后,获胜节点将其本地区块追加到主链;
(8)交易在主链上被越来越多的后续区块确认。
对于区块链的运行过程可以分为:交易生成、网络传播与验证、交易池管理、交易优先级排序、交易手续费定价、共识竞争与构建区块、难度调整机制、分叉处理与主链判定。
1、生成交易
源节点的钱包将会创建一个新的交易,该交易中使用的比特币来自于节点的一个或多个UTXO(未花费的交易输出,Unspent Transaction Output)。源节点将目的节点的公钥作为交易的参数,同时使用自己的私钥对生成的新交易进行签名。
与以太坊等区块链系统采用的账户模型不同,比特币系统并没有账户和余额的概念,而是采用UTXO来记录比特币资产的归属和计算账户的余额。
2、网络传播与验证
传播:交易被创建后,就由源节点广播发送至比特币网络。由于比特币网络是P2P网络,交易的传播采用Gossip协议,由源节点首先发送至其相邻节点,这些相邻节点再次将交易转发给他们的相邻节点。以此类推,一笔交易可以在极短时间内以指数级扩散的速度在全网传播,直到所有连接到网络的节点都接收到它,从而最终传递到目的节点。
验证:每个比特币节点在接收到一笔交易后,都会独立地对交易的有效性进行验证,验证规则(验证机制)。
验证机制:以比特币网络为例,节点接收到邻近节点发来的数据后,首要工作就是验证数据的有效性。矿工节点会收集和验证P2P网络中广播的尚未确认的交易数据,并对照预定义的标准清单,从以下几个方面对数据进行有效性验证:
(1)验证区块大小在有效范畴;
(2)确认数据区块数据结构的有效性;
(3)验证区块至少含有一条交易;
(4)验证第一个交易是CoinBase交易,有且仅有一个。
(5)验证区块头部的有效性;
①确认区块版本号是本节点可兼容的;
②区块引用的前一区块是有效的;
③区块包含的所有交易构建的默克尔树是正确的;
④时间戳合理;
⑤区块难度与本节点计算的相符;
⑥区块哈希值满足难度要求。
(6)验证区块内的交易有效性。
-检查交易语法正确性;
-确保输入与输出列表都不能为空;
-lock_time小于或者等于INT_MAX,或者nLockTime和nSequence的值满足MedianTimePast(当前区块之前的11个区块时间的中位数)。
-交易的字节大小大于等于100。
-交易中签名数量小于签名操作数量上限(MAX_BLOCK_SIGOPS)。
-解锁脚本(scriptSig)只能够将数字压入栈中,并且锁定脚本(scriptPubkey)必须要符合isStandard的格式。
-对于coiinbase交易,验证签名长度为2~100字节。
-每个输出值,以及总量,必须在规定值的范围内(不超过全网总币量,大于0)。
-对于每个输入值,如果引用的输出存在内存池中任何的交易,该交易将被拒绝。
-验证孤立交易。
-如果交易费用太低(低于minRelayTxFee)以至于无法进入一个空的区块,则交易将被拒绝。
-每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。
-如果不是coinbase交易,则确认交易输入有效,对于每一个输入:
——验证引用的交易存于主链;
——验证引用的输出存于交易;
——如果引用的是Coinbase交易,确认至少获得COINBASE_MATURITY(100)个确认;
——确认引用的输出没有被花费;
——验证交易签名有效;
——验证引用的输出金额有效;
——确认输出金额小于等于输入金额(差额即为手续费)。
-如果是Coinbase交易,确认金额小于等于交易手续费与新区块奖励之和。
3、交易池管理
节点验证交易后,会将有效的交易添加到自己的内存池中,内存池是节点维护的一份未确认交易的临时列表,其主要功能是暂时存放那些已在网络中广播但尚未打包到区块中的待确认有效交易;这些交易将会在内存池中等待矿工将它们打包,封装到下一个区块中。内存池存储在节点本地内存而不是硬盘中。
4、交易优先级排序
交易优先级=((UTXO交易额*UTXO存在时间))/交易的字节长度;
5、交易手续费定价
比特币系统采用0.576作为交易的基准优先级,如果交易优先级小于该基准优先级则会被收费。
6、共识竞争与构建区块
一般说来,PoW共识中每个矿工都重复性的完成如下步骤,最快搜索到符合要求的随机数Nonce的矿工获胜并取得记账权:
步骤1:搜集当前时间段的全网未确认交易,并增加一个用于发行新比特币奖励的Coinbase交易,形成当前区块体的交易集合;
步骤2:计算区块体交易集合的默克尔根记入区块头,并填写区块头的其他元数据,其中随机数Nonce置为零。
步骤3:随机数Nonce加1;
步骤4:如果一定时间内未成功,则更新时间戳和未确认交易集合,重新计算默克尔根后继续搜索。
7、难度调整机制
难度是区块链系统的重要参数,用来度量矿工成功挖到下一个区块的难易程度。比特币的全网难度随区块头目标值的变化而变化,目标值越小,难度值越大。
当前区块难度Difficulty=(创世区块Target)/(当前区块Target)
区块链的网络难度并非一成不变,而是根据网络算力的情况不断调整。
8、分叉处理与主链判断
如果多个矿工节点在同一时间段内成功搜索到符合哈希结果要求的随机数,则这些矿工都将认为自己在共识竞争中获胜并向比特币网络中广播其构造的区块,从而产生在同一区块高度出现多个不同的有效区块的情况,即产生分叉现象。
为保证区块链系统中仅有唯一的主链,必须定义合适的主链判断准则来从多个分叉链中选择符合条件的唯一主链。此时不在主链上的区块将成为“孤块”,发现孤块的矿工节点也不会得到相应的比特币奖励。因此,区块链的形状并非单一的“链条”,而是一个树状结构。每个共识轮次对应的时间点上仅有唯一区块是有效的,因而树状结构中也仅有唯一的主链条。
比特币中根据“最大工作量原则”确定主链。