anchor里面有些执行没有signer是执行这个指令不需要签名吗

use anchor_lang::prelude::*;

declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

#[program]
pub mod puppet {
    use super::*;
    pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
        Ok(())
    }

    pub fn set_data(ctx: Context<SetData>, data: u64) -> Result<()> {
        let puppet = &mut ctx.accounts.puppet;
        puppet.data = data;
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = user, space = 8 + 8)]
    pub puppet: Account<'info, Data>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct SetData<'info> {
    #[account(mut)]
    pub puppet: Account<'info, Data>,
}

#[account]
pub struct Data {
    pub data: u64,
}

如这个官方代码,set_data方法里面的struct SetData中的约束只有#[account(mut)] 不需要payer吗,Signer这样的签名吗

请先 登录 后评论

最佳答案 2024-03-19 17:30

  • 这个 puppet 账户的 ownerFg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS 这个合约,合约可以写指令去修改这个账户的数据,因为合约代码上不需要这个账户的签名,所以调用 set_data 指令的时候可以不需要 puppet 账户的签名,这个是合约上面的情况。
  • 但是,在打包交易的时候,是需要一个账户签名来付 gas 费的。
  • 一般来说,这种写法不是很提倡,最好是每一个指令的账户列表就要写出一个 payer 来指定谁来付 gas 费,例如:
    #[derive(Accounts)]
    pub struct SetData<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut)]
    pub puppet: Account<'info, Data>,
    }
  • 最后关于签名和可修改之间的关系,可以参考这篇文章
请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 0 收藏,1114 浏览
  • 孙三胖 提出于 2024-03-18 18:49