подписи yubihsm2 недействительны при подписании транзакций ETH
Я пытаюсь понять, как заставить этот yubihsm2 работать с подписанием транзакций eth. Я использовал библиотеку python, и до сих пор у меня были некоторые базовые настройки. Ниже приведена аббревиатура того, что у меня есть
web3_endpoint = ''
web3 = Web3(HTTPProvider(web3_endpoint))
hsm = YubiHsm.connect("http://localhost:12345")
session = hsm.create_session_derived(1, "password")
key = session.get_object(1,OBJECT.ASYMMETRIC_KEY)
#key = AsymmetricKey.generate(session, 1, "EC Key", 1, CAPABILITY.SIGN_ECDSA, ALGORITHM.EC_K256)
pub_key = key.get_public_key()
#raw_pub = pub_key.public_bytes(
# encoding=serialization.Encoding.DER,
# format=serialization.PublicFormat.SubjectPublicKeyInfo
# )
raw_pub = pub_key.public_bytes(
encoding=serialization.Encoding.X962,
format=serialization.PublicFormat.UncompressedPoint
)
print ("Public key (Uncompressed):\n",binascii.b2a_hex(raw_pub))
unindexPub = raw_pub[1:]
public_key_hash = Web3.keccak(unindexPub)
address_bytes = public_key_hash[-20:]
address = address_bytes.hex()
print(address)
Теперь я могу постоянно получать один и тот же открытый ключ, и он выглядит правильно. Затем я каждый раз получаю один и тот же открытый ключ. Когда я говорю правильно, форматирование выглядит правильно и имеет правильное количество байтов.
1). должен ли я использовать закомментированное форматирование открытого ключа или несжатую кодировку X962, которую я указал выше.
Отсюда все становится немного странным
transaction = {
'to': Web3.toChecksumAddress('0x785AB1daE1b0Ee3f2412aCF55e4153A9517b07e1'),
'gas': 21000,
'gasPrice': Web3.toWei(5, 'gwei'),
'value': 1,
'nonce': 1,
'chainId': 4,
}
serializable_transaction = serializable_unsigned_transaction_from_dict(transaction)
transaction_hash = serializable_transaction.hash()
print(transaction_hash.hex())
# sign the transaction hash and calculate v value
signature = key.sign_ecdsa(transaction_hash,hashes.SHA3_256())
r, s = ecdsa.util.sigdecode_der(signature, ecdsa.SECP256k1.generator.order())
print("r: "+str(r)+"\ns: "+str(s))
v = 28
# encode the transaction along with the full signature and send it
encoded_transaction = encode_transaction(serializable_transaction, vrs=(v, r, s))
web3.eth.sendRawTransaction(encoded_transaction)
Я устанавливаю v на 28.. Я также тестирую его с 27.. Я мог бы использовать правильную сумму с chainid.. но это не обязательно с точки зрения попытки получить действительную подпись (можно восстановить, чтобы получить тот же открытый ключ каждый раз). Иногда я получаю сообщение об ошибке «неверный отправитель», а иногда — «недостаточно газа». Если я возьму вывод подписи и использую библиотеку javascript, чтобы попытаться найти открытый ключ, каждый раз, когда я получаю другой открытый ключ. Но я постоянно генерирую один и тот же открытый ключ из yubihsm2 в этом приложении Python.
Я также прокомментировал в sign_ecdsa функцию хеширования, поскольку я передаю уже хешированные данные (чтобы использовать keccak256).
Есть ли что-то, что я упускаю? Почему эти транзакции неправильно подписываются для eth?
я получаю некоторые из этих помощников по сериализации, вводя здесь описание ссылок,вспомогательные функции сериализации
Спасибо