摘要:函數總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調回調函數。回調函數會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息。回調函數實際上調取的是下的,它會從磁盤中獲取信息并返回。
作者:Derek
簡介Github地址:https://github.com/Bytom/bytom
Gitee地址:https://gitee.com/BytomBlockc...
本章介紹Derek解讀-Bytom源碼分析-持久化存儲LevelDB
作者使用MacOS操作系統,其他平臺也大同小異LevelDB介紹Golang Version: 1.8
比原鏈默認使用leveldb數據庫。Leveldb是一個google實現的非常高效的kv數據庫。LevelDB是單進程的服務,性能非常之高,在一臺4核Q6600的CPU機器上,每秒鐘寫數據超過40w,而隨機讀的性能每秒鐘超過10w。
由于Leveldb是單進程服務,不能同時有多個進程進行對一個數據庫進行讀寫。同一時間只能有一個進程,或一個進程多并發的方式進行讀寫。
比原鏈在數據存儲層上存儲所有鏈上地址、資產交易等信息。
LevelDB的增刪改查操作LevelDB是google開發的一個高性能K/V存儲,本節我們介紹下LevelDB如何對LevelDB增刪改查。
package main import ( "fmt" dbm "github.com/tendermint/tmlibs/db" ) var ( Key = "TESTKEY" LevelDBDir = "/tmp/data" ) func main() { db := dbm.NewDB("test", "leveldb", LevelDBDir) defer db.Close() db.Set([]byte(Key), []byte("This is a test.")) value := db.Get([]byte(Key)) if value == nil { return } fmt.Printf("key:%v, value:%v ", Key, string(value)) db.Delete([]byte(Key)) } // Output // key:TESTKEY, value:This is a test.
以上Output是執行該程序得到的輸出結果。
該程序對leveld進行了增刪改查操作。dbm.NewDB得到db對象,在/tmp/data目錄下會生成一個叫test.db的目錄。該目錄存放該數據庫的所有數據。
db.Set 設置key的value值,key不存在則新建,key存在則修改。
db.Get 得到key中value數據。
db.Delete 刪除key及value的數據。
默認情況下,數據存儲目錄在--home參數下的data目錄。以Darwin平臺為例,默認數據庫存儲在 $HOME/Library/Bytom/data。
accesstoken.db token信息(錢包訪問控制權限)
core.db 核心數據庫,存儲主鏈相關數據。包括塊信息、交易信息、資產信息等
discover.db 分布式網絡中端到端的節點信息
trusthistory.db
txdb.db 存儲交易相關信息
txfeeds.db 目前比原鏈代碼版本未使用該功能,暫不介紹
wallet.db 本地錢包數據庫。存儲用戶、資產、交易、utox等信息
以上所有數據庫都由database模塊管理
比原數據庫接口在比原鏈中數據持久化存儲由database模塊管理,但是持久化相關接口在protocol/store.go中
type Store interface { BlockExist(*bc.Hash) bool GetBlock(*bc.Hash) (*types.Block, error) GetStoreStatus() *BlockStoreState GetTransactionStatus(*bc.Hash) (*bc.TransactionStatus, error) GetTransactionsUtxo(*state.UtxoViewpoint, []*bc.Tx) error GetUtxo(*bc.Hash) (*storage.UtxoEntry, error) LoadBlockIndex() (*state.BlockIndex, error) SaveBlock(*types.Block, *bc.TransactionStatus) error SaveChainStatus(*state.BlockNode, *state.UtxoViewpoint) error }
BlockExist 根據hash判斷區塊是否存在
GetBlock 根據hash獲取該區塊
GetStoreStatus 獲取store的存儲狀態
GetTransactionStatus 根據hash獲取該塊中所有交易的狀態
GetTransactionsUtxo 緩存與輸入txs相關的所有utxo
GetUtxo(*bc.Hash) 根據hash獲取該塊內的所有utxo
LoadBlockIndex 加載塊索引,從db中讀取所有block header信息并緩存在內存中
SaveBlock 存儲塊和交易狀態
SaveChainStatus 設置主鏈的狀態,當節點第一次啟動時,節點會根據key為blockStore的內容判斷是否初始化主鏈。
比原鏈數據庫key前綴database/leveldb/store.go
var ( blockStoreKey = []byte("blockStore") blockPrefix = []byte("B:") blockHeaderPrefix = []byte("BH:") txStatusPrefix = []byte("BTS:") )
blockStoreKey 主鏈狀態前綴
blockPrefix 塊信息前綴
blockHeaderPrefix 塊頭信息前綴
txStatusPrefix 交易狀態前綴
GetBlock查詢塊過程分析database/leveldb/store.go
func (s *Store) GetBlock(hash *bc.Hash) (*types.Block, error) { return s.cache.lookup(hash) }
database/leveldb/cache.go
func (c *blockCache) lookup(hash *bc.Hash) (*types.Block, error) { if b, ok := c.get(hash); ok { return b, nil } block, err := c.single.Do(hash.String(), func() (interface{}, error) { b := c.fillFn(hash) if b == nil { return nil, fmt.Errorf("There are no block with given hash %s", hash.String()) } c.add(b) return b, nil }) if err != nil { return nil, err } return block.(*types.Block), nil }
GetBlock函數最終會執行lookup函數。lookup函數總共操作有兩步:
從緩存中查詢hash值,如果查到則返回
如果為從緩存中查詢到則回調fillFn回調函數。fillFn回調函數會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息。
fillFn回調函數實際上調取的是database/leveldb/store.go下的GetBlock,它會從磁盤中獲取block信息并返回。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24257.html
摘要:函數總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調回調函數。回調函數會將從磁盤上獲得到塊信息存儲到緩存中并返回該塊的信息。回調函數實際上調取的是下的,它會從磁盤中獲取信息并返回。 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹Dere...
摘要:作者簡介地址地址本章介紹解讀源碼分析創世區塊作者使用操作系統,其他平臺也大同小異創世區塊介紹區塊鏈里的第一個區塊創被稱為創世區塊。在比原鏈中創世區塊被硬編碼到中,每一個比原節點都始于同一個創世區塊,這能確保創世區塊不會被改變。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/By...
摘要:只有當觸發了或才能終止進程退出。退出時執行如下操作會將挖礦功能停止,網絡停止等操作。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom代碼啟動、節點初始化、及停止的過程 作者使用MacOS操作系統,其他平臺也大同小異Golang V...
摘要:首先讀取請求內容,解析請求,接著匹配相應的路由項,隨后調用路由項的回調函數來處理。每一個路由項由請求方法和回調函數組成將監聽地址作為參數,最終執行開始服務于外部請求創建對象首先,實例化對象。我們可以看到一條項由和對應的回調函數組成。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com...
摘要:作者簡介地址地址本章介紹代碼網絡中地址簿作者使用操作系統,其他平臺也大同小異介紹用于存儲網絡中保留最近的對端節點地址在下,默認的地址簿路徑存儲在地址簿格式地址類型在中存儲的地址有兩種標識新地址,不可靠地址未成功連接過。 作者:Derek 簡介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomB...
閱讀 1422·2021-11-15 11:38
閱讀 3566·2021-11-09 09:47
閱讀 1969·2021-09-27 13:36
閱讀 3211·2021-09-22 15:17
閱讀 2547·2021-09-13 10:27
閱讀 2862·2019-08-30 15:44
閱讀 1158·2019-08-27 10:53
閱讀 2702·2019-08-26 14:00