让我们采取一个非常基本的智能契约,它有一个函数,在其中你发送一个数字,它将返回的平方。它有另一个返回固定字符串的函数。
contract MyContract {
uint public version;
address public previousPublishedVersion;
function ping() returns (string param){
param = "pong";
}
function squareNumber(uint num) returns (uint256 numSqr) {
numSqr = (num * num);
}
}现在,要部署我使用的契约
myContract.new({
data: MyContract.compiled_code,
gas: gasNeeded * ethConfig.gas_factor,
from: ethConfig.primary_address
}, (err, myContract) => {
if(!err) {
if(!myContract.address) {
console.log('contract trasnaction hash ' + myContract.transactionHash)
} else {
console.log('contract address ' + myContract.address)
resolve({
primary_address: ethConfig.primary_address,
contract_address: myContract.address,
gas_estimate: gasNeeded
})
}
} else {
reject(err)
}
});这会触发两个回调,一个带有事务哈希,一个带有一旦挖掘出的地址。但是,对于sendTransaction,此方法并不存在。我读过使用getTransactionReceipt或检查块号是检查事务是否已被挖掘的好方法。
myContract.ping.call(null, (err, data) => {
if (err) {
reject(err)
} else {
resolve({
primary_address: ethConfig.primary_address,
returnValue: data
})
}
})但是对于我所用的数字
myContract.squareNumber.estimateGas(10, (err, gasNeeded) => {
if (err) reject(err)
myContract.squareNumber.sendTransaction(
10,
{
gas: gasNeeded * config.ethConfig.gas_factor,
from: config.ethConfig.primary_address
}, (err, data) => {
if (err) reject(err)
resolve({
primary_address: config.ethConfig.primary_address,
numSquare : data
})
})
})现在,对于一个call函数,我可以直接获得数据,而不需要进行任何挖掘,但是文档说从sendTransaction()返回的值是它的散列,然后我们将使用getTransactionReceipt()来确认块何时被挖掘。
我的问题很简单,我该如何构造我的web3js代码,才能从solidity函数squareNumber()中得到返回的值(10*10)。
我已经用承诺包装了上面显示的所有API,但是跳过了这个部分,因为它很长,而且与web3js没有任何关系。
发布于 2017-01-16 12:50:43
添加像SquareComputed (参见如何获取非常量事务函数返回的值?)和web3.js这样的事件之后,合同事件示例
变量事件= myContractInstance.MyEvent({valueA: 23} 、附加) //监视更改event.watch(函数(错误,结果){ if (!error) console.log(result);});
这将导致代码如下:
var event = myContractInstance.SquareComputed({});
// watch for changes
event.watch(function(error, result){
if (!error)
resolve({
primary_address: config.ethConfig.primary_address,
numSquare : result // need to access the properties of result to obtain the actual square
})
event.stopWatching();
});在myContractInstance.squareNumber.sendTransaction之前进行上述操作。原代码中的resolve({numSquare:...})应该像上面那样移到watch内部。
其他web3.jsAPI(如web3.eth.filter )也可以使用(参见如何从DAO检索已投票的事件)。
这个问题询问“如何构造我的web3js代码,以获得从squareNumber()实体函数返回的值(10*10)”,否则,有关概述请参见交易和呼叫之间有什么区别?。
发布于 2018-02-23 22:02:59
使用Web3.jsv1.0.0,您可以获得由SquareComputed传输触发的事件(sendTransation()等效方法现在是send()),请参阅文献资料中的send() return
https://ethereum.stackexchange.com/questions/11419
复制相似问题