今天的「三分钟入门neo3」将介绍neo3正在尝试的另一个优化:通过状态根(state root)哈希来确定全局状态。全局认可的状态可以解决轻钱包的信任问题,确保节点之间的存储信息保持一致。同时,区块和状态持久化的分离能够提升性能。区块链聚合
节点状态
节点的状态可以看作是在一定时间内所有存储值的快照。例如,nep-5合同的存储状态主要由用户令牌余额组成。节点的存储状态将依次是所有合约中存储的所有数据的概要。
目前在neo2上,网络上的节点没有一致的全局状态。每当要处理区块时,每个节点都会在本地计算其状态。但即使网络上的所有节点都共享完全相同的且已通过共识节点验证的块信息,由于区块数据的解释不同,一个节点的本地确定状态也可能与另一节点不同。
如果在一个持久的状态根上达成共识,可以快速识别出该问题可能是由vm版本或节点类型的差异引起的。关于状态持久化的讨论最初是由张铮文发起的,他指出,如果将块持久化和状态持久化分离,可以提高性能。
“如果我们将状态持久化与块持久化分开,共识节点可以快速处理事务,而无需等待状态写入和智能合约执行。”
轻客户端信任问题
关于此问题,初步讨论集中在通过与区块分离的形式提供状态持久化,但是全局状态的缺乏导致了另一个问题——轻量级客户端信任问题。由于它们依赖于第三方节点检索的信息,因此轻量级客户端(例如移动钱包)目前面临信任难题。
由于轻量客户端没有存储可用于验证用户余额状态的完整区块链,因此它们无法确保从api或rpc节点检索到的数据是正确可靠的。而merkle patricia trie(mpt),一个经过密码验证的数据结构能够改善这一问题。
- mpt -
mpt是patricia trie与merkle tree的结合。
- patricia trie是二进制基数trie的特殊版本,用于高效查找,插入和删除;
- merkle树是用于通过单个“根”哈希对整个数据结构进行快速密码验证。
实施mpt后,网络节点可以继续以确定性方式计算本地状态,并随着时间更新merkle根。并能在共识过程中将该根哈希与该区块一起进行验证,在该哈希中可以将其保留并由其他节点引用,以验证数据的完整性。
我们将在以后的推文中将更详细地探讨merkle patricia的尝试以及neo3正在实施的其他优化。
区块头中的状态根
为了解决这些信任问题并提供全局状态,建议在区块头中添加状态根。这将允许轻客户端仅存储区块头,并使用它们作为状态证明来检查rpc节点提供的数据真实性。以这种方式验证解决了轻客户端的信任问题,可以在不需要整条链副本的情况下确认信息。
此外,包含在区块头中可确保网络上的每个节点都与全局状态一致。这样可确保所有节点具有相同的合约存储视图,也消除了一致性问题。
在下一篇文章中,我们将继续介绍开发者对此主题的更多讨论,重点介绍neo开发者设计的bug修复功能。