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

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

2 ответа

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

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

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

https://web3py.readthedocs.io/en/stable/contracts.html

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

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

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!
}
Другие вопросы по тегам