{"record":{"id":"1816c40efd518d1e","repo":"hyperledger/fabric","slug":"unexpected-block-type-t","errorCode":null,"errorMessage":"unexpected block type: %T","messagePattern":"unexpected block type: %T","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/pkg/gateway/event/blockiterator.go","lineNumber":34,"sourceCode":"}\n\nfunc NewBlockIterator(iterator ledger.ResultsIterator) *BlockIterator {\n\treturn &BlockIterator{\n\t\tledgerIter: iterator,\n\t}\n}\n\nfunc (iter *BlockIterator) Next() (*Block, error) {\n\tresult, err := iter.ledgerIter.Next()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch block := result.(type) {\n\tcase *common.Block:\n\t\treturn NewBlock(block), nil\n\tdefault:\n\t\treturn nil, errors.Errorf(\"unexpected block type: %T\", result)\n\t}\n}\n\nfunc (iter *BlockIterator) Close() {\n\titer.ledgerIter.Close()\n}\n","sourceCodeStart":16,"sourceCodeEnd":41,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/pkg/gateway/event/blockiterator.go#L16-L41","documentation":"BlockIterator.Next in internal/pkg/gateway/event asserts that the underlying ledger iterator yields *common.Block. Any other concrete type behind the QueryResultsIterator interface reaches the default branch and produces this errors.Errorf with the actual Go type. It is an internal invariant check: the gateway event service only expects blocks.","triggerScenarios":"Registering/iterating a chaincode event or filtered-block stream where the ledger iterator returns a value that is neither *common.Block nor already a fabric Block — i.e. a type other than *common.Block surfaces from the ledger's QueryResultsIterator.","commonSituations":"Fabric source modifications or custom ledger/queryresult implementations returning non-block results; mixing iterators across ledgers/components with different result types; test doubles or mocks returning unexpected types.","solutions":["Ensure the iterator was created from a ledger query that returns blocks (GetBlocksIterator), not kv/query results","Check for custom or patched ledger components returning non-standard result types","Update/align Fabric component versions so the ledger and gateway event service agree on the block type"],"exampleFix":"// before\niter := ledger.NewQueryIterator(...) // returns KV results\n// after\niter, _ := ledger.GetBlocksIterator() // returns *common.Block entries","handlingStrategy":"type-guard","validationCode":"// before consuming, ensure the iterator source yields blocks\n// e.g. use ledger.GetBlocksIterator rather than a generic state/query iterator","typeGuard":"func asBlock(v interface{}) (*fabric.Block, bool) {\n    b, ok := v.(*common.Block)\n    return fabric.NewBlock(b), ok\n}","tryCatchPattern":"blk, err := iter.Next()\nif err != nil {\n    if strings.Contains(err.Error(), \"unexpected block type\") {\n        log.Printf(\"iterator yielded non-block result: %v\", err)\n        return errBlockIteratorMisused\n    }\n    return err\n}","preventionTips":["Use ledger block iterators (GetBlocksIterator) for the gateway event service","Do not swap in mocks or custom iterators returning other result types in production","Keep Fabric components at compatible versions so iterator result types are consistent"],"tags":["fabric","gateway","events","type-mismatch","iterator"],"backgroundTag":"unexpected-type-assertion","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}