#parallel-chain #blockchain #library #persistent-storage #crypto

pchain-world-state

ParallelChain 协议中,定义了从持久存储中读取和写入世界状态的 struct、函数和方法

1 个不稳定版本

0.4.2 2024年4月12日

#6 in #parallel-chain


pchain-runtime 中使用

Apache-2.0

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。补丁版本的增量不保证是非破坏性的。

提交问题

如果您

  1. 有功能请求/功能想法,
  2. 有任何疑问(尤其是与软件相关的问题),
  3. 认为您可能发现了错误。

请尝试适当标记您的问题。

依赖项

~11MB
~170K SLoC