从 web3-1.0.0-beta.27 获取 Solidity 合约函数的 return 值
Getting return value of Solidity contract function from web3-1.0.0-beta.27
我是运行web3 1.0.0-beta.27
,
编译指示 solidity ^0.4.2;
contract Charity{
function ping() public constant returns (uint) {
return 200;
}
}
我 compiling/calling 它在 typescript
中有:
import * as fs from 'fs' ;
import * as solc from 'solc' ;
import * as Web3 from 'web3' ;
var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
var contract_path : string = "path/to/Charity.sol"
const input = fs.readFileSync(contract_path)
const output = solc.compile(input.toString(), 1);
var contract_name = ":" + pr.last(contract_path.split("/")).split(".")[0]
const bytecode = output.contracts[contract_name].bytecode
const abi_ = JSON.parse(output.contracts[contract_name].interface);
web3.eth.getAccounts().then(accounts => {
var coinbase = accounts[0];
var receiver = accounts[1];
// create contract
var myContract = new web3.eth.Contract([], {
from : coinbase
, gasPrice : '20000000000'
});
// set address to coinbase, and jsonInterface to abi
myContract.options.address = coinbase;
myContract.options.jsonInterface = abi_;
// deploy contract -> problem, how do I get the abi in here?
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
// send contract fn to network to be executed
// problem: this is not doing what it's suppose to
myContract.methods.ping().send({ from : coinbase }, (err, val) => {
console.log("ping(): ", err, val)
})
myContract.methods.ping().send({from: coinbase})
.on('transactionHash', function(hash){
console.log("hash: ", hash)
})
.on('receipt', function(receipt){
console.log("recepit: ", receipt)
})
.on('confirmation', function(confirmationNumber, receipt){
console.log("conffirmation: ", receipt)
})
.on('error', console.error);
});
问题是 myContract.methods.ping().send...
没有按照我的要求在回调中返回值 200
,有没有办法解决这个问题?
调用常量函数后,应使用 call() 而不是 send() 方法。
查看文档:
http://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-call
当您不修改状态时,您只需使用 call()。如果你修改状态,你需要一个交易(发送),然后你需要等待交易被挖掘。何时执行此操作是发出事件并监听它。
我是运行web3 1.0.0-beta.27
,
编译指示 solidity ^0.4.2;
contract Charity{
function ping() public constant returns (uint) {
return 200;
}
}
我 compiling/calling 它在 typescript
中有:
import * as fs from 'fs' ;
import * as solc from 'solc' ;
import * as Web3 from 'web3' ;
var web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
var contract_path : string = "path/to/Charity.sol"
const input = fs.readFileSync(contract_path)
const output = solc.compile(input.toString(), 1);
var contract_name = ":" + pr.last(contract_path.split("/")).split(".")[0]
const bytecode = output.contracts[contract_name].bytecode
const abi_ = JSON.parse(output.contracts[contract_name].interface);
web3.eth.getAccounts().then(accounts => {
var coinbase = accounts[0];
var receiver = accounts[1];
// create contract
var myContract = new web3.eth.Contract([], {
from : coinbase
, gasPrice : '20000000000'
});
// set address to coinbase, and jsonInterface to abi
myContract.options.address = coinbase;
myContract.options.jsonInterface = abi_;
// deploy contract -> problem, how do I get the abi in here?
var deployedContract = myContract.deploy({
data: '0x' + bytecode,
}).send({
from: coinbase,
gas : 1500000 ,
gasPrice: '30000000000000'
}, (err, hash) => {
if (err) { console.log("error on deployment: ", err) }
console.log("Hash: ", hash)
})
// send contract fn to network to be executed
// problem: this is not doing what it's suppose to
myContract.methods.ping().send({ from : coinbase }, (err, val) => {
console.log("ping(): ", err, val)
})
myContract.methods.ping().send({from: coinbase})
.on('transactionHash', function(hash){
console.log("hash: ", hash)
})
.on('receipt', function(receipt){
console.log("recepit: ", receipt)
})
.on('confirmation', function(confirmationNumber, receipt){
console.log("conffirmation: ", receipt)
})
.on('error', console.error);
});
问题是 myContract.methods.ping().send...
没有按照我的要求在回调中返回值 200
,有没有办法解决这个问题?
调用常量函数后,应使用 call() 而不是 send() 方法。
查看文档: http://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-call
当您不修改状态时,您只需使用 call()。如果你修改状态,你需要一个交易(发送),然后你需要等待交易被挖掘。何时执行此操作是发出事件并监听它。