5. Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - web3.js调用合约方法

Hardhat编写、编译、部署、测试Solidity ERC20合约 - 进阶篇 - web3.js调用合约方法

  • [1. 安装依赖](#1. 安装依赖)
  • [2. 启动Hardhat本地节点](#2. 启动Hardhat本地节点)
  • [3. 编写调试代码](#3. 编写调试代码)
  • [4. 合约部署到本地节点](#4. 合约部署到本地节点)

1. 安装依赖

npm install web3

2. 启动Hardhat本地节点

npx hardhat node

3. 编写调试代码

clike 复制代码
const { ethers } = require("hardhat");
const { default: Web3 } = require('web3');
const fs = require('fs');
const path = require('path');
const fetch = require('node-fetch');
const { keccak256 } = require("ethers");

// 部署合约
async function deploy() {
  // 获取合约工厂(这里期望存在名为 Token 的合约,位于 contracts/ 下)
  // 注意:合约名需与 solidity 文件中合约名一致。
  const myContract = await ethers.getContractFactory("MyToken");
  const token = await myContract.deploy();
// 等待链上确认
  await token.waitForDeployment();
  const address = await token.getAddress();
  console.log("实际合约地址:", address);

  return address;
}

// web3js调用合约方法
async function web3js(contractAddress) {

    // 读取编译生成的合约 ABI 文件
    const artifact = JSON.parse(fs.readFileSync(path.join(__dirname, '../../artifacts/contracts/MyToken.sol/MyToken.json'), 'utf8'));
    const abi = artifact.abi;

    // 连接本地区块链节点
    const web3 = new Web3("http://localhost:8545");
    // web3.js 合约实例
    const contract = new web3.eth.Contract(abi, contractAddress);

    // ERC20 name, symbol, totalSupply, decimals, balanceOf方法
    var name = await contract.methods.name().call();
    console.log("Token Name:", name);

    var symbol = await contract.methods.symbol().call();
    console.log("Token Symbol:", symbol);

    var totalSupply = await contract.methods.totalSupply().call();
    console.log("Total Supply:", totalSupply);

    var decimals = await contract.methods.decimals().call();
    console.log("Decimals:", decimals);
    
    var  balance = await contract.methods.balanceOf('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266').call();
    console.log("MTK:", balance);

    // ERC20 transfer方法
    var receipt = await contract.methods.transfer('0x70997970C51812dc3A010C7d01b50e0d17dc79C8', 1000).send({from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', gas: 3000000});
    // console.log("Transfer Receipt:", receipt);
    var  balance = await contract.methods.balanceOf('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266').call();
    console.log("MTK:", balance);
    var  balance = await contract.methods.balanceOf('0x70997970C51812dc3A010C7d01b50e0d17dc79C8').call();
    console.log("MTK:", balance);
}

async function main() {
    var address = await deploy();
    
    console.log("web3js 调用合约方法:");
    await web3js(address);
}

main().then();

读操作用call(),写操作用send()

web3.js内部将method赋值eth_call。合约地址放入to,方法名和参数放入data,赋值给params,组装jsonrpc。

读操作不消耗gas,从本地节点直接返回,不组装交易结构,不进行挖矿。所以不需要交易结构中的from、value、gaslimit、gasprice。

写操作消耗gas,广播到区块链上的节点,组装交易结构,进行挖矿。所以需要交易结构中的from、gaslimit、gasprice,默认不需要value。

await contract.methods.transfer('0x70997970C51812dc3A010C7d01b50e0d17dc79C8', 1000).send({from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', gas: 3000000});

'0x70997970C51812dc3A010C7d01b50e0d17dc79C8', 1000是合约中transfer方法的参数,给账户转账1000MTK,{from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', gas: 3000000}是交易参数,消耗ETH。

4. 合约部署到本地节点

npx hardhat run ignition\modules\Mytoken.js --network localhost

hardhat node输出

相关推荐
2601_961963389 小时前
技术解剖:哈希值、区块链与CA认证如何守护电子合同安全?
网络·人工智能·安全·区块链·智能合约·政务
2601_961963389 小时前
从“电子化”到“自动化”:2026年智能合约与电子合同融合的技术逻辑与法律适配
网络·人工智能·区块链·智能合约·政务
2601_956319889 小时前
期货夜盘无人值守监控什么:断线、无成交与拒单信号
python·区块链
CTA终结者9 小时前
期货量化目标仓和净持仓对不齐:天勤 TargetPosTask 与 pos 偏差排查
python·区块链
2601_9555052510 小时前
自然人身份确权可信基础设施赋能 DID 身份合规
运维·金融·区块链·健康医疗·智能硬件·教育电商·政务
c_lb728814 小时前
期货主连研究具体月实盘:KQ 连续与标的月份偏差怎么记
python·区块链
区块链小八歌17 小时前
稳定资产的“乐高”新解法:拆解 Berachain Clearstar HONEY Vault
区块链
c_lb728817 小时前
涨跌停与流动性变差还要不要挂单:quote 涨跌停字段与熔断思路
python·区块链
ellenwan202618 小时前
期货量化尾盘没清仓:天勤 trading_time 过滤与收盘前平仓
python·区块链
Jiamiren18 小时前
JU交易所资金提取问题引发关注:普通用户如何验证交易所储备金真实性?
区块链