前两周上线了我们为 Cybermiles 提供的 supernode,因为 Cybermiles 主网使用了 Tendermint,于是上周便研究了一下 Tendermint,边学边写了个 slides 介绍 Tendermint。
Tendermint 是一个脱胎于 PBFT 的 consensus engine,并在此之上构建了一个 Appliation BlockChain Interface (ABCI),让 blockchain 的开发者可以关注于如何提供服务,以及维系服务的状态,而把如何达成共识,如何管理 mempool,如何进行安全的 p2p 通讯这样的琐事交给 Tendermint 来处理。Tendermint 自身是 golang 撰写的,其 ABCI 接口用 protobuf 实现,并使用 raw TCP 或者 http2 (gRPC) 和 application layer 通讯。
周日,闲来无事,想用 tendermint 做点东西。无奈 tendermint 没有提供 elixir 的 ABCI 实现,社区的 erlang 实现又缺失一些东西,且我很不喜欢 erlang 下用 Record 来描述 protobuf 的方式,于是用 Tony 的 protobuf 库,写了个 elixir 的 ABCI 实现,放在 github.com/arcblock/ex_abci 上,并随后实现了 Tendermint 自身提供的 counter example app - 用区块链的不可篡改性来维护一个全网唯一的计数器。
使用 ex_abci,counter app 的核心代码也就几十行,就是实现 info,check_tx,deliver_tx 几个接口即可:
这样的 app 当 hello world 还可以,用来验证 Tendermint 是否靠谱,本身并不靠谱。Tendermint 还提供了一个 kv store 的 example,也没有 get 到区块链的核心要素,于是我便萌生了搞一个足够简单,最好能在几百行内演示区块链技术的 Simple Chain。那什么算是区块链的核心要素呢,我觉得是这幅图 - Merkle Patricia Tree (MPT):
这是以太坊保存其 World State 的核心 - 我相信我的读者们了解 patricia tree (prefix tree, radix tree, 或者叫 trie),有一些区块链知识的读者应该知道 merkle tree,MPT 结合二者,组织出一个自带验证的 persistent data structure(函数式编程语言保存 list / map 的方式),关于 MPT 和以及上图,我们的工程师丁沛灵同学在上次北京 Hackathon 有一个精彩的讲座,感兴趣的同学可以去 youtube arcblock channel 上找:ArcBlock’s Introduction to Blockchain,在 37 分钟附近开始讲 MPT,大约 10 分钟,非常之深入浅出。篇幅有限,我这里就不详细展开。
关于 Simple Chain,产品上我是这么考虑的:
花了两天的功夫,一个粗糙的,未经过多节点测试的版本终于实现了,源码见:ex_abci/examples/simple_chain。我们谈谈其主要对外接口:
下面是运行时的整个过程。
初始化:
Wallet 状态:
转账:
Tendermint block:
转账结束后的状态:
这个 Simple Chain 主要使用到的技术:
目前代码量在 400 行内,基本上一目了然,用来理解 Tendermint 和区块链技术的基本逻辑再好不过。感兴趣的读者可以安装 tendermint,下载 github.com/arcblock/ex_abci 尝试。
本来这篇文章想赶在 1024 节前发的 - 昨晚我处理 crash recovery 没有处理好,今早开车穿越 90 号高速上的迷雾时,突然有了思路,所以文章发晚了。对这些技术感兴趣的同学,可以在 https://hack.arcblock.io/learning/ 上面报名我们未来的 Tech Talk,以及关注 arcblock 的 youtube channel 获取我们之前的知识分享。
祝大家 1024 节快乐!