Solana Rust 智能合约如何处理数组和向量?
How do Solana Rust smart contracts handle arrays and vectors?
我知道 Solana 没有 HashMap 数据结构作为设计模式。
这是否意味着开发人员应该为每个用户或权益池使用程序派生地址 (PDA),而不是为数据存储创建 array/vector 个用户或权益池?
这个问题有点主观,因为它询问的是如何使用 Solana 处理在链上存储大量信息的意见。两种选择都是可能的:您可以在一个帐户中存储链上向量/数组,或者您可以使用程序派生地址作为一种链上 HashMap。这是一个权衡。
如果您在帐户中存储一个矢量,您会受到开始时分配的大小的限制,但存储一定数量的值可能会更快、更便宜。
如果您需要存储大量数据并且您有生成密钥的良好模型,那么在程序派生地址创建帐户可能是一个不错的选择。您需要为每个帐户支付租金,因此如果您没有在每个帐户中存储大量数据,则费用可能会很高。您可以使用 solana rent <ACCOUNT_SIZE>
来估算这两种方法的成本。
您可以在他们的官方示例中阅读此处的代码。
https://github.com/solana-labs/solana-program-library/blob/master/token-lending/program/src/state/obligation.rs#L331
他们如何打包和解压矢量是第 331 行。
我知道 Solana 没有 HashMap 数据结构作为设计模式。
这是否意味着开发人员应该为每个用户或权益池使用程序派生地址 (PDA),而不是为数据存储创建 array/vector 个用户或权益池?
这个问题有点主观,因为它询问的是如何使用 Solana 处理在链上存储大量信息的意见。两种选择都是可能的:您可以在一个帐户中存储链上向量/数组,或者您可以使用程序派生地址作为一种链上 HashMap。这是一个权衡。
如果您在帐户中存储一个矢量,您会受到开始时分配的大小的限制,但存储一定数量的值可能会更快、更便宜。
如果您需要存储大量数据并且您有生成密钥的良好模型,那么在程序派生地址创建帐户可能是一个不错的选择。您需要为每个帐户支付租金,因此如果您没有在每个帐户中存储大量数据,则费用可能会很高。您可以使用 solana rent <ACCOUNT_SIZE>
来估算这两种方法的成本。
您可以在他们的官方示例中阅读此处的代码。 https://github.com/solana-labs/solana-program-library/blob/master/token-lending/program/src/state/obligation.rs#L331 他们如何打包和解压矢量是第 331 行。