{"record":{"id":"cab8f715d2c78775","repo":"ethereum/go-ethereum","slug":"clique-poa-sealing-not-supported-any-more","errorCode":null,"errorMessage":"clique (poa) sealing not supported any more","messagePattern":"clique \\(poa\\) sealing not supported any more","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"consensus/clique/clique.go","lineNumber":593,"sourceCode":"// Finalize implements consensus.Engine. There is no post-transaction\n// consensus rules in clique, do nothing here.\nfunc (c *Clique) Finalize(chain consensus.ChainHeaderReader, header *types.Header, state vm.StateDB, body *types.Body, blockAccessIndex uint32, bal *bal.ConstructionBlockAccessList) {\n\t// No block rewards in PoA, so the state remains as is\n}\n\n// Authorize injects a private key into the consensus engine to mint new blocks\n// with.\nfunc (c *Clique) Authorize(signer common.Address) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\tc.signer = signer\n}\n\n// Seal implements consensus.Engine, attempting to create a sealed block using\n// the local signing credentials.\nfunc (c *Clique) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error {\n\tpanic(\"clique (poa) sealing not supported any more\")\n}\n\n// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty\n// that a new block should have:\n// * DIFF_NOTURN(2) if BLOCK_NUMBER % SIGNER_COUNT != SIGNER_INDEX\n// * DIFF_INTURN(1) if BLOCK_NUMBER % SIGNER_COUNT == SIGNER_INDEX\nfunc (c *Clique) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int {\n\tsnap, err := c.snapshot(chain, parent.Number.Uint64(), parent.Hash(), nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\tc.lock.RLock()\n\tsigner := c.signer\n\tc.lock.RUnlock()\n\treturn calcDifficulty(snap, signer)\n}\n\nfunc calcDifficulty(snap *Snapshot, signer common.Address) *big.Int {","sourceCodeStart":575,"sourceCodeEnd":611,"githubUrl":"https://github.com/ethereum/go-ethereum/blob/6bb0588ad8e7f922e4ad5580f51265a4097af08f/consensus/clique/clique.go#L575-L611","documentation":"Clique's Seal implementation unconditionally panics with 'clique (poa) sealing not supported any more'. In this codebase, the Clique engine is retained for verifying/reading PoA chains while block production (sealing new blocks through consensus.Engine.Seal) has been removed, so any attempt to mint a Clique block crashes by design.","triggerScenarios":"Running a node configured to seal with clique (e.g. a miner/validator setup calling engine.Seal, --mine with clique without a supported sealer, or custom code invoking Seal on a *clique.Clique instance). Any path reaching clique.Seal panics.","commonSituations":"Old private-PoA setups or tutorials that used clique for block production upgraded to a version where sealing was removed; tools/tests that call Seal directly on the consensus engine.","solutions":["Do not attempt to seal with this engine; use it only to validate existing clique chains.","For a new private/consortium chain, use a consensus engine whose Seal is supported (e.g. a supported PoA/Aura-style engine in your fork) or an external signer design.","Remove --mine or validator sealing config targeting clique.","Pin to an older go-ethereum version if clique sealing is a hard requirement, while tracking the security tradeoff."],"exampleFix":"// before\nengine.Seal(chain, block, results, stop) // *clique.Clique -> panics\n\n// after\n// Use clique only for verification; produce blocks with a supported sealing engine.","handlingStrategy":"validation","validationCode":"// guard before any sealing call\nfunc canSeal(engine consensus.Engine) bool {\n\t_, ok := engine.(interface{ SealSupported() })\n\treturn ok // clique.Clique does not advertise sealing in this build\n}","typeGuard":"func isClique(e consensus.Engine) bool {\n\t_, ok := e.(*clique.Clique)\n\treturn ok\n}","tryCatchPattern":null,"preventionTips":["Never wire clique.Clique into a miner/sealer path.","Assert at startup that the configured engine supports sealing before enabling mining flags.","Track which engines are verify-only in this codebase version."],"tags":["go-ethereum","clique","consensus","sealing","panic"],"backgroundTag":null,"analyzedSha":"6bb0588ad8e7f922e4ad5580f51265a4097af08f","analyzedAt":"2026-08-15T10:06:53.996Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}