Solana Rust程序HashMap<string, u64>。

5
我正在尝试将Ethereum的DeFi合约移植到Solana的Rust程序中... 我已经了解了如何在程序的账户数据中保存一个结构体或数组,但仍然不知道如何将HashMap<地址用字符串表示,金额用u64表示>保存到程序的账户数据中... 然后如何读取这个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);

在程序的账户数据中保存哈希映射是什么意思? - sb27
你的问题不是很清楚,请告诉我们你想要实现什么,例如将数据存储到磁盘、内存等等。如果你能提供 [mcve] 并可能阅读 [ask] :) - hellow
Solana开发支持在Discord上回答了这个问题。 - Russo
2个回答

6

Solana没有像这样的HashMap。在Solidity中,常见的做法是有一个顶级的HashMap来跟踪地址到用户值的映射。

在Solana上,替代它的常见模式是使用PDAs(派生自程序的地址)。你可以对用户SOL钱包进行哈希以确保唯一的PDA,然后使用离线摇杆迭代它们。


谢谢。将pool_info[index1][index2]替换为在每个用户的PDA中保存结构体数组,这个想法怎么样?这是一个好主意吗? - Russo
Solana中的离线摇把是什么? - regularlearner
我有同样的问题,什么是离线链条? - Anoushk

3

HashMap 还是不能用吗? - nxmohamad
每个Solana账户只能容纳10MB的数据,因此当HashMap已满时将无法工作,那么它就变得无用了... - Russo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接