91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Bytom持久化存儲LevelDB有哪些操作

發布時間:2021-12-20 17:44:46 來源:億速云 閱讀:154 作者:iii 欄目:互聯網科技

本篇內容介紹了“Bytom持久化存儲LevelDB有哪些操作”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

LevelDB介紹

比原鏈默認使用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\n", 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信息并返回。

“Bytom持久化存儲LevelDB有哪些操作”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贺州市| 萝北县| 谢通门县| 浦城县| 瓦房店市| 巴东县| 武鸣县| 宣城市| 余江县| 临潭县| 湖南省| 中超| 南陵县| 吴忠市| 南乐县| 弥渡县| 武强县| 饶平县| 旅游| 嘉定区| 思茅市| 商南县| 玉龙| 类乌齐县| 灵寿县| 西城区| 阿克陶县| 洛浦县| 台山市| 万年县| 孙吴县| 郓城县| 深州市| 江油市| 黑龙江省| 邢台市| 广宁县| 右玉县| 湘潭县| 衡水市| 宝山区|