我在一个项目中工作,我需要从用户发送乙醚到智能合同,并从智能合同发送到用户。这个智能合约是用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
发布于 2020-04-22 16:15:52
您需要从Solidity编译器创建的ABI文件构造一个Contract
对象。
下面是一个调用约定函数的示例:
>>> tx_hash = greeter.functions.setGreeting('Nihao').transact()
https://web3py.readthedocs.io/en/stable/contracts.html#contract-deployment-example
根据您的应用程序,用户通常通过他们的web浏览器调用合同,其中他们使用web3.js连接了一个钱包。
下面是一个很好的库,如何将您的dApp与用户钱包连接起来:
Github.com/web3mode/web3mode
https://stackoverflow.com/questions/61278166
复制相似问题