You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:23