--- 摄于 2017 年 9 月 藏川线前段
距离上次网络升级并不遥远,近期,ckb 网络将会迎来再一次的升级,与上次不同的是,这次网络升级将以兼容形式进行,即在下次 hardfork 之前都将存在兼容模式。这次升级的主要目的是——引入轻客户端实现。
所谓的轻客户端,是指一个在本地保留尽可能少数据的面向终端用户的客户端。相对于全节点而言,它的存储压力可以说降低了千倍以上(取决于关注的账户数量),同步速度会提高很多(数量级的差别)。但是,轻客户端带来的并不完全是好处,对于整个区块链网络来说,它也带来了不小的弊端,最显而易见的是,轻客户端不存储全数据,它的所有数据全依赖于它能连上的全节点提供,这就是所谓的吸血节点,并不给数据的去中心化带来任何收益,同时提高了全节点的负担。
顺便一说,轻客户端的激活还需要引入软分叉的概念。
轻客户端加入网络后,对节点发现的行为会带来不小的负面影响。原网络中,节点只存在一个身份,就是全节点,只要能连上,大概率对方就能提供服务,比如同步节点或者是广播交易等等。当轻客户端上线后,由于轻客户端自身数据的不完整,它无法提供同步功能,这对节点发现提出了新的要求——传播节点能力信息。
我们希望在建立网络连接之初,全节点能有意识地排除主动连上的轻节点,并将该节点的能力标记到节点信息中,通过发现协议进行全网广播,尽可能降低因轻客户端加入网络而带来的节点发现上的低效。
可以查看 PR
该 PR 扩展了 identify 协议中的 Flags 字段,将原有只表达全节点的语义扩容成了六个 bit 的语义。identify 是节点网络连接最先开启的协议,它将决定是否继续打开剩下的协议进行通信。
同时,对 discovery 协议进行了升级,现在所有最新的节点信息都带上了它自己声明的 Flags 字段,用来声明该节点的能力。在主动请求节点信息的时候,允许请求方通过 required_flags
来声明它想要的节点能力,尽可能让响应信息更加契合请求方的需求。
通过 molecule 自带的向前兼容的序列化格式,我们并没有增加 discovery union 的 item,而是通过定义一个新的 table 去增加字段,然后将序列化结果塞入原有 union 中,这样新老节点都能够兼容解析该消息,对于老的节点来说,只是原有 schema 解出来的消息后面多加了一段无法识别的信息而已;对于新节点来说,老节点发出来的消息少了一段信息,就直接设置它的 flags 为 default。通过这样的小技巧,我们在消息解码过程中统一了新老协议的兼容问题。
每一次改动背后都存在大量的讨论、实现、测试,希望这次上线一如既往得顺利。
请登录后评论
评论区
加载更多