Etherscan: как я могу проверить контракт с несколькими импортами, развернутыми с помощью Truffle?

Когда я развертываю контракт с Truffle, в котором есть importоператор, и пытаюсь проверить его на etherscan , я понимаю, что мне нужно вставить содержимое импортированного файла.

Я получаю сообщение об ошибке на etherscan, что байт-коды объединенных и развернутых файлов не совпадают. Странно то, что если я разверну контракт (с импортом) на ремикс , то байт-код совпадает с конкатенированным исходным файлом.

Пример

Вот минимальный пример контрактов, демонстрирующих такое поведение.

Combined.solпредставляет собой объединенный файл и Outer.solсодержит развернутый контракт.

Вот что я делаю, что получает ошибку:

  1. Развертывание Outer.solс трюфелем
  2. Перейдите по адресу развернутого контракта на etherscan
  3. Введите Concatenated.solисходный код и нажмите «Проверить» .

Ошибка, байткоды не совпадают.

Больше информации

  • Использование компилятора 0.4.11в ремиксах и трюфелях.
  • Убунту 16.04.
  • На Коване это не должно иметь значения.
  • Развернутый контракт
Для меня проверка составных контрактов работала как шарм. Можете ли вы предоставить адрес развернутого минимального примера в сети Kovan, чтобы я мог расследовать дело?
@JakubWojciechowski Обновленный ответ с адресом развернутого контракта
Пробовали ли вы при проверке кода на Etherscan как с включенной оптимизацией, так и без нее?

Ответы (3)

В настоящее время etherscan не поддерживает проверку многофайловых контрактов. Но на Reddit etherscan есть обсуждение этой проблемы.

Объединение файлов в один работало некоторое время назад, но начиная с версии 0.4.7 Solidity включает хэш метаданных контракта в конце скомпилированного контракта . Поскольку эти метаданные содержат имена файлов и хэши, вы можете получить тот же байт-код после объединения и компиляции, но этот хэш будет другим.

Я думаю, что добавление хэша этих метаданных в развернутый контракт мотивировано тем, чтобы сделать проверку источника автоматической, поскольку каждый развернутый контракт содержит swarm-ссылку на исходники, версию компилятора и параметры компиляции.

Так что в основном функция проверки практически бесполезна, начиная с Solidity 0.4.7?

Я создал интерфейс командной строки, который может вам помочь, под названием multisol . Вы можете установить его через Homebrew, если вы используете Mac, или загрузить один из исполняемых файлов, которые я предоставляю, если вы используете Windows или Linux:

$ brew tap paulrberg/multisol
$ brew install multisol

Затем вы можете использовать его следующим образом:

$ multisol path/to/YourContract.sol

Это создаст папку с именем «multisol-yourcontract», которую можно использовать для проверки исходного кода на Etherscan для развернутого экземпляра YourContract.sol. Обратите внимание, что тип проверки — «Надежность (многочастные файлы)».

Я создал truffle-plugin-verifyдля автоматизации проверки контрактов Truffle на Etherscan.


  1. Установите плагин с помощью npm
npm install truffle-plugin-verify
  1. Добавьте плагин в ваш truffle.jsили truffle-config.jsфайл
module.exports = {
  /* ... rest of truffle-config */

  plugins: [
    'truffle-plugin-verify'
  ]
}
  1. Создайте ключ API в своей учетной записи Etherscan (см . веб- сайт Etherscan )
  2. Добавьте ключ API Etherscan в конфигурацию трюфеля.
module.exports = {
  /* ... rest of truffle-config */

  api_keys: {
    etherscan: 'MY_API_KEY'
  }
}

После переноса вашего Outerконтракта в Kovan вы можете проверить его на Etherscan, запустив:

truffle run verify Outer --network kovan

Дополнительную информацию можно найти в репозитории или в моей статье Автоматическая проверка смарт-контрактов Truffle на Etherscan .

I am trying to verify a contract which uses multiple contracts but it fails with the below error: truffle run verify AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 --network kovan Verifying AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Fail - Unable to verify Failed to verify 1 contract(s): AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Код для проверки: github.com/dydxprotocol/solo/blob/master/contracts/protocol/… Я следовал именно тому, что вы предложили, и все еще пытаюсь понять, чего не хватает.
Случайно не был ли контракт развернут через другой контракт?
Нет, он развертывается независимо. После развертывания он используется в этом контракте: github.com/dydxprotocol/solo/blob/master/contracts/protocol/…
Не могли бы вы открыть задачу на GitHub (с выводом запуска команды с --debugфлагом? github.com/rkalis/truffle-plugin-verify/issues/new