如何与solidity函数交互并从不同的地址进行交易?

Posted

技术标签:

【中文标题】如何与solidity函数交互并从不同的地址进行交易?【英文标题】:How to interact with a solidity function and make transactions from a different address? 【发布时间】:2021-06-12 05:43:32 【问题描述】:

所以我有一个我已经定义然后编译的solidity合约:

voting_contract_compiled = compile_contract('Voting')
voting_deployment_tx_receipt, Voting = deploy_contract(w3, voting_contract_compiled, 10)

当我Voting.all_functions() 时,我得到:

[<Function getNumVoters()>,
 <Function getStatus()>,
 <Function getWinner()>,
 <Function isVotingOpen()>,
 <Function totalVotesFor(int256)>,
 <Function validateAndCacheVote()>,
 <Function voteForCandidate(int256)>,
 <Function votesReceived(int256)>]

这是我定义的函数。我现在要做的是与来自默认帐户以外的发件人的这些功能进行交互。我不知道该怎么做。我是否需要编译另一份合同(这似乎不是正确的选择)但似乎每当我做Voting.something 时,它指的是那里的默认帐户,所以制作新合同是我唯一能想到的事情,但这也是考虑到我会实例化一个新合同,这似乎是错误的。

我想做这样的事情:

account1 = 'from': w3.eth.accounts[1], 'value': w3.toWei(1, 'ether')
Voting.functions.voteForCandidate(1).transact(account1)

但我得到TransactionFailed: execution reverted: b''

【问题讨论】:

【参考方案1】:

事实证明,这样做的方法如下:

transaction = 'from': w3.eth.accounts[6], 'value': w3.toWei(1, 'ether')

tx_hash = Voting.functions.voteForCandidate(1).transact(transaction)
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

其中w3.eth.accounts 只是不同帐户名称的列表。

【讨论】:

以上是关于如何与solidity函数交互并从不同的地址进行交易?的主要内容,如果未能解决你的问题,请参考以下文章

从 Web.js 连接到 Solidity 合约时地址无效

智能合约的函数与函数修饰符

智能合约的函数与函数修饰符

Solidity极简入门#22. Call

移动端交互动效设计你怎么看?

第152篇 Solidity 中的 Call