![](/img/trans.png)
[英]How to get data from the programs posted/deployed on Solana blockchain?
[英]How to withdraw sol/lamports from PDA in solana
我将 SOL/Lamports 转移到 PDA 帐户,但无法从 PDA 取回 SOL。
将 SOL 传输到 PDA
我从下面给定的代码生成 PDA 帐户。
const GREETING_SEED = 'Hello';
greetedPubkey = await PublicKey.createWithSeed(
payer.publicKey,
GREETING_SEED,
programId,
);
const transaction = new Transaction().add(
SystemProgram.createAccountWithSeed({
fromPubkey: payer.publicKey,
basePubkey: payer.publicKey,
seed: GREETING_SEED,
newAccountPubkey: greetedPubkey,
lamports,
space: GREETING_SIZE,
programId,
}),
);
await sendAndConfirmTransaction(connection, transaction, [payer]);
使用以下代码片段进行 Sol 交易:
transaction.add(
SystemProgram.transfer({
fromPubkey:toaccount.publicKey,
toPubkey: greetedPubkey,
lamports: LAMPORTS_PER_SOL/100,
programId: programId,
}),
);
const signature=await sendAndConfirmTransaction(connection, transaction, [toaccount]);
上面的代码工作正常。
从 PDA 中提取 SOL
但是我无法从 PDA 帐户中提取 SOL。
transaction.add(
SystemProgram.transfer({
fromPubkey: greetedPubKey,
toPubkey: toaccount.publicKey,
lamports: LAMPORTS_PER_SOL/100,
programId: programId,
}),
);
const signature=await sendAndConfirmTransaction(connection, transaction, [greetedPubKey]);
我尽一切努力去做。 但无法使用 PDA 地址签署交易。 如果我犯了任何错误,还有其他方法或点吗
分配给程序的帐户,如greetedPubkey
是在执行createAccountWithSeed
之后,只能由程序本身更改其数据或扣除 lamports。 这是文档的摘录:
创建的帐户被初始化为一个称为系统程序的内置程序所拥有,因此被恰当地称为系统帐户。 帐户包括“所有者”元数据。 所有者是程序 ID。 如果帐户的 ID 与所有者匹配,则运行时会授予程序对该帐户的写入权限。 对于系统程序,运行时允许客户端传输 lamports 并且重要的是分配帐户所有权,这意味着将所有者更改为不同的程序 ID。 如果帐户不属于某个程序,则只允许该程序读取其数据并记入该帐户。
https://docs.solana.com/developing/programming-model/accounts#ownership-and-assignment-to-programs
为了将 lamports 转移回来,您必须让您的程序处理一条指令,将 lamports 从greetedPubkey
回您的帐户,例如,通过执行以下操作:
**from_account.try_borrow_mut_lamports()? -= amount_of_lamports;
**to_account.try_borrow_mut_lamports()? += amount_of_lamports;
您可以在https://solanacookbook.com/references/programs.html#how-to-transfer-sol-in-a-program中找到完整示例
这不是您问题的一部分,但作为附录,使用createAccountWithSeed
创建的帐户不是PDA,因此您的程序将无法为其签名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.