简介
GoQuorum基于geth,在其基础上增加了一些联盟链需要的组件,主要包括以下几点:
- 使用Raft或者Istanbul BFT共识算法,而不是PoW。
- 加入了准入机制,而不是任何节点都可以加入网络。
- 修改了区块产生逻辑:使用
global public state root
替换了global state root
。(TODO) - 修改了区块验证逻辑:
State Patricia trie
分成了两个:public state trie
和private state trie
- 修改了区块验证逻辑以支持private transactions。
- 修改了创建transactions的逻辑,支持private transactions。
- 移除了gas的费用(但保留了gas)。
账户/密钥管理
用户提供公私钥。
账户地址是公钥keccak256
哈希的后20个byte。
隐私管理器使用公钥作为目标节点的标识(privateFor
字段)。
隐私
在GoQuorum中,隐私指对于private transactions,只对相关的参与者可见,其它参与者不可见。
##私有交易管理器 (Private transaction Manager)
**Tessera**
指 Quorum 中的私有交易管理器:
- 存储、访问加密后的交易数据。
- 与其它 Tessera 节点交换加密后的payload。
- 不能访问私钥
- 使用 enclaves 实现密码学相关功能
- stateless/restful
enclave
密码学技术是分布式账本的基石,Quorum将很多密码学功能(对称密钥生成、加解密)委托到了 enclave 中。
公有/私有状态
Quorum支持两种状态:
- 共有状态 (
public state
):网络中的所有节点都有权访问 - 私有状态 (
private state
):有权限的节点才能访问
二者的不同在于 transaction 的 payload 是否加密。对于 private transactions ,无关节点没有 payload,因此每个节点需要维护两个 state 。
状态验证
为了保证节点同步,block 需要包含 public transaction 的 root hash。对于 private transactions,不可能达到全局同步(因为有些节点不含private transactions),因此需要使用eth_storageRoot
这个 RPC,指定 private smart contract 地址和区块高度,如果所有相关的节点完成同步,那么将得到相同的 root hash。
交易和合约隐私 (Transaction and Contract Privacy)
Quorum 如何实现交易隐私:
- client 可以通过指定
privateFor
字段来限制交易的可见者 - 替换 transaction 的 payload 为 payload 加密后的 hash 值
- 使用隐私管理器 (Privacy Manager) 链下存储加密的数据
TODO
参考
- https://docs.goquorum.consensys.net/en/stable/Concepts/Architecture/