Как я могу проверить, соответствует ли контракт на блок-цепочке исходный код?
Учитывая исходный код (Solidity) смарт-контракта, существует ли способ детерминистически скомпилировать код и сравнить его с кодом на блочной цепочке? Я хочу проверить, что контракт делает то, что утверждает исходный код, и автор не подделывал его.
7 ответов
AFAIK лучший способ сделать это на данный момент - снова скомпилировать исходный код с той же самой версией компилятора, которую использовал автор (так что это то, что нужно разглашать) и сравнить байт-код.
Итак, совпадение, которое вы должны проверить, это скомпилированный байт-код против данных создания контракта tx .
Чтобы добавить к ответу @ thomas-bertani, сегодня etherchain.org выпустил инструмент проверки контрактов Ethereum
Вот приведенный текст из Как это работает :
- Получить полезную нагрузку транзакции, которая создала контракт
- Скомпилировать предоставленный исходный код с предоставленным компилятором & Параметры
- Если создание и предоставленный байт-код совпадают, можно предположить, что предоставленный исходный код равен тому, что ранее было развернуто на блок-цепочка
В настоящее время рабочий процесс довольно раздражает. Вам нужно скомпилировать контракт с той же версией компилятора и тем же параметром (обратите внимание на getCode введите полученный код.
Etherchain помогает выполнить этот процесс.
В принципе основные методы сопоставления шаблонов могут применяться для идентификации контакта, даже если не используется точно такой же компилятор. Проект, который делает это и в целом связывает контракт высокого уровня (Serpent /Solidity) с адресами Ethereum: Etherscrape
https://etherscan.io/verifyContract является инструментом проверки. Предоставляя исходный код Solidity, он проверяет, соответствует ли сгенерированный Bytecode контрактному Bytecode (по указанному адресу). пользователь должен выбрать один и тот же компилятор и включить или отключить оптимизацию.
Рекомендовать использовать инструмент командной строки с открытым исходным кодом Только что выпущенный ConsenSys, байт-код-верификатор , соответствующий пакет npm
Bytecode Verifier - удобный инструмент командной строки для проверки локально скомпилированного байт-кода целевого контракта на Solidity против его фактического байт-кода, хранящегося в Etheruem Blockchain, с указанием его адреса контракта.
целостность /правильность байт-кода : то, что на самом деле хранится в цепочке, правильно составлено из конкретного контракта, что может быть полезно в случае нетривиального потенциального развертывания контракта с высоким капиталом ( например, MultiSig Wallet), особенно контракт развертывается через стороннюю платформу.
Минимальное усилие, простое в использовании : компилятор целостности включает сверхурочную работу с незначительными и некоторыми существенными изменениями, что усложняет проверку байт-кода. (поскольку повторяющийся «байт-код не соответствует» вопросам, задаваемым на Ethereum Stack Exchange). Bytecode Verifier был протестирован с последней версией вплоть до самых старых развернутых контрактов.
- Testnet friendly : большинство проектов запускается в тестовой сети до развертывания контрактной системы в сети, этот инструмент поддерживает Rinkeby, Kovan и Ropsten Testnet, которые составляют три активные, хорошо поддерживаемые тестовые сети, которые используют большинство разработчиков эфира.
Надеюсь, что это поможет!
Вот как я это делаю в сценарии 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);}