Как я могу получить шестнадцатеричный эквивалент имени метода в контракте Ethereum с помощью Python?

Функция, которую нужно вызвать, называется xyz().

Мой код:

web3.sha3("xyz()").substr(0,10)

Ошибка:

AttributeError: модуль «web3» не имеет атрибута «sha3»

В более новых версиях web3 возникает вышеуказанная ошибка. Что еще можно использовать для получения шестнадцатеричного эквивалента имени функции?

Источник кода: как узнать шестнадцатеричный код для использования в данных для вызова конкретной функции контракта? (решение не работает в новых версиях web3)

Ответы (2)

Шестнадцатеричный эквивалент метода называется селектором функций .

Селектор функции — это первые 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
его еще называют signature, в исходниках он называется сигнатурным, а в солидности называется селектором
Спасибо @Нулик. Я полагал, что селектор относится к 4-байтовому идентификатору Solidity, тогда как сигнатура функции является общей концепцией языка программирования.

вы ищете это:

encodeFunctionSignature

web3.eth.abi.encodeFunctionSignature(functionName);

Кодирует имя функции в ее сигнатуру ABI, которая представляет собой первые 4 байта хэша sha3 имени функции, включая типы.

https://web3js.readthedocs.io/en/v1.2.11/web3-eth-abi.html

В python должен существовать эквивалентный вызов

Я давно ищу аналог, но так и не нашел, вы случайно его не знаете?