首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从web3客户端执行稳固合同时出错

从web3客户端执行稳固合同时出错
EN

Ethereum用户
提问于 2018-10-16 09:38:39
回答 1查看 834关注 0票数 0

我有一份合同如下-

代码语言:javascript
复制
contract getSchwifty {
  string internal constant seeWhatYouGot = "I want to see what you got!";
  string internal contestResult;
  mapping(uint=>string) Record;

  // Contract constructor that takes a string param
  function getSchwifty(string _contestResult) public {
    contestResult = _contestResult;
  }

  function addRecord(uint id, string hashData) public {
    Record[id] = hashData;
  }

  function getRecord(uint id) public returns (string) {
    return Record[id];
  }

  function showMeWhatYouGot() external pure returns (string) {
    return seeWhatYouGot;
  }

  function enterContest(string _contestEntry) external view returns (string) {
    // completely disregard the _contestEntry ;)
    return contestResult;
  }
}

我使用web3客户端部署这个契约,然后尝试调用addRecord和getRecord函数。当我使用method.send()执行此操作时,没有发现任何错误:

代码语言:javascript
复制
simpleContract.methods.getRecord(123).send({from: '0xAA74487ec1cA68932baC64dF05d27a9CA6f8e156'}).then(console.log,console.log)
Promise {
  <pending>,
  domain:
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }
> { blockHash: '0xeb3d7f287dd6da1dc824c2c433185db12e6292f4592894cdd6c82d6678c787f3',
  blockNumber: 12065,
  contractAddress: null,
  cumulativeGasUsed: 21464,
  from: '0xaa74487ec1ca68932bac64df05d27a9ca6f8e156',
  gasUsed: 21464,
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  root: '0x696db44230e2701d1840643dee2543f58cb7ed042d75edba0c1e3ce739e76932',
  to: '0x6ee9957aef5f4073c6af71441ec7962527c37674',
  transactionHash: '0x46c4cb28ce7b0c99d91c6744ad12f29585ae215f048378270e8dcb252b093c03',
  transactionIndex: 0,
  events: {} }

但是,我想查看getRecord的实际结果,因此使用method.call()尝试了getRecord函数。现在我看到一个错误。

代码语言:javascript
复制
simpleContract.methods.getRecord(123).call({from: '0xAA74487ec1cA68932baC64dF05d27a9CA6f8e156',gas: 0x66A84}).then(console.log,console.log)
Promise {
  <pending>,
  domain:
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }
> Error: Returned values aren't valid, did it run Out of Gas?
    at ABICoder.decodeParameters (/node_modules/web3-eth-abi/src/index.js:226:15)
    at Contract._decodeMethodReturn (/node_modules/web3-eth-contract/src/index.js:465:22)
    at Method.outputFormatter (/node_modules/web3-eth-contract/src/index.js:818:46)
    at Method.formatOutput (/node_modules/web3-core-method/src/index.js:163:54)
    at sendTxCallback (/node_modules/web3-core-method/src/index.js:473:33)
    at /node_modules/web3-core-requestmanager/src/index.js:147:9
    at XMLHttpRequest.request.onreadystatechange (/node_modules/web3-providers-http/src/index.js:91:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22)
    at XMLHttpRequest._setReadyState (/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14)
    at XMLHttpRequest._onHttpResponseEnd (/node_modules/xhr2-cookies/dist/xml-http-request.js:318:14)
    at IncomingMessage.<anonymous> (/node_modules/xhr2-cookies/dist/xml-http-request.js:289:61)
    at emitNone (events.js:111:20)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)

不确定,这个错误意味着什么。我对气体限制很满意: gasLimit: 67790268488,

有几个问题-

  1. 对实体代码有什么评论吗?任何听起来不对的事?我尝试将getRecord函数更改为公共常量,但没有起到作用。
  2. 如果method.send()可以工作,这是否意味着所有的东西都可以使用可靠的代码?对我来说,部署,把两项工作都派上去。此外,geth节点上契约的编译和加载也是有效的。
  3. 最后,这个错误意味着什么?我试着在论坛上搜索,但是找不到有用的东西。

提前谢谢。技术冠军

EN

回答 1

Ethereum用户

发布于 2018-10-16 17:45:07

  1. 我建议更改您的智能契约,以使用view属性返回数据,这样您就不必为返回数据支付汽油了。
代码语言:javascript
复制
function getRecord(uint id) external view returns (string) {
   return Record[id];
}
  1. 如果发送成功,则意味着您的智能契约函数已有效部署,函数调用成功。我认为假设每个人都工作是有点自以为是的。
  2. 听起来您似乎没有花费足够的gas来验证事务,但是查看区块链上的数据不应该花费gas,此外,为了更好地调试契约,我建议实现承诺回调(.then,catch )语句。

请参阅承诺-事件

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

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

复制
相关文章

相似问题

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