首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Solana:不能让createAccount起作用,createAccountWithSeed起作用

Solana:不能让createAccount起作用,createAccountWithSeed起作用
EN

Stack Overflow用户
提问于 2022-03-25 10:45:21
回答 1查看 485关注 0票数 1

我目前正在努力学习如何为Solana编写程序并与这些程序进行交互。

我正在使用例子-helloworld代码。为了与helloworld程序进行交互,nodejs代码创建了一个带有seed的帐户:

代码语言:javascript
运行
复制
const transaction = new Transaction().add(
    SystemProgram.createAccountWithSeed({
        fromPubkey: payer.publicKey,
        basePubkey: payer.publicKey,
        seed: GREETING_SEED,
        newAccountPubkey: greetedPubkey,
        lamports,
        space: GREETING_SIZE,
        programId,
    })
)
tx = client.send_transaction(transaction, payer)

我的理解是,它创建了一个数据帐户,由programId程序拥有。还不确定为什么有种子。

我试图用以下代码替换这段代码:

代码语言:javascript
运行
复制
const transaction = new Transaction().add(
    SystemProgram.createAccount({
        fromPubkey: payer.publicKey,
        newAccountPubkey: greetedPubkey,
        lamports,
        space: GREETING_SIZE,
        programId,
    })
)
tx = client.send_transaction(transaction, payer)

但这是行不通的。一旦事务发送,我将得到以下错误:

代码语言:javascript
运行
复制
{'code': -32602, 'message': 'invalid transaction: Transaction failed to sanitize accounts offsets correctly'}

有人能解释我做错了什么吗??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 18:12:56

使用createAccount创建帐户时,必须从该新帐户提供签名。所以在您的例子中,greetedPubkey必须是一个Keypair,就像payer一样。你可以:

代码语言:javascript
运行
复制
const greeted = Keypair.generate();
const transaction = new Transaction().add(
    SystemProgram.createAccount({
        fromPubkey: payer.publicKey,
        newAccountPubkey: greeted.publicKey,
        lamports,
        space: GREETING_SIZE,
        programId,
    })
);
tx = client.send_transaction(transaction, payer, greeted);

createAccountWithSeed是特殊的,因为它从基派生出一个新地址,这意味着您不需要用新地址签名,只需要用基地址签名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71615654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档