Что такое загадочная часть в конце байт-кода контракта Solidity?

Учитывая следующий контракт:

pragma solidity ^0.4.11;

contract Simple {
    bytes32 public v;
    function set(bytes32 _v) {
        v = _v;
    }
}

При дизассемблировании ни remix, solcни не evmмогут правильно интерпретировать конечный конец кода. Кроме того, код кажется недостижимым (он следует за инструкцией JUMP), и то, что он делает, не имеет особого смысла.

Аналогичный завершающий код создается при компиляции с помощью solcи remix, с аналогичными префиксами и суффиксами, но содержимое немного отличается:

 00a165627a7a72305820...0029

При дизассемблировании префиксный байт-код интерпретируется всеми как:

 stop
 log1
 push6 0x627a7a723058 
 sha3
 ...

При компиляции с remixполем «сборка» в веб-интерфейсе деталь описывается как тег «.data»:

[...]
 SSTORE             v = _v
      POP           v = _v
    tag 10          function set(bytes32 _v) {\n        ...
      JUMPDEST          function set(bytes32 _v) {\n        ...
      POP           function set(bytes32 _v) {\n        ...
      JUMP [out]            function set(bytes32 _v) {\n        ...
    .data

Тем самым намекая, что это вовсе не код, а некая форма поля данных. Если да, то для чего это используется? , вообще а в этом конкретном примере?


  • ремикс: 0.4.14+commit.c2215d46.Emscripten.clang
  • evm: 1.7.0-нестабильный (git commit 3d32690b)
  • solc: 0.4.14-develop.2017.7.27+commit.16ca1eea.Linux.g++

Байт-код времени выполнения (из remix):

60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637c2efcba146047578063db80813f146075575b600080fd5b3415605157600080fd5b60576099565b60405180826000191660001916815260200191505060405180910390f35b3415607f57600080fd5b6097600480803560001916906020019091905050609f565b005b60005481565b80600081600019169055505b505600a165627a7a72305820e62ffd25aaa1132d83ae4470e9f3991cb237178c38401db1857b9417b74603560029

Ответы (1)

Это хэш Swarm . Он задокументирован на https://solidity.readthedocs.io/en/develop/metadata.html .

Извлечение следует

Метаданные контракта

Компилятор Solidity автоматически создает файл JSON, метаданные контракта, который содержит информацию о текущем контракте. Его можно использовать для запроса версии компилятора, используемых исходников, документации ABI и NatSpec, чтобы более безопасно взаимодействовать с контрактом и проверять его исходный код.

Компилятор добавляет хеш Swarm файла метаданных в конец байт-кода (подробности см. ниже) каждого контракта, чтобы вы могли получить файл аутентифицированным способом, не прибегая к централизованному поставщику данных.

Формат выглядит так:

введите описание изображения здесь

Если бы вы отдельно загружали файл метаданных в Swarm, будущие пользователи вашего контракта могли бы найти его по этой ссылке в коде контракта.

Обновление август 2019 г.

Начиная с Solidity 0.5.9 формат метаданных выглядит так:

прочность 0.5.9

А также предостережение:

В настоящее время компилятор использует хэш метаданных «swarm версии 0», но это может измениться в будущем, поэтому не полагайтесь на то, что эта последовательность начинается с 0xa2 0x65 'b' 'z' 'z' 'r' '0' . Мы также можем добавить дополнительные данные в эту структуру CBOR, поэтому лучше всего использовать правильный парсер CBOR.

В солидности 0.5.10 я вижу 0xa2вместо 0xa1первого байта и 0x32вместо 0x29последнего байта
Обновление : действительно, они обновили спецификацию метаданных контракта в Solidity 0.5.9.