serialization - Solana Rust 程序 HashMap
问题描述
我正在尝试将以太坊 DeFi 合约移植到 Solana 的 Rust 程序中......我已经了解了如何在程序的帐户数据中保存结构或数组,但仍然不知道如何保存 HashMap<address in string, amount in 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);
解决方案
Solana 不会像那样公开 HashMap。在 Solidity 中,通常有一个顶级 HashMap 来跟踪用户值的地址。
在 Solana 上,替换它的常见模式是使用 PDA(程序派生地址)。您可以散列用户 SOL 钱包以确保唯一的 PDA,然后使用链下曲柄对其进行迭代。
推荐阅读
- html - 我试图让每个网络浏览器的样式看起来都一样
- firebase - 使用没有组织或文件夹的服务帐户创建 GCP 和 Firebase 项目
- javascript - 有没有办法以类似于将变量添加到窗口对象的方式将变量添加到范围?
- java - 自定义 Spinner 项目中的可点击按钮阻止点击项目本身
- extjs - Rhino Parse Error (missing ] after element list
- matlab - 有没有一种方法可以在 Matlab 中集成函数 f(x) 的对数而不定义例如 l = log(f(x)?
- javascript - 多个html部分,检查我在哪个部分
- reactjs - React- Button Onclick 不从文件系统渲染文件 - 在任何点击链接时它总是从文件对象渲染最后一个文件
- c# - 从智能手机访问网络服务器
- android - 从 FirebaseDatabse 收集所有数据并调用 notifyDataSetChanged() 一次