首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sendTransaction从智能契约中检索数据

使用sendTransaction从智能契约中检索数据
EN

Ethereum用户
提问于 2017-01-16 12:15:20
回答 2查看 2K关注 0票数 2

让我们采取一个非常基本的智能契约,它有一个函数,在其中你发送一个数字,它将返回的平方。它有另一个返回固定字符串的函数。

代码语言:javascript
复制
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);
  }
}

现在,要部署我使用的契约

代码语言:javascript
复制
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或检查块号是检查事务是否已被挖掘的好方法。

代码语言:javascript
复制
  myContract.ping.call(null, (err, data) => {
    if (err) {
      reject(err)
    } else {
      resolve({
        primary_address: ethConfig.primary_address,
        returnValue: data
      })
    }
  })

但是对于我所用的数字

代码语言:javascript
复制
  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没有任何关系。

EN

回答 2

Ethereum用户

发布于 2017-01-16 12:50:43

添加像SquareComputed (参见如何获取非常量事务函数返回的值?)和web3.js这样的事件之后,合同事件示例

变量事件= myContractInstance.MyEvent({valueA: 23} 、附加) //监视更改event.watch(函数(错误,结果){ if (!error) console.log(result);});

这将导致代码如下:

代码语言:javascript
复制
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)”,否则,有关概述请参见交易和呼叫之间有什么区别?

票数 2
EN

Ethereum用户

发布于 2018-02-23 22:02:59

使用Web3.jsv1.0.0,您可以获得由SquareComputed传输触发的事件(sendTransation()等效方法现在是send()),请参阅文献资料中的send() return

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/11419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档