From 170ba4fc99fcc7fd9fa6f8d07553dfd9d94978cd Mon Sep 17 00:00:00 2001 From: Ryan Staudt Date: Thu, 29 Jul 2021 05:53:53 -0500 Subject: [PATCH] multi: Add auto revocations to agenda flags. This adds AFAutoRevocationsEnabled to blockchain.AgendaFlags, which may be set to indicate that the automatic ticket revocations agenda should be considered as active when checking a transaction so that any additional checks which depend on the agenda being active are applied. Additionally, this updates all references of blockchain.AgendaFlags to set AFAutoRevocationsEnabled if the automatic ticket revocations agenda is active. --- blockchain/validate.go | 22 ++++++++++++++++++++++ internal/mempool/mempool.go | 16 ++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/blockchain/validate.go b/blockchain/validate.go index 6d18b18f..c2955ab8 100644 --- a/blockchain/validate.go +++ b/blockchain/validate.go @@ -330,6 +330,12 @@ const ( // being active are applied. AFExplicitVerUpgrades + // AFAutoRevocationsEnabled may be set to indicate that the automatic ticket + // revocations agenda should be considered as active when checking a + // transaction so that any additional checks which depend on the agenda being + // active are applied. + AFAutoRevocationsEnabled + // AFNone is a convenience value to specifically indicate no flags. AFNone AgendaFlags = 0 ) @@ -346,6 +352,12 @@ func (flags AgendaFlags) IsExplicitVerUpgradesEnabled() bool { return flags&AFExplicitVerUpgrades == AFExplicitVerUpgrades } +// IsAutoRevocationsEnabled returns whether the flags indicate that the +// automatic ticket revocations agenda is enabled. +func (flags AgendaFlags) IsAutoRevocationsEnabled() bool { + return flags&AFAutoRevocationsEnabled == AFAutoRevocationsEnabled +} + // determineCheckTxFlags returns the flags to use when checking transactions // based on the agendas that are active as of the block AFTER the given node. func (b *BlockChain) determineCheckTxFlags(prevNode *blockNode) (AgendaFlags, error) { @@ -362,6 +374,13 @@ func (b *BlockChain) determineCheckTxFlags(prevNode *blockNode) (AgendaFlags, er return 0, err } + // Determine if the automatic ticket revocations agenda is active as of the + // block being checked. + isAutoRevocationsEnabled, err := b.isAutoRevocationsAgendaActive(prevNode) + if err != nil { + return 0, err + } + // Create and return agenda flags for checking transactions based on which // ones are active as of the block being checked. checkTxFlags := AFNone @@ -371,6 +390,9 @@ func (b *BlockChain) determineCheckTxFlags(prevNode *blockNode) (AgendaFlags, er if explicitUpgradesActive { checkTxFlags |= AFExplicitVerUpgrades } + if isAutoRevocationsEnabled { + checkTxFlags |= AFAutoRevocationsEnabled + } return checkTxFlags, nil } diff --git a/internal/mempool/mempool.go b/internal/mempool/mempool.go index 06d4f286..7eadfcf0 100644 --- a/internal/mempool/mempool.go +++ b/internal/mempool/mempool.go @@ -1795,6 +1795,11 @@ func (mp *TxPool) MaybeAcceptTransaction(tx *dcrutil.Tx, isNew, rateLimit bool) return nil, err } + isAutoRevocationsEnabled, err := mp.cfg.IsAutoRevocationsAgendaActive() + if err != nil { + return nil, err + } + // Create agenda flags for checking transactions based on which ones are // active or should otherwise always be enforced. // @@ -1803,6 +1808,9 @@ func (mp *TxPool) MaybeAcceptTransaction(tx *dcrutil.Tx, isNew, rateLimit bool) if isTreasuryEnabled { checkTxFlags |= blockchain.AFTreasuryEnabled } + if isAutoRevocationsEnabled { + checkTxFlags |= blockchain.AFAutoRevocationsEnabled + } // Protect concurrent access. mp.mtx.Lock() @@ -2041,6 +2049,11 @@ func (mp *TxPool) ProcessTransaction(tx *dcrutil.Tx, allowOrphan, rateLimit, all return nil, err } + isAutoRevocationsEnabled, err := mp.cfg.IsAutoRevocationsAgendaActive() + if err != nil { + return nil, err + } + // Create agenda flags for checking transactions based on which ones are // active or should otherwise always be enforced. // @@ -2049,6 +2062,9 @@ func (mp *TxPool) ProcessTransaction(tx *dcrutil.Tx, allowOrphan, rateLimit, all if isTreasuryEnabled { checkTxFlags |= blockchain.AFTreasuryEnabled } + if isAutoRevocationsEnabled { + checkTxFlags |= blockchain.AFAutoRevocationsEnabled + } // Protect concurrent access. mp.mtx.Lock()