本教程详细介绍了如何在Anchor框架下向已初始化的Solana账户写入数据,并解释了相关代码的实现原理。
在之前的教程中,我们讨论了如何初始化账户以便将数据持久化存储。本教程将展示如何向我们已初始化的账户写入数据。
以下是之前关于初始化 Solana 账户的教程中的代码。我们添加了一个 set()
函数,用于在 MyStorage 中存储一个数字,并添加了相关的 Set 结构体。
其余代码保持不变:
use anchor_lang::prelude::*;
use std::mem::size_of;
declare_id!("GLKUcCtHx6nkuDLTz5TNFrR4tt4wDNuk24Aid2GrDLC6");
##[program]
pub mod basic_storage {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
Ok(())
}
// ****************************
// *** 这个函数是新添加的 ***
// ****************************
pub fn set(ctx: Context<Set>, new_x: u64) -> Result<()> {
ctx.accounts.my_storage.x = new_x;
Ok(())
}
}
// **************************
// *** 这个结构体是新添加的 ***
// **************************
##[derive(Accounts)]
pub struct Set<'info> {
#[account(mut, seeds = [], bump)]
pub my_storage: Account<'info, MyStorage>,
}
##[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init,
payer = signer,
space=size_of::<MyStorage>() + 8,
seeds = [],
bump)]
pub my_storage: Account<'info, MyStorage>,
#[account(mut)]
pub signer: Signer<'info>,
pub system_program: Program<'info, System>,
}
##[account]
pub struct MyStorage {
x: u64,
}
练习:修改测试,使用参数 170
调用 set()
。这是我们尝试持久化存储在 MyStorage
中的 x
的值。你需要在 initialize()
之后调用 set()
。别忘了将 170
转换为大数。
set()
函数解释下面,我们稍微重新排列了代码,将 set()
函数、Set
结构体和 MyStorage
结构体放在一起: 我们现在解释
ctx.accounts.my_storage.x = new_x
的工作原理:
ctx
中的 accounts
字段(顶部蓝色框)让我们可以访问 Set
结构体中的所有键。这不是在 Rust 中列出结构体键的方式。accounts
能够引用 Set
结构体中的键,是由于 #[derive(Accounts)]
宏(底部蓝色框)神奇地插入的。my_storage
账户(橙色框)被设置为 mut
或可变的(绿色框),因为我们...如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!