call - 调用合约方法

优质
小牛编辑
136浏览
2023-12-01

调用合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。

调用:

myContract.methods.myMethod([param1[, param2[, ...]]]).call(options[, callback])

参数:

  • options - Object : 选项,包含如下字段:
    • from - String (optional): The address the call “transaction” should be made from.
    • gasPrice - String (optional): The gas price in wei to use for this call “transaction”.
    • gas - Number (optional): The maximum gas provided for this call “transaction” (gas limit).
  • callback - Function : 可选的回调函数,其第二个参数为合约方法的执行结果,第一个参数为错误对象

返回值:

一个Promise对象,其解析值为合约方法的返回值,Mixed类型。如果合约方法返回多个值,则解析值为一个 对象。

示例代码:

// 使用回调函数接收合约方法执行结果
myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, function(error, result){
    ...
});

// 使用Promise接收合约方法执行结果
myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})
.then(function(result){
    ...
});

下面合约中的方法返回多个值:

// Solidity
contract MyContract {
    function myFunction() returns(uint256 myNumber, string myString) {
        return (23456, "Hello!%");
    }
}

那么在web3.js中,call方法的返回值将是一个对象,即使用返回变量名作为键, 也使用索引作为键:

// web3.js
var MyContract = new web3.eth.contract(abi, address);
MyContract.methods.myFunction().call()
.then(console.log);
> Result {
    myNumber: '23456',
    myString: 'Hello!%',
    0: '23456', // these are here as fallbacks if the name is not know or given
    1: 'Hello!%'
}

下面合约中的方法返回单个值:

// Solidity
contract MyContract {
    function myFunction() returns(string myString) {
        return "Hello!%";
    }
}

那么在web3.js中,call方法也将返回单个值:

// web3.js
var MyContract = new web3.eth.contract(abi, address);
MyContract.methods.myFunction().call()
.then(console.log);
> "Hello!%"