
先明确账本记录什么
区块链账本通常同时涉及交易历史和当前状态。交易记录说明发生了什么,当前状态则用于判断下一笔交易能否执行。设计之初应明确:账本保存哪些交易字段,节点依据哪些规则计算状态,以及哪些数据需要由每个验证节点独立检查。若各节点对同一笔交易的解释不同,即使保存了相同的数据,也难以维持一致的账本。
选择与业务相符的状态模型
比特币采用未花费交易输出模型:一笔交易引用先前尚未花费的输出,已经花费的输出不能再次使用。以太坊的交易则由账户发起,通过签名证明授权,并使用按账户递增的随机数防止交易被重复执行。这是两种不同的状态组织方式,不能把某一种模型的字段或验证规则直接套用于另一种。
paragraphs占位
把验证规则落实到每个节点
账本不能只依靠记录的先后顺序防止重复使用。节点还需要检查交易授权、所引用状态是否有效,以及执行后的状态变化是否符合规则。区块被提出后,也应由节点按共同规则验证;收到一个区块或一笔交易,并不等于它已经成为有效账本的一部分。
区分数据关联与历史确定性
区块可以保存前一区块的哈希,交易也可以通过哈希树汇总到区块头。这些结构有助于发现历史数据被改动,并支持核对某笔交易是否被纳入区块;但纳入证明本身不能替代交易有效性验证。
相同高度可能暂时出现不同区块,因此区块高度不宜单独作为区块的唯一标识。账本设计还应说明节点如何处理分叉、何时更新本地状态,以及应用在不同确认阶段如何表述交易状态,避免把刚广播、已纳入区块和最终确定混为一谈。
适用条件与常见问题
具体设计取决于账本要支持的操作。如果重点是追踪交易输出及其一次性使用,就需要清晰维护未花费输出集合;如果交易会改变账户或合约状态,则需要规定执行顺序、授权方式和状态更新规则。两类设计都离不开可由节点重复执行的验证规则。
常见误区是认为哈希链接使历史绝对无法更改。它能让改动留下可检测的影响,却不能单独决定网络接受哪段历史。另一误区是只保存交易列表而忽略当前有效状态:节点若不能据此判断资金或状态是否已被使用,就无法可靠拒绝冲突交易。