Eth,如何从智能合约中调用存款函数



我正在进行一个项目,需要将以太坊从用户发送到智能合约,并从智能合约发送到用户。智能合约是Solidity中的代码,我使用python和web3.py与它通信。

我设法做到了这一点:从用户到我的python脚本中的智能合约:

#send transaction to the smart contract
web3.eth.sendTransaction({
'to': address,
'from': web3.eth.defaultAccount,
'value': 10000000000000000000
})

并且从智能合约到用户使用这个功能:

function sendEther(address payable recipient, int _amount) public payable {
recipient.transfer(_amout ether);
}

请注意,此函数可以在智能合约中调用。

但后来我想在我的智能合约中创建一个功能存款(从用户到智能合约(:

function deposit(uint256 amount) payable public {
require(msg.value == amount);
// nothing else to do!
}

因此,基本上,如果我需要用python脚本调用这个函数,我需要这样进行:

contract.functions.deposit(10).transac({
'to': address,
'from': web3.eth.defaultAccount,
'value': 10
})

通过检查智能合约的余额,它可以正常工作。

但是,如果我想调用智能合约中的存款功能,并进行从用户到智能合约的交易,我需要如何进行?当我调用智能合约中的函数时,如何解析其中的"msg.value"?这可能吗?

非常感谢,Alban

您需要从Solidity编译器创建的ABI文件中构造Contract对象。

下面是一个如何调用合约函数的示例:

>>> tx_hash = greeter.functions.setGreeting('Nihao').transact()

https://web3py.readthedocs.io/en/stable/contracts.html#contract-部署示例

根据您的应用程序,用户通常通过他们的网络浏览器调用合同,在那里他们使用web3.js.连接了一个钱包

这里有一个很好的库,如何将你的dApp与你的用户钱包连接起来:

github.com/web3modal/web3modal

我认为问题出在您的代码上

function deposit(uint256 amount) payable public {
require(msg.value == amount);
// nothing else to do!
}

尝试使用这个替代:

function deposit(uint256 amount) payable public {
require(msg.value != 0);
// nothing else to do!
}

最新更新