Примеры контрактов с токенами не работают — «Контракт не позволяет выполнить эту транзакцию»

Образец контракта «Расширенный токен» здесь: https://www.ethereum.org/token

Не работает при развертывании в тестовой сети. Попытка отправить эфир на контракт для покупки токенов приводит к сообщению об ошибке:

Контракт не позволит выполнить эту транзакцию

Ничто в учебнике не объясняет, почему это произошло.

Да, ОП говорит, что исправил это, но не предлагает решения, потому что «не может найти, что именно было ошибкой».
Понял. Вы пытались запустить код в Remix, чтобы увидеть, выдает ли он ту же ошибку?
Спасибо за совет. Я выполнил его в Remix, но не осознал возможности отладчика Remix, что привело меня к тому, что я описал в ответе.
Аргх - беру обратно. Даже с исправлением контракт не будет выполняться. Remix говорит, что будет, и что это потребует 30 тысяч газа, но клиент Ethereum по-прежнему сообщает, что это не удастся. Так что до сих пор не исправить.

Ответы (2)

Изменить Итак, я понял проблему. Моя "оплачиваемая" функция называется buy(). Я предполагал, что контракт будет автоматически выбирать платежную функцию при отправке эфира, но похоже, что вам нужна универсальная платежная функция, а не именованная, для получения произвольных эфирных платежей. Как только я удалил имя функции, все заработало.

Изменить: хотя приведенная ниже информация была частью проблемы, конкретное решение приведено выше.

Итак, насколько я могу судить, вот в чем проблема...

  • При создании код контракта дает учетной записи владельца первоначальный запас токенов.
  • Таким образом, неявно контрактная учетная запись имеет нулевые токены.
  • Ожидается, что операции buy() будут извлекаться из учетной записи контракта .

Итак, для работы buy() есть несколько вариантов (в порядке возрастания сложности):

  • Добавьте исходную поставку в учетную запись контракта вместо учетной записи владельца. (требуется изменение кода контракта)
  • Перевести часть токенов на счет контракта от владельца, опубликовать создание. (Требуется 1 дополнительная транзакция, без кода)
  • Отправьте немного эфира на счет контракта и продайте токены от владельца обратно контракту (требуется 1 дополнительная транзакция и расход эфира)

Имеет смысл подробно рассмотреть код, просто не уловил аспект адреса владельца, на который ссылается как «msg.sender», в отличие от адреса контракта, на который ссылается как «этот».

Итак, я разобрался с проблемой. «Оплачиваемая» функция называется buy(). Я предполагал, что контракт будет автоматически выбирать платежную функцию при отправке эфира, но похоже, что вам нужна универсальная платежная функция, а не именованная, для получения произвольных эфирных платежей. Как только я удалил имя функции, все заработало!

После создания контракта первоначальное распределение монет принадлежит владельцу контракта. Вам нужно перевести часть новых монет на сам контракт.

При нулевом балансе контракт не позволит совершить транзакцию.

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