1 个不稳定版本
0.4.2 | 2024年4月12日 |
---|
#6 in #parallel-chain
在 pchain-runtime 中使用
120KB
2K SLoC
平行链世界状态
在平行链中,我们将 Mainnet 维护的用户可见状态称为“世界状态”。世界状态是一组键值对,表示每个“账户”的状态,包括外部账户和合约账户,存储在 Merkle Patricia Trie (MPT) 中 paritytech/trie-db。此库提供了一组用于读取和更新世界状态的函数。
模块
- states:定义了 WorldState 和 AccountStorageStage 方法,用于读取/写入 MPT。
- network:用于在 world state 中存储网络级状态的数据格式方案。
- keys:定义了 Parallelchain-F 用于写入持久存储的键。
- storage:定义了从 world state 访问持久存储的 trait,以及 world state 变化的数据结构。
- error:访问世界状态时的错误处理。
基本用法
// Here demonstrates how to create empty world state, update account information
// and save the world state into database(hashmap).
// This is example address. Don't use this for real transaction.
let address: pchain_types::cryptography::PublicAddress = [200, 49, 188, 70, 13, 208, 8, 5, 148, 104, 28, 81, 229, 202, 203, 180, 220, 187, 48, 162, 53, 122, 83, 233, 166, 97, 173, 217, 25, 172, 106, 53];
// Step 1. prepare database that implement WorldStateStorage trait.
#[derive(Clone)]
struct DummyStorage(HashMap<Key, Value>);
impl WorldStateStorage for DummyStorage{
fn get(&self, key: &Key) -> Option<Value>{
match self.0.get(key){
Some(value) => Some(value.to_owned()),
None => None
}
}
}
impl DummyStorage{
fn apply_changes(&mut self, changes: WorldStateChanges){
for key in changes.deletes.iter() {
self.remove(key);
}
for (key, value) in changes.inserts.iter() {
self.insert(key.clonel(), value.clone());
}
}
}
// Create new database
let mut db = DummyStorage(HashMap::new());
// Step 2. Start an empty world state.
let ws = WorldState::initialize(db);
// Step 3. Some world state operations
// 3.1 Operations that immediately commit to the trie.
ws.with_commit().set_balance(address, 100);
ws.with_commit().set_nonce(address, 1);
ws.with_commit().set_storage_value(address, AppKey::new(key), value);
// 3.2 Operations that saved in cached set.
ws.cached().set_balance(address, 100);
ws.cached().set_nonce(address, 1);
ws.cached().set_storage_value(address, AppKey::new(key), value);
ws.commit(); // you can commit the cached changes to MPT
// Step 4. Commit and close the world state to get the WorldStateChanges
// WorldStateChanges contains the trie node changes since opening the world state and the new trie root hash (a.k.a state hash)
let db_changes: WorldStateChanges = ws.commit_and_close();
// Setp 5. Save the WorldStateChanges to database
db.apply_changes(db_changes);
版本控制
此库的版本反映了它所实现的 ParallelChain 协议的版本。例如,当前版本为 0.4.2,实现了协议版本 0.4。补丁版本的增量不保证是非破坏性的。
提交问题
如果您
- 有功能请求/功能想法,
- 有任何疑问(尤其是与软件相关的问题),
- 认为您可能发现了错误。
请尝试适当标记您的问题。
依赖项
~11MB
~170K SLoC