Skip to content

调用函数

web3.eth.Contract()创建的对象的 methods 属性包含了智能合约中所有可供调用的函数。

为了调用智能合约中的某个函数,比如叫做 myFunction(),我们可以使用 contract.methods.myFunction() 的方式调用。

函数调用分类

在Web3.js中,函数调用可以分为以下几类:

  • 读取智能合约状态的函数调用

    这些函数不会改变智能合约的状态,它们仅仅是读取智能合约状态的值并返回。例如,使用 get() 函数获取智能合约里的某个变量值。

  • 写入智能合约状态的函数调用

    这些函数将会改变智能合约中的状态,它们可能会导致智能合约状态发生变化。例如,使用 set() 函数将某个值写入到智能合约中。

  • 发送交易的函数调用 这些函数将会调用智能合约中的某个函数,并向区块链广播交易。当交易被打包并验证后,智能合约的状态将会发生变化。例如,使用 send() 函数发送一笔交易。

  • 部署智能合约的函数调用 这些函数将会将智能合约的字节码部署到区块链上以创建一个新的智能合约实例。例如,使用 deploy() 函数部署一个新的智能合约。

1. 读取智能合约状态的函数调用

js
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. 写入智能合约状态的函数调用

调用写函数,相当于发送了交易

js
myContract.methods.setNumber(1234)
    .send({ from: '0x956188a6bD41694BdB13AA5CE168543a03B74770' })
    .on('receipt', function(receipt) {
        console.log(receipt)
})

3. 执行事件查询

合约部分

solidity
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 部分

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. 手工部署合约

js
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)
})