你是否对Quorum这个由摩根大通推出的企业级区块链框架感到好奇?它本质上是一个许可制的以太坊联盟链,在节点之间实现了私有且快速的交易处理。先来说说它的核心定位:Quorum并非普通的公链,它更专注于企业环境下的交易隐私与可控性。为了保障隐私,节点之间的私有交易经过了专门设计,采用Raft或Istanbul BFT算法达成共识,再通过Tessera或Constellation实现数据的加密与共享。有趣的是,Quorum网络中的交易无需支付Gas费,验证工作完全由投票共识算法完成。不过,每个节点都需要由网络管理员生成的密钥对才能加入。
学习Quorum最直接的方式?运行官方提供的7节点示例即可。尽管有多种搭建方法,但使用Docker无疑是最省心的选择。下面基于Google Cloud上的Ubuntu 18.04进行演示,如果你使用的是本地机器或AWS上的Ubuntu,操作步骤完全一致。前提条件:确保Docker和Docker Compose已经安装完毕。
接下来,我们将完整搭建7个Quorum节点,并实地考察私有交易如何在节点之间运作。
1、搭建节点
执行以下命令,一步到位启动全部7个节点:
git clone https://github.com/jpmorganchase/quorum-examples.git
cd quorum-examples
QUORUM_CONSENSUS=raft docker-compose up -d
默认情况下,搭建脚本会使用Tessera交易管理器与Istanbul BFT共识算法。若要改用Raft算法,只需设置环境变量 QUORUM_CONSENSUS=raft,然后让7个节点在后台启动。容器启动需要一点时间,可以使用 docker ps 查看每个容器的运行状态及其ID。
2、部署智能合约
容器就绪后,进入节点1的Geth控制台:
docker exec -it quorum-examples_node1_1 geth attach /qdata/dd/geth.ipc
命令中的容器ID可能因环境而异,请根据实际 docker ps 结果进行调整。进入控制台后,即可进行合约操作。
现在部署一个简单的存储合约。示例代码目录下已经包含了 private-contract.js 和 simplestorage.sol 两个文件,存放路径为 quorum-examples/examples/7nodes/。在Geth控制台中运行:
> loadScript('/examples/private-contract.js')
稍等片刻,部署成功后控制台会返回合约地址——务必记录下来。该脚本在节点1上部署了一个初始状态值为42的存储合约,并且交易仅在节点1和节点7之间私有可见,这意味着其他节点将无法获取这个状态值。
验证这一点非常简单。打开节点2的Geth终端,使用ABI与合约地址创建合约实例:
> var abi=
> var address="
> var contract=eth.contract(abi).at(address);
> contract.get()
0
结果返回0,而非42。这正是预期效果——节点2确实无法访问私有交易的状态。
再切换到节点7的Geth终端,使用同样的方式创建合约实例并读取状态值:
> contract.get()
42
节点7能正确读取到42。私有交易的隔离效果一目了然。
3、发送私有交易
现在尝试在节点7和其他任意节点之间创建一个新的私有交易,调用合约的 set() 方法来修改状态值。这需要用到对应节点的公钥,所有7个节点的公钥文件都存放在 quorum-examples/examples/7nodes/keys/ 目录下。
contract.set(4, {from: eth.coinbase, privateFor: ["
上述调用将合约状态值设置为4,并且仅对 privateFor 中指定的节点可见。你可以打开这些指定节点的Geth终端查看合约状态值,应该都会返回4。而其他未指定的节点,看到的仍然是之前的值。

