Hello world 合约方法调用 returns 未处理的拒绝错误

Hello world contract method call returns Unhandled rejection Error

这是我的 package.json:

{
  "dependencies": {
    "solc": "^0.4.16",
    "web3": "^1.0.0-beta.20"
  }
}

这是我的智能合约代码:

contract HelloWorld {
    function displayMessage() constant returns (string) {
        return "Hello from a smart contract";
    }
}

我已经使用 testprc 运行 在节点 repl 上编译了这个合约,我正在尝试像这样调用 displayMessage 方法:

myContract.methods.displayMessage().call()

myContract.methods.displayMessage.call()

但我刚收到这个错误:

> Unhandled rejection Error: ERROR: The returned value is not a convertible string:
at SolidityTypeString.formatOutputString [as _outputFormatter] (/Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-abi/src/formatters.js:245:15)
at /Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-abi/src/type.js:246:25
at SolidityTypeString.SolidityType.decode (/Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-abi/src/type.js:247:11)
at /Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-abi/src/index.js:327:49
at Array.forEach (<anonymous>)
at ABICoder.decodeParameters (/Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-abi/src/index.js:326:13)
at Contract._decodeMethodReturn (/Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-contract/src/index.js:490:22)
at Method._parent._ethereumCall.call.method.outputFormatter (/Users/alberthu/Documents/solidity-intro/node_modules/web3-eth-contract/src/index.js:820:42)
at Method.formatOutput (/Users/alberthu/Documents/solidity-intro/node_modules/web3-core-method/src/index.js:179:54)
at sendTxCallback (/Users/alberthu/Documents/solidity-intro/node_modules/web3-core-method/src/index.js:446:33)
at /Users/alberthu/Documents/solidity-intro/node_modules/web3-core-requestmanager/src/index.js:144:9
at XMLHttpRequest.request.onreadystatechange (/Users/alberthu/Documents/solidity-intro/node_modules/web3-providers-http/src/index.js:64:13)
at XMLHttpRequestEventTarget.dispatchEvent (/Users/alberthu/Documents/solidity-intro/node_modules/xhr2/lib/xhr2.js:64:18)
at XMLHttpRequest._setReadyState (/Users/alberthu/Documents/solidity-intro/node_modules/xhr2/lib/xhr2.js:354:12)
at XMLHttpRequest._onHttpResponseEnd (/Users/alberthu/Documents/solidity-intro/node_modules/xhr2/lib/xhr2.js:509:12)
at IncomingMessage.<anonymous> (/Users/alberthu/Documents/solidity-intro/node_modules/xhr2/lib/xhr2.js:469:24)
at emitNone (events.js:110:20)
at IncomingMessage.emit (events.js:207:7)
at endReadableNT (_stream_readable.js:1059:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)

我试过通读 web3 api 文档,但我是新手,没有发现任何有用的东西。任何人都知道如何让 "Hello from a smart contract" 在服务器上显示?

谢谢!

我也在学习如何编写智能合约,今天早些时候遇到了这个错误。我发现导致它的原因是我将错误的地址绑定到我的智能合约。

web3 中的合约对象有一个地址 属性,表示用于该合约实例的地址。在我的例子中,这个地址不正确,导致我有同样的错误。合约地址在你部署后应该已经返回给你了。

正确的合约地址应该在你部署后通过回调函数返回给你。

您可以通过以下方式设置和查看您的合约地址:

myContract.options.address // returns the current address you have set for this contract instance
myContract.options.address = "the correct contract address"

我会把它留作评论,但不幸的是我没有足够的声誉。如果您需要更多帮助或想聚在一起学习,请告诉我。

这里是关于合约地址的 web3js 文档属性:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#options-address

我也遇到了同样的问题。并插入正确的合约地址。 我的合同(示例来自 documentation web3js) 我使用 web3.1.0.0-beta.23.

pragma solidity ^0.4.18;

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

代码

const contract = new web3.eth.Contract(abi, contractAddress);  
contract.methods.myFunction().call()
  .then(res => console.log(res))
  .catch(e => console.log(e.message))

合同创建并从测试网发送成功。但是如果我尝试调用方法 - 有同样的错误:

ERROR: The returned value is not a convertible string: