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这样的签名吗
puppet
账户的 owner
是 Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS
这个合约,合约可以写指令去修改这个账户的数据,因为合约代码上不需要这个账户的签名,所以调用 set_data
指令的时候可以不需要 puppet
账户的签名,这个是合约上面的情况。payer
来指定谁来付 gas 费,例如:
#[derive(Accounts)]
pub struct SetData<'info> {
#[account(mut)]
pub payer: Signer<'info>,
#[account(mut)]
pub puppet: Account<'info, Data>,
}