asdfgh
骑士
骑士
  • UID603
  • 粉丝0
  • 关注0
  • 发帖数79
阅读:116回复:0

五年磨一链,区块链公司CTO的告白:原来开发一条公链这么难

楼主#
更多 发布于:2018-12-11 10:14
chain33的起源
过去五年来,投入区块链行业后,做了很多事,也遇到了很多以前做梦都没想过会成真的事情,其中,最让我开心的,就是从无到有开发了Chain 33,我们集众人之力打造而成的公链,前阵子,Chain 33终于在Github上开源,向全世界展示我们团队的心血结晶,心里很是感动。
开发之路艰辛
先自我介绍一下,我是33复杂美的「首席技术官王志文」,在区块链行业已经有五年多的时间,几乎可以说是看着国内的区块链技术从零开始,逐步迭代进步的,国内从一开始的模仿、抄袭到后来终于开发出自已的原创公链,这个成果得来不易。我们提交了七千多次的代码修改,中间经历四到五次较大规模的系统改版。
确立开发方向
「我从2013年开始研究比特币,2015年开始研究以太坊,2016年,开始研究Tendermint和 Fabric 」研究了这么多,我和我们的开发团队最后做了一个决定:我们要自己从头开发公链。
主要原因有两个:许多软件设计之初,没有考虑到像我们公司一样有高度订制化的需求,比如,我要改变一下mempool的排队方式,那么,我必须要修改内核的代码,过一段时间,他们也升级了,然后我们开始合并代码,很多时候,系统无法兼容。
所以,我们一开始的目标就是做一个别人可以对内核做二次开发的区块链系统,而不只是一个开发dapp的系统。还有一个原因是,我们对区块链的理解和这些系统有一定程度上的不同,所以,我们希望自主开发一个系统,拥有自己的知识产权是非常重要的,目前Chain 33已经申请了接近200个专利。
「比我想象的困难多了」
没想到,开发一个区块链系统,实际上要比我们想象的复杂许多。在用别人系统的时候,我们总觉得别人的系统写的不好,这个不好用,那个不好用,但是,真到了我们自己要重新构造整个系统的时候,我们发现,我们一开始问题想的太简单了,构造一个系统需要有自己的世界观,需要洞悉本质。就举一个最简单的例子,如何处理交易与交易的关系,以及合约与合约的关系。
公链的三大开发阶段
基础系统的构建
一开始,我们就5个人,如果目标定的太大,妄想一步登天,那么想要实现目标肯定遥遥无期。于是我们开发第一个版本时,就从一个最简单的公链系统开始,不考虑复用,也不考虑二次开发,只考虑用最快的速度实现功能。这个版本大概开发了3个月,就开始测试了,最后没想到光测试时间就花了三个月,测试时间和开发时间一样长,bug特别多,很多模块很难测试,比如P2P 模块。这个阶段,我们做对了很多事情,也做错了不少事情。对的事情,就是我们一开始设计了一个基于消息传递的架构。可以简单地用下面这个图表示:


所有的模块通过一个消息队列通讯,而不是直接互相调用。当然,对于一个单机系统,可以用一个内存的消息队列,而对一个分布式系统,可以用真的消息队列系统。消息队列不仅仅解决了耦合的问题,还有一个非常重要,就是整个系统的构建是基于一套消息协议的,而不是依赖具体的实现,这样,第三方实现者只要实现一个模块的消息协议,就可以直接替换掉这个模块,这个对二次开发非常有用。而且,它让区块链系统可以很容易地分布式部署,解决单机系统性能瓶颈问题。当然,做的比较不好的地方,就是为了赶工期,对软件质量的要求稍微低了一点,这也引发了测试时间太长,bug不容易被及时发现的问题。
首创平行链概念
开发这个阶段的时候,市场行情还算可以,我们资金也比较充沛,这个时候,开发人员开始增加到50人左右,三个团队分别分布在杭州、上海和南京,而且都是非常资深的后端开发人员,这个阶段,管理工作变得分外重要,管理和组织任务分布不像原来一样简单了,否则开发效率会大大降低。
这个阶段,我们做了Devops的改造,配置了一套 Gitlab + Jira + Jenkins 的系统。我们做了部分模块化的工作,并且分成了两个组,一个主要是公链方向的开发,一个是联盟链方向的开发。这个阶段的主要成就就是实现了交易组和平行链的概念,平行链的概念其实非常简单,那就是,用一条公链处理通用的数据的存证部分,而用户自己的平行链来处理具体的业务逻辑。如图表示:


主链因为只有非常少的内置业务逻辑,所以,非常简单,也很容易实现分片,平行链上的节点数不多,类似EOS一样只有二十来个节点,这让平行链的升级非常方便。同时,交易组的实现,也改变了传统区块链系统中每笔交易都是独立的情况。
实现自由可插拔的开发模式
这个阶段的开发模式没有什么变化,但是,我们在开发的过程中发现,关键不是上面敏捷或者Devops,而是在架构上保证,每个人可以做相对独立的工作,不会相互影响。
理论上来说,因为存在协作,所以效率一定会降低,不管用什么方法,协作一定会大大的降低开发效率。当然,协作是不可避免的,但是,我们可以在架构上保证这个协作尽量的少。而得益于我们第一阶段的设计,系统模块本身就是互相独立的,但是,这个粒度上是远远不够的,用户希望根据自己的需求,改造某个点,比如增加一种共识模式、签名方式,或增加一种mempool的排队模式,所有的这些需求,都应该符合开闭原则,也就是说,不能通过修改我们的系统内核来实现,而是通过增加新的插件来实现。如下图表示:


内核非常小,基本上每个点,都可以通过可插拔的模式替换掉。我们开发了一些工具,帮助大家快速开发插件,而且最关键的一点,用户开发好的插件可以分享给别人使用,这个也是我们开发chain33的目标,大家停止制造重复的轮子,可以像分享url一样简单地分享自己的劳动成果。
在我们的设想中,随着越来越多人在chain33内核上不断开发出新的功能,chain33 会越来越强大,它的强大,会让大部分人放弃自主开发自己的区块链系统。
游客

返回顶部