serialization - Solana Rust 程序 HashMap<string, u64>

标签 serialization rust hashmap deserialization solana

我正在尝试将以太坊 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);

最佳答案

Solana 不会公开这样的 HashMap。在 Solidity 中,通常有一个顶级 HashMap 来跟踪用户值的地址。
在 Solana 上,替换它的常见模式是使用 PDA(程序派生地址)。您可以散列用户 SOL 钱包以确保唯一的 PDA,然后使用链下曲柄对其进行迭代。

关于serialization - Solana Rust 程序 HashMap<string, u64>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68454062/

相关文章:

c# - 使用构造函数序列化来自类的数据

c# - DataContract 序列化抽象类

serialization - Erlang序列化

rust - 是否有单一生产者多消费者 channel 的图书馆?

string - [] 字符串运算符,与向量切片链接

java - Map[] myArr,每个都有 <K>Integer、<V>HashSet ...无法获取 HashSet (Java)

java - 带有内部类的请求-响应流模式

rust - From Trait - 如何从切片实现它

java - 使用DFS回溯算法生成迷宫的问题

ruby - Hash.new{[]} - 它有什么问题吗?