本篇是三部曲的第二部分,聊一聊 JPM coin 背后的区块链网络 - Quorum,详解其特点、共识机制,及其如何满足传统银行业的商业需求。
Quorum 被认为是“企业级以太坊”,从2016年起由摩根大通银行启动的开源项目。
(https://github.com/jpmorganchase/quorum)
相对于一般的区块链,Quorum 有以下几个特点:
兼容以太坊合约
准入系统,已知节点
链下+链上隐私保护
灵活支持多种共识机制
高性能、速度快、抗分叉
以太坊的克隆
Quorum 之所以可以兼容以太坊的合约,其本身是以太坊客户端 Go 语言版本 (go-ethereum) 的“克隆”,并根据 go-ethereum 发布进行更新。这意味着所有在以太坊上跑的合约,包括如 Truffle 一样的开发框架,都可以直接部署在 Quorum 上。
但这不代表 Quorum 和以太坊网络之间当下可以互通 (Interoperability)。Quorum 更多是一个联盟链,不是所有人都可以随意加入网络。节点的加入与去除需要授权,并且是已知的身份。这个网络里没有挖矿机制,也没有原生代币。尽管保留 Gas 本身,但是删除了以太坊中 Gas 的定价,即 gasPrice = 0,转账时没有矿工费。
注重隐私与监管友好
以太坊的特点是账本公开透明,普通人打开一个以太坊浏览器,就可以查到每笔交易的全部信息。透明性对于公链是一个优点,到了传统行业,却成了无法匹配的痛点。对于金融业而言,数据的隐私非常重要,银行不希望将自己的资产状况和交易记录公之于众,更不愿意这些数据被竞争者获取。
保护隐私性是 Quorum 的核心功能之一,Quorum 将交易分为公开交易与私人交易。
公开交易直接在主链节点间完成,与以太坊基本一致。
而私人交易会放在链下独立的服务器进行加密处理。Quorum 主链上只存储加密后数据的哈希值,而私有交易的数据将存储在链下,通过管理引擎(Tessera 和 Constellation)在节点间共享。只有交易的相关方(以及监管部门)才能看到交易的细节,非相关方无法获取交易细节。
主链中所有节点的状态公开,达成绝对的状态共识,而私有状态数据库的情况则不同,不保存全局状态。如果你希望进行一笔私人交易,只需要在发起交易时添加一个 privateFor 的标签,加入节点对象,这笔交易便可以在私有状态数据库中点对点进行。
不过这也会带来一些问题,
1. 一旦 privateFor 的节点列表确认发送,就无法添加新的节点到列表中。换句话说,如果对方事先不处于这笔交易链条的一环,就无法获取之前发生的交易详情。设想,对于某些交易,如果央行或者监管者一开始不在这个网络中,后来决定加入,却无法直接获取之前的交易信息。
2. 由于私有状态数据库是点对点进行,不同步全局状态,这就带来双花的风险。
此外,将数据放在链下的服务器不可避免地带来中心化和单点失败的风险。
为了解决链下隐私方案的缺陷,Quorum 在 2017 年与 Zcash 团队合作,提供了一种链上的隐私方案,连接私有合约以及主链 — 合约的商业逻辑在私有合约内部达成一致,然后在主链上进行清算,并以零知识证明的方式使用 z-token 作为保护隐私的桥梁。
如何搭建隐私桥梁呢?z-contract 合约会生成与主链资产 1:1 的代币资产 z-tokens。需要注意的是,z-contract 也在主链上运行,只是其资产是隐蔽资产 (Shielded Assets) 可以隐藏交易信息(发送方、接收方、资产数量等)。
对于一笔隐私交易,会按照以下步骤进行:
卖方创建私人合约,规定合约的细则:包括资产金额、买卖方等。
买方接受合约,此时双方在私人合约层达成一致。
私人合约通知买方付款。
买方将一部分资产从公开主链转移到 z-contract 层,通过 z-tokens 完成隐蔽支付。
买方通知私人合约支付已经完成。
私人合约验证支付已经完成,通知卖方转移资产。
卖方同样通过 z-contract 层的 z-tokens 完成隐秘转移。
卖方通知私人合约转移已经完成。
私人合约验证转移已经完成,此时交易完成最终结算。
其他节点只能看见公开账本上的余额,监管者可以查看 z-contract 层的 z-tokens 转移。
通过增加一层平行的支付网络,交易过程中无需暴露全部的信息,资产在链上清算避免双花和中心化的风险。同时,也给监管者提供了便利。
灵活的共识机制 - 追求最终性 (Finality)
Quorum 可以支持三种共识机制,包括 PoA、RAFT 和 IBFT。
在介绍这几种共识机制之前,我们发现 Quorum 并没有支持最常见的 PoW (工作量证明) 或者 PoS (权益证明),为何呢?
PoW 和 PoS 都属于 Nakamoto Consensus,任何人都可以随时加入和退出节点,这种共识机制通过节点之间某种公平的“投票”选择记账人,由于节点没有身份,可以自由地创造,相互不信任,因此投票资源必须是稀缺性的。在 PoW 机制下,稀缺资源是物理算力,而在 PoS 下,这种资源是经济权益。无需准入带来了去中心化的制衡,但节点之间的“竞争”记账不可避免地牺牲了速度与效率。
对于私有链和联盟链,Nakamoto Consensus 并不合适。出于安全和隐私的考虑,私有链和联盟链的节点之间必须相互许可,才能加入网络。而相互许可的前提是每个节点都有固定的身份,这种身份让节点之间成为信任或者部分信任节点 。基于部分信任或者完全信任节点,可以采用高性能的容错分布式系统 Byzantine Fault Tolerant (BFT),如 PoA 和 IBFT;或者容故障分布式系统 Crash Fault Tolerant (CFT),如 RAFT。
PoA
PoA 的全称是 Proof of Authority (权威证明)。PoA 基于一组有身份的节点,轮流进行记账。换句话说,每个节点在用自己的身份和权威作为担保。每个区块只需要一个签名确认,这大大提高了出块速度和每秒能够吞吐的交易。
虽然有中心化的风险,不过 PoA 的设计中为了限制单个节点的权力,每个节点的签名间隔需要大于 N (总节点数)/2。
Quorum 在早期开发阶段使用了 PoA 共识,但在正式进入生产阶段却剔除了 PoA,这又是出于什么原因呢?
这就涉及到金融结算网络最看重的另一个特性 - 最终性 (Finality),也可以说,抗分叉 (Non-forkable)。
JPM coin 要求抗分叉的前提,排除了其使用包括 PoW、PoS 和 PoA 的可能。因为在这几种共识机制下,虽然区块链按一致的规则检验和收录区块,但也会出现同时有多个相同高度的正确区块产生。一般而言,全网会迅速归集到最长的同一链上。但当涉及规则改变时,即网络中存在遵守不同的规则的节点时,就会存在区块链分叉且不能迅速回归同一链的可能,也就是我们常说的“分叉”。
参考比特币现金对比特币分叉以及其自身的影响,你就可以理解作为每天处理 6 万亿美金的摩根大通银行,一定不希望这些交易因为分叉而无效。
相对而言,Quorum 支持的另外两种共识机制: RAFT 和 IBFT 都是抗分叉的。
RAFT
RAFT 其实是一种已经广为使用的传统分布式一致性协议,应用在包括 Kubernetes, Docker Swarm 等容器集群管理系统。RAFT 对于容故障、可信节点,并且需要更快出块时间和最终性的封闭联盟非常有效。
与以太坊相比,RAFT 也有自己的节点。相对于以太坊任何节点都可以出块,RAFT 的节点分为 Leader 、Follower 以及暂时的 Candidate。
Leader 是负责生产区块的唯一节点,Follower 监听 Leader 的“心跳”,并收取 Leader 传递过来的区块。
如果 Follower 在其周期内没有收到 Leader 发来的心跳,则会认为Leader 已经死了。此时,没有收到 Leader心跳的 Follower 重新发起选举,自己的身份从 Follower 改变为 Candidate。它会给自己投一票,然后发送投票申请到其他 Follower,自己成为 Leader。
接受心跳的目的是为了抗系统故障,新的节点作为 Leader 继续出块。
值得注意的是,当新的交易产生后, Leader 并不会马上记录到链上,而是等收到所有 Follower 的确认回执后,记录并广播一个执行的消息,之后所有收到执行消息的 Follower 才会将区块记录在本地的链上。这样就可以避免分叉,确保最终性。
RAFT 机制下的默认出块时间间隔是 50 ms,而且只有在有交易发生时才会出块,大大节省了储存空间。
但 RAFT 机制也有不足之处,要使其得以运转的前提是全部节点是诚实的,RAFT 虽然可以容单点故障,但是不具备容错,无法防止节点作恶和篡改历史数据。
IBFT
IBFT,全称 Istanbul Byzantine Fault Tolerance (伊斯坦布尔拜占庭容错) 可以在抗分叉的基础上,防止部分节点作恶。
拜占庭将军问题是一个古老的关于容错的一致性协议。想象拜占庭军队围住一个敌方城市,拜占庭部队分开驻扎在城外,每个部分仅由自己的将军指挥。将军们只能通过信使和其它将军进行通信。在观察了敌情之后,他们必须制定一个一致行动的计划。结果表明:只要超过2/3的将军忠诚时即可达成一致。
IBFT 是一种实用拜占庭容错算法,与 RAFT 完全相信 Leader 不同,IBFT 的前提是包容 1/3 不诚实节点,通过验证者多轮投票,达到彼此一致后出块。
出块主要需要三个阶段:预准备 (pre-prepare) 、准备(prepare) 和确认 (commit)
首先,从全网节点轮流选举出一个主节点(Leader)负责生成区块,主节点在收到交易请求后生成新区块。
预准备(Pre-prepare):主节点向所有备份节点发送预准备消息,提议节点将从网络收集到需放在新区块内的多个交易排序后存入列表。
准备(Prepare) :所有备份节点接收到交易列表后,根据排序模拟执行这些交易。所有交易执行完后,广播基于交易结果计算新区块的哈希摘要。
确认(Commit):如果一个节点收到的 2/3 个其它节点发来的摘要都和自己相同,就向全网广播一条 commit 消息。
如果节点收到 2/3 条 commit 消息,即可提交新区块及其交易到本地的区块链和状态数据库,随机进入下一轮区块高度。
可以看到,每个区块经过三个阶段的验证,即使 1/3 的节点出现故障或者作恶,也可以正常添加。如果主节点作恶,备份节点之间可以相互检查,在冲突时提交一次 Round Change,选取新的主节点。
由于在每个区块高度只有一个节点负责出块,不会有分叉的风险。而且账本不可篡改,试图修改历史纪录需要获取所有备份节点和主节点的私钥。与 PoW 相比,IBFT 没有竞争机制,出块速度更快。
不过,IBFT 的劣势也很明显,多个验证阶段的结构下让消息数量与节点数量成指数级增长,因此 IBFT 的节点数不能太多,通常用作企业级和政府的网络。
综合来看,节点准入、注重隐私、交易最终性、支持灵活的共识机制满足不同商业场景下的需求,并且监管友好是传统金融巨头发行加密货币看重的特点和条件。
虽然摩根大通对 Quorum 区块链的建设和信息非常开放,但遗憾地是,官方并没有公开 JPM coin 使用何种共识机制的信息。推断来看,JPM coin 会根据不同的应用场景在 RAFT 和 IBFT 中选择。如果所有的节点都是摩根银行信任的伙伴,那么 RAFT 是不二的选择;如果只部分信任成员银行,IBFT 将是最为可行的方案。
这也意味着,至少在早期阶段,JPM coin 的对象是相对封闭的联盟。但摩根币和一般用户并不是没有任何关系,摩根大通的清算网络可以大大增加银行之间的网络效应,而且为跨境支付提供了更加安全的合规信息交流协议。银行本身效率的提升和成本的降低,对终端用户来说无疑是一件好事。 更重要的是,摩根币的推出是对以太坊 ,包括区块链应用落地的一个巨大推动。从技术层面,兼容以太坊合约的 Quorum 网络完全有可能在之后和已有的公共区块链进行互通,在中心化与点对点的货币系统之间搭建桥梁。
在第三部分中,我会横向比较各国大型银行和央行发行和正在试验的加密货币以及数字货币 ,以及对当地经济甚至全球货币市场的重塑意义。