Fabric2.0.0 区块交易校验流程解析

gossip/privdata/coordinator.goStoreBlock方法中分别对区块交易和读写集进行了校验,关键代码如下:

// 此方法对区块信息和交易签名等进行了校验
err := c.Validator.Validate(block)
......
......
// 此方法中对读写集进行了校验
err = c.CommitLegacy(blockAndPvtData, &ledger.CommitOptions{})

区块和交易校验

先看区块和交易的校验,在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)

上述方法实现在core/ledger/kvledger/txmgmt/txmgr/lockbasedtxmgr/lockbased_txmgr.go

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

实现在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
    }
        // 此处是隐私数据读写集校验
    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节点首先获取当前账本中该键的最新版本号,并将该版本号与请求读取该键的事务的版本号进行比较,如果两个版本号相同,则表示读取操作是有效的。如果事务的版本号小于最新版本号,则Peer节点会拒绝读取请求,因为该事务读取的版本已经过期,不再是当前有效的版本。

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
}
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 1. fabric服务架构 api: 服务的grpc接口和http接口 sdk:不同开发语言的软件工具开发包 fa...
    开心的羊咩咩阅读 469评论 0 1
  • Fabric基本概念 Fabric (Hyperledger fabric) 是由 IBM 贡献的超级账本框架:利...
    WULG阅读 1,920评论 0 0
  • 介绍完Bitcoin P2P网络的组网机制后,本文将介绍Peer之间交换的协议消息。Bitcoin节点将Trans...
    oceanken阅读 2,673评论 4 6
  • Hyperledger fabric基本概念 首先fabric是由IBM贡献的超级账本框架。它是一个利用现有成熟的...
    dingtom阅读 75,199评论 0 27
  • 声明 这是一篇信息整合的文章,80%的内容来自Fabric官方文档和网络文章,在此基础上整理和修改,剩下20%为操...
    小蜗牛爬楼梯阅读 2,207评论 0 1