前面我们已经提到,区块链要解决的是如何用一种可信的方式记录数据,使得用户可以信任区块链系统记录的数据,而无须假设记账节点的可信性。怎么实现呢?“无须信任”技术上的解决办法就是假设互相不信任。因此,每个节点都存有一份完整的数据记录,每条新的交易都要被重新验证。当一个节点重新加入网络并需要同步数据的时候,也是从其他节点同步交易历史,然后重新计算验证,这就决定了其第一个特点,即分布式存储(不能完全信任他人的存储)。
这么多记账节点为什么愿意按照一致性协议记账呢?依靠的就是巧妙的记账激励机制——诚实的记账节点会得到相应的奖赏,且诚实的记录比恶意篡改记录的收益更大——这就是一致性协议设计中的要点。下面就对区块链的数据结构、分布式存储和一致性协议进行详细介绍。
图1-1比特币区块链的数据结构
首先从数据结构来理解区块链,图1-1展示了比特币区块链的数据结构。系统中的交易(Transaction)被打包成一个个区块(Block)。在区块链系统运行过程中,区块链每次只能添加一个区块,并且每个区块均包含了用于验证其有效链接于上一个区块之后的数学凭证。正如它的名称“区块链”(Blockchain),一个个区块按照密码学算法链接在一起。这样的组织设计可以很容易地验证数据是否篡改、追踪历史以及保证安全。
其次,区块链的架构是分布式、去中心化的。系统中各个节点组成一个P2P网络,每个节点均分别执行、验证和记录相同的交易,每个节点都可以在本地存储完整的区块链数据。没有一个中心机构能够干预交易的执行顺序和结果。“去中心”在这里不是目的,而是一种达到可信的手段。
最后,为了保证各节点状态的一致性,还需要共识机制,即一致性协议(如PoW、PoS、PoA等)。以PoW为例,为了使得各个节点记录的结果是一致的,在每一时刻系统要选择一个记账节点来计算下一个区块。其他节点对该记账节点的区块结果进行验证,通过后则接受这个区块。为了激励大家高效正确地记账,系统对记账节点有相应的奖赏,这样一来大家会贡献计算和存储资源来争夺记账权。由于可以互相验证,也保证了记账的可靠性。
接下来,我们要解决的问题就是:如何公平地选取这个记账节点,以及如何设计激励机制。PoW中采用的是“猜散列值”这个公平的、依靠消耗算力的方式,也被称作“挖矿”。谁先算出给定要求的散列值,谁就以大概率先争夺到这个记账权。为什么说是概率呢,因为在分布式网络中,由于延迟,消息传递到其他各个节点的时间是不一样的。在不同节点上对下一区块的认可在短时间内可能是不同的。最终,以系统中最长的链条作为共识结果,即大家认可的账本内容。