我有一个可以正常使用的私钥-公钥签名:
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个字节
您能否将其序列化为字节,它可能正在读取十六进制的长度。我在下面有几个可以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'