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

Sale.new({ from: state.account, value: value, gas: 4000000 }).then((instance) => {
  // do something with instance
}).catch((err) => {
  alert(err)
})

Когда приведенный выше код запускается, я иногда получаю эту ошибку:The contract code couldn't be stored, please check your gas amount.

Контракт, который я пытаюсь создать, почти точно такой же, как и контракт на безопасный удаленный платеж в документации Solidity, может быть, всего на несколько строк больше.

Странно то, что контракт фактически создается, и я вижу успешную транзакцию в MetaMask, а эфир вычитается из моего счета. Я могу даже тогда использовать Sale.at(<new contract address>)для взаимодействия с созданным контрактом. Я тестировал в сети Ropsten.

Ответы (3)

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

Это заставляет меня думать, что это ошибка с MetaMask, и мне жаль, что мы еще не выяснили это: https://github.com/MetaMask/metamask-plugin/issues/1361

Это похоже на одну из тех очень общих ошибок. Я столкнулся с этим, когда добавил аргумент функции, не обновляя файл ABI (я храню определения функций и функции в отдельных файлах) — это приводило к тому, что определение функции не соответствовало реализации.

Надеюсь, это поможет кому-то.

Это была моя проблема с этим сообщением об ошибке. Я добавил функцию в абстрактный контракт, но не в реализованный контракт.

вы получили ошибку после исключения в конструкторе.

я думаю, что что-то не так с этим фрагментом:

  function Purchase() payable {
        seller = msg.sender;
        value = msg.value / 2;
        if (2 * value != msg.value) throw;
    }

это может вызвать исключение while 2*value==msg.value.

Почему это может вызвать исключение? И если это выбрасывает, то не следует ли откатывать транзакцию? Почему он успешно создается?
какую ценность вы отправляете в транзакции создания?
Пользователь введет что-то вроде 0.1. Который затем прогоняется web3.toWei(web3.toBigNumber(0.1).times(2), 'ether')Итак, я думаю, что конструктор должен иметь возможность разделить отправленное значение поровну на 2 части, потому что перед отправкой оно было умножено на 2.