日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5.4 账本数据

發布時間:2023/12/29 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5.4 账本数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

賬本數據(Ledger)是以二進制文件的形式存儲的,每個賬本數據存儲在不同的目錄下。后面的內容都是在已經區分了賬本的情況下再對數據進行查詢的。基于文件系統的區塊存儲實現了如下功能接口。

1)賬本存儲管理。

·提交區塊到賬本(AddBlock)

·獲取區塊鏈信息(GetBlockchainInfo)

·獲取區塊數據(RetrieveBlocks)

·關閉區塊存儲(Shutdown)

2)索引管理:跟蹤區塊和交易保存在哪個文件。

·根據哈希值獲取區塊(RetrieveBlockByHash)

·根據區塊編號獲取區塊(RetrieveBlockByNumber)

·根據交易編號獲取交易(RetrieveTxByID)

·根據區塊編號和交易編號獲取交易(RetrieveTxByBlockNumTranNum)

·根據交易編號獲取區塊(RetrieveBlockByTxID)

·根據交易編號獲取交易驗證碼(RetrieveTxValidationCodeByTxID)

賬本數據的所有操作都是通過區塊文件管理器(blockfileMgr)實現的,定義如下:


type blockfileMgr struct {
? ?rootDir ? ? ? ? ? string ? ? ? ? ? ? ? ? ? ? // 區塊鏈中區塊存儲的根目錄
? ?conf ? ? ? ? ? ? ?*Conf ? ? ? ? ? ? ? ? ? ? ?// 配置信息
? ?db ? ? ? ? ? ? ? ?*leveldbhelper.DBHandle ? ?// 數據庫指針
? ?index ? ? ? ? ? ? index ? ? ? ? ? ? ? ? ? ? ?// 區塊索引接口
? ?cpInfo ? ? ? ? ? ?*checkpointInfo ? ? ? ? ? ?// 區塊檢查點信息
? ?cpInfoCond ? ? ? ?*sync.Cond ? ? ? ? ? ? ? ? // 條件變量
? ?currentFileWriter *blockfileWriter ? ? ? ? ? // 當前寫入區塊文件的指針
? ?bcInfo ? ? ? ? ? ?atomic.Value ? ? ? ? ? ? ? // 區塊鏈信息
}


區塊文件管理器實現的功能分為幾類。

1)賬本數據存儲管理。

·確定文件存儲在哪個目錄;

·確定區塊存儲在哪個文件。

2)檢查點管理:跟蹤最新持久化存儲的文件。

3)索引管理:跟蹤區塊和交易保存在哪個文件。

5.4.1 賬本數據存儲

區塊文件管理器創建的文件名以"blockfile_"為前綴,6位數字為后綴,后綴必須是從小到大連續的數字, 中間不能有缺失,比如blockfile_000000、blockfile_000001、blockfile_000002等。默認的區塊文件大小上 限為64MB(目前這個大小在代碼中是固定的,以后可能會動態調整)。一個賬本能保存的最大數據量大概有61TB,這應該能滿足目前絕大多數的應用了。

區塊文件管理器維護一個當前寫入區塊文件的指針currentFileWriter,寫入區塊文件的數據包括兩個 部分,一個是區塊大小,另一個是區塊數據。寫入區塊文件中的區塊大小和區塊數據都是經過序列化處理的,序列化過程見技術實現部分。如果寫入區塊大小和序列 化后,當前區塊文件的大小超過設定值,則會寫入到下一個區塊文件中。創建一個新的區塊檢查點信息(見區塊索引部分),保存到數據庫中。

若寫入區塊文件和保存區塊檢查點信息的過程出現任何異常,就會根據區塊檢查點記錄的最新區塊文件偏移 latestFileChunksize(見區塊索引部分),恢復區塊文件到寫入前的狀態。多個區塊數據保存到區塊文件后,區塊文件形成了一個非結構化的 二進制文件,它需要在區塊文件外記錄索引信息,才能快速地定位到區塊。保存區塊數據后會建立這個區塊的索引,并保存到數據庫中,詳細的構建區塊索引過程在 后面的章節會有介紹。

最后是更新區塊鏈文件管理器維護的區塊檢查點信息和區塊鏈信息。

5.4.2 賬本數據讀取

區塊文件流(blockfileStream)和區塊流(blockStream)是以數據流的方式從區塊文件系 統中讀取區塊的,區塊文件流是從單個文件中讀取的,區塊流可以跨不同的文件,實際的文件讀取通過區塊文件流來實現。區塊流維護了當前的區塊文件流指針,還 有當前區塊文件的編號等,詳細的定義如下:


type blockStream struct {
? ?rootDir ? ? ? ? ? string ? ? ? ? ? ?// 區塊鏈中區塊存儲的根目錄
? ?currentFileNum ? ?int ? ? ? ? ? ? ? // 當前讀取文件區塊的編號
? ?endFileNum ? ? ? ?int ? ? ? ? ? ? ? // 結束讀取文件區塊的編號
? ?currentFileStream *blockfileStream ?// 當前區塊文件流指針
}


可以有多個區塊流同時讀取區塊文件以獲取區塊數據,讀取從區塊文件currentFileNum的某個偏移開始, 到區塊文件endFileNum(包含整個區塊文件)之間的所有區塊。結束讀取文件區塊的endFileNum可以設置為小于0的數值,這表示讀取后續所 有的區塊文件,直到賬本數據目錄下某個區塊文件不存在為止。

跟區塊文件存儲過程類似,讀取區塊數據需要先讀取區塊數據的大小,再讀取區塊數據本身。區塊數據的大小是可變長的 64位數字,最大長度為8個字節。由于可變長數字序列化后最后一個字節的最高位是0,所以能從字節流中區分出區塊數據大小和區塊數據本身。詳細的編碼規則 見序列化部分。

區塊迭代器(blocksItr)基于區塊流,實現了獲取區塊數據(RetrieveBlocks)的接口。增加的一個業務邏輯是如果需要獲取的區塊編號還未生成,迭代器會一直等待,直到獲取到指定區塊或者關閉迭代器。

5.4.3 交易模擬執行

鏈碼是可以并行執行的,執行的過程并不影響當前的狀態數據庫。實現的方法是在最新賬本上生成一個賬本數據的模擬 器,模擬執行過程生成的數據會寫入模擬器的writeMap中,讀取的數據寫入到readMap中,最后再根據writeMap和readMap生成 TxRwSet結果。每次鏈碼執行的時候都會生成一個新的模擬器,所以多個鏈碼并行執行并不會相互影響,模擬執行的結果也不會直接影響當前的狀態數據庫, 生成的TxRwSet在提交交易的時候,只有驗證通過以后才會記錄到賬本中。

來源:我是碼農,轉載請保留出處和鏈接!

本文鏈接:http://www.54manong.com/?id=1067

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })(); '); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

總結

以上是生活随笔為你收集整理的5.4 账本数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。