Нужен ли мне скомпилированный контракт только для того, чтобы получить определение ABI?

Зачем мне нужна скомпилированная версия контракта только для того, чтобы получить определение ABI? Похоже, адрес контракта должен быть достаточно.

Я очень смущен, потому что я просто пытаюсь запустить контракт, предполагая, что он был сделан на другом компьютере. Похоже, сначала мне нужен весь код, используемый для создания контракта, который я не думаю, что у меня был бы гипотетически. (Я буквально просто следую примеру «приветствия»)

Ответы (2)

Похоже, адрес контракта должен быть достаточно.

Вы правы, было бы лучше, если бы 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♦
@Alper, тебе удалось найти, как получить ABI контракта из текущей версии ремикса?
Да, сэр, на Compileвкладке и нажмите, чтобы получить detailsконтракт, который вы хотите. Затем вы должны увидеть ABIраздел, щелкните значок копирования рядом с ним. @ДжонМерфи