国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Derek解讀Bytom源碼分析-持久化存儲(chǔ)LevelDB

GitChat / 2428人閱讀

摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)。回調(diào)函數(shù)會(huì)將從磁盤上獲得到塊信息存儲(chǔ)到緩存中并返回該塊的信息。回調(diào)函數(shù)實(shí)際上調(diào)取的是下的,它會(huì)從磁盤中獲取信息并返回。

簡(jiǎn)介

Github地址:https://github.com/Bytom/bytom

Gitee地址:https://gitee.com/BytomBlockc...

本章介紹Derek解讀-Bytom源碼分析-持久化存儲(chǔ)LevelDB

作者使用MacOS操作系統(tǒng),其他平臺(tái)也大同小異

Golang Version: 1.8

LevelDB介紹

比原鏈默認(rèn)使用leveldb數(shù)據(jù)庫。Leveldb是一個(gè)google實(shí)現(xiàn)的非常高效的kv數(shù)據(jù)庫。LevelDB是單進(jìn)程的服務(wù),性能非常之高,在一臺(tái)4核Q6600的CPU機(jī)器上,每秒鐘寫數(shù)據(jù)超過40w,而隨機(jī)讀的性能每秒鐘超過10w。

由于Leveldb是單進(jìn)程服務(wù),不能同時(shí)有多個(gè)進(jìn)程進(jìn)行對(duì)一個(gè)數(shù)據(jù)庫進(jìn)行讀寫。同一時(shí)間只能有一個(gè)進(jìn)程,或一個(gè)進(jìn)程多并發(fā)的方式進(jìn)行讀寫。

比原鏈在數(shù)據(jù)存儲(chǔ)層上存儲(chǔ)所有鏈上地址、資產(chǎn)交易等信息。

LevelDB的增刪改查操作

LevelDB是google開發(fā)的一個(gè)高性能K/V存儲(chǔ),本節(jié)我們介紹下LevelDB如何對(duì)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是執(zhí)行該程序得到的輸出結(jié)果。

該程序?qū)eveld進(jìn)行了增刪改查操作。dbm.NewDB得到db對(duì)象,在/tmp/data目錄下會(huì)生成一個(gè)叫test.db的目錄。該目錄存放該數(shù)據(jù)庫的所有數(shù)據(jù)。
db.Set 設(shè)置key的value值,key不存在則新建,key存在則修改。
db.Get 得到key中value數(shù)據(jù)。
db.Delete 刪除key及value的數(shù)據(jù)。

比原鏈的數(shù)據(jù)庫

默認(rèn)情況下,數(shù)據(jù)存儲(chǔ)目錄在--home參數(shù)下的data目錄。以Darwin平臺(tái)為例,默認(rèn)數(shù)據(jù)庫存儲(chǔ)在 $HOME/Library/Bytom/data。

accesstoken.db token信息(錢包訪問控制權(quán)限)
core.db 核心數(shù)據(jù)庫,存儲(chǔ)主鏈相關(guān)數(shù)據(jù)。包括塊信息、交易信息、資產(chǎn)信息等
discover.db 分布式網(wǎng)絡(luò)中端到端的節(jié)點(diǎn)信息

trusthistory.db
txdb.db 存儲(chǔ)交易相關(guān)信息
txfeeds.db 目前比原鏈代碼版本未使用該功能,暫不介紹
wallet.db 本地錢包數(shù)據(jù)庫。存儲(chǔ)用戶、資產(chǎn)、交易、utox等信息

以上所有數(shù)據(jù)庫都由database模塊管理

比原數(shù)據(jù)庫接口

在比原鏈中數(shù)據(jù)持久化存儲(chǔ)由database模塊管理,但是持久化相關(guān)接口在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 根據(jù)hash判斷區(qū)塊是否存在

GetBlock 根據(jù)hash獲取該區(qū)塊

GetStoreStatus 獲取store的存儲(chǔ)狀態(tài)

GetTransactionStatus 根據(jù)hash獲取該塊中所有交易的狀態(tài)

GetTransactionsUtxo 緩存與輸入txs相關(guān)的所有utxo

GetUtxo(*bc.Hash) 根據(jù)hash獲取該塊內(nèi)的所有utxo

LoadBlockIndex 加載塊索引,從db中讀取所有block header信息并緩存在內(nèi)存中

SaveBlock 存儲(chǔ)塊和交易狀態(tài)

SaveChainStatus 設(shè)置主鏈的狀態(tài),當(dāng)節(jié)點(diǎn)第一次啟動(dòng)時(shí),節(jié)點(diǎn)會(huì)根據(jù)key為blockStore的內(nèi)容判斷是否初始化主鏈。

比原鏈數(shù)據(jù)庫key前綴

database/leveldb/store.go

var (
    blockStoreKey     = []byte("blockStore")
    blockPrefix       = []byte("B:")
    blockHeaderPrefix = []byte("BH:")
    txStatusPrefix    = []byte("BTS:")
)

blockStoreKey 主鏈狀態(tài)前綴

blockPrefix 塊信息前綴

blockHeaderPrefix 塊頭信息前綴

txStatusPrefix 交易狀態(tài)前綴

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函數(shù)最終會(huì)執(zhí)行l(wèi)ookup函數(shù)。lookup函數(shù)總共操作有兩步:

從緩存中查詢hash值,如果查到則返回

如果為從緩存中查詢到則回調(diào)fillFn回調(diào)函數(shù)。fillFn回調(diào)函數(shù)會(huì)將從磁盤上獲得到塊信息存儲(chǔ)到緩存中并返回該塊的信息。

fillFn回調(diào)函數(shù)實(shí)際上調(diào)取的是database/leveldb/store.go下的GetBlock,它會(huì)從磁盤中獲取block信息并返回。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/24242.html

相關(guān)文章

  • Derek解讀Bytom源碼-久化存儲(chǔ)LevelDB

    摘要:函數(shù)總共操作有兩步從緩存中查詢值,如果查到則返回如果為從緩存中查詢到則回調(diào)回調(diào)函數(shù)。回調(diào)函數(shù)會(huì)將從磁盤上獲得到塊信息存儲(chǔ)到緩存中并返回該塊的信息。回調(diào)函數(shù)實(shí)際上調(diào)取的是下的,它會(huì)從磁盤中獲取信息并返回。 作者:Derek 簡(jiǎn)介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc......

    Eminjannn 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-創(chuàng)世區(qū)塊

    摘要:作者簡(jiǎn)介地址地址本章介紹解讀源碼分析創(chuàng)世區(qū)塊作者使用操作系統(tǒng),其他平臺(tái)也大同小異創(chuàng)世區(qū)塊介紹區(qū)塊鏈里的第一個(gè)區(qū)塊創(chuàng)被稱為創(chuàng)世區(qū)塊。在比原鏈中創(chuàng)世區(qū)塊被硬編碼到中,每一個(gè)比原節(jié)點(diǎn)都始于同一個(gè)創(chuàng)世區(qū)塊,這能確保創(chuàng)世區(qū)塊不會(huì)被改變。 作者:Derek 簡(jiǎn)介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/By...

    王軍 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-啟動(dòng)與停止

    摘要:只有當(dāng)觸發(fā)了或才能終止進(jìn)程退出。退出時(shí)執(zhí)行如下操作會(huì)將挖礦功能停止,網(wǎng)絡(luò)停止等操作。 作者:Derek 簡(jiǎn)介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom代碼啟動(dòng)、節(jié)點(diǎn)初始化、及停止的過程 作者使用MacOS操作系統(tǒng),其他平臺(tái)也大同小異Golang V...

    Godtoy 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-Api Server接口服務(wù)

    摘要:首先讀取請(qǐng)求內(nèi)容,解析請(qǐng)求,接著匹配相應(yīng)的路由項(xiàng),隨后調(diào)用路由項(xiàng)的回調(diào)函數(shù)來處理。每一個(gè)路由項(xiàng)由請(qǐng)求方法和回調(diào)函數(shù)組成將監(jiān)聽地址作為參數(shù),最終執(zhí)行開始服務(wù)于外部請(qǐng)求創(chuàng)建對(duì)象首先,實(shí)例化對(duì)象。我們可以看到一條項(xiàng)由和對(duì)應(yīng)的回調(diào)函數(shù)組成。 作者:Derek 簡(jiǎn)介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com...

    GitCafe 評(píng)論0 收藏0
  • Derek解讀Bytom源碼-孤塊管理

    摘要:此時(shí)節(jié)點(diǎn)將放入到孤塊管理緩存池中,等待彼此的父塊。判斷當(dāng)前塊是否存在于區(qū)塊鏈上或是否存在孤塊緩存池中,如果存在則返回。比如當(dāng)前區(qū)塊高度為,則在孤塊緩存池中查詢是否有區(qū)塊高度為的區(qū)塊。 作者:Derek 簡(jiǎn)介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介紹bytom...

    Donne 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<