整体设计原则
CITA-Cloud
从一开始就确认了与云计算结合的路线。
对于上层应用来说是很容易理解的,参见产品定位白皮书。但是对于底层链来说,除了支持部署在 k8s
上,链本身如何结合云计算,一开始并没有想的很清楚。
经过最近一段时间的思考,以及在实际开发过程中的实践,我们已经得到了答案。在之前的技术白皮书主要思考的解耦的基础上,让解耦出的每一个组件都能独立完成某项功能。在解耦的基础上,组件的接口还能够自洽。这样这些组件也可以直接复用已有的库或者软件。
协议详解
Network
Network
微服务,主要提供网络部分的功能,分为收/发两大部分功能。收的部分采用了控制反转,收到的网络报文根据报文头中的字段分发到不同的 Grpc
地址,因此只提供了一个注册接口( RegisterNetworkMsgHandler
);发的部分提供了单播( SendMsg
)和广播( Broadcast
)两个接口。此外就是一个查询网络连接状态的接口(GetNetworkStatus)。
实现上就是已有网络库的简单封装。其中一个实现network_direct直接使用系统网络库,内部实现为节点的全互联。另外一个实现network_p2p,使用了已有的一个 p2p
库。
Storage
Storage
微服务,主要提供 KV
存储相关的功能,涵盖了常用的增删改查功能。接口上有: Store
(其语义是 updata
,同时包含增和改的功能), Load
, Delete
。
针对区块链业务,预先定义了不同的 region
:
enum Regions {
GLOBAL = 0;
TRANSACTIONS = 1;
HEADERS = 2;
BODIES = 3;
BLOCK_HASH = 4;
PROOF = 5;
RESULT = 6;
BUTTON = 7;
}
用户可以根据自己的需要调整 region
列表。
具体实现上,就是已有存储系统的简单封装。当前实现有基于 sqlite
的storage_sqlite和基于 tikv
的storage_tikv。
region
的实现,基于 sqlite
时是用不同的 table
来实现;基于 tikv
时是直接把 region
序列化之后拼接在 key
的前面。
KMS
KMS
微服务,主要提供私钥加密存储,以及相关的密码学服务。接口有: GenerateKeyPair
, HashData
, VerifyDataHash
, SignMessage
, RecoverSignature
,形成——生成密钥对/哈希以及相关的验证/签名以及相关的验证——这么一个自洽的功能集合。可以认为是一个软件加密机加上一个密码学工具箱。
目前的实现kms,支持 secp256k1+keccak
和 sm2+sm3
两种密码学算法组合。
Executor
Executor
微服务,主要提供根据交易改变链上状态以及查询链上状态的功能。接口有: Exec
和 Call
,分别对应执行和查询。
至于执行的细节,比如采用何种 VM
;状态有哪些内容;状态如何组织和保存,都由具体实现来决定。将来可能会给出一些兼容已有链的特殊实现。
Consensus
Consensus
微服务,主要提供让提案在多个共识参与方之间达成一致的功能。接口包括:
- 实现在
controller
中的:GetProposal
本节点提交的提案;CheckProposal
检查别的节点提交的提案;CommitBlock
确认一个提案。 - 实现在
Consensus
中的:CheckBlock
检查同步自别的节点的已经确认的提案;Reconfigure
处理系统配置变更。
单独这个微服务的功能,可以认为是一个分歧解决机。
实现上,目前尝试了 PoX
类型的consensus_proof_of_sleep,以及基于 raft
的consensus_raft。
Controller
Controller
微服务在整个区块链中处于核心的位置,主导所有主要的流程,以及提供准对用户的 RPC
接口。
接口除了前述的针对 Consensus
微服务的接口,就是针对用户的 RPC
接口。其中最重要的是 SendRawTransaction
发送交易接口,剩下的都是一些信息查询接口。
单独就这个微服务来说,可以认为是一个提案管理系统。用户通过发送交易接口,提交原始交易数据, Controller
管理这些原始交易数据。通过计算原始交易数据的哈希,组装 CompactBlock
,以及再次哈希,形成 Consensus
需要的提案,管理这些提案。这里所说的管理,包括持久化,同步,以及验证其合法性。
Blockchain.proto
文件中定义了一套交易和块的数据结构,但是前面所述的从原始交易数据如何产生最终 Consensus
需要的提案,并且这个过程还是要可验证的,这些都由具体实现决定。未来我们会提供一个框架,方便用户自定义整个流程,甚至是自定义交易和块等核心数据结构。