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

简介: 将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。创建迁移脚本,告诉Truffle如何部署智能合约。运行新创建的迁移脚本,部署智能合约。...

1. Ganache本地区块链

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

1.1 主界面

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

image.gif

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

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

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

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

    1.2 设置

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

    image.gif

    以下是一些主要设置:

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

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

      2. 开发智能合约

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

      2.1 初始化项目

      首先创建项目目录:

      $ mkdir mydapp
      $ cd mydapp

      image.gif

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

      $ truffle init

      image.gif

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

      G:\qikegu\ethereum\mydapp>tree /f
      卷 数据 的文件夹 PATH 列表
      卷序列号为 0C52-9CF4
      G:.
      │  truffle-config.js
      ├─contracts
      │      Migrations.sol
      ├─migrations
      │      1_initial_migration.js
      └─test

      image.gif

        • 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": "kevinhwu@qikegu.com",
          "license": "ISC",
          "devDependencies": {
            "@truffle/contract": "^4.0.33",
            "dotenv": "^8.1.0",
            "lite-server": "^2.5.4",
            "truffle-hdwallet-provider": "^1.0.17"
          }
        }

        image.gif

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

        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;
            }
        }

        image.gif

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

        2.4 编译项目

        现在让我们编译项目:

        项目目录下执行命令:

        $ truffle compile

        image.gif

        等编译完成,可以看到多了一个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
                }
              }
            }

            image.gif

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

            image.gif

            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);
            };

            image.gif

            上面的代码中:

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

              3.3 执行迁移命令

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

              $ truffle migrate

              image.gif

              执行详情如下:

              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: [] }

              image.gif

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

              目录
              相关文章
              |
              Web App开发 域名解析 缓存
              如何在 Ubuntu 20.04 上安装 Node.js 和 npm
              本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
              168466 7
              如何在 Ubuntu 20.04 上安装 Node.js 和 npm
              |
              5G 芯片
              带你读《无人机网络与通信》之二:空对地与空对空数据链路通信
              本书针对无人机系统两个关键问题—通信组网和管控体系做了比较全面和深入的描述和探讨,特别是以大量笔墨分析了现有无线通信解决方案,对比了不同通信协议,得出了很有价值的研究结论。无人机的跨越式发展将涉及公共安全管理的问题,构建管控体系是当务之急,分级管理以及制定相应的适航标准是一件大事情,本书对此也进行了系统的、建设性的讨论。未来,高档无人机和无人机集群将对环境具有更强的感知能力和自适应能力,还有对任务的自规划和学习、调整能力,本书讨论的内容将为它们的发明、部署和监督提供宝贵的信息。
              |
              Java 数据库连接 mybatis
              【Spring常见错误】No qualifying bean of type
              📋📋 精彩摘要:MyBatis 核心配置文件(xxxConfig.xml),该文件配置了MyBatis的一些全局信息,,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和响应MyBatis行为的一些属性。本文将深入浅出的介绍MyBatis核心配置文件中常用的标签配置。
              7011 0
              |
              机器学习/深度学习 资源调度 算法
              机器学习领域必知数学符号与概念(一)
              本文介绍了一些数学符号以及这些符号的含义。
              1061 65
              |
              存储 SQL 数据库
              关系数据库-数据库事务处理与ACID原则
              本文详细介绍了关系数据库中的事务处理和ACID原则。通过事务处理,可以确保数据库操作的原子性、一致性、隔离性和持久性,从而提高数据的可靠性和一致性。在实际应用中,可以通过事务控制语句和适当的隔离级别,确保复杂操作的正确执行。希望本文能帮助您更好地理解和应用数据库事务处理,提高数据库系统的可靠性和性能。
              518 18
              |
              存储 安全 前端开发
              数字货币交易所系统开发技术方案规则
              数字货币交易所系统的开发涉及市场调研、功能需求、性能与安全、技术选型、系统设计、通信数据流、开发实现及测试调优等多个环节。本文档概述了各环节的关键技术方案和规则,旨在指导开发者构建高效、安全的数字货币交易平台。
              |
              JavaScript Linux 区块链
              使用Ganache搭建本地测试网并实现远程连接
              使用Ganache搭建本地测试网并实现远程连接
              |
              JavaScript
              cnpm 的安装与使用
              本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
              cnpm 的安装与使用
              |
              IDE JavaScript 编译器
              《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)
              《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)
              3569 0
              |
              关系型数据库 API 数据库
              SqlAlchemy 2.0 中文文档(二十三)(4)
              SqlAlchemy 2.0 中文文档(二十三)
              337 0

              热门文章

              最新文章