zoukankan      html  css  js  c++  java
  • 摩根大通的企业级区块链解决方案—Quorum

    根据Coindesk近期发布的《2017年区块链行业报告》,企业级区块链快速发展的势头已经呈现出来,该报告预计2025年全球企业级区块链年收入将会达到199亿美元。作为2017年成立的区块链联盟EEA(Enterprise Ethereum Alliance,企业以太坊联盟)核心成员,摩根大通倾力打造的Quorum区块链平台,值得引起Fintech业界的重视。

    【Quorum是什么】

    Quorum,是一个企业级分布式账本和智能合约平台,可看作企业版的以太坊(以太坊,是第二代公有区块链智能合约平台)。Quorum通过一套区块链架构,提供私有智能合约执行方案,并满足企业级的性能要求。

    Quorum,适用于任何需要高速和高吞吐量处理联盟许可间进行私有交易的应用程序。Quorum解决了区块链技术在金融及其他行业应用的特殊挑战。

    Quorum,是基于以太坊分布式账本协议开发而成,为金融服务行业提供以太坊许可链方案,以便支持交易与合约的隐私性。

    Quorum的主要特点及其基于以太坊公有链的扩展功能,具体如下:

    • 交易与合约的隐私性
    • 多种基于投票的共识机制
    • 网络/节点的许可管理
    • 更高性能

    基于Quorum的企业级区块链系统架构

    Quorum,基于以太坊协议官方Go方案开发而成,支持私有链和联盟许可链,它使用基于投票的共识算法,通过介绍一个新的私有交易识别器来实现数据隐私。Quorum的设计目标之一,就是尽可能复用更多的已有技术,最大限度地减少对现有以太网的改造,以减少与以太坊未来版本保持代码一致性所需要的工作量。

    大部分负责额外隐私功能的逻辑都位于标准以太网协议层的顶层设计中。下图描述了Quorum区块链平台及其架构组件的全景图。

    Quorum的本质,是使用密码学技术来防止交易方以外的人看到敏感数据。该解决方案,需要一个单独的共享区块链,和一个智能合约框架与以太坊原始代码的修改组合;其中智能合约框架对隐私数据进行了隔离。对go-ethereum代码库进行的修改,包括区块提案和验证过程的修改。区块验证过程,是通过执行交易合约代码来进行的,比如所有节点都对公开交易、和与交易方相关的私有交易进行验证;对于其他私有交易,节点将会忽略合约代码的执行过程。

    这样的操作,将导致状态数据库的分离,如状态数据库被分成私有状态数据库和公开状态数据库两类。网络中所有节点的公开状态,均完美达成状态共识。私有状态数据库的情况有所不同,即使客户端节点的状态数据库不再保存整个全局状态数据库的状态,实际的分布式区块链及其中所有事务仍可以同步到所有节点,为防篡改而做加密安全处理。与其他基于多链的分段策略的相比,这是一个明显的区别,同时增强了设计的安全性和弹性。具体请参考下图:

    Quorum组件

    根据前文Quorum系统架构图所示,Quorum区块链包含以下组件:

    • Quorum节点(基于geth客户端修改)
    • Constellation事务管理器
    • Constellation Enclave

    Quorum节点

    Quorum节点有意被设计成轻量级的geth分叉,以便可以继续利用成长中的以太坊社区研发优势。因此,将来geth发版后,Quorum只用更新单行代码即可。

    Quorum节点对geth做了以下改动:

    1. PoW共识算法,改成QuorumChain,一种基于投票的共识机制(Quorum 2.0之后将弃用QuorumChain)
    2. P2P网络层,改成只有授权节点才能连入或连出网络
    3.  区块生成逻辑,由检查“全局状态根”改为检查“全局公开状态根”
    4. 区块验证逻辑,在区块头,将“全局状态根”替换成“全局公开状态根”
    5. 状态树,分成公开状态树和私有状态树
    6. 区块链验证逻辑,改成处理“私有事务”
    7. 创建事务,改成允许交易数据被加密哈希替代,以维护必需的隐私数据
    8. 删除以太坊中Gas的定价,尽管保留Gas本身

    Constellation模块

    Constellation,是一个P2P的加密消息交换机,是以安全的方式提交信息的通用系统。它与用PGP加密消息的MTA(消息传输代理)网络相当,它不是区块链专用的,可以适用于许多其他类型的应用程序,比如你希望在交易对手网络中进行单独封装的消息交换。Constellation模块,由两个子模块组成:Constellation事务管理器(用于Quorum的PrivateTransactionManager的默认实现)和Enclave。

    1)事务管理器

    Quorum的事务管理器负责事务隐私,存储并允许访问加密的交易数据,与其他参与方的事务管理器交换加密的有效载荷,但没有访问任何敏感私钥的权限。它用Enclave来加密(尽管Enclave可以由事务管理器自己托管)。

    2)Enclave

    分布式账本协议,通常利用密码技术来保证事务真实性、参与者身份验证和历史数据存储(即通过加密哈希数据链)。为了实现相关事务的隔离,同时通过特定加密的并行操作来提供性能优化,包括系统密钥生成和数据加解密的大量密码学工作,会委托给Enclave。

    【为什么选择Quorum】

    用一句话来解释,为什么要选择Quorum?Quorum,是一套开源、免费而且聚焦企业级应用的区块链平台框架。

    接下来,我们来看看Quorum有哪些独到之处。

    交易隐私性

    Quorum的核心功能之一,就是事务隐私性。为此,我们引入'公开交易'和'私有交易'的概念。请注意,这只是一个理论上的概念,而Quorum并未引入新的事务类型;然而,以太坊事务模型已扩展包含一个可选的privateFor参数(导致事务被Quorum视为私有的人数)和事务类型(有一个新的IsPrivate方法来识别交易)。

    接下来,我们以处理私有交易的流程为例,解释Quorum的事务流程,如下图所示:

    在这个案例中,A机构和B机构构成了私有交易AB的交易双方,而C机构不参与该交易。

    1.     A机构发出一笔私有交易AB到Quorum节点,指定交易的有效负载,并为A机构和B机构设定privateFor参数,形成其公钥;

    2.     A机构的Quorum节点发送交易到与之配对的事务管理器,为其请求保存交易的有效负载;

    3.     A机构的事务管理器向与之相关的Enclave发出请求,验证发送者并加密有效负载;

    4.     A机构的Enclave检验A机构的私钥,一旦验证通过,就会进行交易对话。这就需要:

           i.          生成系统密钥和随机数;

          ii.          对交易有效负载和来自i)项中的系统密钥进行加密;

         iii.          计算ii)项中已加密有效负载的SHA3-512哈希值;

         iv.          遍历交易参与方列表(本例中为A机构和B机构),加密i)项中的系统密钥和参与者的公钥(PGP加密);

          v.          向事务管理器返回ii)项中的已加密有效负载、iii)项中的哈希值,iv)项中每个参与者的加密密钥。

    5.      然后,A机构的事务管理器使用哈希作为索引,保存已加密有效负载(使用系统密钥加密)和已加密系统密钥,再将哈希值、已加密有效负载和与B机构公钥加密而成的已加密系统密钥等安全地发送给事务管理器。B机构的事务管理器使用Ack/Nack进行响应。需要注意的是,如果A机构并未从B机构处收到响应或Nack,那么交易将不会传播到整个网络。它是参与者保存通讯有效负载的前提条件。

    6.      一旦数据成功传到B机构的事务管理器,A机构的事务管理器向Quorum节点返回哈希值,该节点就使用哈希值替换交易的初始负载,修改交易的V值为37或38,这将对其他节点进行提示,该哈希值表示一个与已加密有效负载相关的私有交易;相反,则提示一个无意义字节码相关的公开交易;

    7.      接下来,交易将基于标准的以太坊P2P协议,传播到剩余网络中;

    8.      生成一个包含交易AB的区块,并且发散到网络中的每一个机构;

    9.      处理区块时,所有机构都将处理交易。每一个Quorum节点将认识到一个37或38的V值,表明交易的有效负载需要加密、需要联系他们本地的事务管理器,从而决定他们是否需要同意这笔交易(使用哈希值作为索引进行查找);

    10.   由于C机构并未同意这笔交易,它将收到一条NotARecipient的消息,并将忽略该交易——它将不会升级其私有状态数据库。A机构和B机构将会在他们本地的事务管理器中查找哈希值,识别他们的确赞成该交易,然后每位参与者与其对应的Enclave进行通讯,发送已加密有效负载、已加密系统密钥和签名;

    11.  Enclave验证签名,然后使用Enclave中该机构的私钥来解密系统密钥,使用刚刚显示的系统密钥解密交易有效负载,并向事务管理器返回已加密有效负载;

    12.   机构A和B的事务管理器,通过执行合约代码,向EVM发送已解密有效负载。这次执行将会升级仅在Quorum节点的私有状态数据库的状态。注意:代码一旦运行即会无效,所以没有上述流程它将无法阅读。

    基于Raft的共识机制

    Quorum采用了基于Raft的共识机制(使用etcd的Raft实现),而不是以太坊默认的PoW方案。这对于不需要拜占庭容错并且需要更快出块时间(以毫秒而非秒为单位)和事务结束(不存在分支)的封闭式成员资格/联盟设置非常有效。此外,对比QuorumChain,这种共识机制不会“不必要地”创建空白区块,并“按需”有效地创建区块。

    当geth二进制文件传递--raft参数时,节点将以“Raft模式”运行。

    Raft和以太坊都有自己的“节点”概念:

    在Raft中,正常操作中的节点是“领导者”或“追随者”。 整个集群有一个单独的领导者,所有的日志条目都必须流过。 还有一个“候选人”的概念,但只有在领导人选举期间。

    在基于Raft的共识机制里,我们在Raft和以太坊节点之间建立了一对一的对应关系:每一个以太坊节点也是一个Raft节点,并且按照惯例,Raft集的领导者角色为仅有的能够产生新块的以太坊节点。铸币者有责任像以太坊矿工一样,将交易和块绑定起来,但不需要提供PoW工作量证明。

    我们同时定位leader和minter的主要原因是:(1)方便,因为Raft确保一次只有一个领导者;并且(2)避免从节点分块到领导者的节点的网络跳跃,通过它,所有的Raft写入必须流动起来。我们执行方案时观察到Raft领导层的变化-如果一个节点成为领导者,它将开始铸币,如果一个节点失去领导力,它将停止铸币。

    你可能会注意到,在Raft领导层过渡期间,可能会有一段时间,其中多于一个的节点可能会认为它有铸造职责。

    我们使用现有的以太坊p2p传输层来传递节点之间的事务,但我们仅通过Raft传输层来传输块。它们由铸币者创建,通过Raft方式、以相同顺序,从铸币者那里流向群集的其余部分。

    当铸币者创建一个块时,不像vanilla以太坊那样将块写入数据库并立即考虑链的新头部,我们只需在区块通过Raft传播时插入块或设置其为链的新头部。所有节点将会一起延伸链条,就像它们采用它们的Raft日志。

    从以太坊的角度来看,Raft通过node/service.go中的Service接口实现来进行集成:“可以注册到节点中的单个协议”。

    网络授权与安全

    网络授权,是用来控制哪些节点可以连接到指定节点、以及可以从哪些指定节点拨出的功能。目前,当启动节点时,通过--permissioned参数在节点级别处进行管理。

    如果设置了--permissioned参数,节点将查找名为<data-dir>/permissioned-nodes.json的文件。此文件包含此节点可以连接并接受来自其连接的enodes白名单。因此,启用权限后,只有permissioned-nodes.json文件中列出的节点成为网络的一部分。 如果指定了--permissioned参数,但没有节点添加到permissioned-nodes.json文件,则该节点既不能连接到任何节点也不能接受任何接入的连接。

    【快速入门】

    使用Quorum,要求安装、配置和运行Quorum节点和Constellation服务器。接下来,我们看看如何手动设置Quorum的步骤,包括密钥生成、创世块和Constellation配置等很快就会推出,但现在最好的方式是使用已运行的Vagrant环境,运行Quorum示例。Vagrant环境会在几分钟内自动设置一个准备开发使用的测试Quorum网络,如果您想要开始使用Quorum,则建议您采用这种方法。

    搭建环境

    快速开始使用Quorum的办法就是使用VirtualBox和Vagrant:

    git clone https://github.com/jpmorganchase/quorum-examples

    cd quorum-examples

    vagrant up

    # (should take 5 or so minutes)

    vagrant ssh

    安装Quorum核心组件

    1)创建节点

    复制代码库,然后运行源代码:

    git clone https://github.com/jpmorganchase/quorum.gitcd quorummake all

    二进制文件放置在$REPO_ROOT/build/bin目录中。 将目录放在PATH中,以便轻松调用geth和bootnode,或将这些二进制文件复制到PATH中的文件夹中,例如/usr/local/bin目录。补充PATH变量,最简单的办法就是,在~/.bashrc或 ~/.bash_aliases文件中添加PATH=$PATH:/path/to/repository/build/bin。

    运行测试案例:

    make test

    2)安装Constellation

    点击链接https://github.com/jpmorganchase/constellation/releases,获取安装包,并将提取的二进制文件放置在PATH的某处,例如在/usr/local/bin目录。

    创建智能合约

    开发智能合约,Quorum使用标准Solidity书写智能合约。通常,设计这些智能合同,就像为以太坊设计智能合同一样。智能合同可以是公开的(即对于指定Quorum网络中的所有参与者可见和可执行),也可以对于一个或多个网络参与者是私有的。但请注意,Quorum不会引入新的合约类型;相反,与交易相似,公开和私有合约的概念只是理论上的。

    1)创建公开交易/合约

    为了让一个指定Quorum网络上的所有参与者都可以查看和执行交易或智能合约,只需发送一个以太网交易到网络(如果您希望该交易创建一个合约,则将to参数留空)。

    有关sendTransaction调用的详细信息,请参阅Quorum API页面,其中包括对标准以太坊调用的一些修改。

    2)创建私人交易/合约

    为了使交易/智能合约专用于Quorum网络上的参与者的子集,发送标准以太坊交易,但将消息上的privateFor参数设置为应该是参与者的公钥,能够查看和执行交易或合约代码。

    下面的示例JSON消息:

    '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from": $FROM_AC, "to": $TO_AC, "data": $CODEHASH, "privateFor": ["$PUBKEY1,PUBKEY2"]}],"id":$ID}'

    有关sendTransaction调用的详细信息,请参阅Quorum API页面,其中包括对标准以太坊调用的一些修改。

    3)Quorum合约设计注意事项

            i.          私有合约不能升级公开合约。这是因为不是所有的参与者都能够执行私有合同,所以如果该合约可以升级公开合约,那么每个参与者最终将以公开合约的不同状态结束操作。

          ii.          一旦合约被公开,以后将无法重新变成私有合约。如果您确实需要公开私有化合约,则需要从区块链中删除并创建新的私有合约。

    组建Quorum联盟许可链

    通过在节点启动期间添加--permissioned参数作为命令行参数,可以在单个节点级别启用网络权限。添加参数后,节点将在节点的<data-dir>文件夹中查找名为permissioned-nodes.json的文件。

    permissioned-nodes.json文件包含一个节点参数列表(enode://remotekey@ip:port),该特定节点将接受来自连接的接入连接并进行接出连接。

    如果设置了--permissioned参数,但permissioned-nodes.json文件为空或者仅存在于节点的<data-dir>文件夹中,则该节点将启动,但它不会连接到任何其他节点,也不会接受来自其他节点的任何接入连接请求。无论是哪种情况,都期望看到错误记录。

    geth选项列表下,--permissioned参数可用:

    $ geth --help ( truncated output ) MISCELLANEOUS OPTIONS: --permissioned         If enabled, the node will allow only a defined list of nodes to connect

    查看许可链案例,看授权许可后如何运行节点,或看以下安装教程。

    1)启用授权

          i.  在<data-dir>目录下创建permissioned-nodes.json文件,并确保其为正确的JSON格式;

          ii.  使用正在安装或连接的Quorum网络节点的enode id填充文件;

         iii.  使用--permissioned命令行参数,启动节点。

    permissioned-nodes.json格式如下:

     ["enode://remoteky1@ip1:port1", "enode://remoteky1@ip2:port2", "enode://remoteky1@ip3:port3", ] 

    例如:(便于查看,节点id仅截取部分展示)

    ["enode://8475a01f22a1f48116dc1f0d22ecaaaf77e[::]:30301", "enode://b5660501f496e60e59ded734a889c97b7da[::]:30302","enode://54bd7ff4bd971fb80493cf4706455395917[::]:30303"]

    以上将确保此节点只能接受来自/到达此白名单中3个节点的接入或接出连接。

    2)添加新节点:

    任何添加到permissioned-nodes.json文件的内容,都将在后续发出接入或接出请求时,被服务器动态获取。节点不需要重新启动以便更改生效。

    3)删除现有节点:

    从permissioned-nodes.json文件中删除现有的连接节点,不会立即删除那些现有的连接节点。但是,如果连接由于任何原因而被断开,并且随后的连接请求将从被删除的节点id中产生,它将作为新请求的一部分被拒绝。

    至此,一个简易的Quorum联盟许可链环境,即搭建完毕。

    关于Quorum的更多资源

    摩根大通推出的企业级区块链方案,主要为金融场景服务,尤其关注交易隐私。下期我们将会介绍Quorum如何运用“零知识证明”密码学技术。大家如果对Quorum平台感兴趣,可访问Quorum官网,http://www.jpmorgan.com/quorum

  • 相关阅读:
    Nginx在linux环境下(centos7)的安装、负载均衡设置
    ocr识别开源软件tesseract试用记录
    Nginx在windows环境下的安装、负载均衡设置
    一个测试程序迭代的故事05
    一个测试程序迭代的故事04
    一个测试程序迭代的故事03
    一个测试程序迭代的故事02
    一个测试程序迭代的故事01
    Delphi5和Delphi7属性编辑器内存泄漏问题的解决
    使用Calibre自带工具批量转换电子书格式
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313606.html
Copyright © 2011-2022 走看看