Нужен ли ABI для вызова смарт-контракта ropstend?

У меня есть только адрес смарт-контракта ropsten, поэтому я пытаюсь получить его через web3.js с помощью:

window.web3.eth.Contract(abi, address)

но я вижу в документации, что он получает два параметра, у меня нет abi, так ли это необходимо? я вижу, в старой версии нам просто нужен был адрес.

I'm using "web3": "^1.3.4"

Спасибо

Ответы (1)

Краткий ответ: вам нужен ABI, чтобы вызвать контракт.

Давайте немного поговорим о том, как его получить, а затем поговорим об одном способе, которым вы все равно сможете взаимодействовать с контрактом, если у вас его нет (написав свой собственный для той части контракта, с которой вам нужно взаимодействовать). ).

1) Этерскан

В Etherscan есть так называемые проверенные контракты. Вы можете проверить, подтвержден ли контракт, с которым вы хотите взаимодействовать, зайдя на сайт Ropsten Etherscan и указав в контракте свой адрес. Прокрутите немного вниз страницу Etherscan для контракта, и там должна быть вкладка «Контракт». Если на нем зеленый кружок с галочкой, это проверенный контракт. Нажмите на вкладку «Контракт», и если вы прокрутите вниз, вы увидите возможность скопировать ABI в буфер обмена.

(Один небольшой совет: если вы взаимодействуете с контрактом на токен, Etherscan часто имеет две отдельные страницы, одну для токена, а другую для контракта. Если вы попадаете на страницу токена и не можете найти, проверен ли контракт, справа вверху должна быть возможность перейти на страницу контракта, что иногда помогает.)

2) сделай сам

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

Трюфель:

truffle compile

Артефакты будут размещены build/contracts— вы увидите JSON с именем контракта (как определено внутри контракта, а не с именем файла).

Каска:

npx hardhat compile

Артефакты будут помещены в artifacts/.

примечание (и Truffle, и Hardhat): возможно, вам придется выбрать abiполе JSON — фактический JSON содержит больше, чем ABI.

Вы также можете использовать solcкомпилятор для компиляции ABI, но гораздо сложнее заставить его работать с правильной версией.

Если контракт, с которым вы взаимодействуете, заключен с крупным разработчиком, вы, вероятно, также можете получить его, обратившись к их каналам связи.

3) Что делать, если я полностью не могу получить ABI?

Правда в том, как указал Мортен в комментариях, что до сих пор мы говорили о получении всего ABI. Вам может не понадобиться весь ABI, на самом деле, есть очень большая вероятность, что вам это не нужно. Если вы взаимодействуете только с некоторыми функциями контракта, вам нужен только ABI, у которого есть эти функции, и вы можете игнорировать остальные. Это означает, что если вы знаете имя, аргументы и параметры функции, у вас есть решение: напишите свой собственный ABI!

Приведем пример. Стандарт ERC20 имеет функцию под названием transfer:

function transfer(address _to, uint256 _value) public returns (bool success)

Используя стандарт ABI JSON, мы можем выяснить, как создать объект ABI для вызова transferпо контракту ERC20 (который следует стандарту), даже если у нас нет ABI. Это будет выглядеть примерно так:

[
  {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
]

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

Вам не нужен полный JSON ABI для взаимодействия с контрактом. Если вы знаете имя и типы параметров функции, которую хотите вызвать, вы можете использовать ее для кодирования данных транзакции.
Правда @Morten, не подумал об этом, когда писал ответ. Я обновлю ответ.