Quorum 是由 J.P.Morgan 推出的企业级分布式账本平台。在以太坊的基础上,Quorum额外提供了联盟链的服务。在公有链方面,Quorum继承了以太坊的协议及其客户端Geth。
Quorum 和以太坊的主要区别:
- 提供了Transaction和Contract的私有化功能。
- 多种基于投票机制的共识方式。
- 网络与节点的权限管理。
- 更高的性能。
Quorum 的主要组件:
- Quorum Node (节点)
- Constellation - Transaction Manager (用于私有Transaction的管理)
- Constellation - Enclave (用于加解密私有Transaction的信息)
2. Quorum的结构
Quorum Node
Quorum 节点的设计主要沿袭以太坊的 geth。面对日益壮大的以太坊社区,Quorum 希望能借助以太坊越来越完善的节点设计。因此,未来每次 geth 的 release 版本 Quorum 都会针对性的做升级调整。
为了适配其企业级的联盟链功能,Quorum 同时还对 geth 做了部分调整:
1. 用其自己实现的基于投票机制的共识方式 “QuorumChain” 来代替原来的 “Proof of work” 。
1. 在原来无限制的P2P传输方式上增加了权限功能。使得P2P传输只能在互相允许的节点间传输。
1. 原来区块中的 “global state root” 被替换成了 “global public state root”。
1. 原来的 state 存储被分成了两部分,分别存储 public state 和 private state。
1. 修改区块校验逻辑使其能支持 private transaction。
1. Transaction 生成时支持 transaction 内容的替换。这个调整是为了能支持联盟中的私有交易。(后面的 Transaction Processing 章节会提到)
Constellation
Constellation 模块的主要职责是支持 private transaction。Constellation 由两部分组成:Transaction Manager 和 Enclave。Transaction Manager 用来管理和传递私有消息,Enclave 用来对私有消息的加解密。
Transaction Manager
在一次私有交易中,Transaction Manager 会存储私有交易的内容,并且会将这条私有交易内容与其他相关的 Transaction Manager 进行交互。同时它也会利用 Enclave 来加密或解密其收到的私有交易。
Enclave
在分布式账本中,密码学被广泛的运用在交易真实性校验,成员校验,历史信息追溯等方面。为了能更有效率的处理消息的加密与解密,Quorum 将这个功能单独拉出并命名为 Enclave 模块。Enclave 和 Transaction Manager 是一对一的关系。
3. Transaction
在 Quorum 中有两种交易类型,”Public Transaction” 和 “Privat Transaction”。在实际的交易中,这两种类型都采用了以太坊的 Transaction 模型,但是又做了部分修改。Quorum 在原有的以太坊 tx 模型基础上添加了一个新的 “privateFor” 字段。同时,针对一个 tx 类型的对象添加了一个新的方法 “IsPrivate”。用 “IsPrivate” 方法来判断 tx 是 public 还是 private,用 “privateFor” 来记录 tx 只有谁能查看。
Public Transaction
Public Transaction 的机理和以太坊一致。TX 中的交易内容能被链上的所有人访问到。
Private Transaction
Private Transaction 虽然被叫做 “Private”,但是在全网上也会出现与其相关的交易。只不过交易的明细只有与此交易有关系的成员才能访问到。在全网上看到的交易内容是一段hash值,当你是交易的相关人员时,你就能利用这个hash值,然后通过 Transaction Manager 和 Enclave 来获得这比交易的正确内容。这在 Transaction Processing 章节中会详细介绍。
Transaction Processing
Public Transaction的处理流程和以太坊的 TX 流程一致。TX 广播全网后,被矿工打包到区块中。节点收到区块并校验区块中的 TX 信息。然后根据 TX 信息更新本地的 State。
Private Transaction也会将 TX 广播至全网。但是它的 TX payload已经从原来的真实内容替换为一个hash值。这个hash值是由Transaction Manager提供的。
两者的区别可以参考下图: