Daoleno

在 Tendermint 上构建区块链

May 5, 2020 • ☕️ 3 min read

本文介绍在 Terndermint 上构建区块链的一般性规则

可获得的特性

去中心化和拜占庭容错

每个节点都拥有本地独立的数据库(MongoDB、LevelDB…),节点之间使用 tendermint 协议进行通信。

不可变性

一旦数据存储在 区块链上,就不能修改和擦除。

区块链通过一下几种策略来达到不可变性:

  • 不提供更改和擦除存储数据的 API
  • 每个节点在其独立的数据库中存储着所有的数据的完全拷贝
  • 所有的交易都是加密签名的,一般交易被存储,更改其内容将会更改签名

高交易率

Cosmos 对 tendermint 的测试显示,在分布于 5 个大洲的 7 个数据中心的 64 个节点的云实例上,Tendermint 共识可以每秒处理数千个事务,提交延迟为一到两秒钟。

索引和结构化数据查询

每个节点都有其本地数据库,意味着我们可以灵活的利用数据库的索引和查询数据的能力

工作原理

通过区块链上交易的生命周期来了解其工作原理

1. 向区块链发送交易

通过交易 API,可以向区块链发送交易

POST /api/v1/transactions
POST /api/v1/transactions?mode=async
POST /api/v1/transactions?mode=sync
POST /api/v1/transactions?mode=commit

交易类型对应 tendermint 交易 api 的类型

2. 交易到达节点

交易到达节点后会做一些基本的验证,如果交易有效。交易会被编码为 Base64,并与一些其他信息一起拼接成 JSON 字符串。 区块链接着会将字符串发送给本地的 Tendermint 实例。

3. 交易到达 Tendermint 实例

当交易发送到 Tendermint 节点时,节点会通过 CheckTx 检查交易,如果检查通过,交易会被放到内存池里,向其余节点广播,最终打包进一个块里。

广播交易有多种方式,分别为

/broadcast_tx_async(立即返回)
/broadcast_tx_sync(通过CheckTx校验,进入到内存池后返回)
/broadcast_tx_commit(打包进块后返回)

区块链需要实现 Tendermint 的 ABCI(Application BlockChain Interface) 来实现自定义交易类型

  • InitChain
  • Info
  • CheckTx
  • BeginBlock
  • DeliverTx
  • EndBlock
  • Commit

每个区块链实例通过收集 BeginBlockEndBlock 调用之间传递的交易(DeliverTx)来跟踪正在构造的块。

实例等到有 Commit 消息的时候才会将新块写进 MongoDB

交易模型

交易包含两种数据模型

asset 包含不可变数据

meta 允许用户定义额外的可变数据