赞
踩
之前的以太坊教程和Solidity教程我们都是借助智能合约在线编辑器编译部署我们的合约代码,这属于手动编译部署后在线调用合约的方法进行调试。在这篇文章中,我将会带领大家怎么使用web3来与以太坊进行交互对接口进行调用。
之前我们有提到过,web3是与以太坊交互的接口,支持Nodejs,Java,以及Python。我是比较熟悉Nodejs开发,所以,在这篇文章我们使用web3.js来讲解。如果你是Java开发或者Python开发,可以看着Nodejs语言的思路,再自行百度下应该就可以很快上手了。后期,我也将会用Go语言讲解一下怎么使用Go语言来与以太坊交互。至于其它语言的开发者,我们就只能自行百度或者谷歌了。
我们的前提工作是,使用我们写的ERC20的合约代码来做示例。Nodejs使用express框架和truffle框架。测试网络选用以太坊Goerli测试网。
mkdir MyToken && cd MyToken
npm init
npm install
“dependencies”: {
“@openzeppelin/contracts”: “^4.8.3”,
“bignumber.js”: “^9.0.0”,
“body-parser”: “^1.19.0”,
“cookie-parser”: “~1.4.4”,
“debug”: “~2.6.9”,
“ethereumjs-tx”: “^1.3.7”,
“express”: “^4.17.1”,
“ganache-cli”: “^6.9.1”,
“http”: “0.0.1-security”,
“http-errors”: “~1.6.3”,
“keythereum”: “^0.1.4”,
“morgan”: “~1.9.1”,
“mysql”: “^2.18.1”,
“node-while-loop”: “^1.0.4”,
“pug”: “2.0.0-beta11”,
“solc”: “^0.4.26”,
“solc-js”: “^1.0.1”,
“truffle”: “^5.1.26”,
“web3”: “^1.0.0-beta.35”
}
将从智能合约在线编辑器编译的MyToken合约的abi放进MyToken.abi文件内。
我们会运用到合约的地址,所以我们需要将合约部署到我们的Goerli测试网络。
配置truffle-config.js文件
module.exports = { defaultNetwork: "net", // 指定哪个网络 networks: { net: { url: "https://Goerli.infura.io/v3/9df29b35c83d4e4c87a8cde2034794f1", accounts: ["部署合约的钱包地址的私钥"], }, }, mocha: { // timeout: 100000 }, // Configure your compilers compilers: { solc: { version: "0.8.10", // Fetch exact version from solc-bin (default: truffle's version) } } };
const express = require('express');
const app = new express();
const call = require('../MyToken');
const router = express.Router();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(router);
router.get('/balanceOf', call.balanceOf);
router.get('/name', call.name);
app.listen(7070, '127.0.0.1', () => console.log("正在监听端口"));
7.编写MyToken.js接口文件
// 导入web3接口 const Web3 = require('web3'); // fs包 const fs = require('fs'); // 连接网络 const web3 = new Web3(new Web3.providers.HttpProvider('https://Sepolia.infura.io/v3/9df29b35c83d4e4c87a8cde2034794f1')); // 导入依赖 const Tx = require("ethereumjs-tx");// 这个版本一定要1.3.7 // 获取abi接口 const abi = JSON.parse(fs.readFileSync('./abi/MyToken.abi')); // 合约地址 const ContractAddr = '0x9718bAE26B1aBb4fc361766cC63d1C037c3b1534'; // 示例化合约对象 const contract = new web3.eth.Contract(abi, ContractAddr); module.exports = { // 查询token数量剩余多少 balanceOf: async (req, res) => { const owner = "0xF8600a900fF30c76807C155bf6B07ba5BE8190A7"; await contract.methods.balanceOf(owner).call().then(function (result) { console.log("balanceOf:" + result); // 发送响应数据 res.send({ "msg": "ok", "balanceOf": result, }); }) }, // 查询token的名称 name: async (req, res) => { await contract.methods.name().call().then(function (result) { console.log("name:" + result); res.send({ "msg": "ok", "name": result, }); }) }, }
项目目录
MyToken
- abi
- MyToken.abi
- router
- router.js
- MyToken.js
- MyToken.sol
- package.json
- truffle-config.js
至此,我们就已经掌握了使用nodejs和web3.js跟以太坊合约的交互。这里获得的数据跟在智能合约在线编辑器我们部署合约手动调用合约的方法的数据是一致的。有兴趣的同学可以按照我的例子自己尝试一遍。除了用web3.js外,官方还为我们提供了使用ether.js接口来调用以太坊的合约,这跟web3.js的思路是类似的,这个我们在后续的文章中会讲到。
如果有疑问的话,留言交流。喜欢的话就点个关注,点个赞吧。下一篇文章,我们来讲一下如何使用ethers,以及如何使用hardhat框架来调用我们的合约。咱们下一期再见!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。