在4月14号举办的 Gopher China 大会中,来自比特大陆的姜家志做了题为《 Go 在区块链的发展和演进》的演讲,详细讲述了 Go 语言在区块链中的应用和意义。

Golang 以其在高并发场景下的天然优势等特性,已经成为今天开发分布式系统的首选语言,在云计算领域占据了无法替代的位置。如今,越来越多的项目组织都选择了 Golang 来编写核心处理模块。在当下最热门的技术领域——区块链上,我们所熟知的包括以太坊、SiaCoin 、IPFS 等都在使用 Go 语言开发,甚至可以大胆预测:继云计算之后,未来整个区块链行业也将会是 Go 语言的天下。



姜家志-现在在比特大陆负责比特币客户端开发项目,10 年互联开发经验,13 年开始接触比特币,开发了比太钱包,这是中国人开发的唯一一个被 bitcoin.org 推荐的钱包。13年开始接触 Go 语言,刚一接触就被 Go 的简洁和高效吸引。

以下是对于演讲的内容实录。

大家好,我是比特大陆哥白尼项目负责人姜家志。我 2013 年开始接触比特币,开发了比太钱包(是国内开发的唯一上 bitcoin.org 的钱包)。现在就职于比特大陆,从事区块链底层协议开发相关的工作。比特大陆是一家专注于高速、低功耗定制芯片设计研发的科技公司。可能圈外的人对比特大陆了解比较少,更多是知道我们的蚂蚁矿机。实际上我们除了矿机业务还有 AI 业务,而且已经产出了人工智能的芯片。我们是一家以技术为驱动的科技公司,拥有着硬件和软件方面的各类人才。

今天主要跟大家分享一下 Go 和区块链的发展和演进。

首先,我们一起看一下区块链里面招聘的 TOP15 的技能要求,如图1。

640_wx_fmt_png图1

我们可以看到,在区块链行业里面 Go 的招聘排位是第一的,占比 10.20%,超过了 Java 和 C++。目前区块链领域对于 Go 语言的招聘需求不断提高,以我们公司为例,很多项目除了前期使用了Java 和 C++ 之外,后期的项目都是以 Go 语言为主。

640_wx_fmt_png 1图2

 图2 是来自 GitHub 的统计,排行第一是 JavaScript。这是有原因的,因为一般网站代码中 Java Script 占比很高,比如说我搭了一个网站,把网站的代码放到了 Github上,统计之后,这个网站就算作以 JavaScript 为主了。此外,写测试脚本一般大多会使用 Python ,也导致了python 的使用增加。而在区块链领域,真正的首选语言还是 Go 语言,比如以太坊都是基于 Go 语言开发的,很多新的项目也都选择了 Go 语言进行开发。接下来我们进入正题。

  1. 区块链

区块链的定义是一个很复杂的事情,因为不同的人对于区块链的理解不同,而且区块链也在不断的发展中,以下列出一些大家对区块链了解的基本定义:

1.去中心化 。其实现在很多的区块链的项目,因为要求高 TPS,已经在牺牲中心化的特性实现高 TPS 了,比如说典型 EOS,它其实更相当于弱中心化。

2.数字化帐本。这些很清晰,所以的区块链都是在互联网上进行的。

3.不可篡改。在以太坊中通过交易的方式可以改变合约的状态的,但是这种改变在合约上也是已知的。

4.确定性的可复制状态机。这个是用来解决整个系统的容错性问题。

2.区块链的特点

1.去中心化(弱中心化)

 弱中心化是为了解决信任问题,不会出现一个单一组织或者个人能够控制整个协议。

2.弱信任,对等的写入权限的数据库

 在区块链的每个矿工,或者是超级节点以及其他的 POS 见证人等,都有对等的写入权限,这个根据各个协议的不同,虽然说有对等的写入权限,但是什么时候能写入就是共识要解决的问题。

3.共识信任的机制来自于规则,非第三方

 这些代码中定义的规则,不是来自于任何的第三方,这里的第三方比较广泛,比如说任何公司、个人甚至一个政府。

4.不可篡改性

 在智能合约中有可能改一些智能合约的状态,其他的数据和交易都是不可篡改的。

5.加密安全性,强规则

 区块链世界中都是一些非常强的规则,比如说我们常常听到交易,确认。强一致性的规则是各个节点都必须要遵守,如果发生了和规则不一致的交易,或者是区块,会被其他的节点拒绝。

6.可编程

比特币协议本身就是可编程的,体现在脚本语言上,如果是简单的私钥之间只是转帐,硬编码就能实现,不需要使用脚本语言的,脚本语言也能实现一些简单的合约。

7.匿名性

 比特币和以太坊是比较弱的匿名性,他们是一个分布式帐本,所有人都有完整的数据,就有能力追查到这个交易从哪里来的。强匿名性没有办法被追踪的。而 zcash 是通过零知识证明实现了强匿名性。

8.跨平台

 现在的项目都会跨平台,我对比特币的理解其实是一个协议,整个协议必须类似于互联网当中的 TCP 协议,整个协议要有跨平台性,还要有跨编程语言的特性。

3.区块链使用的编程语言

 最开始的时候,世界上还没有区块链这个名词,2008 年的时候,中本聪发布比特币的白皮书,定义了:比特币是点对点的电子现金系统。2009 年创世块诞生,从我们早期观察比特币的源代码中可以看到,中本聪有可能不是专业的程序员,早期的时候他是现学 C++。

从这个时候开始,一直到 2014 年的左右,在区块链行业里一直都是 C++ 的天下,所有的区块链项目,包括以太坊,包括莱特币等,都是使用 C++ 的。2009 年 Go 也是刚刚发布,也不可能使用 Go 语言。

3.1以太坊

 以太坊最开始也是采用 C++ 编写的,后来改到了 Go 语言上。

Go 的以太坊(go-ethereum)的实现是在 2014 年开始的,现在使用 Go 的版本客户端使用率已经占到了 61%,是占有量最大的客户端。另外是 Rust 编写的客户端占到了 26%,剩下的其他语言的版本。去年以太坊一两个星期就完成了一次硬分叉,就是用 Go 语言的客户端实现的,这个硬分叉的时间点上所有人都要升级客户端完成升级,可以看到 Go 的版本的客户端在以太坊上是使用最多的版本。从这个时间开始,也是 2014 年,各个项目在区块链上,Go 语言的使用会大大增加。

3.2区块链中的 GO 语言

640_wx_fmt_png 2图3

图3中的第一个是 Go 语言实现的 btcd,是 Go 语言实现的比特币客户端,这个版本处于待维护的状态,现在主要的精力是在闪电网络的开发。另外是 GOCOIN,这是南美的程序员做的个人的项目,他一个人开发了大概三年。

4.为什么选择 GO 语言?4.1区块链开发的特点*

640_wx_fmt_png 3

图4

为什么大家会选择 Go 语言?首先要看下区块链的开发特点是什么?第一就是很分布式系统,区块链是 P2P 节点的架构,每个节点在本质上来说都是对点的,每个节点都有对等的权利,因此就会有大量的网络编程,比如比特币客户端,他大概需要连接 2000-3000 个节点,这对多线程要求就会比较高。另外一个特点是在区块链的项目当中会使用大量的数据结构和算法,还有密码学的东西,因为是一个强规则的网络,对于密码学,对于公钥、私钥和哈希大家运用的就会特别的多。

**4.2 其他语言C++

640_wx_fmt_png 4图5

图5中可以看到,C++ 学习曲线比较高,这个大家都是有共识的,重载决议是一个比较困扰人的地方,另外还有函数模板,也是不容易理解的。还会重载了大量的操作码,操作符等,这也给阅读上的带来了困难。早期的时候选择 C++ 对区块链的开发是可以的,但是后面会面临很多问题,如何快速迭代,快速开发等等。

JavaScript

640_wx_fmt_png 5图6

 2015 年开始,当时 JS 社区的大牛 JJ 开发了 BCON ,是基于 JS 开发的。但 JS 语言的设计只用了三天,里面很多开发逻辑或设计逻辑都不一定那么合理,这部分在 ES6 上会有改善。JS 的标准库特别小,这也是 JS 的第三方库会为什么特别多的原因,因为标准库不能满足大家的需要,就会出现各种各样的库。还有错误机制,没有一个明确的错误处理机制。runtime 就无法利用编译器做优化,这是原因导致 JS 没有办法做区块链底层架构的。

如下所述,C++ 和 JS 在区块链的底层信息上是有自己的弱势,接下来我们看一下 Go 在这方面有什么优势。

4.3Go 的优势

640_wx_fmt_png 6图7

 1. 从部署的角度来讲,Go 语言的部署比较简单,直接编成机器码,而且还有跨平台的编译的选项。

2.从工程的角度来讲,Go 语言是一种良好的语言,代码是一致的,Go 语言提供了自己的工具库。只要按照工具库做,所有人写出来的代码也是一致的,就很容易理解,不需要炫技的写法。

3.从运行效率来讲,效率比较高,是静态的类型,代码比较简洁,自动垃圾回收。

5.GO 语言的思维

  开发 Go 语言项目的时候,我们强调用 Go 语言的思维来开发 Go 语言的项目。

全面简单,正交组合,偏好并发这三个方面上。

1.全面简单全面简单很简单,Go 语言只有 25 个关键词,Package 也比较容易理解,垃圾回收机制目前来说效率还是比较高,另外类型推断其实在我们编程的时候,可以给我们带来动态语言的优势,不用事先定义一些变量,就可以直接使用。

2.正交组合这个主要是 Interface 这块,它与其实现之间无显示关联,通过组合架构让程序静态结构更加清晰。还有垂直组合,包括水平组合,都是通过 interface 进行组合的。

 3.偏好并发:goroutines+select+channels=偏好并发。

6. GO 语言上的使用情况

   下面总结一下我们在 Go 语言上面的使用情况。

协程

 第一个是协程,我们会处理自己对应的消息,包括接送消息和发送消息都在自己的协程内部完成,消息处理也是使用协程去完成,还有脚本的验证使用协程并发做验证。

channel 通道

   模块之间使用通道进行解耦,使用通道做加锁工作,实现消息通信。

buffer 在内存池中的使用

   使用 buffer 能从网上接受TX消息,反序列化构造小脚本对象,减少内存占用,封装对于 buffer channel 的读写。

7.GO 未来的挑战

 下面说下未来的挑战,主要是区块链上的。

分片

  并行化验证是多线程实现交易在同一个电脑上能够并发的执行。分片的特点是把所有的交易分成多个片,在多个电脑上执行,并行化验证是分片的基础。

编译器

  另外是编译器的执行,比特币的脚本其实是类似于 Java Script,以太坊的脚本其实也是在堆栈上执行的,我们看到小蚁已经实现了编译器的优化,大家作为程序员都很容易理解 JVM 会比这个 EVM 快很多,会更好的支撑并行化的操作。

共识协议

   共识协议的进展非常快。有 POW、POS、DPOS、DBFT、DAG 等等。POW 经过了十年的验证,是没有问题的。第一个先介绍一下 DAG,一个见证节点把不同的交易在上面不断打包,而解决双方的问题,怎么解决呢?全网有一半以上的节点看到即双方的概率很低了,DAG 技术是经过全世界密码学专家评审,但有自己的缺点,有重复验证的问题,数据无法 trim 等,每一个节点都要保存大量的数据,所以会带来数据的冗余。另外就是 DPOS,我所了解的已经有 100 多个团队在竞选 EOS 的超级节点了。各个团队,各个项目都不但地在自己的领域、方向说做优化,包括共识,包括编译器等,大家都在不断地探索新得更加合理的能够解决问题的方式。

GO 语言提供的帮助

   快速迭代,快速进化,Go 的密码学实现,Go 的区块链基础库,泛型?

   Go 语言能给区块链带来什么帮助呢?第一是现在 Go 的密码学实现比较少。如果有 Go 密码学实现以及一些区块链的基础库,对于整个区块链行业来讲,大家在开发会更加的便利。Go 语言没有泛型的概念,要是在这一块有改进的话,在开发的会更加的节省代码。

8.我们在做什么

   最后介绍一下我们团队在做什么,我们团队涉及到整个区块链协议,底层协议的研究和开发。目前最主要的工作是基于 Go 语言做一个高可用的客户端,在这个基础上,会在侧链和并行化验证做更多的研究和探索。未来会涉及到其他方向上的技术研究。

640_wx_fmt_png 7图8

   图8是项目的架构图,第一层是提供服务,比如说 RPC、Web Service,在业务层上有P2P的网络使用,包括UTXO,包括网络消息的转发,定义一些基础工具,比如说密码学的一些算法,交易的 model,加解密的工具和存储等。

640_wx_fmt_png 8图9

   图9是业务的流程图,每一个比特币的消息经过转化,对于消息字节的处理,做完相应的处理后,再做一层存储,这是业务处理的逻辑,强调组件化的设计。架构图里,每一块都是独立组件,组件化的设计是从顶到上的结构,每个模块是独立的。拿数据库举例的话,比特币使用了 levelDB。09年的时候,levelDB 是最好的选择,但是现在 rocksDB 会比 levelDB 提升了一些,通过替换相应的接口就可以,这样在存储上能带来更大效率的提升。

   组件化的好处易设计、易实现、易测试、易维护、易复用。在密码学、存储、交易结构上能够少做开发量,复用我们的模块,在开发效率上也有很大的提升。

Q&A

   提问:我比较关心里面提到的 mempool,我想问一下用 mempool 的原因是什么呢?是因为考虑到性能还是考虑到一些 GC 的压力?在你们项目当中用 mempool 的原因是什么?基于什么样的考虑?

   姜家志:不是基于优化的考虑,就是在确认之前,交易要放在一个地方。

   提问:mempool 只是一个逻辑的概念,并不是 GC 之外要搞一个东西。

   姜家志:对,你要把它有一个地方存下来,它是一个逻辑实现上的需要。

   提问:你们的项目对性能的要求高吗?

   姜家志:很高,我刚才说了,我们会把每一个节点,计算机的性能压榨到极致,就会涉及到存储、网络、内存使用,都会出现性能上的瓶颈,和传统上的分布式系统不太一样,传统的互联网项目的优化,区块链项目不能简单的那种做,必须要把单机性能压榨到极致之后再考虑其他的扩展,这对性能和内存的使用要求是非常高的。

   提问:我们都知道比特大陆是硬件公司,你刚才谈到很多软件的东西,在落地的时候,会有后端 Go 语言的落地吗?

   姜家志:落地的话,无论是 C++ 还是 Go 语言,我们不用关心底层 CPU 的架构,其实就是一个软件,就是一套协议,各个语言都应该去实现,大家保持共识一致就可以了。

   提问:不会有特有的硬件吗?比如说你们的蚂蚁矿机等等?

   姜家志:那是挖矿的部分,挖矿只是在整个协议开发中占了很的一部分。矿机的做的预算就是算哈希,他只做需要做这个事情,算出来之后提交到节点,节点提交到整个网络上,虽然在整个协议中只是一部分而已,但是收益很大,就形成了一个很大的产业。

   提问:你们做的软件并不服务于你们的挖矿的硬件。

   姜家志:我们的软件和硬件的关系不大,任何人只要实现比特币的协议,就必须遵从比特币现有的网络协议即可。在矿机里面的挖矿运算,把结果算出来提交到节点就可以了,之后和矿机就没有什么关系了。


更多讲师 ppt 下载,请点击“阅读原文