#ethereum #solidity #smartcontracts
Вопрос:
Если у меня есть такая функция, как эта:
function sendToAuthor (uint tokenId) public payable{
//here I want to get some ether from the msg.sender, store it in a
mapping and send it to another address (author).
}
Чего я не понимаю, так это как проверить, дал ли отправитель msg.деньги смарт-контракту или нет. Если я смогу это проверить, я могу взять значение msg.из сопоставления и отправить его автору, но как мне проверить, что отправитель действительно перевел eth в контракт?
Ответ №1:
msg.value
Переменная содержит, сколько ETH было внесено в payable
функцию. Вы проверяете, что значение выше нуля или соответствует любой сумме платежа, которую вы ожидаете.
Ответ №2:
psuedocode:
contract someContract {
address author = "0x00...";
mapping (address => uint) public sentToAuthor;
function sendToAuthor () public payable {
sentToAuthor[msg.sender] = msg.value;
author.call{value: msg.value}("");
}
}
Ваш вопрос на самом деле не имеет смысла.
Чего я не понимаю, так это как проверить, дал ли отправитель msg.деньги смарт-контракту или нет.
Вы просто посмотрите на ценность msg.value
. Если транзакция не возвращается, и функция оплачивается, и вы больше никуда ее не отправляете, то ваш контракт получает эти средства. Период. Никакой «проверки» не требовалось. Если вы действительно хотите проверить, вы можете сделать это на стороне клиента, но просто посмотрите на баланс контракта (например ethers.utils.balanceOf(contractAddress)
, или что-то в этом роде). Вы также можете просто посмотреть на карту здесь, она будет правильной и покажет вам.
Если я смогу это проверить, я могу взять значение msg.из сопоставления и отправить его автору, но как мне проверить, что отправитель действительно перевел eth в контракт?
«msg.значение» на самом деле не будет «в» отображении, сопоставления на самом деле не могут содержать eth, они могут содержать только uint. Это просто говорит вам, сколько было отправлено в контракт.
Кстати, как написано здесь, он отправляет его прямо автору, поэтому он не останется в контракте. Если вы удалите последнюю строку «sendToAuthor» ( author.call
строка), вместо этого eth просто останется в самом контракте.
(кстати, есть стековый поток ethereum, вы должны спросить там.)