Эт, как вызвать функцию депозита из умного контракта - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю над проектом, в котором мне нужно отправить эфир от пользователя к умному договору и от умного договора к пользователю. Умный контракт - это код в Solidity, и я использую python и web3.py для связи с ним.

Мне удается сделать это следующим образом: от пользователя до умного контракта в моем python script:

#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» в моем умном контракте, когда я вызываю функцию внутри? Это вообще возможно?

Большое спасибо, Албан

1 Ответ

0 голосов
/ 22 апреля 2020

Вам необходимо создать объект Contract из файлов ABI, созданных компилятором Solidity.

Вот пример вызова функции контракта:

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

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

В зависимости от вашего приложения, обычно пользователи вызывают контракт через свой веб-браузер, где у них есть кошелек, подключенный с помощью web3. js.

Вот хорошая библиотека для подключения вашего dApp к вашему пользовательскому кошельку:

github.com / web3modal / web3modal

...