以太坊 – 部署智能合约到Ganache

目录

1. Ganache本地区块链

1.1 主界面

1.2 设置

2. 开发智能合约

2.1 初始化项目

2.2 添加package.json文件

2.3 添加智能合约源文件

2.4 编译项目

3. 部署智能合约到Ganache

3.1 更新配置文件

3.2 创建迁移脚本 

3.3 执行迁移命令


1. Ganache本地区块链

首先启动Ganache,创建本地的以太坊区块链网络。

1.1 主界面

本地区块链可以模拟公共区块链,开发人员可以在本地区块链上测试智能合约。打开Ganache,界面如下图所示:

本地区块链缺省有10个外部账号,每个账号都有100个假的以太币,这些可以通过设置改变。

Ganache界面中有下面几个主要页面:

  • ACCOUNTS – 账号页面,这显示了自动生成的所有帐户及其余额。
  • BLOCKS – 区块页面,显示了在本地区块链网络上挖掘的每个区块,及其Gas成本和包含的交易。
  • TRANSACTIONS – 交易页面,列出了在本地区块链上发生的所有交易。
  • CONTRACS – 合约页面
  • EVENTS – 事件页面
  • LOGS – 日志页面

界面顶部的搜索栏,可以让你搜索本地区块链网络上的区块或交易。

1.2 设置

可以通过设置来定制Ganache的一些功能,单击主界面右上角的设置图标进入设置页面。

以下是一些主要设置:

  • SERVER – 服务器设置页面,管理关于网络连接的详细信息,比如网络id、端口、主机名和自动挖掘状态。
  • ACCOUNTS & KEYS – 帐户和密钥页,设置自动生成的帐户数量及其余额,缺省10个账号,每个账号余额是100 ether。
  • CHAIN – 链页,让你为网络设置Gas限制和Gas价格。
  • 高级设置 – 日志选项设置,比如保存日志文件和配置详细输出的能力。

请注意,在更改了新的设置之后,必须Restart(设置页面右上角)才能生效。

2. 开发智能合约

我们将使用truffle创建一个智能合约项目,该智能合约的功能是可以获取值和设置值

2.1 初始化项目

首先创建项目目录:

$ mkdir mydapp
$ cd mydapp

然后使用truffle init初始化项目,将生成项目模板文件:

$ truffle init

我们可以查看一下生成的项目目录:

G:\qikegu\ethereum\mydapp>tree /f
卷 数据 的文件夹 PATH 列表
卷序列号为 0C52-9CF4
G:.
│  truffle-config.js
│
├─contracts
│      Migrations.sol
│
├─migrations
│      1_initial_migration.js
│
└─test
  • contracts 目录 智能合约源文件目录,现在已经有了一个Migrations.sol源文件,功能是迁移/部署/升级智能合约。
  • migrations 目录 迁移文件目录,迁移文件都是javascript脚本,帮助我们把智能合约部署到以太坊。
  • test 目录 测试代码目录。
  • truffle-config.js 文件 Truffle项目配置文件,例如可以在里面配置网络。

2.2 添加package.json文件

package.json是npm用来管理包的配置文件,在项目根目录下创建此文件,内容如下:

{
  "name": "ethereum-demo",
  "version": "1.0.0",
  "description": "以太坊demo",
  "main": "truffle-config.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "dev": "lite-server",
    "test": "echo \"Error: no test specified\" && sexit 1"
  },
  "author": "[email protected]",
  "license": "ISC",
  "devDependencies": {
    "@truffle/contract": "^4.0.33",
    "dotenv": "^8.1.0",
    "lite-server": "^2.5.4",
    "truffle-hdwallet-provider": "^1.0.17"
  }
}

关于依赖的包,用到时逐个安装。

2.3 添加智能合约源文件

 在contracts 目录中创建一个新文件MyContract.sol,内容如下所示:

// 声明solidity版本
pragma solidity ^0.5.0;

// 声明智能合约MyContract,合约的所有代码都包含在花括号中。
contract MyContract {

    // 声明一个名为value的状态变量
    string value;

    // 合约构造函数,每当将合约部署到网络时都会调用它。
    // 此函数具有public函数修饰符,以确保它对公共接口可用。
    // 在这个函数中,我们将公共变量value的值设置为“myValue”。
    constructor() public {
        value = "myValue";
    }

    // 本函数读取值状态变量的值。可见性设置为public,以便外部帐户可以访问它。
    // 它还包含view修饰符并指定一个字符串返回值。
    function get() public view returns(string memory ) {
        return value;
    }

    // 本函数设置值状态变量的值。可见性设置为public,以便外部帐户可以访问它。
    function set(string memory _value) public {
        value = _value;
    }
}

这个智能合约的功能是可以获取值和设置值。

2.4 编译项目

现在让我们编译项目:

项目目录下执行命令:

$ truffle compile

等编译完成,可以看到多了一个build目录,该目录下生成了新文件:./build/contract/MyContract.json

这个文件是智能合约ABI文件,代表“抽象二进制接口”。这个文件有很多作用,其中2个重要作用:

  • 作为可在Ethereum虚拟机(EVM)上运行的可执行文件
  • 包含智能合约函数的JSON表示,以便外部客户端可以调用这些函数

3. 部署智能合约到Ganache

接下来,我们将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:

  • 更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。
  • 创建迁移脚本,告诉Truffle如何部署智能合约。
  • 运行新创建的迁移脚本,部署智能合约。

3.1 更新配置文件

更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。

打开位于项目根目录下的truffle-config.js文件,修改内容如下:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    }
  },
  solc: {
    optimizer: {
      enabled: true,
      runs: 200
    }
  }
}

这些网络配置,包括ip地址、端口等,应该与Ganache的网络配置匹配:

3.2 创建迁移脚本 

接下来,我们将在migrations目录中创建迁移脚本,告诉Truffle如何部署智能合约,在该目录中创建文件2_deploy_contracts.js

注意,在migrations目录中所有文件都有编号,作用是让Truffle知道执行它们的顺序。

2_deploy_contracts.js文件内容如下:

var MyContract = artifacts.require("./MyContract.sol");

module.exports = function(deployer) {
  deployer.deploy(MyContract);
};

上面的代码中:

  • 首先,require了创建的合约,并将其分配给一个名为“MyContract”的变量。
  • 接着,将合约加入部署清单,运行迁移命令时合约将被部署。

3.3 执行迁移命令

现在让我们从命令行执行迁移命令, 部署智能合约。

$ truffle migrate

执行详情如下:

G:\qikegu\ethereum\mydapp>truffle migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.



Starting migrations...
======================
> Network name:    'development'
> Network id:      5777
> Block gas limit: 0x6691b7


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xe62fb8a27c9ccc894562fbd7a7797526ad9323ab67a44516ae342642bf4ffcc6
   > Blocks: 0            Seconds: 0
   > contract address:    0x168A7247B58786edd259502948f5Bf9449C863AD
   > block number:        1
   > block timestamp:     1568189958
   > account:             0x29920e756f41F8e691aE0b12D417C19204371E91
   > balance:             99.99477214
   > gas used:            261393
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00522786 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00522786 ETH


2_deploy_contracts.js
=====================

   Deploying 'MyContract'
   ----------------------
   > transaction hash:    0xe9dcef6f70332e476684e8f93ab96969af53920555161054f1f4bcc6277116fb
   > Blocks: 0            Seconds: 0
   > contract address:    0x4D3CFaF8457CEA76c0409f989f9870115B4d2d82
   > block number:        3
   > block timestamp:     1568189959
   > account:             0x29920e756f41F8e691aE0b12D417C19204371E91
   > balance:             99.98804272
   > gas used:            294448
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00588896 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00588896 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.01111682 ETH











  receipt:
   { transactionHash:
      '0x83be6ef86fe542b3c94ae1dd5f2e04570c199d6b2e7997af60f3d91cda9259ec',
     transactionIndex: 0,
     blockHash:
      '0x6e58c2c77b5998004b8a8c66760ca923814865307c69f1c779673cc2cbca06bc',
     blockNumber: 5,
     from: '0x29920e756f41f8e691ae0b12d417c19204371e91',
     to: '0x4d3cfaf8457cea76c0409f989f9870115b4d2d82',
     gasUsed: 33501,
     cumulativeGasUsed: 33501,
     contractAddress: null,
     logs: [],
     status: true,
     logsBloom:
      '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
     v: '0x1c',
     r:
      '0xdaf1578a7987ec5d4e7d25c4b66f570d97f880b783d3403b54fa7eb30b1ab836',
     s:
      '0x4024f2b26bab6277cc86da9727a9bccc1ba7832773b9c2781b265f8dd87df46f',
     rawLogs: [] },
  logs: [] }

可以看到,我们已经将智能合约成功部署到本地的Ganache区块链网络。

猜你喜欢

转载自blog.csdn.net/qq_62294245/article/details/125458104
今日推荐