У меня есть только адрес смарт-контракта ropsten, поэтому я пытаюсь получить его через web3.js с помощью:
window.web3.eth.Contract(abi, address)
но я вижу в документации, что он получает два параметра, у меня нет abi, так ли это необходимо? я вижу, в старой версии нам просто нужен был адрес.
I'm using "web3": "^1.3.4"
Спасибо
Краткий ответ: вам нужен ABI, чтобы вызвать контракт.
Давайте немного поговорим о том, как его получить, а затем поговорим об одном способе, которым вы все равно сможете взаимодействовать с контрактом, если у вас его нет (написав свой собственный для той части контракта, с которой вам нужно взаимодействовать). ).
В Etherscan есть так называемые проверенные контракты. Вы можете проверить, подтвержден ли контракт, с которым вы хотите взаимодействовать, зайдя на сайт Ropsten Etherscan и указав в контракте свой адрес. Прокрутите немного вниз страницу Etherscan для контракта, и там должна быть вкладка «Контракт». Если на нем зеленый кружок с галочкой, это проверенный контракт. Нажмите на вкладку «Контракт», и если вы прокрутите вниз, вы увидите возможность скопировать ABI в буфер обмена.
(Один небольшой совет: если вы взаимодействуете с контрактом на токен, Etherscan часто имеет две отдельные страницы, одну для токена, а другую для контракта. Если вы попадаете на страницу токена и не можете найти, проверен ли контракт, справа вверху должна быть возможность перейти на страницу контракта, что иногда помогает.)
Если у вас есть работающая среда Truffle, Hardhat или аналогичная, а также доступ к исходному коду контракта, с которым вы хотите взаимодействовать, вы можете скомпилировать ABI самостоятельно.
Трюфель:
truffle compile
Артефакты будут размещены build/contracts
— вы увидите JSON с именем контракта (как определено внутри контракта, а не с именем файла).
Каска:
npx hardhat compile
Артефакты будут помещены в artifacts/
.
примечание (и Truffle, и Hardhat): возможно, вам придется выбрать abi
поле JSON — фактический JSON содержит больше, чем ABI.
Вы также можете использовать solc
компилятор для компиляции 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 для функций, с которыми вы знакомы.
Мортен
Линум Лабс