零基础也能玩转以太坊智能合约交互实战指南

·

14 min read

重要提示: Web3.js 已停止维护,建议使用 Ethers.js 或 Viem 进行新项目的智能合约交互。下文将手把手演示 Ethers.js、Web3.js 与 Etherscan 三种主流方式。

本文目标:快速掌握智能合约交互核心技能

工具清单:开发前 5 分钟准备

👉 不想自己搭节点?获取高可用 RPC 端点只需几步

先搭好本地工作目录,接着可跳过章节,直接看你想用的工具(Etherscan、Ethers.js、Web3.js)。

核心概念速通

什么是 ABI ——“合约行动手册”

ABI(Application Binary Interface) 是 JSON 格式的接口文件,告诉你的应用:

样例 ABI 片段:

[
  {
    "constant": true,
    "inputs": [{"name": "","type": "address"}],
    "name": "balanceOf",
    "outputs": [{"name": "","type": "uint256"}],
    "type": "function",
    "stateMutability": "view"
  },
  {
    "constant": false,
    "inputs": [],
    "name": "deposit",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  }
]

合约源码一旦在 Etherscan 上通过验证,Code 板块会自动生成完整 ABI。

读函数 vs 写函数

以太坊单位:wei、gwei、Ether

1 Ether = 1,000,000,000 gwei = 1,000,000,000,000,000,000 wei

合约内部交互都用 wei,前端开发时多用 gwei 估算 gasPrice。

获取测试币 Sepolia ETH

访问 QuickNode 水龙头,选择 Ethereum → Sepolia,连接钱包并申请 0.1–0.5 ETH 做压测。主网余额不足 0.001 ETH 会限制领取,可通过发推增加额度。

👉 再领一份测试币防断档

方法一:浏览器直连 Etherscan,不写一行代码

适用场景

合约地址 WETH on Sepolia: 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14

读:查看任意地址余量

  1. 打开 Etherscan Sepolia
  2. 搜索合约地址 → Contract → Read Contract
  3. 连接钱包 → 点击 balanceOf → 输入待查询地址 → 点击 Query

写:把 0.05 ETH 包装成 WETH

  1. Write Contract → 连接钱包
  2. 点击 deposit → value 填 0.05 → Write
  3. 在钱包确认后即可生成交易哈希

完成后回到 Read 板块重新查 balanceOf 验证 WETH 增加 0.05。

方法二:Ethers.js 高佳实践

Step 1 初始化工程

mkdir interact-ethersjs && cd interact-ethersjs
npm init -y
npm install ethers dotenv
touch index.js .env
# .env
HTTP_PROVIDER_URL=https://YOUR_QUICKNODE_SEPOLIA_URL
PRIVATE_KEY=0xYOUR_PRIVATE_KEY_WITHOUT_LEADING_0x

Step 2 读余额

// index.js 读模板
const { ethers } = require('ethers');
require('dotenv').config();

const provider = new ethers.JsonRpcProvider(process.env.HTTP_PROVIDER_URL);
const signer = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

const WETH = '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14';
const abi = ['function balanceOf(address) view returns (uint256)'];
const contract = new ethers.Contract(WETH, abi, provider);

async function read() {
  const bal = await contract.balanceOf(signer.address);
  console.log('WETH余额(ETH):', ethers.formatEther(bal));
}
read();

Step 3 写操作:包装 ETH

// 在文件尾部追加
const abiWrite = ['function deposit() payable'];
const contractW = new ethers.Contract(WETH, [...abi, ...abiWrite], signer);

async function wrap() {
  const tx = await contractW.deposit({ value: ethers.parseEther('0.05') });
  await tx.wait();
  console.log('交易哈希:', tx.hash);
}

(async () => {
  await read(); // 初始余额
  await wrap(); // 写入
  await read(); // 余额验证
})();

运行:node index.js
看到余额从 0.1 → 0.15 即成功。

方法三:Web3.js 速通(已停止维护,仅作对比)

Web3.js 4.x 代码语法与 1.x 并不完全相同,若已上线项目仍可维护,但不再推荐新项目使用。
// index-web3.js
const { Web3 } = require('web3');
require('dotenv').config();

const client = new Web3(process.env.HTTP_PROVIDER_URL);
const account = client.eth.accounts.wallet.add(process.env.PRIVATE_KEY);
const contract = new client.eth.Contract(abi, WETH);

async function read() {
  const bal = await contract.methods.balanceOf(account[0].address).call();
  console.log('WETH余额(ETH):', client.utils.fromWei(bal));
}

async function wrap() {
  const receipt = await contract.methods.deposit().send({
    from: account[0].address,
    value: client.utils.toWei('0.05'),
  });
  console.log('交易哈希:', receipt.transactionHash);
}

运行步骤与 Ethers.js 类似,输出相同。

常见问题与解答(FAQ)

Q1:Ethers.js 与 Viem 哪个更先进?
A:两者均活跃维护,内建 TypeScript 支持;Ethers.js 社区成熟,Viem 则使用全新模块化架构,侧重 Ethers.js 兼容者可选前者,追求极致性能与 smaller bundle 可试试后者。

Q2:为什么钱包里有 ETH 却无法写?
A:写操作需谨慎估算 gasLimitmaxFeePerGas,钱包若自动估计过高,余额可能实际不足。请关闭高级设置,使用默认值,或手动调低 Safely更低值。

Q3:Etherscan 报错 “Invalid ABI” 怎么办?
A:说明合约尚未验证。请前往项目方 GitHub 下载 ABI JSON,再在 Remix 或 Hardhat 部署后本地交互。

Q4:测试网水龙头额度用完了?
A:可尝试 QuickNode Twitter Bonus、Alchemy 水龙头或跨桥主网小额充值再领取;确保每个地址钱包余额 >0.001 ETH 主网即可持续领。

Q5:私钥放进脚本安全吗?
A:本地临时开发可以先用 .env 存储;上线项目必须使用 Vault / KMS / 云凭据托管;切勿泄漏到 Git 仓库。

Q6:主网交互要注意哪些问题?
A:先 小额打样,确认合约、地址、gasLimit、value 全对。并用 ethers.verifyMessage 核对离线签名,防前端钓鱼。

写在最后

通过三大刀具——浏览器 Etherscan、简洁易用的 Ethers.js 及经典 Web3.js——你完成了 智能合约交互 的入门流水线:读余额、写交易、签名广播、验证结果。下一步可拓展到 ERC-20 转账、NFT 铸造或 UniV3 流动性挖矿等高阶场景,全部只需把 合约地址与 ABI 替换即可。

祝你在 以太坊开发 旅程一帆风顺,有问题欢迎留言讨论。