在 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,这意味着您必须预先指定要使用的每个帐户。

对于你的情况,这意味着没有立竿见影的解决办法!解决此问题的最佳方法是创建一个包含所有必需计数器的全局帐户,并根据每条指令的需要更新它。

我希望有更令人满意的答复,但这是我能想到的最好的。