交易流程
发起一笔交易,这笔交易会有以下流程:
1️⃣ 当发起一笔交易后,这笔交易首先被发送给区块链其中一个节点 A,在进入节点 A 前,先验证交易的格式、签名、nonce 等基本合法性,通过验证后这笔交易会被暂存到节点 A 的内存池中,这个池子 状态都是待打包(Pending)。
2️⃣ 然后节点 A 立刻把交易广播到邻居节点,然后才在自己的池中按照 Gas 费用高低排序,矿工/验证者会优先选择一批价格更高的交易进行打包,此时这批交易会被构建到新的区块中成为候选区块(以太坊大概 12 秒出一个区块),接着候选区块也会被广播。
3️⃣ 邻居节点收到交易后也会先进行合法性校验,通过后再转发给它们的邻居。其他节点收到广播的候选区块后,也会对候选区块进行验证,包括区块头的有效性、共识证明以及区块内所有交易的合法性(再次验证签名、防止双花等)。验证通过后,节点会将候选区块追加到本地的区块链副本末尾。至此这笔交易才算是真正上链,状态变为已确认(Confirmed)。
4️⃣ 然而“上链”并不意味着高枕无忧。在区块链中,存在区块被“重组”的风险,即网络可能选择在另一个竞争链上继续建设,导致你所在的区块被丢弃,其中的交易被回滚。所以还需一个最终确认(Finalized)!,最终确认的实现方式因链而异。
-
概率最终性(比特币):基于“最长链原则”。你的交易所在区块后面跟的确认区块越多,它被推翻的概率就越低,呈指数级下降。通常等待 6 个区块确认后,即可视为最终确认。
-
绝对最终性(以太坊 PoS):通过验证者投票机制实现。在以太坊中,大约每 12-15 分钟会形成一个“检查点”,经过两轮连续的验证者投票后,之前的区块状态就被“最终确定”,在协议层面不可逆转,除非发生极端攻击。
交易广播时,并非所有节点都会接收或保留这笔交易,有些节点可能因 Gas 费过低而拒绝加入自己的内存池、可能因内存池已满而丢弃低优先级交易。所以每个节点的内存池的交易并不完全相同,只能是大致相同。
整个过程存在两个广播:交易广播和候选区块广播。交易被第一个节点验证后进入该节点的内存池然后被广播到其他节点,候选区块先被广播而后上链。交易状态从待打包->已确认->最终确认。