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经常被攻击,就是因为这一点,共识节点可以随意控制这个随机数。

任何一个程序员,不管有没有区块链开发经验,都可以加入我们都开源社区,目前社区中有一批非常有经验都开发人员,可以给大家提供帮助。

chain33 区块链开发框架诞生记的更多相关文章

  1. 醒醒吧!互联网的真正未来不是AI,更不是VR,AR,而是区块链

    这些力量并非命运,而是轨迹.他们提供的并不是我们将去向何方的预测,而是告诉我们,在不远的将来,我们会向那个方向前行,必然而然. ---凯文•凯利 文字与货币 人类在演化过程中,凭借智慧创造了无数事物, ...

  2. eoLinker API-Shop 抓住区块链机遇,从这些API开始

    区块链是分布式存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的数学算法. 区块链目前分为三类: 公有区块链(PublicB ...

  3. 人人都懂区块链--pdf电子版学习资料下载

    人人都懂区块链 21天从区块链“小白”到资深玩家电子版pdf下载 链接:https://pan.baidu.com/s/1TWxYv4TLa2UtTgU-HqLECQ 提取码:6gy0 好的学习资料需 ...

  4. 区块链产业发展热潮来袭,Panda Global 认为体验、安全是关键词

    作为一项近些年才发展起来的新型技术,区块链自诞生之日起就备受关注,凭着去中心化.不可篡改.信息透明等多种关键特点,已成为变革传统产业的一项有力创新手段.当区块链热潮再度袭来之时,知名数字货币交易所Pa ...

  5. 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

    很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...

  6. 区块链技术(一):Truffle开发入门

    以太坊是区块链开发领域最好的编程平台,而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只 ...

  7. 50行Python代码构建小型区块链

    本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...

  8. Factom(公证通)--基于区块链的存证系统

    Factom这个Solution在2014年的时候就已经推出了,现在已经2018年了,我才来写这一篇分析文章可能有些迟了,但是它是十分具有参考价值的.因为现阶段来开区块链虽然炒得火热--养猫.养狗.草 ...

  9. 一场IPFS引领下的共享之风正在走向区块链

    中国互联网的高速发展 已经接近10年,小编完整的经历这个过程.这一切我们从一个小网站 饭否 说起... 互联网 2006年3月16:Twitter上线 2007年5月12:  饭否上线 饭否是中国第一 ...

随机推荐

  1. 机器学习入门 一、理解机器学习+简单感知机(JAVA实现)

    首先先来讲讲闲话 如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这 ...

  2. querySelector/querySelectorAll选择器两个容易忽略的点

    jquery写得多了,原生js大API就容易忘.如果你也是这样,一起来回顾一下HTML5的类jquery选择器querySelector和querySelectorAll吧,querySelector ...

  3. 使用 jquery jroll2 开发仿qq聊天列表侧滑功能

    由于开发需求,需要做一个类似qq的聊天界面,侧滑弹出单条item右侧菜单,菜单可点击,效果如下图(包括点击事件+长按事件): 1.项目主体dom和css 页面结构比较简单,顶部header做了fixe ...

  4. Android中,利用Intent传递对象值

    在很多情况下,调用startActivity(Intent) 方法,跳转到另外一个Activity或其他component,需要传递一个对象给它. 可以让这个要传递的对象所属类实现Serializab ...

  5. Educational Codeforces Round 14 D. Swaps in Permutation 并查集

    D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...

  6. 【原】getInputStream()与getParameterMap()获得Post请求的数据区别

    [前言] 最近在写一个接口,写好以后想测试,自己写ajax(Post方法)来调用接口倒是可以用action所在类的属性的get/set方法获得数据.但是不只是页面的ajax会调用这个接口,还有外系统会 ...

  7. Java删除ArrayList中的重复元素

    Java删除ArrayList中的重复元素的2种方法 ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇到那种必 ...

  8. HDU 4764 Stone (2013长春网络赛,水博弈)

    Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. [置顶] Linux下发布QT程序

    Linux下发布QT程序 概述 无论在windows下还是在linux下,可执行程序的运行都依赖于相关的运行库,我们需要将依赖的库找到放到特定的位置,让可执行文件能够找到.在不知道可执行文件依赖哪些库 ...

  10. PHP扩展迁移为PHP7扩展兼容性问题记录

    PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题.记录下来,避免大家再踩坑. add_assoc_string ...