0

我正在尝试让已部署的 HelloWorld 合同在节点应用程序中运行。我想像这样运行该call()函数来检查它:

const deployed = helloWorldContract.new({
  from: acct1,
  data: compiled.contracts[':HelloWorld'].bytecode,
  gas: 151972,
  gasPrice: 5
}, (error, contract) => {
    if(!error){
      console.log(contract.displayMessage.call());
    } else {
      console.log(error);
    }
});

以下是供参考的合同:

contract HelloWorld {
  function displayMessage() public constant returns (string){
    return "hello from smart contract - {name}";
  }
}

当我尝试console.log(contract.displayMessage.call())回调时,它返回:TypeError: Cannot read property 'call' of undefined,但是,当我登录它时,console.log(contract.displayMessage)它返回:

{ [Function: bound ]
   request: [Function: bound ],
   call: [Function: bound ],
   sendTransaction: [Function: bound ],
   estimateGas: [Function: bound ],
   getData: [Function: bound ],
   '': [Circular] }

我在这里做错了什么?如何call在已部署的合约中运行该功能?

4

1 回答 1

2

我认为您的问题可能是由.new构造函数引起的。我个人不推荐使用它,因为它很奇怪。相反,您应该将字节码部署为标准事务。

无论如何,如果您查看源代码.new您会发现回调实际上被调用了两次。它完全是非标准的,据我所知,没有记录。

事务发送后第一次调用回调,并且contract对象将已transactionHash设置。

第二次调用回调时,contract对象应该具有address属性集。这就是您想要的,因为没有地址属性,您无法调用合约方法。

简而言之,试试这个

const deployed = helloWorldContract.new({
  from: acct1,
  data: compiled.contracts[':HelloWorld'].bytecode,
  gas: 151972,
  gasPrice: 5
}, (error, contract) => {
    if (error){
      console.error(error);
    } else {
      console.log(contract);
      if (contract.address) {
        console.log(contract.displayMessage());
      }
    }
});

要在不使用方法的情况下部署合约.new,首先需要生成合约字节码和 ABI。您可以通过使用solc或在线solidity 编译器或任何其他方式获得它。

然后部署您使用的合约web3.eth.sendTransactiondata参数设置为字节码和一个空to地址。sendTransaction会返回给你一个transactionHash,你需要等待被挖掘和确认。最简单的方法是通过轮询 - 我写的这个方法是一个很好的起点 - https://gist.github.com/gaiazov/17c9fc7fdedf297e82386b74b34c61cd

如果您的合约采用构造函数参数,它们将附加到字节码中,例如data: bytecode + encodedConstructorArguments.

于 2017-07-18T19:47:30.137 回答