CPChain的私有交易的嚴重bug的修復過程記錄

2021-09-30 18:19:10 字數 906 閱讀 6373

現象:當執行了私有交易之後,關閉區塊鏈節點,再重新開啟之後會出現系統崩潰的情況。

分析:在節點啟動的時候會呼叫loadlaststate(),然後執行以下**載入private state db,但是這裡出現崩潰。

if _, err := state.new(getprivatestateroot(bc.db, currentblock.root()), bc.privatestatecache); err != nil {

經過除錯,發現getprivatestateroot()函式返回了預期的結果,但是這個結果也就是hash,在trie裡並沒有找到。因此根本原因是private state trie沒有持久化寫到磁碟。

經查明,在區塊鏈節點退出時會呼叫(*blockchain)stop() 函式,在該函式中會把blockchain.stackcache的記憶體中內容寫入磁碟,這裡漏掉了把blockchain.privatestatecache的記憶體中內容**也寫入磁碟**。

因此,解決方法是修改(*blockchain)stop()函式,將記憶體中的private state trie寫入磁碟。

log.info("writing private cached state to disk", "block", recent.number(), "hash", recent.hash(), "root", recent.root())

if err :=privtriedb.commit(getprivatestateroot(bc.db, recent.root()), true); err != nil {

log.error("failed to commit recent private state trie", "err", err)

交易的流程

1.使用者a發起交易,請求被傳向對等節點b 2.節點b同步交易,並進行校驗,通過則放到記憶體池中,並向其他節點 3.如果是轉賬交易,獲得記賬權的節點將該交易和其它交易一起打包到區塊中,並在本地的evm上執行被呼叫的合約 直到 執行結束或gas用完 4.執行智慧型合約的gas數量由合約的計算步驟決定,...

Bytom的鏈式交易和花費未確認的交易

當我們基於比原做應用的時候,在構建交易過程中會遇到以下兩種情況。多個位址向乙個位址轉賬,還有一種就是從乙個位址分批次向多個位址轉賬。那我們今天就來介紹一下這兩種交易構建的具體流程,以及貼出具體實現的 當我們從多個錢包位址一次性轉到乙個位址的時候,為了提高使用者體驗。我們可以選擇鏈式交易,把多筆交易一...

商業的本質 (交易)

序 微小的成功靠努力 偶然的成功靠運氣 而巨大的 持續的成功 一定是依靠對商業本質的深刻洞察和牢牢把握 首先我們問一下自己 商業的本質是什麼 接下來請聽乙個故事 假如你家是種大公尺的 一年能種 200 多斤大公尺 差不多正好夠一家人吃 自己種大公尺 自己吃 請問這是商業嗎 顯然不是 這是自給自足的小...