Solana Anchor:如何让feePayer支付账户创建费且保留推文作者
解决Solana交易中让feePayer同时支付账户创建费的问题
要实现让交易的feePayer同时承担Tweet账户的创建费用,同时保留原钱包作为推文作者,你需要调整Anchor的Accounts结构体定义,并确保交易包含必要的签名。
核心修改点
你之前的错误是在init属性里引用了不存在的fee_payer字段——Anchor的Accounts结构体里,你需要把feePayer作为一个命名为payer的Signer账户传入,然后在payer参数里指向这个字段。
修改后的Accounts结构体
#[derive(Accounts)] pub struct SendTweet<'info> { // 指定payer为结构体中的payer字段,由feePayer承担账户创建费 #[account(init, payer = payer, space = Tweet::LEN)] pub tweet: Account<'info, Tweet>, // 作者仅作为签名者,无需mut(不用从它扣钱) pub author: Signer<'info>, // feePayer需要mut属性,因为要从中扣除账户创建所需的lamports #[account(mut)] pub payer: Signer<'info>, // 用Program类型替代AccountInfo更简洁 pub system_program: Program<'info, System>, }
程序逻辑无需修改
原有的send_tweet函数逻辑保持不变,依然将tweet.author赋值为author.key,这样推文的作者还是原钱包,而付费的是指定的feePayer。
前端注意事项
调用交易时,需要:
- 将交易的
feePayer设置为你的新钱包地址 - 让原作者钱包和feePayer钱包都对交易进行签名(因为两者都是Accounts结构体中的Signer类型)
错误原因说明
你之前的代码里写了payer = fee_payer,但你的Accounts结构体中定义的付费账户字段是payer,而非fee_payer——feePayer是Solana交易层面的概念,在Anchor程序中需要通过显式传入的Signer字段来引用它。
内容的提问来源于stack exchange,提问作者alessandro buffoli
相关产品推荐
相关产品推荐

