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

Posted

技术标签:

【中文标题】使用 Web3 1.0 调用智能合约方法【英文标题】:Calling a Smart Contract method using Web3 1.0 【发布时间】:2018-12-28 08:46:03 【问题描述】:

目前,我已成功将智能合约部署到 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 来正确调用合约方法?我在传递选项等方面做错了吗?

谢谢!

【问题讨论】:

更改您的事件发射器以检查 transactionHashreceipt。事务哈希的回调将是您返回的第一个响应。如果你得到了,但从未得到收据,那么你的交易就没有被挖掘。我还将明确包含 gasPricegas 值。最后,您是否在 Etherscan 上确认您的合约已正确部署? 【参考方案1】:

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

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

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

那么到现在为止,一切都应该很好了。

【讨论】:

谢谢亚历克斯,但我确实这样做了。我只是删掉了该代码,以免在堆栈溢出时使代码过于复杂。很好,但这不是问题。【参考方案2】:

首先,您需要使用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
             );
    

【讨论】:

以上是关于使用 Web3 1.0 调用智能合约方法的主要内容,如果未能解决你的问题,请参考以下文章

text 智能合约上的eth调用方法仅适用于web3

nodejs部署智能合约的方法-web3 0.20版本

如何使用 Python 和 web3.py 调用智能合约函数

Web3js - 部署后立即返回智能合约地址

使用 web3js 和 galanche 调用具有价值的以太坊智能合约

通过 web3.js 调用智能合约函数没有响应