主页 > imtoken官方版下载安卓最新版 > 从零开始玩转基于以太坊的联盟链Quorum系列02

从零开始玩转基于以太坊的联盟链Quorum系列02

从零开始玩转基于以太坊的联盟链Quorum系列02

注:上一节没有完成本地3节点网络的搭建,基于raft共识模型。 本节主要讲解智能合约在3节点网络上的部署和测试

Smart Contract 一个简单的智能合约实现

pragma solidity ^0.4.17;
contract SimpleStorage {
    uint public storedData;
    function SimpleStorage(uint initVal) public {
        storedData = initVal;
    }
    function set(uint x) public {
        storedData = x;
    }
    function get() public constant returns (uint retVal) {

以太坊是联盟链还是私有链_以太坊的私有链_启动以太坊私有链

return storedData; } }

Truffle 部署智能合约 创建一个新的 Truffle 项目

注:truffle是目前以太坊开发的主要工具链之一,由CONSENSYS开发。

mkdir test
cd test
truffle init

完成以上操作后,目录结构如下:

文件结构

将上面的智能合约示例保存到 test/contracts 目录中作为 SimpleContract.sol

编译智能合约

truffle compile --all

以太坊是联盟链还是私有链_启动以太坊私有链_以太坊的私有链

执行后会生成build目录,内容如下:

build目录结构

编写部署文件migrations/2_deploy_simplestorage.js

var simple_storage = artifacts.require("SimpleStorage");
module.exports = function(deployer) {
    deployer.deploy(simple_storage, 42, {privateFor:["3znvmFqqc63FyiW/bhxIlTHfAZ6xnuhMgPaxTchgJlg="]});
};

注意:privateFor表示这是一个私有合约,对所有节点不可见

修改 truffle.js 文件

module.exports = {
    networks: {
        development: {

以太坊的私有链_以太坊是联盟链还是私有链_启动以太坊私有链

host: "localhost", port: 22000, network_id: "*", gas: 4600000, gasPrice: 0 }, second_node: { host: "localhost", port: 22001, network_id: "*", gas: 4600000, gasPrice: 0 }, third_node: { host: "localhost",

启动以太坊私有链_以太坊的私有链_以太坊是联盟链还是私有链

port: 22002, network_id: "*", gas: 4600000, gasPrice: 0 } } };

注意:端口号必须对应你本地实验网络中每个节点的端口号

将智能合约部署到链上

truffle migrate --reset

输出如下所示:

部署命令输出

验证私人合同仅对允许的同行可见

以太坊的私有链_启动以太坊私有链_以太坊是联盟链还是私有链

var abi = 智能合约编译生成的abi
var private = eth.contract(abi).at(智能合约的地址)

在三个节点分别执行以上命令。 我们在node1上指定只有node3可以通过privateFor字段看到智能合约。 因此,通过private访问智能合约时以太坊是联盟链还是私有链,只有node1和node2可以看到数据状态。 执行效果如下:

private执行效果1

private执行效果2

private执行效果3

在私有合约的基础上验证只有privateFor节点可以接收

在node1上发布一个privateFor["node2", "node3"]智能合约以太坊是联盟链还是私有链,然后在node1中执行

private.set(199, {from:eth.coinbase, privateFor:["3znvmFqqc63FyiW/bhxIlTHfAZ6xnuhMgPaxTchgJlg="]})

上面的意思是这个交易只对node3可见,虽然node2和node3对智能合约都是可见的

在node3中执行private.get()的结果如下:

node3 private.get

在node2中执行private.get()的结果如下:

node2 private.get

下一篇:下篇文章将完成一个基于这个本地测试网的完整示例:积分联盟系统