P2P协议告诉你「状态根如何实现?」

今天,我们将分享一个当前正在开发的方案——通过P2P消息传播的状态分布,看看状态根原理是如何在Neo3环境下运行的。

网络协议
Neo网络上的共识节点和普通节点都以P2P的方式连接。每个节点都与网络上的其他节点有多个连接,以确保新信息的快速传播。
节点间的通信是以消息的形式实现的,每个消息都携带一个指令和需要处理的负载数据。消息可以是对区块链数据的查询请求,例如最新的区块信息,也可以是携带了高优先级的信息,例如共识数据。
由于网络上的所有节点都会不停地监听传入的P2P消息,P2P网络是将一个达成共识的状态进行分布化的理想场所。这种方法最初由Igor Coelho提出:
“我认为较好的方法是通过P2P消息推送状态哈希,并由共识节点进行签名,这样节点仍可以跟踪“正式的”状态,而不必将它们永远锁定在区块链上。”
解耦状态
与区块头方法不同的是,通过P2P网络进行状态分布化意味着达成共识的全局状态永远都不会上链。这样可以将状态从区块中解耦,通过为潜在的性能改进预留空间来满足最初的提案目标。
此外,由于状态永远不会在链上提交,因此依旧可以部署那些会影响状态的Bug修复代码,而不会引入与区块数据的冲突。如果发生这种情况,可以分配新的签名哈希。Neo核心开发者Jeff Solinsky表示:
“如果Neo的新版本需要解决一些会改变MPT哈希的问题,可以通过分发离线的MPT哈希文档,其中将包含由共识节点签名的新MPT哈希。客户端可以在从离线的区块文件中重新同步区块链时加载该哈希文件。”
这种方法的一个潜在缺点是,网络协议上的额外负载可能会影响交易吞吐量,因为添加新消息或提高消息频率会减少其他任务的处理时间。但是,如果状态根哈希分布在现有讯息(例如与共识过程相关的消息)中,这种负担将会最小化。
– 解耦状态 –
解耦旨在让数据模型、业务逻辑、视图显示三层之间彼此降低耦合,把关联度降到最低,不至于牵一发而动全身。
实施提案
在决定以P2P消息的方式实现状态分布后,Neo软件工程师张涛简要概述了这一可能的实现方案。
其中详细说明了3个可能的实现方向:
– 将状态根添加到PrepareRequest共识消息,并将签名添加到Commit共识消息中;
– 使用单独的dBFT流程就状态根达成共识;
– 区块创建完毕后让共识节点签名并广播当前状态根。
由于其他开发人员倾向于第一种和第三种方案,张涛提议将两种方案进行结合。在这种情况下,共识节点将状态根与新块一起发送,如方案1所述,但是未确认的状态根可以通过共识节点签名进行验证,如方案3所述。
张涛还分享了两个需要解决的问题。在升级的情况下,开始生成新状态根链时以及将其向其他节点进行广播时将需要大量的P2P消息,从而会对性能产生不利影响。
但由于每个全节点仍将生成本地状态根,因此仅需要检查由共识节点签名的最新状态根。这样就不再需要生成大量的P2P消息,因为每个轻节点或全节点仅需要最新的状态根即可进行验证。
上文已经基本介绍了如何通过P2P协议在Neo3中实现状态根。状态根作为实现Neo3 MPT数据结构的关键之一,下一篇「三分钟入门Neo3」将介绍MPT树的基本原理以及简单的支付验证逻辑。