使用 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 来正确调用合约方法?我在传递选项等方面做错了吗?
谢谢!
【问题讨论】:
更改您的事件发射器以检查transactionHash
和 receipt
。事务哈希的回调将是您返回的第一个响应。如果你得到了,但从未得到收据,那么你的交易就没有被挖掘。我还将明确包含 gasPrice
和 gas
值。最后,您是否在 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 调用智能合约方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 和 web3.py 调用智能合约函数