Solana Rust 程序 HashMap<string, u64>

Posted

技术标签:

【中文标题】Solana Rust 程序 HashMap<string, u64>【英文标题】:Solana Rust program HashMap<string, u64> 【发布时间】:2021-09-27 22:02:04 【问题描述】:

我正在尝试将以太坊 DeFi 合约移植到 Solana 的 Rust 程序中...... 我已经了解了在程序的帐户数据中保存结构或数组,但仍然不知道如何将 HashMap

保存到程序的帐户数据中...... 然后如何读取这个 HashMap 的值,比如检查每个地址的质押量。 请帮忙。谢谢!

我的 Solana Rust 程序:

pub fn get_init_hashmap() -> HashMap<&'static str, u64> 
  let mut staked_amount: HashMap<&str, u64> = HashMap::new();
  staked_amount.insert("9Ao3CgcFg3RB2...", 0);
  staked_amount.insert("8Uyuz5PUS47GB...", 0);
  staked_amount.insert("CRURHng6s7DGR...", 0);
  staked_amount

pub fn process_instruction(...) -> ProgramResult 
    msg!("about to decode account data");
    let acct_data_decoded = match HashMap::try_from_slice(&account.data.borrow_mut()) 
      Ok(data) => data,//to be of type `HashMap`
      Err(err) => 
        if err.kind() == InvalidData 
          msg!("InvalidData so initializing account data");
          get_init_hashmap()
         else 
          panic!("Unknown error decoding account data :?", err)
        
      
    ;
    msg!("acct_data_decoded: :?", acct_data_decoded);

【问题讨论】:

程序的账户数据中保存hash map是什么意思? 你的问题很不清楚。请告诉我们您到底想达到什么目标,例如将数据存储到磁盘,内存,...。如果您可以提供minimal reproducible example 并可能阅读How to Ask :) 由 Discord 上的 Solana 开发支持人员回答 【参考方案1】:

Solana 不会像那样公开 HashMap。在 Solidity 中,通常有一个*** HashMap 来跟踪用户值的地址。

在 Solana 上,替换它的常见模式是使用 PDA(程序派生地址)。您可以散列用户 SOL 钱包以确保唯一的 PDA,然后使用链下曲柄对其进行迭代。

【讨论】:

谢谢。用在每个用户的 PDA 中保存一个结构数组来替换 pool_info[index1][index2] 怎么样。这是个好主意吗? Solana 中的链下曲柄是什么? 我也有同样的问题,什么是链下曲柄?【参考方案2】:

由 Discord 上的 Solana 开发支持人员回答: HashMap 目前不能在链上工作,所以你必须使用 BTreeMap。

至于实际保存它,您可以遍历键值对并序列化其中的每一个。

一般来说,我们建议使用多个帐户,并为每个帐户使用程序派生地址:https://docs.solana.com/developing/programming-model/calling-between-programs#program-derived-addresses

【讨论】:

HashMap 还是不行吗? 请参阅 bartosz.lipinski 的上述答案。每个 Solana 账户只能保存 10MB 的数据,所以 HashMap 满了就不行了,那就没用了……

以上是关于Solana Rust 程序 HashMap<string, u64>的主要内容,如果未能解决你的问题,请参考以下文章

rust solana 构建错误:没有这样的子命令:+bpf [关闭]

智能合约开发——Sui/Move vs. Solana/Rust

智能合约开发——Sui/Move vs. Solana/Rust

Rust、OpenSSL、solana-test-validator 库未加载问题

Solana Rust 智能合约如何获得区块高度或 Unix 时间?

Solana区块链智能合约开发简要流程