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!
}