chain33 区块链开发框架诞生记
chain33 诞生记
很多年没有写博客了,应该说,自从2013年开始玩比特币,就没有写过了。这5年来,做了很多事情,也见了很多以前做梦都没有想到过都事情。我做的最开心的事情,也是觉得最有意义的事情,就是负责开发了一个区块链开发框架 chain33 ,目前这个框架已经在 github 上开源,开源地址是: https://github.com/33cn/chain33
欢迎大家点star,fork。
从2013年开始研究比特币,后来到了2015年,开始看以太坊到代码。到了2016年,我们又研究了 tendermint 和 fabric,最终,我们还是决定要自己从头开发。主要原因有两个。这些软件在设计到时候,没有考虑到,像我们公司一样要做深度定制的情况,比如,我要改变一下mempool的排队方式,那么,我必须要修改内核的代码,过一段时间,他们也升级了,然后我们开始合并代码,很多时候,系统会变的不兼容。所以,我们一开始的目标就是做一个别人可以对内核做二次开发的区块链系统,而不是只是一个可以开发dapp的系统。还有一个原因是,我们对区块的理解和这些系统的理解有一定的不同,所以,我们希望自主开发一个系统,有自己的知识产权是非常重要的,目前这个系统已经申请了接近200个专利。
当然,开发一个区块链系统,实际上要比我们想像的复杂。在用别人系统的时候,我们总觉得别人的系统写的不好,这个不好用,那个不好用,但是,真到了我们自己要重新构造整个系统的时候,我们发现,我们一开始问题想的太简单了,构造一个系统需要有自己的世界观,需要有对本质的洞悉。比如最简单的,如何对待交易与交易的关系,以及合约与合约的关系。可以从一个小例子看一下区块链的世界观问题,点击链接查看:
交易组
总结来说,整个开发过程可以分成三个阶段:
第一个阶段
一开始,我们就5个人,如果目标定的非常大,那么肯定实现遥遥无期。于是我们开始第一个版本的开发,实现一个简单的公链系统,不考虑复用,不考虑二次开发,而是就实现功能,用最快的速度。这个版本大概开发了3个月,就开始测试了,最后我们发现测试时间也花了三个月,bug特别多,很多模块很难测试,比如P2P 模块。这个阶段,我们做对了很多事情,也做错了不少事情。对的事情,就是我们一开始设计了一个 基于消息传递的架构。可以简单的用下面这个图表示:
就是所有的模块通过一个消息队列通讯,而不是直接互相调用。当然,对于一个单机系统,可以用一个内存的消息队列,而对一个分布式系统,可以用真的消息队列系统。消息队列不仅仅解决了耦合的问题,还有一个非常重要,就是整个系统的构建是基于一套消息协议的,而不会依赖具体的实现,这样,第三方实现者只要实现一个模块的消息协议,就可以直接替换掉这个模块,这个对二次开发非常有用。而且,它很容易让区块链系统可以分布式部署,解决单机系统性能瓶颈问题。当然,做的比较不好的地方,就是为了赶工期,对软件质量的要求稍微低了一点,这也引起了测试时间太长,bug不容易被及时发现的问题。
第二阶段
开发这个阶段的时候,市场行情还算可以,我们资金也比较充沛,这个时候,开发人员开始增加到50人左右(有杭州,上海,南京)三个团队,而且都是非常资深的后端开发人员,管理和组织工作不能像原来一样简单了,否则开发效率会大大降低。这个阶段,我们做了devops的改造,配置了一套 gitlab + jira + jenkins 的系统。我们做了部分的模块化的工作,并且分成了两个组,一个主要是公链方向的开发,一个是联盟链方向的开发。这个阶段的主要成就就是实现了 交易组 和 平行链的概念,平行链的概念其实非常简单,那就是,用一条公链处理通用的数据的存证部分,用户自己的平行链来处理具体的业务逻辑。如图表示:
主链因为只有非常少的内置业务逻辑,所以,非常简单,也很容易实现分片,而平行链上的节点不会非常多,类似eos一样二十来个节点,它的升级就会非常的方便。同时,交易组的实现,也改变了传统区块链系统中交易都是独立情况。
第三阶段
这个阶段的开发模式没有什么变化,但是,我们在开发的过程中发现,关键不是上面敏捷或者devops,而是在架构上保证,每个人可以做相对独立的工作,不会相互影响。理论上来说,因为存在协作,所以效率一定会降低,不管用什么方法,协作一定会大大的降低开发效率。当然,协作是不可避免的,但是,我们可以在架构上保证这个协作尽量的少。得益于我们第一阶段的设计,系统模块本身就是互相独立的,但是,这个粒度上是远远不够的,用户希望根据自己的需求,改造某个点,比如增加一种共识模式,增加一种签名方式,增加一种mempool的排队模式,所有的这些需求,都应该符合开闭原则,也就是说,不能通过修改我们的系统内核来实现,而是通过增加新的插件来实现。如下图表示:
内核非常小,基本上每个点,都可以通过可插拔都模式替换掉。我们开发了一些工具,帮助大家快速开发插件,而且最关键都一点,用户开发好都插件可以分享给别人使用,这个也是我们开发chain33的目标,大家停止制造重复的轮子,可以像分享url一样简单都分享自己都劳动成果。随着,大家在chain33内核上不断开发出新的功能,chain33 会越来越强大,它的强大,会让大部分人放弃自主开发自己的区块链系统。
目前我们已经开源了大部分的插件。开源地址:https://github.com/33cn/plugin
下面列举一下主要的插件:
共识部分:
- pbft(联盟链,beta)
- tendermint(联盟链)
- raft(私有链)
- ticket(公链)
- solo (测试链)
加密部分:
- sep256k1 (bitcoin, ethereum)
- ed25519 (tendermint,sc)
- sm2 (国密支持)
store:
- mavl (tendermint 提供的后端数据存储方式)
- mpt (以太坊提供的数据存储方式)
- kvmvcc(目前性能最高的区块链后端存储方法)
执行器部分:
- evm (以太坊虚拟机支持)
- wasm (目前没有开源)
- cert (联盟链权限管理)
- hashlock (hash锁定,和btc,eth 跨链使用)
- paracross (平行链,注意,平行链只是我们的一个插件,可见内核非常的小)
- privacy (类似门罗币的隐私保护实现,这个例子可以好好学习一下,它显示我们系统可扩展性的强大,门罗币是utxo模型,但是也可以在我们系统里面兼容 账户模型)
- trade (内置一个币币交易所,可以支持链上所有资产的交易)
- 游戏(牛牛,时时彩,石头剪刀布 …)
还有一点,我们为了公平的实现博彩游戏,在共识的级别加入随机数的概念,这个是目前区块链系统无法做到的。最近eos经常被攻击,就是因为这一点,共识节点可以随意控制这个随机数。
任何一个程序员,不管有没有区块链开发经验,都可以加入我们都开源社区,目前社区中有一批非常有经验都开发人员,可以给大家提供帮助。