如何使用Solana Rust合约发送SOL

4

我是一名Rust/Solana开发新手,感觉遇到的问题对其他开发新手也会有所帮助。

我想知道如何在指令期间将SOL从一个账户转移到程序中,并且能够将SOL发送回调用该指令的账户。

我已阅读https://docs.solana.com/,但没有找到有关通过程序进行SOL转移的信息。

例如:

Acc1调用Program1中的赌博指令,该指令从调用方转移1 SOL,然后运行可验证的随机函数。如果Acct1赢得了赌博,Program1将向Acct1发送2 SOL。

非常感谢您的帮助,谢谢!

1个回答

2

非常感谢!我正在尝试按照您的指示构建程序,但遇到了错误指令所需的帐户丢失 invoke_signed( &ix, &[ base_account.to_account_info().clone(), user.to_account_info().clone(), system_program.to_account_info().clone(), ], &[&[b"test", &[bump_seed]]], // solana_program::system_instruction::transfer(&pda, &user_address, 10000); ); Ok(())``` - Brutus123
1
“pda”和“base_account.key”需要相同才能进行转账。很可能它们不是同一个账户,因此您需要将pda传递给指令。 - Jon C
明白了!这是 Github 的链接,如果需要更多上下文信息可以查看。 https://github.com/mark-antony1/7dice/blob/master/programs/dice/src/lib.rs我该如何从 PDA 中获取账户信息?PDA 只是地址,对吗? - Brutus123
1
你需要在链下派生地址,然后将其传递给指令,即使它尚不存在。请参考此示例:https://solanacookbook.com/references/accounts.html#sign-with-a-pda - Jon C
明白了,感谢您的帮助! - Brutus123
嗨Jon!我该如何为PDA添加类型,以便在定义方法的上下文中使用?以下是我尝试使用的一般上下文,以便我可以在客户端中提供一个字符串作为pda,但似乎并没有起作用:#[derive(Accounts)] pub struct SendLamports<'info> { #[account(init, payer = user, space = 9000)] pub base_account: Account<'info, BaseAccount>, #[account(mut)] pub user: Signer<'info>, pub system_program: Program<'info, System>, pub pda: Account<'info>, }错误:括号参数必须是生命周期和类型 60 | pub pda: Account<'info>`有什么想法吗? - Brutus123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接