Учитывая следующий контракт:
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
Тем самым намекая, что это вовсе не код, а некая форма поля данных. Если да, то для чего это используется? , вообще а в этом конкретном примере?
Байт-код времени выполнения (из remix
):
60606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637c2efcba146047578063db80813f146075575b600080fd5b3415605157600080fd5b60576099565b60405180826000191660001916815260200191505060405180910390f35b3415607f57600080fd5b6097600480803560001916906020019091905050609f565b005b60005481565b80600081600019169055505b505600a165627a7a72305820e62ffd25aaa1132d83ae4470e9f3991cb237178c38401db1857b9417b74603560029
Это хэш Swarm . Он задокументирован на https://solidity.readthedocs.io/en/develop/metadata.html .
Извлечение следует
Метаданные контракта
Компилятор Solidity автоматически создает файл JSON, метаданные контракта, который содержит информацию о текущем контракте. Его можно использовать для запроса версии компилятора, используемых исходников, документации ABI и NatSpec, чтобы более безопасно взаимодействовать с контрактом и проверять его исходный код.
Компилятор добавляет хеш Swarm файла метаданных в конец байт-кода (подробности см. ниже) каждого контракта, чтобы вы могли получить файл аутентифицированным способом, не прибегая к централизованному поставщику данных.
Формат выглядит так:
Если бы вы отдельно загружали файл метаданных в Swarm, будущие пользователи вашего контракта могли бы найти его по этой ссылке в коде контракта.
Начиная с Solidity 0.5.9 формат метаданных выглядит так:
А также предостережение:
В настоящее время компилятор использует хэш метаданных «swarm версии 0», но это может измениться в будущем, поэтому не полагайтесь на то, что эта последовательность начинается с 0xa2 0x65 'b' 'z' 'z' 'r' '0' . Мы также можем добавить дополнительные данные в эту структуру CBOR, поэтому лучше всего использовать правильный парсер CBOR.
Пол Разван Берг
0xa2
вместо0xa1
первого байта и0x32
вместо0x29
последнего байтаПол Разван Берг