Fabric2.0.0 區(qū)塊交易校驗流程解析

gossip/privdata/coordinator.goStoreBlock方法中分別對區(qū)塊交易和讀寫集進行了校驗,關鍵代碼如下:

// 此方法對區(qū)塊信息和交易簽名等進行了校驗
err := c.Validator.Validate(block)
......
......
// 此方法中對讀寫集進行了校驗
err = c.CommitLegacy(blockAndPvtData, &ledger.CommitOptions{})

區(qū)塊和交易校驗

先看區(qū)塊和交易的校驗峭弟,在core/committer/txvalidator/v20/validator.go中的Validate(block *common.Block)方法:

func (v *TxValidator) Validate(block *common.Block) error {
    var err error
    var errPos int

    startValidation := time.Now() // timer to log Validate block duration
    logger.Debugf("[%s] START Block Validation for block [%d]", v.ChannelID, block.Header.Number)

    // Initialize trans as valid here, then set invalidation reason code upon invalidation below
    txsfltr := ledgerUtil.NewTxValidationFlags(len(block.Data.Data))
    // array of txids
    txidArray := make([]string, len(block.Data.Data))

    results := make(chan *blockValidationResult)
    go func() {
        for tIdx, d := range block.Data.Data {
            // ensure that we don't have too many concurrent validation workers
            v.Semaphore.Acquire(context.Background())

            go func(index int, data []byte) {
                defer v.Semaphore.Release()

                v.validateTx(&blockValidationRequest{
                    d:     data,
                    block: block,
                    tIdx:  index,
                }, results)
            }(tIdx, d)
        }
    }()

讀寫集校驗

core/ledger/kvledger/kv_ledger.goCommitLegacy方法中

// 此處進行讀寫集校驗
txstatsInfo, updateBatchBytes, err := l.txtmgmt.ValidateAndPrepare(pvtdataAndBlock, true)

上述方法實現(xiàn)在core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/lockbased_txmgr.go

batch, txstatsInfo, err := txmgr.validator.ValidateAndPrepareBatch(blockAndPvtdata, doMVCCValidation)

實現(xiàn)在core/ledger/kvledger/txmgmt/validator/valimpl/default_impl.go

func (impl *DefaultImpl) ValidateAndPrepareBatch(blockAndPvtdata *ledger.BlockAndPvtData,
    doMVCCValidation bool) (*privacyenabledstate.UpdateBatch, []*txmgr.TxStatInfo, error) {
       // 此處進行第一次讀寫集校驗   levelDB為空校驗
    if internalBlock, txsStatInfo, err = preprocessProtoBlock(
        impl.txmgr,
        impl.db.ValidateKeyValue,
        block,
        doMVCCValidation,
        impl.customTxProcessors,
    ); err != nil {
        return nil, nil, err
    }
        // 此處進行讀寫集校驗攀芯,包括了“雙花”校驗等
    if pubAndHashUpdates, err = impl.internalValidator.ValidateAndPrepareBatch(internalBlock, doMVCCValidation); err != nil {
        return nil, nil, err
    }
        // 此處是隱私數(shù)據(jù)讀寫集校驗
    logger.Debug("validating rwset...")
    if pvtUpdates, err = validateAndPreparePvtBatch(
        internalBlock,
        impl.db,
        pubAndHashUpdates,
        blockAndPvtdata.PvtData,
        impl.customTxProcessors,
    ); err != nil {
        return nil, nil, err
    }

}

跟到core/ledger/kvledger/txmgmt/validator/statebasedval/state_based_validator.go中的validateEndorserTX方法

func (v *Validator) validateEndorserTX(
    txRWSet *rwsetutil.TxRwSet,
    doMVCCValidation bool,
    updates *internal.PubAndHashUpdates) (peer.TxValidationCode, error) {

    var validationCode = peer.TxValidationCode_VALID
    var err error
    // 此處進行MVCC校驗  
    if doMVCCValidation {
        validationCode, err = v.validateTx(txRWSet, updates)
    }
    return validationCode, err
}

MVCC Check是在讀取賬本中的鍵值對時進行的一種檢查機制屯断。在Hyperledger Fabric中,賬本的每個版本都有一個對應的版本號侣诺,稱為“交易編號”(transaction ID)殖演。在讀取賬本中的某個鍵值對時,Peer節(jié)點首先獲取當前賬本中該鍵的最新版本號年鸳,并將該版本號與請求讀取該鍵的事務的版本號進行比較剃氧,如果兩個版本號相同,則表示讀取操作是有效的阻星。如果事務的版本號小于最新版本號朋鞍,則Peer節(jié)點會拒絕讀取請求已添,因為該事務讀取的版本已經(jīng)過期,不再是當前有效的版本滥酥。

func (v *Validator) validateTx(txRWSet *rwsetutil.TxRwSet, updates *internal.PubAndHashUpdates) (peer.TxValidationCode, error) {
    // Uncomment the following only for local debugging. Don't want to print data in the logs in production
    //logger.Debugf("validateTx - validating txRWSet: %s", spew.Sdump(txRWSet))
    for _, nsRWSet := range txRWSet.NsRwSets {
        ns := nsRWSet.NameSpace
        // Validate public reads
        if valid, err := v.validateReadSet(ns, nsRWSet.KvRwSet.Reads, updates.PubUpdates); !valid || err != nil {
            if err != nil {
                return peer.TxValidationCode(-1), err
            }
            return peer.TxValidationCode_MVCC_READ_CONFLICT, nil
        }
        // Validate range queries for phantom items
        if valid, err := v.validateRangeQueries(ns, nsRWSet.KvRwSet.RangeQueriesInfo, updates.PubUpdates); !valid || err != nil {
            if err != nil {
                return peer.TxValidationCode(-1), err
            }
            return peer.TxValidationCode_PHANTOM_READ_CONFLICT, nil
        }
        // Validate hashes for private reads
        if valid, err := v.validateNsHashedReadSets(ns, nsRWSet.CollHashedRwSets, updates.HashUpdates); !valid || err != nil {
            if err != nil {
                return peer.TxValidationCode(-1), err
            }
            return peer.TxValidationCode_MVCC_READ_CONFLICT, nil
        }
    }
    return peer.TxValidationCode_VALID, nil
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末更舞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坎吻,更是在濱河造成了極大的恐慌缆蝉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦真,死亡現(xiàn)場離奇詭異刊头,居然都是意外死亡,警方通過查閱死者的電腦和手機诸尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門原杂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人您机,你說我怎么就攤上這事穿肄。” “怎么了际看?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵咸产,是天一觀的道長。 經(jīng)常有香客問我仲闽,道長脑溢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任赖欣,我火速辦了婚禮焚志,結果婚禮上,老公的妹妹穿的比我還像新娘畏鼓。我一直安慰自己酱酬,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布云矫。 她就那樣靜靜地躺著膳沽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪让禀。 梳的紋絲不亂的頭發(fā)上挑社,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音巡揍,去河邊找鬼痛阻。 笑死,一個胖子當著我的面吹牛腮敌,可吹牛的內(nèi)容都是我干的阱当。 我是一名探鬼主播俏扩,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弊添!你這毒婦竟也來了录淡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤油坝,失蹤者是張志新(化名)和其女友劉穎嫉戚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈圈,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡彬檀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞬女。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍帝。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拆魏,靈堂內(nèi)的尸體忽然破棺而出盯桦,到底是詐尸還是另有隱情慈俯,我是刑警寧澤渤刃,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站贴膘,受9級特大地震影響卖子,放射性物質發(fā)生泄漏。R本人自食惡果不足惜刑峡,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一洋闽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧突梦,春花似錦诫舅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娃闲,卻和暖如春虚汛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皇帮。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工卷哩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人属拾。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓将谊,卻偏偏與公主長得像冷溶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓢娜,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. fabric服務架構 api: 服務的grpc接口和http接口 sdk:不同開發(fā)語言的軟件工具開發(fā)包 fa...
    開心的羊咩咩閱讀 482評論 0 1
  • Fabric基本概念 Fabric (Hyperledger fabric) 是由 IBM 貢獻的超級賬本框架:利...
    WULG閱讀 1,958評論 0 0
  • 介紹完Bitcoin P2P網(wǎng)絡的組網(wǎng)機制后挂洛,本文將介紹Peer之間交換的協(xié)議消息。Bitcoin節(jié)點將Trans...
    oceanken閱讀 2,692評論 4 6
  • Hyperledger fabric基本概念 首先fabric是由IBM貢獻的超級賬本框架眠砾。它是一個利用現(xiàn)有成熟的...
    dingtom閱讀 75,340評論 0 27
  • 聲明 這是一篇信息整合的文章虏劲,80%的內(nèi)容來自Fabric官方文檔和網(wǎng)絡文章,在此基礎上整理和修改褒颈,剩下20%為操...
    小蝸牛爬樓梯閱讀 2,267評論 0 1