【问题标题】:How to add new properties to a NEAR Rust smart contract that already has state?如何向已经有状态的 NEAR Rust 智能合约添加新属性?
【发布时间】:2021-06-03 12:31:56
【问题描述】:

我有一个部署到 NEAR 协议的 Rust 智能合约,现在我想更新它并添加属性以实现持久性。但是合约已经有了状态,如果调用新版本我会得到错误Cannot deserialize the contract state

这是更新后的状态结构(我想在其中添加另一个 HashMap):

#[near_bindgen]
#[derive(Default, BorshDeserialize, BorshSerialize)]
pub struct RepositoryPermission {
    permission: HashMap<String, HashMap<String, Permission>>,
    invitations: HashMap<InvitationId, Invitation>,  // I want to add this HashMap 
}

为持久化添加新属性的最佳方式是什么?

【问题讨论】:

    标签: rust nearprotocol near-sdk-rs


    【解决方案1】:

    您可以创建一个新结构,而不是将属性添加到原始且已持久化的结构中

    const INVITATIONS_KEY: &[u8] = b"INVITATIONS";
    
    #[derive(Default, BorshDeserialize, BorshSerialize)]
    pub struct Invitations {
        invitations: HashMap<InvitationId, Invitation>
    }
    

    并在合约中创建(私有)方法以在合约中反序列化/序列化:

    fn load_invitations(&self) -> Invitations {
            return env::storage_read(INVITATIONS_KEY)
                        .map(|data| Invitations::try_from_slice(&data).expect("Cannot deserialize the invitations."))
                        .unwrap_or_default();
        }
    
        fn save_invitations(&self, invitations: Invitations) {
            env::storage_write(INVITATIONS_KEY, &invitations.try_to_vec().expect("Cannot serialize invitations."));
        }
    

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 2022-06-23
      • 2022-06-22
      • 2021-12-30
      • 2021-01-12
      • 1970-01-01
      • 2021-10-14
      • 2021-11-08
      • 2020-11-08
      相关资源
      最近更新 更多