Что такое ABI и почему необходимо взаимодействовать с контрактами?

ABI упоминается во многих местах, включая официальный веб-сайт Ethereum. Что такое ABI и почему это необходимо использовать?

72 голоса | спросил Taylor Gerring 21 Jpm1000000pmThu, 21 Jan 2016 14:49:05 +030016 2016, 14:49:05

6 ответов


58

ABI означает двоичный интерфейс .

В общем, ABI - это интерфейс между двумя программными модулями, один из которых часто находится на уровне машинного кода. Интерфейс является де-факто методом кодирования /декодирования данных в /из машинного кода.

В Ethereum, в основном, вы можете кодировать контракты Solidity для EVM и, наоборот, читать данные из транзакций.

ответил Afri 21 Jpm1000000pmThu, 21 Jan 2016 14:54:42 +030016 2016, 14:54:42
67

ABI, Application Binary Interface, в основном, как вы вызываете функции в контракте и получаете данные назад .

  

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

Этнический смарт-контракт - это байт-код, развернутый в блок-цепочке Ethereum. В контракте может быть несколько функций. ABI необходим, чтобы вы могли указать, какую функцию в контракте вызывать, а также получить гарантию того, что функция вернет данные в ожидаемом формате.

Из спецификация ABI Ethereum , пример:

contract Foo {
  function bar(real[2] xy) {}
  function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }
  function sam(bytes name, bool z, uint[] data) {}
}

Если бы мы хотели вызвать baz с параметрами 69 и true, мы бы пропустили всего 68 байтов, которые можно разбить на:

  

0xcdcd77c0: идентификатор метода. Это выводится как первые 4 байта   Кеш-256-хэш формы ASCII подписи baz (uint32, bool).   0x0000000000000000000000000000000000000000000000000000000000000045:   первый параметр, значение uint32 69, заполненное до 32 байтов   0x0000000000000000000000000000000000000000000000000000000000000001:   второй параметр - логическое значение true, дополненное 32 байтами

68 байтов - это то, что было бы указано в поле data транзакции: примечание о безопасности на . (Чтобы подвести итог, будьте осторожны, что вы помещаете в поле данных, потому что при передаче его в вызывающий контракт могут быть непреднамеренные, возможно, вредоносные побочные эффекты.)

Чтобы избежать общей ошибки при определении идентификатора метода, необходимо использовать канонические типы, например uint256 вместо uint .

Вот пример в Solidity для вычисления идентификатора метода для sam выше:

bytes4(keccak256("sam(bytes,bool,uint256[])")

Использование библиотеки более высокого уровня, такой как web3.js, абстрагирует большинство этих деталей, но ABI в формате JSON по-прежнему необходимо предоставить web3.js.

Примечание. ABI - это абстракция, которая не является частью основного протокола Ethereum . Любой может определить свой собственный ABI для своих контрактов, и любые абоненты таких контрактов должны будут соответствовать этому ABI, чтобы получить значимые результаты. Тем не менее, все разработчики проще использовать Solidity, Serpent и web3.js, которые соответствуют ABI выше.

ответил eth 9 FebruaryEurope/MoscowbTue, 09 Feb 2016 00:01:32 +0300000000amTue, 09 Feb 2016 00:01:32 +030016 2016, 00:01:32
11

Контрактное определение : формальное определение в высокоуровневом коде (например, твердость).

Скомпилированный контракт . Контракт, преобразованный в байт-код для работы на виртуальной машине Ethereum (EVM), придерживаясь спецификация . Обратите внимание, что имена функций и входные параметры хэшируются во время компиляции. Поэтому для другой учетной записи, чтобы вызвать функцию, ей сначала нужно дать имя funtion и аргументы - следовательно, ABI:

Бинарный интерфейс приложения - ABI: Список функций и аргументов контракта (в формате JSON 1 ). Учетная запись, желающая использовать функцию интеллектуального контракта, использует ABI для хеширования определения функции, чтобы она могла создавать байт-код EVM, необходимый для вызова функции. Затем он включается в поле данных, T d , транзакции и интерпретируется EVM с кодом на целевой учетной записи (адрес контракта).


1 Использование JSON является стандартом de facto ; это не в формальной спецификации, но изменение этого приведет к необходимости изменения многих инструментов.

ответил atomh33ls 2 FriEurope/Moscow2016-12-02T14:18:51+03:00Europe/Moscow12bEurope/MoscowFri, 02 Dec 2016 14:18:51 +0300 2016, 14:18:51
7

подумайте о «ABI» как о «API» на низком уровне.

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

дополнительная информация "из официального документа"

  

Бинарный интерфейс приложения (ABI) предназначен для использования как de   факто-метод для кодирования & декодирование данных в & из транзакций

.

  

Мы утверждаем, что все контракты будут иметь определения интерфейса   любые контракты, которые они называют доступными во время компиляции.

ответил Badr Bellaj 9 +03002016-10-09T17:49:35+03:00312016bEurope/MoscowSun, 09 Oct 2016 17:49:35 +0300 2016, 17:49:35
3

Мне было очень трудно понять часть этого вопроса why , поэтому я хотел бы добавить одну вещь благодаря этот отличный ответ :

«Как эти байты интерпретируются в структурированные данные, зависит от программы и, следовательно, вплоть до используемого языка программирования. Чтобы две программы, написанные на разных языках программирования, вызывали друг друга, составители таких языков должен реализовывать сериализацию и десериализацию данных таким же образом, то есть они должны реализовывать спецификацию ABI, но им этого не нужно. "

tl; dr контракт, написанный в Solidity, может взаимодействовать с контрактом, написанным в Viper или Bamboo, потому что все они реализуют и придерживаются спецификации ABI.

ответил user1234 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 29 Sep 2017 18:56:55 +0300 2017, 18:56:55
1

Просто скопируйте этот json. Это контракт ABI введите описание изображения здесь

ответил Трипольский Пётр 16 PM000000110000002931 2017, 23:39:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132