2018年11月17日上午,“2018比原链全球开发者大会”正式在杭州国际博览中心(G20会馆)开幕,这是杭州第一次由开源组织举办的技术型峰会,也是杭州被誉为区块链之城以来规模最大的一场区块链开发者大赛,100+开发团队历经4个月激烈厮杀,16支团队将在本次大会上展开最终角逐。
在大赛进行过程中,资深程序员,比原社区的开发者Derek作了题为《GO语言公链实战》的分享。这是即将上市的一本图书,它主要讨论了GO语言的使用,而比原链是该书剖析GO语言的一个具体项目。
“现在讲区块链的书很多,但真正深入公链的书不多,而从一个技术语言入手,去剖析区块链技术的就更少了。我认为Go语言是区块链未来的趋势,我这本书就是想通过对比原代码的剖析,让更多程序员了解区块链。”Derek说。
以下为Derek演讲,经整理:
大家好,今天主要和大家分享一下关于比原链的技术细节。主要四个方面,第一,比原链的总架构;第二,虚拟机的堆栈实现;第三,区块快速同步和定期同步原理;第四,P2P节点状态机。
上面是比原链总架构图,比原链官方提供了一个三层架构图,我在这上面细化了一下。第一层是用户交互层,比原链提供两种用户交互工具,包括bytomcli、Bytom-dashboard,我们开发者用得比较多。第二层是接口层,ApiServer服务,主要接收交互层工具的请求和处理请求,并响应请求。第三层是内核层,是比原链的核心,占整体代码54%左右。最主要的两块是交易管理,交易的构建、交易的签名和交易的提交。包括智能合约,它也有这三个过程。智能合约运行在bvm虚拟机,还有Equity语言,今天参赛选手都是用Equity语言做代码编写。还有BUTXO,这是比原链在比特币UTXO上做了一些拓展。
再下一层是钱包层,大家用得比较多,这一块比较简单,就不说了。然后是共识层,目前主流的共识有两种,PoW和PoS,比原链的宗旨是算力即权力,所以他们选择PoW方式去做共识。比原链在PoW做了一个创新,自主研发了Tensority算法,基于AI友好型的矩阵计算hash方式。接下来是数据库,在比原链上面用得比较多,对开发者来说把时间换成空间的一种方式。最主要的数据库有几个,一个是Core,存放所有主链区块信息和交易信息。还有Wallet,钱包数据库等。
下面一层是P2P网络层,P2P大家都知道,当年快播用得特别溜。比原链在该基础上面主要实现几个功能,节点发现,区块同步、交易同步、快速广播,快速广播主要为了挖矿时让交易能够在全网尽快达成共识。
说一下虚拟机的运行原理,大家在学校里都学过堆栈,先进先出和先进后出的数据结构。BVM在这里就是先进后出的数据结构。第一步操作,假设堆栈里有两个指令,有两个元素,X和Y。这时候入站的话,将2入站到站中,就是XY和2。当出站操作时,它是先进后出的原理,首先会从栈中推出一个元素,比如说常数2从站点推出来。下面是执行DUP的指令,复制指令,将栈中元素再复制一个元素放入到栈当中。我们可以看到原有的是X和2,然后通过执行到DUP指令之后就变成X,2和2。这是一个虚拟机,我们在虚拟机发布指令,都会涉及指令进站出站的操作,这是堆栈虚拟机。
下面说一下区块,区块早期一般都是定期同步,这种情况下在一个区块链网络上比较缓慢。比原链在上面做了快速同步机制,我们可以看到这两边的区别,它是根据Checkpoints,是比特币最早提出来的,用于检验旧区块是否有分叉。所以比原链在Checkpoints做了快速同步,基于当前节点在Checkpoints高度节点范围内就使用快速同步,不然就是定期同步。
快速同步的话,从当前节点和已知节点中找到已知最优对等节点进行加密握手链接,加密握手链接之后会向它发送请求,发送请求范围是从当前高度到Checkpoint范围,最大是128个区块,一次请求会请求128个最大。然后它就会验证区块,添加到本地区块链上面,这是快速同步。定期同步,前面流程都是一样,但是到后面因为为了安全问题,每次这个块还没有出来的时候只请求一个区块,再验证,再添加到本地。添加完之后会最后通知对等节点,告诉它最新节点高度和区块hash。
下面再简单介绍一下P2P节点状态机,状态机的话,大家应该在学校里都学过,它是一种状态的切换。不知道大家有没有看过一些P2P源码,在比原链里有7种状态的定义。当前节点和对等节点进行连接的时候,对等节点的初始状态是Unknown,经过不同包的发送切换不同的状态。由Unknown一直往下切,整个状态机图表大概是这样的。
这里面包含几个策略,比如说当前节点和对等节点刚开始加密握手连接之后,大家的状态都是Unknown,然后发一些Ping包,对等节点返回一些Pong包,状态节点就会被切换。直到它会将对等节点加入到自己路由表中,就会和对等节点建立一些交易和区块的发送。不光是比原,包括比特币和以太坊,所有币种都是用KAD去实现这种路由表。KAD是一个路由算法,它是基于两个节点的ID进行异货算出来一个逻辑距离。这个距离不是实际物理地址,比如我在中国,我在美国,这也有可能建立连接。并不是说我在中国和杭州建立最近的连接,它是逻辑的距离。
下面说一下今天来的目的,前面都是一些铺垫。今天主要和大家介绍一下,我和我的小伙伴在9月初时,写了一本书,目前的进度是2/3,大约是在明年年初就能出版。《GO语言公链实战》里面的内容是和比特币有点类似,但又比精通比特币内容丰富很多,包括原理上的实现和算法上的实现,都会以比原链底层代码作为铺垫,在上面展示出来。