如何在 borsh-python 中将“Pubkey”作为预期模式传递给预期模式?

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

我正在尝试反序列化以下十六进制字符串:

“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?

python deserialization solana borsh
1个回答
0
投票

看起来这个问题不再相关了,但是对于那些感兴趣的人来说,这是答案,因为我自己为此奋斗了很长时间!

对于公钥,只需使用 u8 类型和 32 字节长度的固定数组:

borsh.types.fixed_array(_type=borsh.types.u8, length=32)
© www.soinside.com 2019 - 2024. All rights reserved.