前言
求其区块链团队出品
旗下网站
- Web3js 教程:web3js.cn
- Hardhat 中文网: hardhat.cn
调用函数
在以太坊中,智能合约对象的 methods 属性包含了智能合约中所有可供调用的函数。
为了调用智能合约中的某个函数,比如叫做 myFunction(),我们可以使用 contract.methods.myFunction() 的方式调用。
这个方法会返回一个对象,可以通过 send() 方法向智能合约发送交易,同时我们可以设置函数参数和其他选项来进行智能合约交互,并按照智能合约的逻辑执行相应的操作。
在Web3.js中,函数调用可以分为以下几类:
读取智能合约状态的函数调用:这些函数不会改变智能合约的状态,它们仅仅是读取智能合约状态的值并返回。例如,使用 get() 函数获取智能合约里的某个变量值。
写入智能合约状态的函数调用:这些函数将会改变智能合约中的状态,它们可能会导致智能合约状态发生变化。例如,使用 set() 函数将某个值写入到智能合约中。
发送交易的函数调用:这些函数将会调用智能合约中的某个函数,并向区块链广播交易。当交易被打包并验证后,智能合约的状态将会发生变化。例如,使用 send() 函数发送一笔交易。
部署智能合约的函数调用:这些函数将会将智能合约的字节码部署到区块链上以创建一个新的智能合约实例。例如,使用 deploy() 函数部署一个新的智能合约。
::: tip
本章仅介绍读和写函数调用,其他的请读者继续学习
:::
1. 读取智能合约状态的函数调用
let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:8545"))
var abi = [/* 这里省略掉 abi */]
var contractAddress = '0x4E4861f95f4cB129Dae9E739458f1583E1100Dd1'
var myContract = new web3.eth.Contract(abi, contractAddress)
myContract.methods.getNumber().call(function(error, result) {
console.log(result)
})
2. 写入智能合约状态的函数调用
调用写函数,相当于发送了交易
myContract.methods.setNumber(1234)
.send({ from: '0x956188a6bD41694BdB13AA5CE168543a03B74770' })
.on('receipt', function(receipt) {
console.log(receipt)
})
3. 执行事件查询
合约部分
pragma solidity >= 0.7.0 <0.9.0;
contract DemoSimple {
uint number;
event myEvent(uint name);
function setNumber(uint _number) public {
emit myEvent(_number);
number = _number;
}
function getNumber() public view returns(uint) {
return number;
}
}
js 部分
let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545"))
var abi = [/* 这里省略掉 abi */]
var contractAddress = '0x9af62672FA2a5f749Df1e3EdCE2A4825Adb73dF2'
var myContract = new web3.eth.Contract(abi, contractAddress)
myContract.getPastEvents(
'AllEvents', {
fromBlock: 0,
toBlock: 'latest'
},
(error, result) => { console.log(result) }
)
4. 手工部署合约
let Web3 = require("web3")
let web3 = new Web3(new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545"))
var abi = [/* 这里省略掉 abi */]
var myContract = new web3.eth.Contract(abi)
// deplay 的 字节码
var data = /* 字节码 */
var candidateNames = ['0x416c696365', '0x4265747479', '0x5365615361']
myContract.deploy({
data: data,
arguments: [candidateNames]
}).send({
from: '0x88F3f579A8f1A84376884286Bd4A7927593834D7',
gas: 1500000,
gasPrice: '1000000'
}, function(error, result) {
console.log(result)
})