帮助更新此页面

🌏

本页面有新版本,但现在只有英文版。请帮助我们翻译最新版本。

通过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]
45
46const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f"
47
显示全部
📋 复制

对于此项目,我们剥离完整的 ERC20 ABI ,仅保留balanceOftransfer函数,不过您可以在这里获取完整的ERC20 ABI

然后我们需要实例化我们的智能合约:

1const web3 = new Web3("http://localhost:8545")
2
3const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS)
4
📋 复制

我们还会设置两个地址:

  • 一个接受转账
  • 一个已经解锁并将发送
1const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81"
2const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE"
3
📋 复制

在下一部分中,我们会调用 balance Of 函数来检索当前的代币数量,此时这两个地址的代币数量都被冻结。

调用:从智能合约读取值

第一个例子,将调用“常量(constant)”方法并且在 EVM 中执行这个智能合约方法,并不发送任何交易。 为此我们将读取一个地址的 ECR20 余额。 阅读关于 ECR20 代币的文章.

您可以访问一个实例化的智能合约方法,用这种方式提供 ABI: yourContract.methods.methodname。 通过使用call函数,您可以接收执行函数的结果。

1daiToken.methods.balanceOf(senderAddress).call(function (err, res) {
2 if (err) {
3 console.log("An error occured", err)
4 return
5 }
6 console.log("The balance is: ", res)
7})
8
📋 复制

请记住,DAI ERC20 有 18 位小数,这意味着您需要移除 18 个零才能获得正确的数额。 uint256 将以字符串形式返回,因为 Javascript 不处理大数值。 如果不确定,请了解我们关于 bignumber.js 的教程如何在 JS 中处理大数

发送:将交易发送给智能合约函数

对于第二个示例,我们将调用 DAI 智能合约的 transfer 函数,发送 10 个 DAI 到第二个地址。 transfer 函数接受两个参数:收件人地址和转账代币的数量:

1daiToken.methods
2 .transfer(receiverAddress, "100000000000000000000")
3 .send({ from: senderAddress }, function (err, res) {
4 if (err) {
5 console.log("An error occured", err)
6 return
7 }
8 console.log("Hash of the transaction: " + res)
9 })
10
显示全部
📋 复制

调用函数返回将被在区块链中挖矿(mine) 的交易的哈希。 在以太坊中,交易哈希是可以预测的 - 这里是我们在执行前获得交易哈希值的方法(了解如何计算哈希)。

因为该函数只向区块链提交交易,除非通过挖矿并包含在区块链中,否则我们无法看到结果。 在下一个教程中,我们将学习如何通过了解交易的哈希来等待交易在区块链上执行

上次编辑: , Invalid DateTime
Edit page