они там типы преобразуют. Например есть JSON RPC запрос eth_getLogs
Там в ответе массив объектов, у которого int поля в виде hex строк, например 'logIndex': '0x49'
И w3.eth.get_logs() дает ответ в виде class LogEntry(TypedDict) с полем logIndex: int
И я не могу найти где произошла магия преобразования из hex строки logIndex="0x49", в нормальный int. И такое не только по eth_getLogs запросу, а по очень многим json rpc запросам.
Вообще у меня задача такая: я хотел бы использовать типы из библиотеке web3py, которые лежат в модуле types. Но с json rpc серверами я работаю сам, и я хотел бы этот json ответ автоматически конвертировать в types.* классы библиотеки, как types.LogEntry и т.п. А не для каждого писать преобразователь типов.
Может быть кто-то вникал как работает web3py и может подсказать, где именно происходит трансформация json ответа в правильные TypedDict классы? Где-то есть один универсальный метод, который берет json ответ и на выходе по определению TypeDict класса делает все необходимые трансформации как, наприvер hex str -> int для всех нужных полей.
И как можно автоматом на питоне преобразовать строки где числа в виде строк в hex в формате в инты? Вот пример лога, json ответ: data = {'address': '0xdac17f958d2ee523a2206206994597c13d831ec7', 'blockHash': '0x9dc915cbbd9a6e66f843870934af26d2fc8a2600a6f9c442ee4518453df25977', 'blockNumber': '0x1137e53', 'data': '0x0000000000000000000000000000000000000000000000000000000039a6c230', 'logIndex': '0xe', 'removed': False, 'topics': ['0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x000000000000000000000000d1b40cbaffa93347a5164d6ffdc3af2885fe097a', '0x00000000000000000000000071626b6e2e2c5e281ce4c7912e0d3131cba17398'], 'transactionHash': '0x1ebd3748ed458d40b1d50ca62f2f83e2b89b0f7aa0486b6572bfdde35faff042', 'transactionIndex': '0x4'} class Log(TypedDict): blockHash: str blockNumber: int logIndex: int -- вот частично описаный класс. И если сделать просто log=Log(**data), то не получится log["logIndex"] в виде int, а будет по прежнему строка.
в web3py есть отдельные методы конвертации https://web3py.readthedocs.io/en/stable/web3.main.html#encoding-and-decoding-helpers А какой тип выбрать. решается на основе abi контракта
Обсуждают сегодня