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

news2025/1/12 3:58:27

目录

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": "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"
  }
}

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

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区块链网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot配置Swagger3.0

springboot配置Swagger3.0 1、pom加入依赖 我们创建一个SpringBoot项目&#xff0c;引入 swagger3 依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>…

任正非:ChatGPT对我们的机会是什么,内部讲话实录!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 为感谢全国火花奖获奖者对于产业界及科学界做出的重大贡献&#xff0c;华为组织了与部分获奖老师与专家的座谈会。座谈会上&…

LeetCode.46. 全排列(回溯法入门)

写在前面&#xff1a; 题目链接&#xff1a;LeetCode.46. 全排列 编程语言&#xff1a;C 题目难度&#xff1a;中等 一、题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a…

【震撼GPT-4崛起!年薪60万工作被GPT-4取代,成本仅2千多,引发轰动!】

目录 福利&#xff1a;文末纯分享中文版CHAT GPT镜像&#xff0c;不存在魔法&#xff0c;纯分享免费使用 一、前言 1、GPT-4的表现&#xff0c;与一位6年工作经验的人类相当 2、GPT-4完成所有类型的任务都要比人类快得多&#xff01; 二、GPT-4当数据分析师&#xff0c;都…

聊一聊影响LCD屏背光效率的几个重要因素

前阶段&#xff0c;小白的一个朋友参加了一个面试。面试完和小白说到其技术面过程惨不忍睹。被提及原因时&#xff0c;主要还是因为面试者提出的问题&#xff0c;小白的朋友答复的可能不是很让面试官满意。出于好奇&#xff0c;小白问了问都存在哪些问题&#xff0c;其中一道便…

论文笔记:Graph neural networks: A review of methods and applications

1 GNN的设计pipeline 1.1 获取图结构 结构化场景 图结构在应用问题中是已知的 比如分子结构、物理系统非结构化场景 图结构在应用问题中是未知的 需要根据任务人为地建图 1.2 判断图的类型 & 尺寸 图的类型 有向图/无向图//异构图/同构图 图中的点和边类型是不是一样的…

Prometheus 简单介绍,部署

目录 Prometheus 介绍 功能介绍 Prometheus安装 安装介绍 prometheus.yml 文件介绍 prometheus实施安装 Prometheus常用命令参数有哪些 设置Prometheus-server开机自动启动 &#xff08;解释&#xff09; Prometheus简单启动页面介绍 node_exporte 是做什么的 安装n…

【个人笔记】真寻bot部署记录+远程postgreSQL访问+源码食用记录

安装 0. 系统配置 Centos v8.2 1. 安装 使用真寻bot https://github.com/zhenxun-org/zhenxun_bot-deploy bash <(curl -s -L https://raw.githubusercontent.com/zhenxun-org/zhenxun_bot-deploy/master/install.sh)选择1&#xff0c;安装go-cqhttp和zhenxun_bot&…

java boot项目读取yml配置信息

之前 我们讲过 boot的配置文件格式主要有三种 application.properties application.yml application.yaml 我们说推荐用 application.yml 其实从 xml 到 yml 都是要系统去读取他的配置信息 今天 我们就来写一下 在java中读取 yml的配置 这里 我在 yml中多加两个配置 代码如下…

LabView中顺序结构的使用

LabView中的顺序结构能够保证程序按照一定的顺序运行。LabView中的顺序结构分为平铺式顺序结构和层叠式顺序结构两种。 1 平铺式顺序结构 平铺式顺序结构包括一个或多个顺序执行的子程序框图&#xff0c;这种框图也被成为“帧”&#xff0c;程序按照帧为单位&#xff0c;以从…

MKS SERVO4257D 闭环步进电机_系列3 串口(RS485)指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

ATA-3000系列功率放大器在精密微流体控制中的典型应用

ATA-3000系列功率放大器在精密微流体控制中的典型应用 压电陶瓷精密微流体控制应用&#xff1a; 精密微流体控制在医药配比、遗传基因与生物工程、航空航天、军工国防等方面具有广泛的应用&#xff0c;特别是在大流量伺服阀先导控制领域&#xff0c;具有重要作用。随着压电陶瓷…

TPO69 01|Why Snakes Have Forked Tongues P5P6|阅读真题精读|17:50~19:35

17:00&#xff5e;17:50 吃饭 目录 P56 生词 段落大意 P5段落大意 P6段落大意 题目 【5】事实信息题|定位准确非常重要✅ 【6】事实信息题|定位准确非常重要✅ 【7】推理题|文章是否提及|不要过度推理 【8】修辞目的题|举例一般为了说明✅ 【9】句子插入题|in other words|同义…

SpringCloud Alibaba Seata

SpringCloud Alibaba Seata Seata 基础 先看一个问题&#xff0c;引出Seata 单机单库(多表)处理事务示意图 分布式微服务架构下的数据库事务示意图 3. 梳理上图 用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持∶仓储服务∶对给定的商品扣除仓库/商品数量订单服务…

第10届蓝桥杯Scratch国赛真题集锦

编程题 第 1 题 问答题 捉迷藏之 题目说明 编程实现:小猫随机躲在6个按固定位置排列的前景角色任一个的后面,只露出一点点痕迹。具体要求: 1).添加任意1个背景,保留小猫角色,从角色库中挑选6个角色作为前景角色(小猫将躲在它们的后面) 2).6个前景角色按照两行三列的方式以固…

从数据工程师到提示工程师:使用AI解决数据准备任务

数据工程占据了数据科学过程的很大一部分。在CRISP-DM中&#xff0c;这个过程阶段被称为“数据准备”。它包括数据摄取、数据转换和数据质量保证等任务。在本文中&#xff0c;我们使用ChatGPT和Python解决了典型的数据工程任务。通过这样做&#xff0c;我们探索了数据工程与新的…

Redis集群安装之分片集群

1.为什么使用分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题高并发写的问题 哨兵模式本质是依旧是主从模式&#xff0c;在主从模式下我们可以增加slave节点来拓展读并发能力&#xff0c;但是没办法扩展写能力…

项目笔记-瑞吉外卖(全)

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能:star:4.1代码实现 5.退出功能6.页面效果出现 day021.完善登录功能2.新增员工功能3.启用禁用员工信息:star:(自定义消息转换器使用)4.编辑员工信息 day031.公共字段自动填充2.新增分类…

第11届蓝桥杯Scratch国赛真题集锦

编程题 第 1题 问答题 3D打印小猫 题目说明 背景信息:3D打印技术,它与普通打印工作原理基本相同,打印机内装有液体或粉未等“打印材料”,与电脑连接后,通过电脑控制把“打印材料”一层层叠加起来,最终把计算机上的蓝图变成实物。 编程实现:通过滑杆控制小猫造型变化,按下…

聚类算法以及聚类算法模型评估的介绍

一、聚类算法的介绍 1.什么是聚类算法 聚类算法是一类无监督学习算法&#xff0c;用于将数据集中的对象分组&#xff08;或聚类&#xff09;成具有相似性的集合。聚类算法不依赖于预定义的类别标签&#xff0c;而是根据数据的内在特点将相似的数据点聚集在一起。聚类算法的目…