Как я могу проверить, соответствует ли контракт на блок-цепочке исходный код?

Учитывая исходный код (Solidity) смарт-контракта, существует ли способ детерминистически скомпилировать код и сравнить его с кодом на блочной цепочке? Я хочу проверить, что контракт делает то, что утверждает исходный код, и автор не подделывал его.

43 голоса | спросил Joris Bontje 21 Jam1000000amThu, 21 Jan 2016 10:10:26 +030016 2016, 10:10:26

7 ответов


27

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

Итак, совпадение, которое вы должны проверить, это скомпилированный байт-код против данных создания контракта tx .

ответил Thomas Bertani 21 Jpm1000000pmThu, 21 Jan 2016 12:27:37 +030016 2016, 12:27:37
15

Чтобы добавить к ответу @ thomas-bertani, сегодня etherchain.org выпустил инструмент проверки контрактов Ethereum

Вот приведенный текст из Как это работает :

  
  • Получить полезную нагрузку транзакции, которая создала контракт
  •   
  • Скомпилировать предоставленный исходный код с предоставленным компилятором & Параметры
  •   
  • Если создание и предоставленный байт-код совпадают, можно предположить, что предоставленный исходный код равен тому, что ранее было развернуто на   блок-цепочка
  •   
ответил makevoid 22 Jpm1000000pmFri, 22 Jan 2016 14:27:12 +030016 2016, 14:27:12
8

В настоящее время рабочий процесс довольно раздражает. Вам нужно скомпилировать контракт с той же версией компилятора и тем же параметром (обратите внимание на getCode введите полученный код.

  • Сравните скомпилированный код с полезной нагрузкой транзакции, которая создала контракт.
  • Etherchain помогает выполнить этот процесс.

    В принципе основные методы сопоставления шаблонов могут применяться для идентификации контакта, даже если не используется точно такой же компилятор. Проект, который делает это и в целом связывает контракт высокого уровня (Serpent /Solidity) с адресами Ethereum: Etherscrape

    ответил mKoeppelmann 28 Jam1000000amThu, 28 Jan 2016 06:27:03 +030016 2016, 06:27:03
    6

    https://etherscan.io/verifyContract является инструментом проверки. Предоставляя исходный код Solidity, он проверяет, соответствует ли сгенерированный Bytecode контрактному Bytecode (по указанному адресу). пользователь должен выбрать один и тот же компилятор и включить или отключить оптимизацию.

    ответил Badr Bellaj 22 +03002016-10-22T22:03:45+03:00312016bEurope/MoscowSat, 22 Oct 2016 22:03:45 +0300 2016, 22:03:45
    3

    Другим подходом было бы декомпилировать байт-код и сравнить его с источником.

    Существует инструмент Porosity , который делает именно это.

    ответил emx 9 PM00000020000001331 2017, 14:55:13
    0

    Рекомендовать использовать инструмент командной строки с открытым исходным кодом Только что выпущенный ConsenSys, байт-код-верификатор , соответствующий пакет npm

      

    Bytecode Verifier - удобный инструмент командной строки для проверки локально скомпилированного байт-кода целевого контракта на Solidity против его фактического байт-кода, хранящегося в Etheruem Blockchain, с указанием его адреса контракта.

         
    • целостность /правильность байт-кода : то, что на самом деле хранится в цепочке, правильно составлено из конкретного контракта, что может быть полезно в случае нетривиального потенциального развертывания контракта с высоким капиталом ( например, MultiSig Wallet), особенно контракт развертывается через стороннюю платформу.

    •   
    • Минимальное усилие, простое в использовании : компилятор целостности включает сверхурочную работу с незначительными и некоторыми существенными изменениями, что усложняет проверку байт-кода. (поскольку повторяющийся «байт-код не соответствует» вопросам, задаваемым на Ethereum Stack Exchange). Bytecode Verifier был протестирован с последней версией вплоть до самых старых развернутых контрактов.

    •   
    • Testnet friendly : большинство проектов запускается в тестовой сети до развертывания контрактной системы в сети, этот инструмент поддерживает Rinkeby, Kovan и Ropsten Testnet, которые составляют три активные, хорошо поддерживаемые тестовые сети, которые используют большинство разработчиков эфира.
    •   

    Надеюсь, что это поможет!

    ответил Alex Xiong 22 32017vEurope/Moscow11bEurope/MoscowWed, 22 Nov 2017 18:36:33 +0300 2017, 18:36:33
    0

    Вот как я это делаю в сценарии web3.

    Сначала , скомпилируйте код.

    const solc = require('solc');
    
    //contract sources
    const contractPath = "../contracts/";
    
    const input = {
      "ContractName.sol" : fs.readFileSync(contractPath + 'contractName.sol', 'utf8'),
    }
    
    let solcOutput = await solc.compile({ sources: input }, 1);
    

    сейчас сравнить byteCode

    let blockCode = await web3.eth.getCode(contractAddress);
    let solcCode = '0x' + (solcOutput.contracts["contractName.sol:contracName"].runtimeBytecode);}
    
    ответил Ilan Dshare 25 J000000Wednesday18 2018, 18:06:40

    Похожие вопросы

    Популярные теги

    security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132