eth_keys如何获取字符串公共密钥,以便可以将其放入JSON

问题描述 投票:0回答:1

我有一个可以正常使用的私钥-公钥签名:

print(signature.verify_msg(bytes(transaction_hash.hexdigest().encode('utf-8')), first_wallet['public_key']))

verify_signature:0xf9671943931afb93e1613eb5d73a77ed961653f70562884709d45ffa774fa7f756b7e8b8a4bd11ffe71448eedddfc10e7dbcd4b069477c7665e6a978347b6e42

真实

但是我需要对公共密钥进行json序列化,以便节点可以进行验证,我尝试了很多事情。第一个错误是:

TypeError:类型为'PublicKey'的对象不可JSON序列化

然后,如果我使用first_wallet['public_key'].to_hex()对其进行序列化,则当节点使用该公钥来验证我收到的消息时:

eth_keys.exceptions.ValidationError:意外的未压缩公共密钥长度:预期为64,但获得了130个字节

python public-key-encryption eth-keys
1个回答
0
投票

您能否将其序列化为字节,它可能正在读取十六进制的长度。我在下面有几个可以json序列化的示例,服务器可能除外。不知道另一端与您连接的是哪个库,我决定展示一些示例。

In [587]: bytes.fromhex(hex(first_wallet['public_key'])[2:])                                                                                                  
Out[587]: b'\xf9g\x19C\x93\x1a\xfb\x93\xe1a>\xb5\xd7:w\xed\x96\x16S\xf7\x05b\x88G\t\xd4_\xfawO\xa7\xf7V\xb7\xe8\xb8\xa4\xbd\x11\xff\xe7\x14H\xee\xdd\xdf\xc1\x0e}\xbc\xd4\xb0iG|ve\xe6\xa9x4{nB'



In [572]: len('0xf9671943931afb93e1613eb5d73a77ed961653f70562884709d45ffa774fa7f756b7e8b8a4bd11ffe71448eedddfc10e7dbcd4b069477c7665e6a978347b6e42')           
Out[572]: 130

In [573]: len(b'\xf9g\x19C\x93\x1a\xfb\x93\xe1a>\xb5\xd7:w\xed\x96\x16S\xf7\x05b\x88G\t\xd4_\xfawO\xa7\xf7V\xb7\xe8\xb8\xa4\xbd\x11\xff\xe7\x14H\xee\xdd\xdf\xc1\x0e}\xbc\xd4\xb0iG|ve\xe6\xa9x4{nB')                                                                                                                 
Out[573]: 64
encoded = base64.encodebytes( b'\xf9g\x19C\x93\x1a\xfb\x93\xe1a>\xb5\xd7:w\xed\x96\x16S\xf7\x05b\x88G\t\xd4_\xfawO\xa7\xf7V\xb7\xe8\xb8\xa4\xbd\x11\xff\xe7\x14H\xee\xdd\xdf\xc1\x0e}\xbc\xd4\xb0iG|ve\xe6\xa9x4{nB')  

encoded                                                                                                                                               
b'+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl\n5ql4NHtuQg==\n'

encoded.decode('ascii')                                                                                                                               
'+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl\n5ql4NHtuQg==\n'

In [12]: json.dumps('+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl\n5ql4NHtuQg==\n')                                           
Out[12]: '"+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl\\n5ql4NHtuQg==\\n"'

base64.b64encode(b'\xf9g\x19C\x93\x1a\xfb\x93\xe1a>\xb5\xd7:w\xed\x96\x16S\xf7\x05b\x88G\t\xd4_\xfawO\xa7\xf7V\xb7\xe8\xb8\xa4\xbd\x11\xff\xe7\x14H\x
    ...: ee\xdd\xdf\xc1\x0e}\xbc\xd4\xb0iG|ve\xe6\xa9x4{nB')
b'+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl5ql4NHtuQg=='

json.dumps(b'+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl5ql4NHtuQg==') 


In [22]: json.dumps('+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl5ql4NHtuQg==')                                               
Out[22]: '"+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl5ql4NHtuQg=="'

In [24]: base64.b64decode('"+WcZQ5Ma+5PhYT611zp37ZYWU/cFYohHCdRf+ndPp/dWt+i4pL0R/+cUSO7d38EOfbzUsGlHfHZl5ql4NHtuQg=="')                                       
Out[24]: b'\xf9g\x19C\x93\x1a\xfb\x93\xe1a>\xb5\xd7:w\xed\x96\x16S\xf7\x05b\x88G\t\xd4_\xfawO\xa7\xf7V\xb7\xe8\xb8\xa4\xbd\x11\xff\xe7\x14H\xee\xdd\xdf\xc1\x0e}\xbc\xd4\xb0iG|ve\xe6\xa9x4{nB'
© www.soinside.com 2019 - 2024. All rights reserved.