Невозможно проверить подписанное сообщение TronLink / TronWeb.js в Python

Я подписываю сообщение с помощью TronLink/TronWeb.js, но не могу проверить его в Python

Библиотека Python Я использую https://github.com/iexbase/tron-api-python/

Код Javascript для подписи сообщения:

const original_message = "557e3517549cf8ed47d8b205654ea2a7"
const signedtxn = await tronWeb.trx.sign(original_message);
// result 0x862e16c28684bed7162e9a1dd34962882d887610de6c775054ffbad989baec65707b2ba898366c02e9f20730bc2daf54bb7e6d33d77c64f8930f8c9365f5993a1b

Код Python для проверки подписанного сообщения

from tronapi import Tron
from hexbytes import HexBytes

tron = Tron()

class signed_message:
     # signedtxn variable in javascript
    signature = HexBytes('0x862e16c28684bed7162e9a1dd34962882d887610de6c775054ffbad989baec65707b2ba898366c02e9f20730bc2daf54bb7e6d33d77c64f8930f8c9365f5993a1b')

original_message = "557e3517549cf8ed47d8b205654ea2a7"
address = "<!-- Tron Base58 Address in TronLink/TronWeb -->"
tron.trx.verify_message(original_message, signed_message, address=address)

Я получаю эту ошибку в python

ValueError: Signature does not match

Я могу проверить сообщение в TronWeb.js, но не могу в Python

2 ответа

Вы можете использовать tronpy (да, я автор tronpy.)

PublicKey.verify_msg

последний байт вашей подписи должен быть 0x01 или же 0x00, который отличается от ETH.

Вы можете использовать web3=6.9.0

      from eth_typing import ChecksumAddress, Hash32

from typing import cast

from eth_utils.curried import keccak, to_bytes

from eth_account.messages import SignableMessage

from web3.auto import w3

def tron_recover_message(signature: bytes = None, text: str = None) -> ChecksumAddress:

    """
    :param signature 0x862e16c28684bed7162e9a1dd34962882d887610de6c775054ffbad989baec65707b2ba898366c02e9f20730bc2daf54bb7e6d33d77c64f8930f8c9365f5993a1b
    :param text sign message
    """

    try:

        signature = hex(int(signature, 16) - 27)

        message_bytes = to_bytes(primitive=None, hexstr=None, text=text)

        signable_message = SignableMessage(
            b"E",
            b"TRON Signed Message:\n32",
            message_bytes,
        )

        message_hash = Hash32(keccak(b"\x19" + signable_message.header + signable_message.body))

        return cast(ChecksumAddress, w3.eth.account._recover_hash(message_hash, None, signature))

    except Exception as e:
        print("error")

Другие вопросы по тегам