通过 JavaScript 调用智能合约
在本教程中,我们将了解如何通过 JavaScript 调用智能合约函数。 首先是读取智能合约的状态(例如,ERC20 持有者的余额),然后我们将通过代币转账来修改区块链的状态。 你应该已经熟悉如何设置 JS 环境来与区块链交互。
在本例中,我们将使用 DAI 代币。为了进行测试,我们将使用 ganache-cli 分叉区块链,并解锁一个已有很多 DAI 的地址:
ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81要与智能合约交互,我们需要它的地址和 ABI:
1const ERC20TransferABI = [2 {3 constant: false,4 inputs: [5 {6 name: "_to",7 type: "address",8 },9 {10 name: "_value",11 type: "uint256",12 },13 ],14 name: "transfer",15 outputs: [16 {17 name: "",18 type: "bool",19 },20 ],21 payable: false,22 stateMutability: "nonpayable",23 type: "function",24 },25 {26 constant: true,27 inputs: [28 {29 name: "_owner",30 type: "address",31 },32 ],33 name: "balanceOf",34 outputs: [35 {36 name: "balance",37 type: "uint256",38 },39 ],40 payable: false,41 stateMutability: "view",42 type: "function",43 },44]4546const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"显示全部在这个项目中,我们删除了完整的 ERC20 ABI,只保留了 balanceOf 和 transfer 函数,但你可以在这里找到完整的 ERC20 ABIopens in a new tab。
然后我们需要实例化智能合约:
1const web3 = new Web3("http://localhost:8545")23const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)我们还将设置两个地址:
- 接收转账的一方,以及
- 我们已解锁的、将发送转账的一方:
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"在下一部分中,我们将调用 balanceOf 函数来检索这两个地址当前持有的代币数量。
调用:从智能合约读取值
第一个示例将调用一个“常量”方法,并在 EVM 中执行其智能合约方法,而无需发送任何交易。 为此,我们将读取一个地址的 ERC20 余额。 阅读我们关于 ERC20 代币的文章。
你可以按如下方式访问你为其提供了 ABI 的实例化智能合约的方法:yourContract.methods.methodname。 通过使用 call 函数,你将收到执行该函数的结果。
1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {2 if (err) {3 console.log("An error occurred", err)4 return5 }6 console.log("The balance is: ", res)7})请记住,DAI ERC20 有 18 位小数,这意味着你需要去掉 18 个零才能得到正确的金额。 由于 JavaScript 不处理大数值,uint256 会作为字符串返回。 如果你不确定如何在 JS 中处理大数,请查看我们关于 bignumber.js 的教程opens in a new tab。
发送:向智能合约函数发送交易
在第二个示例中,我们将调用 DAI 智能合约的 transfer 函数,向我们的第二个地址发送 10 个 DAI。 transfer 函数接受两个参数:接收方地址和要转账的代币数量:
1daiToken.methods2 .transfer(receiverAddress, "100000000000000000000")3 .send({ from: senderAddress }, function (err, res) {4 if (err) {5 console.log("An error occurred", err)6 return7 }8 console.log("Hash of the transaction: " + res)9 })显示全部该函数调用返回交易的哈希,该交易将被挖矿并加入区块链。 在以太坊上,交易哈希是可预测的——因此我们可以在交易执行前就得到其哈希(在此处了解如何计算哈希opens in a new tab)。
由于该函数只是将交易提交到区块链,因此只有当它被挖出并打包到区块链中时,我们才能看到结果。 在下一篇教程中,我们将学习如何根据交易哈希等待其在区块链上执行opens in a new tab。
页面最后更新: 2025年10月21日