ethers.js 简单demo

使用到的技术栈和工具

源码地址:github.com/luopeihai/e...

项目环境构建

  1. create-react-app 创建react项目 npx create-react-app ethers-example

  2. Hardhat 配置项目区块链开发环境 安装hardhat 依赖包npm install --save-dev hardhat

    配置启动hardhat的script并执行该指令

js 复制代码
// package.json
scripts:{
    "start:hardhat": "hardhat node"
}

运行 hardhat node 后生成文件:

  • hardhat.config.jshard配置文件
  • deploy.js部署智能契约文件
  • Lock.sol智能契约
  • Lock.js Lock.sol ut

再次运行npm run start:hardhat 启动 hardhat 服务并列出测试账号,拿到Private Key 导入Metamask账号

  1. ethers.js 引入和链接Metamask钱包 首先 npm install ethers --save 我安装的是 ethers.js v6的版本

链接 Metamask钱包

通过 ethers.js 链接 Metamask

js 复制代码
// app.js
import { ethers } from "ethers";
import "./App.css";

function App() {
  const connect = async () => {
    let signer = null;
    let provider;

    if (window.ethereum == null) {
      console.log("MetaMask not installed; using read-only defaults");
      provider = ethers.getDefaultProvider();
    } else {
      provider = new ethers.BrowserProvider(window.ethereum);
      signer = await provider.getSigner();
    }
    // 当前访问人address
    const addr = await signer.getAddress();
    console.log("addr", addr);
  };

  return (
    <div className="App">
      <p>
        <button onClick={connect}>connect wallet</button>
      </p>
    </div>
  );
}

export default App;

点击 "connect wallet" 链接钱包,授权成功后 控制台将打印出当前访问用户的address

调用Lock.sol智能合约

在Lock.sol添加 成员message 和 事件SetMessage代码

js 复制代码
// contracts/Lock.sol

    string public message = "hello world";
    event SetMessage(string new_msg);

    function setMessage(string memory _msg)external{
        message = _msg;
        emit SetMessage(_msg);
    }

修改完契约后需要依次执行compiledeploy操作, 先把对应script配置上

js 复制代码
 // package.json
 script:{
   ...
   "build:hardhat": "hardhat compile",
   "deploy:hardhat": "hardhat run ./scripts/deploy.js --network localhost"
 }
 

依次执行指令
npm run build:hardhat 生成编译文件artifacts , cache
npm run deploy:hardhat 将生成智能契约 address

app.js 中引入 compile 后的 Lock.json

js 复制代码
// app.js

import Lock from "../artifacts/contracts/Lock.sol/Lock.json";

react server将报错,

shell 复制代码
Module not found: Error: You attempted to import ../artifacts/contracts/Lock.sol/Lock.json which falls outside of the project src/ directory. Relative imports outside of src/ are not supported.
You can either move it inside src/, or add a symlink to it from project's node_modules/.

报错原因是 create-app-react 有效代码需要在 src目录下,那就设置hardhat.config.js编译后的文件导出到src/下,修改配置如下:

js 复制代码
// hardhat.config.js

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

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.19",
  paths: {
    artifacts: "./src/artifacts",
  },
};

保存修改,再次npm run build:hardhat npm run deploy:hardhat,运行成功后 src 中将多出契约编译后文件artifacts

app.js 中引入编译后的契约json信息

js 复制代码
// app.js

import Lock from "./artifacts/contracts/Lock.sol/Lock.json";

添加 readMessage读取Lock.sol中的成员messagesetMessage触发Lock.sol中 SetMessage事件

js 复制代码
// app.js

 const readMessage = async () => {
    const provider = new ethers.BrowserProvider(window.ethereum);
    
    const lock = new ethers.Contract(
      YOUR_DEPLOY_ADDRESS, 
      Lock.abi,
      provider
    );
    const message = await lock.message();
    alert(message);
  };

  const setMessage = async () => {
    const provider = new ethers.BrowserProvider(window.ethereum);
    const signer = await provider.getSigner();
    let lock = new ethers.Contract(
      YOUR_DEPLOY_ADDRESS,
      Lock.abi,
      signer
    );
    let transaction = await lock
      .connect(signer)
      .setMessage("world hello!");
    let result = await transaction.wait();
    alert(result.logs[0].args);
  };
  

YOUR_DEPLOY_ADDRESS 为 npm run deploy:hardhat 发布成功后显示的 Lock.sol address

点击 readMessage按钮将alert "hello world"

点击 setMessage ,由于该方法为写入操作需要支付 "燃料",所以Metamask 将提示确认

点击"确认"后将alert "hello world"

相关推荐
晴殇i20 分钟前
DOM嵌套关系全解析:前端必备的4大判断方法与性能优化实战
前端·javascript·面试
似水流年_zyh30 分钟前
canvas涂抹,擦除功能组件
前端
胖虎26532 分钟前
前端多文件上传核心功能实现:格式支持、批量上传与状态可视化
前端
胖虎26534 分钟前
Vue2 项目常用配置合集:多语言、SVG 图标、代码格式化、权限指令 + 主题切换
前端
一键定乾坤38 分钟前
npm 源修改
前端
parade岁月39 分钟前
Vue 3 响应式陷阱:对象引用丢失导致的数据更新失效
前端
掘金安东尼41 分钟前
GPT-6 会带来科学革命?奥特曼最新设想:AI CEO、便宜医疗与全新计算机
前端·vue.js·github
申阳1 小时前
Day 5:03. 基于Nuxt开发博客项目-页面结构组织
前端·后端·程序员
全马必破三1 小时前
React的设计理念与核心特性
前端·react.js·前端框架
ttod_qzstudio1 小时前
替代 TDesign Dialog:用 div 实现可拖拽、遮罩屏蔽的对话框
前端·tdesign