2

我正在做一个项目,我需要将以太币从用户发送到智能合约,然后从智能合约发送到用户。智能合约是 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”?这甚至可能吗?

非常感谢, 阿尔班

4

1 回答 1

1

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

以下是如何调用合约函数的示例:

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

https://web3py.readthedocs.io/en/stable/contracts.html#contract-deployment-example

根据您的应用程序,通常用户通过他们的 Web 浏览器调用合同,他们在其中使用 web3.js 连接了钱包。

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

github.com/web3modal/web3modal

于 2020-04-22T08:15:52.437 回答