在 Solana(锚)程序中访问和迭代帐户元数据?
Access and iterate over account metadata within a Solana(Anchor) Program?
要访问和迭代客户端上的 Solana 帐户元数据,只需使用 solana/web3.js。但是我怎样才能在 solana(Anchor) 程序本身中访问相同的数据。如何获取创建的推文帐户数量并访问帐户作者的公钥。我希望这在链上完成,以防止任何用户为自己的利益操纵前端代码,例如 minting/transferring 实用程序代币给他们自己而不是 dApp 的其他用户。基本上下面的 web3 代码如何在链上实现?
下面是我想在程序中执行的操作的 web3.js 版本。
const tweetAccounts = await program.account.tweet.all();
let totalAccounts = tweetAccounts.length;
for (let tweetAccount of tweetAccounts) {
let allKeys = [];
let theKey = tweetAccount.author.publicKey;
allKeys.push(theKey);
}
Solana 程序代码我必须创建推文帐户。
pub fn send_tweet(ctx: Context<SendTweet>, topic: String, content: String, review: i32) -> ProgramResult {
let tweet: &mut Account<Tweet> = &mut ctx.accounts.tweet;
let author: &Signer = &ctx.accounts.author;
let clock: Clock = Clock::get().unwrap();
if topic.chars().count() > 50 {
return Err(ErrorCode::TopicTooLong.into())
}
if content.chars().count() > 280 {
return Err(ErrorCode::ContentTooLong.into())
}
tweet.author = *author.key;
tweet.timestamp = clock.unix_timestamp;
tweet.topic = topic;
tweet.content = content;
tweet.review = review;
Ok(())
}
#[derive(Accounts)]
pub struct SendTweet<'info> {
#[account(init, payer = author, space = Tweet::LEN)]
pub tweet: Account<'info, Tweet>,
#[account(mut)]
pub author: Signer<'info>,
pub system_program: Program<'info, System>,
}
不可能动态加载新帐户on-chain,这意味着您必须预先指定要使用的每个帐户。
对于你的情况,这意味着没有立竿见影的解决办法!解决此问题的最佳方法是创建一个包含所有必需计数器的全局帐户,并根据每条指令的需要更新它。
我希望有更令人满意的答复,但这是我能想到的最好的。
要访问和迭代客户端上的 Solana 帐户元数据,只需使用 solana/web3.js。但是我怎样才能在 solana(Anchor) 程序本身中访问相同的数据。如何获取创建的推文帐户数量并访问帐户作者的公钥。我希望这在链上完成,以防止任何用户为自己的利益操纵前端代码,例如 minting/transferring 实用程序代币给他们自己而不是 dApp 的其他用户。基本上下面的 web3 代码如何在链上实现?
下面是我想在程序中执行的操作的 web3.js 版本。
const tweetAccounts = await program.account.tweet.all();
let totalAccounts = tweetAccounts.length;
for (let tweetAccount of tweetAccounts) {
let allKeys = [];
let theKey = tweetAccount.author.publicKey;
allKeys.push(theKey);
}
Solana 程序代码我必须创建推文帐户。
pub fn send_tweet(ctx: Context<SendTweet>, topic: String, content: String, review: i32) -> ProgramResult {
let tweet: &mut Account<Tweet> = &mut ctx.accounts.tweet;
let author: &Signer = &ctx.accounts.author;
let clock: Clock = Clock::get().unwrap();
if topic.chars().count() > 50 {
return Err(ErrorCode::TopicTooLong.into())
}
if content.chars().count() > 280 {
return Err(ErrorCode::ContentTooLong.into())
}
tweet.author = *author.key;
tweet.timestamp = clock.unix_timestamp;
tweet.topic = topic;
tweet.content = content;
tweet.review = review;
Ok(())
}
#[derive(Accounts)]
pub struct SendTweet<'info> {
#[account(init, payer = author, space = Tweet::LEN)]
pub tweet: Account<'info, Tweet>,
#[account(mut)]
pub author: Signer<'info>,
pub system_program: Program<'info, System>,
}
不可能动态加载新帐户on-chain,这意味着您必须预先指定要使用的每个帐户。
对于你的情况,这意味着没有立竿见影的解决办法!解决此问题的最佳方法是创建一个包含所有必需计数器的全局帐户,并根据每条指令的需要更新它。
我希望有更令人满意的答复,但这是我能想到的最好的。