• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go在区块链的发展和演进

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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



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


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


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

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


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

图1

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

图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 语言

图3

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


4.为什么选择 GO 语言?


4.1 区块链开发的特点



图4

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


4.2 其他语言

C++


图5

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


JavaScript


图6

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

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


4.3 Go 的优势


图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 语言做一个高可用的客户端,在这个基础上,会在侧链和并行化验证做更多的研究和探索。未来会涉及到其他方向上的技术研究

图8

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

图9

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

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


Q&A

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

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

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

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

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

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

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

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

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

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

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

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




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



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO发布时间:2022-07-10
下一篇:
go语言的time.Sleep发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap