今天呢,跟大家一起学习Rust, 学习的项目就是 facebook 的 Libra 项目。 搞懂Libra项目,学习区块链的思想和项目的build,是我学习Rust的主要动力。 因此我们首先从Libra 的项目说起,把各个模块都大概了解下,然后在分析代码的时候,我将以自己的想法,谈谈 设计 和 读 源码(Rust).
首先简单的说说 Libra项目, Libra(天秤座)的使命是建立一个简单的全球货币和金融基础设施,为数十亿人提供支持。这个货币叫做 Libra,号称是以分散式区块链为基础,构建出低波动性加密货币(相比比特币), 和智能合约平台(相比以太坊). facebook的雄心计划可见 Libra 具有发币(国家央行)的作用,为全球人提供金融服务(全球的央行). 发币是以有价资产作为支撑。
先不考虑Libra 的经济逻辑,咱们先转过来看看Libra 项目的源码和思路。看看代码层面上是如何支持这么大的一个宏观计划的? 在分析代码前,我们需要看看Libra 的一些核心概念,和Libra的源码项目结构,然后我们来分析源码的每个模块的设计和源码。
核心概念:
发送方地址: 发送方的账户地址
发送方公钥: 公钥可以验证私钥的签名,公钥可以产生许多的账户地址,账户地址一共是有32个字节组成
发送方私钥: 私钥是用来做签名的.
Gas 价格: 这个价格是用来付费的,这个费用是用来执行一笔交易。我的理解相当于手续费,费用越高,越优先的成交这笔交易.
交易的状态: 意思是在区块链上每个人账户最终状态,比如 这个人账户余额是多少,转账是多少,等。
分类帐状态: Libra 区块链的状态,这个状态是由在这个区块链上的所有账户的状态的组成, 为了执行这比交易,区块链的 节点的validator 必须知道最新的全局状态。
工作量证明(PoW): 这个跟 Merkle tree 有关系,后面会单独的来谈谈 Merkle tree 背后的原理是什么。工作量证明机制, 简单来说就是 来实现竞争结果判定。
但是对于Libra这个项目来说,不会像比特币那种方式 造成很大的资源浪费,Libra 应该提出自己的解决方式来 解决工作量证明的问题。
好了,咱们来看看 Libra的项目的构建,然后再看看源码项目的结构: 下图是来自于官方的validator node 大致 各个模块的流程。咱们来一个一个看看 每个模块是大致做什么的。
Client: 客户端就是发起transaction的,和user 打交道的。
Admission Control: admission control 是一个对外的接口,任何的一个client 发起的request,都会首先进入admission control 这个节点。
AC 这个模块是对client request 做一个初始的检查, 比如可以做流量的控制,合法合规性的检查。 Libra 是用 grpc 来做 各个节点之间的调用的。
Mempool: 这个节点是用来做buffer的,将待处理的交易存储到这个buffer 里,等待被执行。因为是分布式系统,这池里面存储的交易, 和其他节点是共享的。
Consensus: 这个一致性组件, 一是为了 排序交易的区块,二是为了 对一笔交易 和其他节点达成共识。
Execution: 执行节点,一是 利用虚拟机(VM) 执行这段交易(以太坊智能合约 是有vm 执行合约里面的代码). 二是协调一个区块交易的执行,并且在其他各个节点中去维护一个透明的交易状态
Virtual Machine(VM): AC 和 Mempool 是使用VM 组件 执行每个交易的校验检查。VM 是用来执行程序。
Storage: storage 是用来存储达成协议的交易区块链,和执行结果(执行的最终状态).
大家看到这里,是不是很激动
1. 这些模块是怎么组织到一起的? 代码的逻辑是怎么样实现的呢?
2. 好多分布式的共有的问题是如何解决的呢? 比如共识。 Rust 是如何基于CAP 理论来做分布式系统的呢? 相信构架的朋友们,会很好奇。
3. Rust 本身号称安全性的语言,依靠Rust 类型系统和 所有权系统。Rust 语言本身就很神奇。
好了,咱们一起去探究探究。 首先咱们先看看Libra 项目的代码结构。后面我们一个一个来讨论。
1. 编译器: CLion
2. 在CLion 里配置好环境,下载Rust 插件和 cargo 的toml 插件包管理。
3. 安装Rust 和 cargo,请见官网。
4. 更改cargo 的镜像源,速度会快点。镜像 查询请见: https://crates.io/
镜像源更改: (1) cd ~/.cargo/ (2) vi config (3) copy 下面的内容.
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
好了,配置好了之后,去download 的 Libra项目 https://github.com/libra/libra.git, 然后使用 CLion 大家项目。 执行cargo build: 这个步骤会执行很久,最好有外网的环境。 因为网络的原因,很可能build 是失败。
下图是build 成功的 项目,看着都感觉到激动, 每个模块的层次很清楚。 后面就是慢慢学习的时候了。
下一篇博客,将从这个项目的依赖构建说起,然后我们从client 模块探究。逐层分析。
咱们下期见!