我正在尝试反序列化以下十六进制字符串:
“e445a52e51cb9a1dbddb7fd34ee661eecf5078301148ff160d7d39c2eb39bd8a653 36260014e92375510898fccc8b08f00d2496b000000005b49b52a3d3700000118fd431 8e5c5d0ebafd594a987aa6bd95ced29e4b785c4ef9de66783fc08cdc54a1a65660000 0000007e6d6707000000a5c6221da698030000d2496b00000000a52e10d1149a0200“
我的方法是使用Python的borsh库(https://pypi.org/project/borsh-python/),效果很好。但是,我面临的一个问题是我不知道如何将“Pubkey”作为预期模式中的预期类型传递。
这是我当前尝试反序列化以下十六进制字符串的代码:
“e445a52e51cb9a1dbddb7fd34ee661eecf5078301148ff160d7d39c2eb39bd8a653 36260014e92375510898fccc8b08f00d2496b000000005b49b52a3d3700000118fd431 8e5c5d0ebafd594a987aa6bd95ced29e4b785c4ef9de66783fc08cdc54a1a65660000 0000007e6d6707000000a5c6221da698030000d2496b00000000a52e10d1149a0200“
import borsh
from borsh import types
from solders.pubkey import Pubkey
# Define the schema for the dictionary
example_dict_schema = borsh.schema({
'idk': types.u64,
'mint': Pubkey,
'solAmount': types.u64,
'tokenAmount': types.u64,
'isBuy': types.u8,
'user': Pubkey,
'timestamp': types.i64,
'virtualSolReserves': types.u64,
'virtualTokenReserves': types.u64
})
serialized_bytes = bytes.fromhex('e445a52e51cb9a1dbddb7fd34ee661eecf5078301148ff160d7d39c2eb39bd8a65336260014e92375510898fccc8b08f00d2496b000000005b49b52a3d3700000118fd4318e5c5d0ebafd594a987aa6bd95ced29e4b785c4ef9de66783fc08cdc54a1a656600000000007e6d6707000000a5c6221da698030000d2496b00000000a52e10d1149a0200')
deserialized_data = borsh.deserialize(example_dict_schema, serialized_bytes)
print(deserialized_data)
我的主要问题是:
TypeError: value '<class 'solders.pubkey.Pubkey'>' is not a valid Borsh type.
我知道 Pubkey 是有效的 Borsh 类型,但不知道如何告诉 borsh 适当地处理“publicKey”和“user”字段。
这是预期的输出:
{
"mint": {
"type": "publicKey",
"data": "ExGZYPhHkhQ4jCbYPicCZz89tEmtVKiS6j9MhSqypump"
},
"solAmount": {
"type": "u64",
"data": "1800000000"
},
"tokenAmount": {
"type": "u64",
"data": "60735849056603"
},
"isBuy": {
"type": "bool",
"data": true
},
"user": {
"type": "publicKey",
"data": "2gYmikFDQno2o7shxA6CgDF5AVM6Px6DpHRNc6RNMiDS"
},
"timestamp": {
"type": "i64",
"data": "1717901898"
},
"virtualSolReserves": {
"type": "u64",
"data": "31800000000"
},
"virtualTokenReserves": {
"type": "u64",
"data": "1012264150943397"
}
}
实际输出
TypeError: value '<class 'solders.pubkey.Pubkey'>' is not a valid Borsh type
这显然不是我想要的。我是否应该使用另一种类型值,而不是简单地输入“Pubkey”?以下是 borsh 接受类型的列表(https://borsh.io/ - 在规范选项卡下)。
或者
我应该尝试手动构造一个新的 borsh 类型吗?如果是这种情况,我将如何创建新的 borsh 类型的 Pubkey?
看起来这个问题不再相关了,但是对于那些感兴趣的人来说,这是答案,因为我自己为此奋斗了很长时间!
对于公钥,只需使用 u8 类型和 32 字节长度的固定数组:
borsh.types.fixed_array(_type=borsh.types.u8, length=32)