Функция, которую нужно вызвать, называется xyz()
.
Мой код:
web3.sha3("xyz()").substr(0,10)
Ошибка:
AttributeError: модуль «web3» не имеет атрибута «sha3»
В более новых версиях web3 возникает вышеуказанная ошибка. Что еще можно использовать для получения шестнадцатеричного эквивалента имени функции?
Источник кода: как узнать шестнадцатеричный код для использования в данных для вызова конкретной функции контракта? (решение не работает в новых версиях web3)
Шестнадцатеричный эквивалент метода называется селектором функций .
Селектор функции — это первые 4 байта хеша Keccak сигнатуры функции , аргументы упакованы как строковые типы.
Вы можете получить это:
>>> from web3 import Web3
>>> Web3.keccak(text="xyz()")
HexBytes('0x356bc81e51224d094b17ccb8f80b1e659fe334bcf15c6240857cce0568cbb0ba')
>>> hex_bytes = Web3.keccak(text="xyz()")
>>> print(hex_bytes[0:4].hex())
0x356bc81e
вы ищете это:
encodeFunctionSignature
web3.eth.abi.encodeFunctionSignature(functionName);
Кодирует имя функции в ее сигнатуру ABI, которая представляет собой первые 4 байта хэша sha3 имени функции, включая типы.
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-abi.html
В python должен существовать эквивалентный вызов
Нулик
signature
, в исходниках он называется сигнатурным, а в солидности называется селекторомМикко Отамаа