Solidity — Смарт-контракт — Отправка eth с внешней учетной записи на смарт-контракт

Я прочитал этот пример http://solidity.readthedocs.io/en/latest/solidity-by-example.html#simple-open-auction , чтобы узнать, как разрешить моему смарт-контракту получать eth из внешней учетной записи. Кажется, мне нужна простая оплачиваемая функция. Поэтому я написал контракт с простой платной функцией на Remix и протестировал его с помощью MetaMask (Ropsten Network), отправив 1 eth со своего внешнего аккаунта на свой контракт. Сбой, MetaMask сообщает мне, что контракт вызывает исключение. Итак, я добавил в контракт резервную функцию и снова попытался отправить eth. Это сработало! Но приведенный выше пример не говорит мне, что мне нужна резервная функция, и я не могу выполнить хранение данных (например, сохранить msg.value и msg.sender в переменных) в резервной функции, потому что для этого требуется больше газа, чем он может имеют!

Пожалуйста помогите. Я знаю, что это нубский вопрос, но я не могу понять.

Строка очень немногих контрактов:введите описание изображения здесь

ОШИБКА:введите описание изображения здесь

Спасибо всем!

добавление вашего кода контракта и ошибок, безусловно, облегчит людям помощь

Ответы (3)

Проблема в том, что даже если payableв вашем контракте есть функция, вы ее не вызываете. Вы должны вызвать функцию напрямую. Если вы не вызываете какую-либо конкретную функцию напрямую (что происходит, если вы просто отправляете эфир с помощью Metamask), будет вызвана резервная функция (если таковая существует).

К сожалению, Metamask не поддерживает прямой вызов функций контракта. Вам потребуются дополнительные инструменты (или другие инструменты). Ознакомьтесь с Metamask: как получить доступ/вызвать функции развернутого контракта, используя, например, Metamask.

Выглядит нормально, вам просто нужно развернуть контракт в сети ropsten (выберите виртуальную машину JavaScript в верхнем правом меню в ремиксе). Затем используйте метамаску для отправки эфира на контракт после его развертывания. Очевидно, что для сложных операций вам понадобится обычная функция, публичная и платная, например, функция «заявка», которую вы уже получили.

ps резервная функция необходима, когда вы хотите, чтобы ваш контракт принимал эфир без выполнения функции, например, когда вы хотите отправить эфир из метамаски в контракт.

Вот простой контракт, который я заключил, оплачивая функцию makeWish. По сути, вы можете бросить немного эфира и добавить текстовую строку своего желания в блокчейн в виде события.

Вот код контракта: https://etherscan.io/address/0x592F9B9A7D7AaF70FD6b4dE9883a62cA888DE702#code

Вы можете взаимодействовать с ним через MetaMask здесь: https://etherscan.io/address/0x592F9B9A7D7AaF70FD6b4dE9883a62cA888DE702#writeContract