如何为已经有状态的NEAR Rust智能合约添加新属性?



我有一个部署到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 
}

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

您可以创建一个新的结构体

,而不是将属性添加到原始的并且已经持久化的结构体中。
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."));
}

最新更新