블록체인 자습서 Fabric1.0 소스 코드 분석 Ledger(장부) 2
Fabric 1.0 소스 코드 노트의 Ledger(장부)
PeerLedger 인터페이스에 포함된 commonledger를 추가합니다.Ledger 인터페이스는 다음과 같이 정의됩니다.
type Ledger interface {
GetBlockchainInfo() (*common.BlockchainInfo, error) // blockchain
GetBlockByNumber(blockNumber uint64) (*common.Block, error) // Block, math.MaxUint64 Block
GetBlocksIterator(startBlockNumber uint64) (ResultsIterator, error) // startBlockNumber ( startBlockNumber), , ledger block
Close() // ledger
Commit(block *common.Block) error // block
}
// common/ledger/ledger_interface.go
ValidatedLedger 인터페이스에 방법이 정의되지 않았습니다.PeerLedger에서 잘못된 거래를 선별한 후,ValidatedLedger는 최종 장부를 표시합니다.잠시 소홀히 하다.
QueryExecutor 인터페이스 정의: 질의를 수행하는 데 사용됩니다.여기서 Get* 방법은 KV-based 데이터 모델을 지원하는 데 사용되며, ExecuteQuery 방법은 더욱 풍부한 데이터와 조회 지원을 지원하는 데 사용됩니다.
type QueryExecutor interface {
GetState(namespace string, key string) ([]byte, error) // namespace key value, chaincode,chaincodeId namespace
GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error) // key
// , startKey、 endKeyd
GetStateRangeScanIterator(namespace string, startKey string, endKey string) (commonledger.ResultsIterator, error)
ExecuteQuery(namespace, query string) (commonledger.ResultsIterator, error) // , statedb
Done() // QueryExecutor
}
// core/ledger/ledger_interface.go
HistoryQueryExecutor 인터페이스 정의: 사용 내역 조회를 실행합니다.
type HistoryQueryExecutor interface {
GetHistoryForKey(namespace string, key string) (commonledger.ResultsIterator, error) // key
}
// core/ledger/ledger_interface.go
TxSimulator 인터페이스 정의: "최신"상태의 일관된 스냅샷에서 거래를 시뮬레이션합니다.여기서 Set* 방법은 KV-based 데이터 모델을 지원하는 데 사용되며, ExecuteUpdate 방법은 더욱 풍부한 데이터와 조회 지원을 지원하는 데 사용된다.
type TxSimulator interface {
QueryExecutor // QueryExecutor
SetState(namespace string, key string, value []byte) error // namespace key value
DeleteState(namespace string, key string) error // namespace key
SetStateMultipleKeys(namespace string, kvs map[string][]byte) error // key
ExecuteUpdate(query string) error //ExecuteUpdate
GetTxSimulationResults() ([]byte, error) //
}
// core/ledger/ledger_interface.go
4、kvledger.kvLedger 구조체 및 방법(PeerLedger 인터페이스 구현)
kvLedger 구조체 정의:
type kvLedger struct {
ledgerID string //ledgerID
blockStore blkstorage.BlockStore //blkstorage
txtmgmt txmgr.TxMgr //txmgr
historyDB historydb.HistoryDB //historyDB
}
// core/ledger/kvledger/kv_ledger.go
관련 방법은 다음과 같습니다.
// kvLedger
func newKVLedger(ledgerID string, blockStore blkstorage.BlockStore,versionedDB statedb.VersionedDB, historyDB historydb.HistoryDB) (*kvLedger, error)
// statedb historydb
func (l *kvLedger) recoverDBs() error
// , db ,
func (l *kvLedger) recommitLostBlocks(firstBlockNum uint64, lastBlockNum uint64, recoverables ...recoverable) error
// ID
func (l *kvLedger) GetTransactionByID(txID string) (*peer.ProcessedTransaction, error)
// BlockchainInfo
func (l *kvLedger) GetBlockchainInfo() (*common.BlockchainInfo, error)
//
func (l *kvLedger) GetBlockByNumber(blockNumber uint64) (*common.Block, error)
//
func (l *kvLedger) GetBlocksIterator(startBlockNumber uint64) (commonledger.ResultsIterator, error)
//
func (l *kvLedger) GetBlockByHash(blockHash []byte) (*common.Block, error)
// ID
func (l *kvLedger) GetBlockByTxID(txID string) (*common.Block, error)
// ID
func (l *kvLedger) GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error)
func (l *kvLedger) Prune(policy commonledger.PrunePolicy) error //
//
func (l *kvLedger) NewTxSimulator() (ledger.TxSimulator, error)
//
func (l *kvLedger) NewQueryExecutor() (ledger.QueryExecutor, error)
func (l *kvLedger) NewHistoryQueryExecutor() (ledger.HistoryQueryExecutor, error)
// , blkstorage, statedb, historyDB
func (l *kvLedger) Commit(block *common.Block) error
//
func (l *kvLedger) Close() //
// core/ledger/kvledger/kv_ledger.go
5、kvledger.Provider 구조체 및 방법(PeerLedgerProvider 인터페이스 구현)
Provider 구조체 정의:
type Provider struct {
idStore *idStore //idStore
blockStoreProvider blkstorage.BlockStoreProvider //blkstorage
vdbProvider statedb.VersionedDBProvider //statedb
historydbProvider historydb.HistoryDBProvider //historydb
}
// core/ledger/kvledger/kv_ledger_provider.go
4
// idStore、blockStoreProvider、vdbProvider historydbProvider, Provider, Ledger
func NewProvider() (ledger.PeerLedgerProvider, error)
// Ledger, ( blkstorage, statedb, historydb), ledgerID
func (provider *Provider) Create(genesisBlock *common.Block) (ledger.PeerLedger, error)
// provider.openInternal(ledgerID), Ledger
func (provider *Provider) Open(ledgerID string) (ledger.PeerLedger, error)
// ledgerID blkstorage、statedb historydb, kvledger
func (provider *Provider) openInternal(ledgerID string) (ledger.PeerLedger, error)
//ledgerID
func (provider *Provider) Exists(ledgerID string) (bool, error)
// ledgerID , provider.idStore.getAllLedgerIds()
func (provider *Provider) List() ([]string, error)
// idStore、blkstorage、statedb、historydb
func (provider *Provider) Close()
// Ledger,
func (provider *Provider) recoverUnderConstructionLedger()
func (provider *Provider) runCleanup(ledgerID string) error //
func panicOnErr(err error, mgsFormat string, args ...interface{}) //panicOnErr
// core/ledger/kvledger/kv_ledger_provider.go
6.ledgermgmt(Ledger 관리 함수)
글로벌 변수:
var openedLedgers map[string]ledger.PeerLedger //Ledger map,Key ChainID( ChannelId LedgerId)
var ledgerProvider ledger.PeerLedgerProvider //LedgerProvider
// core/ledger/ledgermgmt/ledger_mgmt.go
Ledger 관리 함수:
func Initialize() //Ledger , initialize(),once.Do
func initialize() //Ledger , openedLedgers ledgerProvider
// ledgerProvider.Create(genesisBlock) Ledger, openedLedgers
func CreateLedger(genesisBlock *common.Block) (ledger.PeerLedger, error)
// id Ledger, ledgerProvider.Open(id) Ledger
func OpenLedger(id string) (ledger.PeerLedger, error)
// ledgerID , ledgerProvider.List()
func GetLedgerIDs() ([]string, error)
// ledgerProvider
func Close()
// closableLedger
func wrapLedger(id string, l ledger.PeerLedger) ledger.PeerLedger
// core/ledger/ledgermgmt/ledger_mgmt.go
closableLedger:
type closableLedger struct {
id string
ledger.PeerLedger
}
func (l *closableLedger) Close() // l.closeWithoutLock()
func (l *closableLedger) closeWithoutLock() //delete(openedLedgers, l.id)
// core/ledger/ledgermgmt/ledger_mgmt.go
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.