区块链以太坊 - ethers教程

这篇具有很好参考价值的文章主要介绍了区块链以太坊 - ethers教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

theether 安装,区块链

上一篇文章我们讲到了使用以太坊官方的web3.js第三方工具和以太坊的truffle框架,以及利用nodejs的express框架实现对以太坊智能合约方法的调用。在这一篇文章中,我们将学习使用以太坊的另一种第三方工具ethers和以太坊的hardhat框架来编译部署合约,并且也实现对以太坊智能合约方法的调用。让我们还是以之前讲过的ERC20合约为示例。

1.首先我们先创建基本的目录结构,选择创建一个javascript工程。

npx hardhat

2.将我们的合约放至contracts目录内,合约名称叫做MyToken.sol。

3.配置hardhat.config.js文件


require("@nomicfoundation/hardhat-toolbox");

const fs = require('fs');
const privateKey = fs.readFileSync(".secret").toString().trim();

module.exports = {
    defaultNetwork: "goerli", // 指定哪个网络
    networks: {
        goerli: {
            url: "https://goerli.infura.io/v3/9df29b35c83d4e4c87a8cde2034794f1",
            accounts: [privateKey],
        }
    },

    solidity: {
        version: "0.8.0",
        settings: {
            optimizer: {
                enabled: true,
                runs: 200
            }
        }
    },

    paths: {
        sources: "./contracts",
        tests: "./test",
        cache: "./cache",
        artifacts: "./artifacts"
    },
    mocha: {
        timeout: 40000
    }

};

4.编写部署合约文件 scripts/deploy.js

const hre = require("hardhat");

async function main() {

  const MyToken = await hre.ethers.getContractFactory("MyToken");
  const myToken = await MyToken.deploy("FIRST-TOKEN","FT");
  await myToken.deployed();
  console.log("MyToken deployed to:", myToken.address);
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

5.添加依赖 package.json

{
  "name": "hardhat-project",
  "dependencies": {
    "@nomicfoundation/hardhat-toolbox": "^2.0.2",
    "@openzeppelin/contracts": "^4.8.3",
    "bignumber.js": "^9.1.1",
    "hardhat": "^2.14.0"
  },
  "devDependencies": {
    "body-parser": "^1.20.2",
    "chai": "^4.3.7",
    "ethereumjs-tx": "^2.1.2",
    "ethers": "^6.3.0",
    "express": "^4.18.2",
    "fs": "^0.0.1-security",
    "web3": "^1.9.0"
  }
}

6.编写测试脚本 /test/MyToken.js

const {expect} = require("chai");
const {ethers} = require("hardhat");

describe("Test MyToken", function () {
    it("Should return the same name and same symbol", async function () {
        const myToken = await ethers.getContractFactory("MyToken");
        const mt = await myToken.deploy("FIRST-TOKEN","FT");
        await mt.deployed();

        // name
        expect(await mt.name()).to.equal("FIRST-TOKEN");
        console.log("name true!");

        // symbol
        expect(await mt.symbol()).to.equal("FT");
        console.log("symbol true!");
    });
});

7.配置好上面的代码后,我们安装依赖,之后再依次编译,部署,测试

npm install
npx hardhat compile
npx hardhat run ./scripts/deploy.js --network goerli
npx hardhat test

此时项目目录为

MyToken
	- contracts
    - MyToken.sol
	- scripts
  	- deploy.js
	- test
  	- MyToken.t.js
	- hardhat.config.js
	- package.json
	-	cache
    - ...
	- artifacts
    - ...
	- .secret

上面,我们完成了对代码的编译部署以及测试,接下来,我们使用ethers来调用合约的接口。在上面的代码目录基础上,我们再往下添加目录代码。

我们首先将编译后在artifacts/contracts/MyToken.sol/MyToken.json里的abi文件复制粘贴到我们新建的abis/abi文件中。如下:

abis/abi

[
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "name",
        "type": "string"
      },
			...
      ...
      ...
    "stateMutability": "nonpayable",
    "type": "function"
  }
]

其次,我们编写调用合约的接口文件apis/api.js

const ethers = require('ethers');
const fs = require('fs');
const Tx = require("ethereumjs-tx");// 这个版本一定要1.3.7
const BigNumber = require("bignumber.js");

const abi = JSON.parse(fs.readFileSync("./abis/abi"));

const provider = new ethers.getDefaultProvider('https://goerli.infura.io/v3/9df29b35c83d4e4c87a8cde2034794f1');
const privateKey = fs.readFileSync(".secret").toString().trim();
const wallet = new ethers.Wallet(privateKey, provider);

const ContractAddr = '0xE15d4d98543a2C8847BeFeFB332fe91459B0eC83';

const contract = new ethers.Contract(ContractAddr, abi, provider);
const contractWithSigner = contract.connect(wallet);

module.exports = {

    name: async (req, res) => {
        let result = await contractWithSigner.name();
        console.log("name:" + result + "\n");
        // 发送响应数据
        res.send({
            "msg": "ok",
            "name": result,
        });
    },

    // 查询token数量剩余多少
    balanceOf: async (req, res) => {
        const owner = "0xF8600a900fF30c76807C155bf6B07ba5BE8190A7";
        let result = await contractWithSigner.balanceOf(owner);
        console.log("balanceOf:" + result + "\n");

        const bal = new BigNumber(result);

        // 发送响应数据
        res.json({
            "msg": "ok",
            "balanceOf": bal.toFixed(),
        });
    },
}

最后,我们编写路由文件routers/router.js

const express = require('express');
const app = new express();
const call = require('../apis/api');
const router = express.Router();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extend: false}));
app.use(bodyParser.json());
app.use(router);

router.get('/name', call.name);
router.get('/balanceOf', call.balanceOf);

app.listen(7070, '127.0.0.1', () => console.log("正在监听端口"));

最终,项目的目录长这样

MyToken
  - abis	
    - abi
  - apis
    - api.js
  -	routers
    - router.js
	- contracts
    - MyToken.sol
	- scripts
  	- deploy.js
	- test
  	- MyToken.t.js
	- hardhat.config.js
	- package.json
	-	cache
	- artifacts
	- .secret

所有代码完成后,我们运行 node ./routers/router.js 就可以访问我们的合约接口了。

至此,关于ethers调用和合约接口,以及使用hardhat编译部署合约到以太坊的测试网络,我们就讲完了。下一节,带着大家使用go语言来调用我们的以太坊合约接口。我们下一期再见!文章来源地址https://www.toymoban.com/news/detail-810709.html

到了这里,关于区块链以太坊 - ethers教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链之以太坊

    对于以太坊中可能出现的replay attack对于账户中的每一笔交易都加上一个nonce值来记录这是第几次交易,然后将nonce值和交易一起进行签名,之后如果有人重放这笔交易,经过验证发现nonce值对应的交易已经执行过一次了,就不再执行了。所以全节点也应该保存每个节点的nonce值

    2024年02月13日
    浏览(37)
  • 以太坊区块链快速入门

    1.什么是以太坊? 以太坊是由社区驱动的技术,为加密货币以太币(ETH)和成千上万的去中心化应用程序提供动力。 属于所有人的银行服务 现实生活中不是每个人都能使用金融服务。但是只要您有网络,就可以访问基于以太坊的借贷和储蓄产品。 更好的隐私保护 使用以太坊

    2024年01月20日
    浏览(42)
  • 区块链工作原理(区块链治理系统、比特币、以太坊、智能合约)

    每个国家或者城市都有自己的一套治理系统来创建、更新和执行法律。区块链也都有自己的治理系统。总的来说,区块链治理可分为两类: On-Chain Governance Off-Chain Governance 链上治理是一个管理和实施加密货币区块链变化的系统。在这种类型的治理中,制定变化的规则被编码到

    2024年02月02日
    浏览(56)
  • 谈谈区块链入门技能(二):以太坊区块链浏览器如何使用?

    上一期我们介绍了比特币浏览器如何使用,本期我们来谈一谈什么是以太坊以及以太坊浏览器如何使用。 什么是以太坊? 以太坊是一个合作运行的、全球性的、透明的数据库。通过共同努力,来自世界各地的参与者维护了以太坊地址的公共记录,其中包括用户帐户和智能合

    2024年01月18日
    浏览(46)
  • 以太坊区块链网络部署及验证实验

    国科大2023秋季学期计算机网络实验,简单记录一下实验流程 在 Ubuntu 上安装 Go 1.19 版本可以通过以下步骤进行: 1.1 下载 Go 1.19 首先,打开终端。从 Go 语言的官方网站下载最新版本。使用 wget 或 curl 命令下载 Go 1.19 的 tarball。 确保下载链接是最新的,可以在 Go 语言官方下载

    2024年02月04日
    浏览(76)
  • 区块链技术学习笔记(14) 以太坊账户

    比特币系统中采用的是基于交易的账本,在这个模式下并不会显式记录每个账户上会存在多少钱,而是根据UTXO推断余额,既计算拥UTXO中有私钥的币总和,隐私保护较好,使用并不太方便(在交易的时候要证明每一个币的来源,并且在一次交易收到的币UTXO,消费的时候必须全

    2024年02月19日
    浏览(41)
  • 区块链基础原理和以太坊工作原理

    当我们谈论区块链的基础原理时,我们指的是一种分布式账本技术,它采用去中心化的方式记录和验证交易。区块链的核心概念包括分布式账本、区块、共识机制和加密算法。 1.分布式账本: 2.区块链是一种分布式账本,它将数据存储在多个计算机节点上,而不是集中存储在

    2024年02月20日
    浏览(54)
  • 区块链入门1 初识以太坊 配置Metamask

    下载MetaMask 本文首先将简单介绍一下如何在 Microsoft Edge 浏览器上安装配置 MetaMask 插件,首先进入 MetaMask 官网, MetaMask 官网地址如下: https://metamask.io/   因为我已经安装过了,这里显示的是remove,没有安装的话应该是install。 注册 在拓展里面找到MetaMask,然后点击进入MetaM

    2024年02月04日
    浏览(35)
  • 以太坊区块链数据监控系统设计与实现

    作者:禅与计算机程序设计艺术 随着比特币和以太坊的火爆,各类项目都纷纷推出了基于以太坊或其他区块链技术的去中心化应用,而这些应用所依赖的底层公共区块链网络也逐渐成为一个热点话题。如今,主流的区块链项目中,以太坊已经连续三年位列榜首,并在全球范围

    2024年02月08日
    浏览(41)
  • 【区块链】复习九之以太坊数据结构

    比特币是采用基于交易的账本模式 ,优点有:隐私保护比较好;缺点有:没有显示地记录账户余额,交易不方便(要一次性花出去) 以太坊是基于账户的账本模式 。 优点 :显示地记录账户余额 交易更加方便 对双花攻击(支付方不诚实)有着天然的防御 缺点 :易遭受重放

    2023年04月25日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包