假设我在智能合约中有以下简单代码:
#[near_bindgen]
pub struct A {
pub var1: AccountId,
pub var2: Balance,
pub my_map: TreeMap<String, (u128, u128, u128)>,
}
#[near_bindgen]
impl A {
#[init]
pub fn init() -> Self {
let _my_map: TreeMap<String, (u128, u128, u128)> = TreeMap::new(b"t");
Self {
//...other fields
my_map: _my_map
}
}
//!!!
// will this work properly for each client at all?
//
pub fn my_method1(&mut self) {
// !! instance variable !!
if !self.my_map.contains_key("some_key") {
self.my_map.insert(&"aaa", &(1, 2, 3));
} else {
// already exists, error!
}
}
}
在普通环境中,此Rust代码将使每个人都拥有自己的A
实例及其字段的唯一值。对的
我是否正确理解,在NEAR中,每个人(客户端(都将拥有相同的A
实例?
也就是说,实例变量A.my_map
将包含相同的数据,用于可以使用此代码的智能合约的每个客户端?
那么A.var1
和A.var2
呢?
智能合约在调用之间保持状态。在您的示例中,每次有人在您的合同中调用my_method1
时,my_map
和其他变量都是相同的。
这种状态在部署智能合约的网络中是持久的,这意味着对于testnet
和mainnet
,它将是独立的。
例如,如果您希望管理不同呼叫者的单独状态,请查看以下示例:https://github.com/near-examples/rust-status-message/blob/master/src/lib.rs它使用呼叫者的帐户ID和与其相关的数据之间的映射