Зачем мне нужна скомпилированная версия контракта только для того, чтобы получить определение ABI? Похоже, адрес контракта должен быть достаточно.
Я очень смущен, потому что я просто пытаюсь запустить контракт, предполагая, что он был сделан на другом компьютере. Похоже, сначала мне нужен весь код, используемый для создания контракта, который я не думаю, что у меня был бы гипотетически. (Я буквально просто следую примеру «приветствия»)
Похоже, адрес контракта должен быть достаточно.
Вы правы, было бы лучше, если бы ABI можно было получить, просто просмотрев контракт.
Так почему же составители контрактов должны также предоставлять ABI в дополнение к адресу контракта?
Одна из причин заключается в том, что идентификаторы методов функций в контракте вычисляются с использованием хэш-функции. Таким образом, для инструмента невозможно просмотреть байт-код контракта и извлечь имена функций/методов внутри этого контракта. (Инструменту придется угадывать имена функций, хешировать их и смотреть, совпадают ли первые 4 байта с идентификатором метода — слишком много возможных имен функций.)
Вам не нужен исходный код, только ABI. ABI создается при компиляции кода, но может распространяться и обычно распространяется отдельно.
По сути, ABI — это просто список имен функций в контракте и типов аргументов, которые они принимают. Вам даже не нужен весь ABI, только те части, с которыми вы хотите взаимодействовать. Например, чтобы сгенерировать ABI для функции greeter
контракта greet
, вы можете просто перекомпилировать этот контракт:
contract Greeter {
function greet() constant returns(string);
}
с помощью solc
или онлайн-компилятора . Найдите Interface
поле в онлайн-компиляторе. Это определение ABI.
Interface
находится поле в новом браузере Solidity ( ethereum.github.io/browser-solidity/… ) @Tjaden Hess♦Compile
вкладке и нажмите, чтобы получить details
контракт, который вы хотите. Затем вы должны увидеть ABI
раздел, щелкните значок копирования рядом с ним. @ДжонМерфи
ЗМиттон
эт