使用Web3 1.0调用智能合约方法

时间:2018-07-20 05:41:35

标签: blockchain ethereum solidity web3

目前,我已经将智能合约成功部署到Rinkeby测试网,使用Web3 1.0版访问有问题的方法时遇到问题。

这是我的web3代码,该代码实例化一个合约实例并调用一个合约方法:

const contractInstance = new web3.eth.Contract(abiDefinition, contractAddress);
var value = web3.utils.toWei('1', 'ether')
var sentTransaction = contractInstance.methods.initiateScoreRetrieval().send({value: value, from: fromAddress})

console.log('event sent, now set listeners')

sentTransaction.on('confirmation', function(confirmationNumber, receipt){
  console.log('method confirmation', confirmationNumber, receipt)
})
sentTransaction.on('error', console.error);

这是我的智能合约,或者更确切地说,是将其简化为相关内容的版本:

contract myContract {

  address private txInitiator;
  uint256 private amount;


  function initiateScoreRetrieval() public payable returns(bool) {
    require(msg.value >= coralFeeInEth);
    amount = msg.value;
    txInitiator = msg.sender;
    return true;
  }


}

我无法进入在web3端设置事件监听器的console.log,也没有抛出任何类型的错误。我当然不是从实际的事件监听器中获取控制台。我猜我发送交易的方式出了问题,但我认为我正确地遵循了以下记录的模式:https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send

有人对如何使用web3 1.0正确进行合同方法调用有任何见解吗?我在传递选项等方面做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

我相信您忘记为web3指定HttpProvider,因此您没有连接到实时Rinkeby网络,并且默认情况下,web3在您的本地主机上运行,​​这就是即使您提供正确权限的原因合同地址,那里什么都没有。

要连接到实时网络,我强烈建议您使用ConsenSys的Infura Node。

const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io"));

那么到现在,一切都应该正常工作了。

答案 1 :(得分:0)

首先,您需要使用encodeABI()生成交易ABI,下面是一个示例:

let tx_builder = contractInstance.methods.myMethod(arg1, arg2, ...);
let encoded_tx = tx_builder.encodeABI();
let transactionObject = {
    gas: amountOfGas,
    data: encoded_tx,
    from: from_address,
    to: contract_address
};

然后,您必须使用发件人的私钥使用signTransaction()签署交易。以后您可以sendSignedTransaction()

web3.eth.accounts.signTransaction(transactionObject, private_key, function (error, signedTx) {
        if (error) {
        console.log(error);
        // handle error
        } else {
            web3.eth.sendSignedTransaction(signedTx.rawTransaction)
              .on('receipt', function (receipt) {
              //do something
             });
    }