block底層儲存方式
Header和Block的主要成員變數,最終還是要儲存在底層資料庫中。Ethereum 選用的是LevelDB, 屬於非關係型資料庫,儲存單元是[k,v]鍵值對。
//core/database_util.go
var (
headHeaderKey = []byte("LastHeader")
headBlockKey = []byte("LastBlock")
headFastKey = []byte("LastFast")
trieSyncKey = []byte("TrieSync")
// Data item prefixes (use single byte to avoid mixing data types, avoid `i`).
headerPrefix = []byte("h") // headerPrefix + num (uint64 big endian) + hash -> header
tdSuffix = []byte("t") // headerPrefix + num (uint64 big endian) + hash + tdSuffix -> td
numSuffix = []byte("n") // headerPrefix + num (uint64 big endian) + numSuffix -> hash
blockHashPrefix = []byte("H") // blockHashPrefix + hash -> num (uint64 big endian)
bodyPrefix = []byte("b") // bodyPrefix + num (uint64 big endian) + hash -> block body
blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts
lookupPrefix = []byte("l") // lookupPrefix + hash -> transaction/receipt lookup metadata
bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits
preimagePrefix = "secure-key-" // preimagePrefix + hash -> preimage
configPrefix = []byte("ethereum-config-") // config prefix for the db
// Chain index prefixes (use `i` + single byte to avoid mixing data types).
BloomBitsIndexPrefix = []byte("iB") // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress
// used by old db, now only used for conversion
oldReceiptsPrefix = []byte("receipts-")
oldTxMetaSuffix = []byte{0x01}
ErrChainConfigNotFound = errors.New("ChainConfig not found") // general config not found error
preimageCounter = metrics.NewRegisteredCounter("db/preimage/total", nil)
preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil)
)
| key | value |
| 'h' + num + hash | header's RLP raw data |
| 'h' + num + hash + 't' | td |
| 'h' + num + 'n' | hash |
| 'H' + hash | num |
| 'b' + num + hash | body's RLP raw data |
| 'r' + num + hash | receipts RLP |
| 'l' + hash | tx/receipt lookup metadata |
這裡的hash就是該Block(或Header)物件的RLP雜湊值,在程式碼中也被稱為canonical hash;num是Number的uint64型別,大端(big endian)整型數。可以發現,num 和 hash是key中出現最多的成分;同時num和hash還分別作為value被單獨儲存,而每當此時則另一方必組成key。這些資訊都在強烈的暗示,num(Number)和hash是Block最為重要的兩個屬性:num用來確定Block在整個區塊鏈中所處的位置,hash用來辨識惟一的Block/Header物件。
通過以上的設計,Block結構體的所有重要成員,都被儲存進了底層資料庫。當所有Block物件的資訊都已經寫進資料庫後,我們就可以使用BlockChain結構體來處理整個塊鏈。
2
相關文章
- block底層淺談BloC
- Apache Druid底層儲存設計ApacheUI
- iOS底層原理 - Block本質探究iOSBloC
- RocketMQ高效能之底層儲存設計MQ
- TiDB 底層儲存結構 LSM 樹原理介紹TiDB
- Redis(一):基本資料型別與底層儲存結構Redis資料型別
- 理清 Block 底層結構及其捕獲行為BloC
- Block型別及儲存區域BloC型別
- rocket mq 底層儲存原始碼分析(2)-業務訊息持久化MQ原始碼持久化
- android 儲存方式Android
- mysql儲存引擎InnoDB詳解,從底層看清InnoDB資料結構MySql儲存引擎資料結構
- MySQL索引及優化(1)儲存引擎和底層資料結構MySql索引優化儲存引擎資料結構
- MySQL之儲存引擎InnoDB和MyISAM的區別及底層詳解MySql儲存引擎
- oracle底層字典表obj$及source$與儲存過程procedure系列一OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列二OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列三OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列四OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列五OracleOBJ儲存過程
- TiFlash 儲存層概覽
- 雲端儲存抽象層-FluentStorage抽象
- iOS底層原理總結 - 探尋block的本質(二)iOSBloC
- iOS底層原理總結 - 探尋block的本質(一)iOSBloC
- session會話的底層實現方式Session會話
- java 資料儲存方式Java
- HP-lefthand底層結構詳解及儲存災難資料恢復資料恢復
- 三層儲存技術保障雲服務的儲存安全
- 日期的正確儲存方式
- 儲存器的層次結構
- 資料上鍊儲存,深圳區塊鏈技術底層應用落地服務區塊鏈
- OceanBase 儲存層程式碼解讀(三)巨集塊儲存格式
- OceanBase 儲存層程式碼解讀(二)微塊儲存格式
- 資料儲存的方式(只說三種方式)
- OC底層探索(十六) KVO底層原理
- 資料儲存的三種方式
- Java常見的本地儲存方式Java
- JavaScript本地儲存的方式有哪些JavaScript
- 如何構建通用儲存中間層
- 六、層次結構儲存系統