Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust

在本期Hacker Speaker中,我们有幸邀请到Rust语言中文社区(Rust.cc)联合创办人Mike Tang为大家讲解Rust与区块链开发与大家一同继续探索这门以安全、并发、实用为设计准则的编程语言


本篇推送干货十足,阅读全篇需约25分钟,还有Mike提供的扩展资料,建议添加收藏,以便随时温故知新,加深理解哦!



Mike Tang 告诉你,为什么Rust 适合区块链开发


  1. Rust语言特点讲解
  2. 目前Rust领域生态的介绍
  3. Rust的加密库生态
  4. 使用Rust开发区块链


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_02

Speaker:Mike Tang

Rust语言中文社区(Rust.cc)联合创办者

Rust资深开发者

Cdot核心开发者

Rust语言中文社区(rust.cc)联合创办者;多语言资深开发者;极简主义倡导者。从linux到C到lua,如今被Rust深深吸引,中国Rust语言主要推动者之一。坚信Rust将会是一个面向未来50年的基础性编程语言。对开源的看法:开源只是形式,背后的态度需要仔细考量。






0. 引言


我是从2014年下半年开始接触Rust,之后也观望了大概一年多的时间,边观望边学习。当时Rust还没发布1.0版本,变化特别大,经常这个月写的程序第二个月就编译不了了。但是2015年,Rust发布1.0版本之后,兼容性得到了很好的提升。一直到现在,整个兼容性保持得特别好,并且特性逐步在迭代。每六周发布一个版本,没有任何一个版本延误。

 

Rust语言是Mozilla主导的编程语言,很多人拿它与Go进行比较。但是实际上他们的定位差别很大,各自具体的优势、劣势,这里就不展开,大家可以自己查找相关资料学习。




1. Rust语言特点讲解


本身Rush语言的学习内容很多,而且与传统过程或者面向对象的编程语言的区别较大。如果你曾经有过C++的编程经验,或者,另一方面,有过Haskell等函数式语言的编程经验,那么你学习的话可能会稍微轻松一点,如果没有这两方面经验的话,接触起来可能会有一些障碍,主要在概念的理解以及习惯上面会有一定的不适。

 

所以我这里也并不会把Rust语言从头到尾详细的讲一遍,主要为大家介绍一下Rust语言的独特特点,太基础的部分我就不讲了。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust_03


我罗列了一些与区块链有关的Rust的特点,但不是Rust的全部特点,在这里为大家简单介绍一下以上几点。



第一个是所有权。这是Rust语言中的一个特性,其它语言也有但不会去强调,而且没有非常精细的剖析和分析。举例来说:


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust_04

之前没有接触过所有权特性的同学可能理解起来不一定会很快。我可能讲的比较快,如果感兴趣的同学可私下再继续进行研究,了解内在机理。


我大概说一下这个例子,就是说我生成一个hello world字符串,我在传统的语言打印程序中,把这个字符串再赋值给另外一个,那么我再打印这个新的bar这个字符串以及打印之前这个foo这个字符串,都应该能打印出来,这是非常普通的一个程序。

 

但在Rust里面是不行的,我们编译的时候,Rust编译器会给我们报错,“borrowed or moved value”,就是说引用了被移走的变量,然后编译器会很清晰地指出错误的行数。

 

Rust会认为foo首先拥有hello world这个字符串的所有权,然后在执行了bar的赋值之后,相当于把hello world的这个字符串的所有权交给了bar,这个时候bar可以打印,但是foo就不能打印了。

 

这是Rust中与其他语言非常不一样的地方,刚开始接触的时候会非常不习惯,我这里就不更加深入了。今天的讲座也只是大体介绍一下Rust的面貌,让大家感受一下它与众不同的地方,真正要掌握,还需要花大量时间去认真地钻研。

 

第二个就是Borrowchecker,借用检查器。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_05


这其实也是非常简单的一个程序,我得到了一个hello字符串,然后我要把它传给change,然后添加一个world。然后这里又报错了,为什么呢?因为编译器告诉我们,我们不能改变一个不可变的引用。改成这样就可以了:


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust_06


这个例子,我们首先要把s定义成mut,就是可变的。然后再传入一个可变的引用,然后在change里面的参数类型也要声明成可变的引用,然后就可以对其进行操作。


然后,对同一对象,可变的引用就只能一个,如果有多个会怎样呢,我们看一下。

 

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_07



同样,Rust编译器能准确地捕捉到代码中的问题,非常严格,当有多个可变时,它直接会说第一个可变引用在这里,第二个又出现了就不行。所以刚开始会非常不适应。但是正因如此,Rust才能做到在没有gc的情况,做到对内存的自动和安全管理。


第三点,枚举。Rust中的枚举很强大,是个和类型,可以包括Rust中其它所有类型。

 

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_08


在类型具有明确边界时,可以替代泛型使用。明确边界这里是说这个枚举中有个变体,这个数字是确定的,这种情况下可以代替泛型使用。

 

泛型是类型抽象的方式,也是一种复用代码的方式。从C++/Java 过来的同学应该比较清楚吧。动态语言中对泛型提得不明显,但是基本是支持泛型的。


Trait是Rust 的定义共享行为的方式。在其它语言中,可能对应Interface,但是并不完全相同。举例来说:


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_09



这里我们首先定义了一个叫summary的一个trait,其中有一个方法叫做summarize,返回一个字符串。对于两个不同的结构体,一个叫news article,这可能是一个博客的对象。然后有个另外一个tweet,就是推的对象,这两个对象的结构、内容完全不一样。但是都可以具有同样的行为,都可以执行summarize,但是内容不一样。在这种场景下,就可以分别单独去实现这个summarize的trait。


优势是,比如在另外的接口中可以利用泛型,同时接受这两种不同的对象。然后他都可以调用同一个summarize方法,在实际中执行的是不同的实现。泛型结合triat在Rust中的可玩性就特别高,下面来看一个小例子。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_10



这个就简单介绍一下,往往我们在定义一个泛型的时候,都会给他限定一个或者一些trait。这样来限定它具有某些方法的形式,即可以想象成这个类型,具有某种身份。大家如果感兴趣可以继续进行系统学习。



下面讲运算符重载。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_11

这个学过C++的同学应该都比较熟悉。比如说我定义的两个结构体,也可以实现加减乘除或者其他运算。在Rust里面实现运算符重载也是通过实现trait完成。这个trait的名称是特定的,是STD标准库里面提供的。


下面介绍Trait object,如图。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_12


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_13


Trait更高级的内容有关联类型,在后面依赖注入的时候非常重要。使用Trait 的关联类型,可以在实现的时候,才指定需要的类型。这就是依赖注入。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_14

Rust中的比C和C++中的要强大。因为它不是字符串模板,而是基于语法树层级的。然后可以利用模式匹配在语法树之上进行操作,可以对代码的token流直接解析,非常强大,但是也容易被玩坏。


以上就是Rust语言中的代表性特点,但讲得特别粗略,大家后面有时间可以慢慢去理解,因为都是一些例子,可以结合Rust的书来系统性的学习和理解。只有理解其中的细节,才可能掌握精髓和设计理念,它是一门非常有特色的语言。




2. Rust领域的生态


目前 Rust 领域的生态介绍:



l   异步(async/await)1.3911 月正式发布:async-std,tokio

l   command line: clap, struct_opt, fd,ripgrep,bat ...

l   Web Framework: hyper,  Rocket,Actix-web, Tide, Sapper, diesel ...

l   Web Frontend Yew, Seed, Deno

l   WebAssembly: wasm-bindgen, web-sys,js-sys

l   数据库:tikv,sled

l   大数据处理:DataFusion, FastSpark

l  CDN:cloudflare云,边缘计算

l   BlockChain: Polkadot/Substrate, Libra,Grin,Near, Nervos ...

l   操作系统与嵌入式:redox, tock, 连载教程

l   机器学习与AI:tensorflow-rust

l   GUI: gtk-rs, imgui-rs




Rust语言从2015年发展到现在,今年最重要的工作就是异步,在11月就会正式出版。整个社区其实都在等待这个版本的发布,因为很多异步方面的工作,比如web服务、数据库、P2P都在等待它的特性。目前这一块的技术库有tokio、async-std等。


Rust语言在2015年发布之后,这几年在命令行领域出现了很多优秀的项目。比如grep、fd、ripgrep、bat等。如果是用Linux或Mac的用户,可能早已经用到了。这些工具都非常优秀,速度非常快。然后在web框架领域也有不少,比如rocket等等。并且Rust的web框架在那个web框架的性能评测中基本都能占据前几位。


Rust也可以用来开发web前端。比如说Yew还有Seed,就借鉴了ELM和react的思路,然后用Rust编译成webassembly来操控前端的元素,目前也在快速发展中。所以用Rust写web、APP、前端,是完全可行的。前端,后端都可以用Rust写,Rust可以成为一个真正的全栈语言。另外还有一个deno这个项目要提一下,他是Node的原著者做的,号称Node版本2.0。里面也有很重要的部分是用Rust来写的,因为性能相关的部分用Rust写非常有优势。


第五个就是WebAssembly,从目前行业发展来说,Rust上的WebAssembly是最好的,比C/C++的工具都要完善。

 

第六,数据库有tikv是国内公司主导的,还有sled这个嵌入数据库。以及还有其他一些我没有去收录。大数据处理方面也有一些项目出现了,但是都还在早期。对于CDN来说,cloudflare是Rust的忠实粉丝,用Rust造了很多轮子。

 

至于区块链领域,目前全世界有相当多的重要项目,都已经在用Rust来写了。也有很多人拿Rust做操作系统的尝试。比如redox和tock,tock是一个嵌入式操作系统。以及一些用于学习的连载教程。

 

然后机器学习与AI,谷歌的tensorflow-rust也已经被被提升为他们的一级支持项目。GUI的话,有gtk-rs, imgui-rs可用,但还称不上完善。这是Rust的短板。


虽然Rust是由Mozilla主导开发的,然后交给了社区发展运营,看起来也没有一个好爹。但实际上,经过这几年的发展,已经逐渐受到了各种大厂的欢迎。比如,微软的安全部门内部力推Rust,至少相当一部分代码会用Rust来写。然后亚马逊云服务中的很多组件,都已经在Rust来写了,包括一个新的、轻量级VM,叫做firecracker。之前一段时间,亚马逊云对Rust核心组的赞助也被国内媒体广泛报道。然后谷歌的新的操作系统Fuchsia等,也大量用到Rust。然后英特尔在虚拟机方面的设施也用Rust做了很多尝试,开源了一些项目。更加重量级的是Facebook的Libra,引起了世界的轰动。阿里也推出了编排管理的Rudr项目。百度的硅谷实验室X-lab利用Rust做了一套基于安全的项目,比如命令行技术工具、甚至一个小的Linux发行版。几大主流IDE对Rust的支持,目前也都还不错。


目前国际的大厂支持:

l  微软:安全部门主导推荐

l  AWS:云中的很多组件

l  Google:Fuchsia, tensorflow-rust

l  Intel:虚拟机方面的设施

l  Facebook:Libra

l  阿里:Rudr

l  百度:X-lab  mesalink, rustls


IDE

l  JetBrains:Rust 插件

l  VS code

l  Clion

l  VIM

l  Emacs




3. Rust加密库的生态


上次孙老师讲过椭圆曲线加密,非常深入,我在这里讲一下Rust加密库的生态。

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_15

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_16

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_17

这是网友整理的Rust各种加解密算法的库。可以看到Rust在加解密的生态已经相当完善,而且Rust语言也是最早用来实现某些算法的语言之一。比如SR25519很早就使用Rust实现了。Rust语言的运算符重载以及泛型、trait在这些库里用的特别多,十分清晰。这里面每一个就不细讲了,可能孙老师研究的更深一些。但是这些名字在区块链领域是会经常碰到的,如果有时间逐个学习也是有好处的。


Paritytech也是轮子专家,最早使用Rust开发区块链的公司之一,当时用Rust开发时也缺了很多东西,于是他们造了很多Rust密码学领域的轮子,大家可以去他们的Github上看一下(https://github.com/paritytech)。




4. 使用Rust开发区块链


实际上,用某语言开发区块链这个题目本身就可以写成一本书,在本次讲解中也只是简单地提一下为什么Rust适合开发区块链。


下面,我们会以解析 Substrate 为例,来简单介绍一下,如何使用 Rust 来写一个完整的区块链。


区块链的结构可以分为六大系统,包括基础部分(5个)和链上功能系统:

l  区块链系统基础部分

¡  存储系统(Kv,SQL)

¡  p2p数据传输,gossip

¡  共识系统 (区块链分布式基石) PoW, PoS, DPoS ...

¡  交易池/执行器系统

¡  rpc系统(区块链与外界交互主要通道)

l  链上功能


其中,基础部分所有的区块链都会覆盖,充其量是实现的不同。但是链上功能,不同的区块链,内容很不一样。比如:

l  Bitcoin 的 UTXO 模型及脚本系统

l  Ethereum 的智能合约平台, solidity, evm

l  Polkadot/Substrate的 runtime 及 合约系统,wasm


所以,这就会有一个问题,如果每一个区块链都要重复实现前五个系统的话,其实会浪费大量的人力和物力,而且它的正确性也不一定能得到保证。我们都知道,软件工程使用的越多,bug越少,bug解决的越多,就越来越完善,特性也是。所以说Parity在研发Polkadot网络的时候,逐渐就诞生了构建一个通用区块链框架的思想。所以就把代码抽出来形成了substrate工程。


Substrate 简介

Substrate 是Parity主导的面向未来的通用区块链开发框架,使用Rust 语言编写。它为区块链抽象封装了一整套基础设施,在功能性和易用性之间做到了较好的权衡。它的分解和抽象水平,目前在世界范围内来看都是比较厉害的。使用Substrate,我们可以快速验证我们的想法,相当于大幅降低了区块链开发的门槛。


Substrate 中用到的一些 Rust 基本技术有:


泛型

必不可少,通篇使用,也会使初学者在刚开始看代码时掌握不好。


加密库中的高阶类型需要的运算符重载,+ - * /  

在加密库中很重要,如果没有,代码就会写得非常啰嗦,各种转换容易出错。有了运算符重载,就会让代码变得漂亮、清晰。


使用Trait 关联类型实现的依赖注入

对于框架来讲非常重要。框架的目的就是要提供基础功能,不能给上层太多限制,在方便和灵活性之间其实是一种矛盾,如何让开发者方便实用,又不限制开发者的能力,这是一个非常大的问题。我认为Substrate做到了这一点。


宏,用得非常多,非常重要

我个人认为,substrate用宏有一些过度。


自带的测试框架


Rust 对 wasm 的最优秀支持

webassembly用的非常多,也非常重要。Rust为其提供了最完善的工具链和支持。


std 与no_std 属性开关,Rust 编译目标的快速可切换


类型化编程(设计成充分利用类型来保证程序的安全可靠)

利用Rust强类型的特性,进行类型化编程。


利用tokio 启动若干独立的 task service,并保持轮询

可以认为substrate中的服务是独立的,相互耦合很少,互相通过Channel通信。


ed25519,sr25519 等密码学库的使用


l  以及其它特性,在此不一一列举。



Substrate 的结构实现:


存储系统,rust-rocksdb,字典树 trie。


P2P 传输系统,rust-libp2p,这个里面本身内容也很丰富,这个也是Parity团队实现的。


共识系统,BABE/GRANDPA,PBFT 的实现和改进,这是自带的共识协议,开发者可以自行实现自己的共识协议,这些模块是可插拔的。


交易池/执行器系统    transaction_pool,executor, state-machine,wasm。


l  Rpc 系统rpc-servers, rpc。


Substrate的上层功能部分全在runtime中实现,也即srml 和srml 相关的底层支持代码中。


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust_18

Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_区块链_19



Substrate采用应用平行链的模式,一条链就是一个应用,从而突破了以太坊的智能合约的模式。Substrate的平行链作为Polkadot跨链系统的生态的一部分,可以方便地与其它平行链交互。解决了以太坊的重大瓶颈问题。在Substrate上实现一个evm 也是可以的。


Substrate的内容非常多,这里只能简单提一下它的实现。我们研究substrate 也有一段时间了,目前正在规划建立Substrate 的中文技术社区。更多的资料,请关注社区,也欢迎大家积极地参与到社区的建设中来。 




5. 总结


Rust 本身的严谨、高效,使其成为面向IT 工业未来50年的语言,而区块链行业如火如荼的发展,正好撞上Rust 的出现。自从Rust2015 年发布1.0 以来,使用Rust 开发区块链的项目越来越多,一些国际最重要的项目都使用Rust开发,这与Rust 语言本身的理念及优秀特性和实现是密不可分的。


目前区块链的发展,还处于非常初级的时期,Rust 能在其中发挥作用的空间,还非常大。


Rust 与区块链,会互相成就。




扩展材料


当区块链遇上Rust

​https://rust-china.org/article?id=289da7be-19ce-49fe-af6d-3a7946404ca6​


你们居然用Rust

https://mp.weixin.qq.com/s/YxFOpNfG9l4GbqFnEIW0LQ


Substrate 设计总览

​https://zhuanlan.zhihu.com/p/56383616​


Substrate 设计总览 (二)

​https://zhuanlan.zhihu.com/p/56414647​


Substrate 源码导读 - 之命令行启动

​https://docs.qq.com/doc/DQldUWkJIWHJMQ3BI​


Substrate Runtime 实现代码分析

​https://docs.qq.com/doc/DQmpQcnVOSGZvVnZ0​




Q&A


Q:关于webassembly,目前用rust写合约,编译成webassembly部署到链上运行,这块是否成熟呢?

A: 目前substrte的runtime和合约,都可以编译成wasm运行,目前运行很稳定,eos也在推进。以太坊的ewasm也已经开发了很久,但是还没正式投入使用,要说成熟,肯定谈不上,但这是趋势。


Q: 做了五六年底层嵌入式了,中间做过go项目,拿python做过几个小工具,底层基本腻了,想转行到上层,求教有没有什么方法?

A: 嵌入式,用 Rust 不更好吗?嵌入式转上层跨度挺大的,而且上层细分领域这么多。这个问题不好答。这个还是看个人,没有统一的方法。如果想切入区块链领域,从substrate入门是一个比较好的办法。


Q: 对rust很感兴趣,而且最近区块链风口很盛,想凭借rust进入该行业可行吗?社区有没有rust练手的项目能够参与呢?

A: 可以啊。就是 substrate,强烈推荐。substrate虽然脱胎于 polkadot,但是完全可以独立出来成为一个中立的项目。它是纯技术的开发框架。跟具体的币没有关系。可以从这里学习入手。主要是我自己看好这样一个底层框架,用它来做任何项目都可以。比如用 substrate 开发 cosmos 相关的节点模块。用Rust进入这个行业非常好,你也可以在国内找到大量的开发者用同样的技术栈。substrate上有加密猫的项目可以用来练手。


Q: rust是mozilla推进的项目,想提问Rust, WebAssembly, C++在blockchains开发中的优势是什么呢?Rust没有Go那样有个好爸爸,那Rust的前景领域会会有哪些呢?

A: 好爹的问题,上面提到过了。只要是好孩子,还是会有人爱的吧。而且,爱的人会更多,不止一个爹。比如现在 amazon 就想成为 rust 的后爸。blockchain 开发强调安全,高性能。rust 刚好切中这几个点。webassembly 是撬动未来整个IT界的技术方案,大厂们都一致在定标准,跟着走没问题的。c++在性能方面没问题,在内存安全上,普通程序员可能会有一些问题。


Q: rust的主要应用场景是?是否适合后端开发呢?

A: 前面已提到过。非常适合后端开发。其实国内大厂,阿里,知乎,头条,美团,百度等都在尝试用 rust 进行后端服务开发了。


Q: 区块链开发的步骤都有哪些?如果用C语言开发的话需要有哪些注意事项?以及怎么样才算拉链(公链)完毕呢?

A: Rust应该场景很广泛,但最有竞争力的应该是一些性能相关的领域。比如,之前C++占据统治地位的地方。比如,游戏,数据库,图像处理,科学计算,加解密等等。区块链也算一个。建议完整的看本区块链开发的书。c语言开发区块链,会遇到基础设施的问题,而且,安全性,内存泄漏,空指针,缓冲区溢出这些问题,很难克服。用c开发的区块链,性能上,也不比 rust 开发的区块链好(理论上)。区块链的几大组件,我前面已经提到过,都实现了,再统一串到一起,就能起一条链。


Q: Rust适合去做嵌入式开发吗?

A: Rust 官方2018年重要的四个方向之一,就是嵌入式开发。但是好像推进效果不太好。rust 其实是非常适合做嵌入式的,但是嵌入式行业工具链的碎片化非常严重,导致还需要长时间的积累。需要有更多人投入才行,这就是鸡和蛋的问题了。






Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_Rust_20

DoraHacks是中国社区覆盖范围最广,全球最活跃的极客组织之一,成立5年来,DoraHacks联合600多家合作伙伴在8个国家15个城市燃起科技团战烽火,积累了3000余项目,辐射30万名开发者,并于今年7月发起“第四次工业革命”千人黑客马拉松。


DoraHacks的使命是连接全球极客,解决重要而迫切的问题,成为未来行业问题的最新解决方式。


了解更多关于DoraHacks“第四次工业革命”极客马拉松详情,请关注DoraHacks官方微信、新浪微博@DoraHacks #第四次工业革命极客马拉松#


Mike Tang跟你聊Rust与区块链开发 | Hacker Speaker 回顾#03_泛型_21