遇到问题尝试使用 Solana-py 创建程序派生地址 (PDA):“没有足够的值来解压(预期 2,得到 1)”

Posted

技术标签:

【中文标题】遇到问题尝试使用 Solana-py 创建程序派生地址 (PDA):“没有足够的值来解压(预期 2,得到 1)”【英文标题】:Falling into issues Trying to Create a Program Derived Address (PDA) with Solana-py: "not enough values to unpack (expected 2, got 1)" 【发布时间】:2022-01-24 03:45:24 【问题描述】:
    params = system_program.CreateAccountWithSeedParams(
    base_pubkey = keypair.public_key,
    from_pubkey = keypair.public_key,
    lamports = 200,
    new_account_pubkey = greeted,
    program_id = program_id,
    seed = 'hello',
    space = 8
)

我正在获取输出

CreateAccountWithSeedParams(from_pubkey = 2ASw3tjK5bSxQxFEMsM6J3DnBozNh7drVErSwc7AtzJv,new_account_pubkey = BkuEamVXuHugbAAVurExanW1FGAejsEAa7hECYsP1j6o,base_pubkey = 2ASw3tjK5bSxQxFEMsM6J3DnBozNh7drVErSwc7AtzJv,种子= '你好',lamports = 200,空间= 8,program_id = TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) P>

当我使用时问题就来了

transaction_Params = system_program.create_account_with_seed(params)

我得到了一大堆错误,长话短说:没有足够的值来解包(预期 2,得到 1)

全文:

任何帮助都会得到更多的珍惜和赞赏,但也会得到大量的感谢欢呼 ????????????

【问题讨论】:

欢迎来到 SO,不要使用截图来分享代码或回溯——这对人们来说很难阅读。 【参考方案1】:

看起来seed 提供的实际上应该是一个直接序列化为 Rust 字符串的 dict。这是一个测试:https://github.com/michaelhly/solana-py/blob/b507d4dfe16cdaccc754b1f2bac5ed9e258ea039/tests/unit/test_system_program.py#L64

另外,如果您尝试创建程序派生地址,您实际上需要在程序中使用invoke_signed 在程序中创建它。从外部创建程序派生地址是不可能的,因为您需要程序为程序派生地址“签名”。查看https://solanacookbook.com/recipes/accounts.html#program-derived-address 和https://solanacookbook.com/recipes/accounts.html#create-account-with-seed 之间的区别

【讨论】:

在这种情况下,为什么我要求 find_program_address 与我在 params 中使用的种子相同,在这种情况下,我将生成一个不在 ed25519 曲线上的地址,我只是看起来像一个PDA。顺便说一句,种子格式作为字典工作,谢谢,我不知道如何使种子在 find_program_address 和 create_account_with_seed 之间保持一致,因为我们输入的是字典与字节数组 抱歉,不是很清楚。您可以在客户端代码中离线生成 地址,但如果您想在该地址创建一个帐户,则需要传入种子,以便运行时可以验证程序 -派生地址。老实说,完全不用担心create_account_with_seed,很少有情况需要它。 好的,谢谢。非常感谢。

以上是关于遇到问题尝试使用 Solana-py 创建程序派生地址 (PDA):“没有足够的值来解压(预期 2,得到 1)”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel DB 查询中使用派生列

根据参数创建派生类的新实例

使用 MPI 派生数据类型创建和通信“结构数组”

如何从现有的基类对象创建派生类对象?

如何在派生类中可移植地初始化继承的模板化 POD 结构?

C++如何使用派生类构造函数销毁基类中的对象