主页 > 下载imtoken钱包20app > 区块链运行过程记录
区块链运行过程记录
目录
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的矿工获胜,获得记账权:
第一步:收集当前时间段内全网未确认的交易,添加一个用于发放新的比特币奖励的Coinbase交易,形成当前区块体的交易集;
第二步:计算出区块体交易集的默克尔根并记录在区块头中,并填写区块头的其他元数据,其中随机数Nonce设置为零。
第三步:随机数Nonce加1;
第四步:如果在一定时间内失败,则更新时间戳和未确认交易集合,重新计算Merkle根,继续查找。
7.难度调整机制
难度是区块链系统的一个重要参数,用来衡量矿工成功挖到下一个区块的难易程度。 比特币全网难度随着区块头的目标值而变化。 目标值越小,难度值越大。
当前区块难度 Difficulty=(Genesis block Target)/(Current block Target)
区块链的网络难度不是一成不变的,而是根据网络算力不断调整的。
8. 分叉处理及主链判断
如果多个矿工节点在同一时间段内成功搜索到符合哈希结果要求的随机数,这些矿工就会认为自己赢得了共识竞争,将自己构建的区块广播到比特币网络,从而生成一个区块在比特币网络中。 当多个不同的有效区块出现在同一个区块高度时,就会出现分叉现象。
为了保证区块链系统中只有一条唯一主链,需要定义一个合适的主链判断标准,从多条分叉链中选择出一条合格的唯一主链。 此时,不在主链上的区块将成为“孤块”,找到孤块的矿工节点将不会获得相应的比特币奖励。 因此,区块链的形状不是单一的“链条”,而是树状结构。 每一轮共识对应的时间点只有唯一的区块有效,所以树状结构中只有唯一的主链。
在比特币中,主链是根据“最大工作量原则”确定的。