Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit 09112b6

Browse files
committed
Mark filtered blocks invalid
1 parent b03ce6a commit 09112b6

File tree

1 file changed

+61
-52
lines changed

1 file changed

+61
-52
lines changed

pkg/protocol/engine/filter/postsolidfilter/postsolidblockfilter/post_solid_block_filter.go

+61-52
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
6060
for _, parentID := range block.Parents() {
6161
parent, exists := c.blockCacheRetrieveFunc(parentID)
6262
if !exists {
63-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
64-
Block: block,
65-
Reason: ierrors.Join(iotago.ErrBlockParentNotFound, ierrors.Errorf("parent %s of block %s is not known", parentID, block.ID())),
66-
})
63+
c.filterBlock(
64+
block,
65+
ierrors.Join(iotago.ErrBlockParentNotFound, ierrors.Errorf("parent %s of block %s is not known", parentID, block.ID())),
66+
)
6767

6868
return
6969
}
7070

7171
if !block.IssuingTime().After(parent.IssuingTime()) {
72-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
73-
Block: block,
74-
Reason: ierrors.Join(iotago.ErrBlockIssuingTimeNonMonotonic, ierrors.Errorf("block %s issuing time %s not greater than parent's %s issuing time %s", block.ID(), block.IssuingTime(), parentID, parent.IssuingTime())),
75-
})
72+
c.filterBlock(
73+
block,
74+
ierrors.Join(iotago.ErrBlockIssuingTimeNonMonotonic, ierrors.Errorf("block %s issuing time %s not greater than parent's %s issuing time %s", block.ID(), block.IssuingTime(), parentID, parent.IssuingTime())),
75+
)
7676

7777
return
7878
}
@@ -84,18 +84,18 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
8484
// check if the account exists in the specified slot.
8585
accountData, exists, err := c.accountRetrieveFunc(block.ProtocolBlock().Header.IssuerID, block.SlotCommitmentID().Slot())
8686
if err != nil {
87-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
88-
Block: block,
89-
Reason: ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Wrapf(err, "could not retrieve account information for block issuer %s", block.ProtocolBlock().Header.IssuerID)),
90-
})
87+
c.filterBlock(
88+
block,
89+
ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Wrapf(err, "could not retrieve account information for block issuer %s", block.ProtocolBlock().Header.IssuerID)),
90+
)
9191

9292
return
9393
}
9494
if !exists {
95-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
96-
Block: block,
97-
Reason: ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Errorf("block issuer account %s does not exist in slot commitment %s", block.ProtocolBlock().Header.IssuerID, block.ProtocolBlock().Header.SlotCommitmentID.Slot())),
98-
})
95+
c.filterBlock(
96+
block,
97+
ierrors.Join(iotago.ErrIssuerAccountNotFound, ierrors.Errorf("block issuer account %s does not exist in slot commitment %s", block.ProtocolBlock().Header.IssuerID, block.ProtocolBlock().Header.SlotCommitmentID.Slot())),
98+
)
9999

100100
return
101101
}
@@ -105,26 +105,26 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
105105
rmcSlot := block.ProtocolBlock().Header.SlotCommitmentID.Slot()
106106
rmc, err := c.rmcRetrieveFunc(rmcSlot)
107107
if err != nil {
108-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
109-
Block: block,
110-
Reason: ierrors.Join(iotago.ErrRMCNotFound, ierrors.Wrapf(err, "could not retrieve RMC for slot commitment %s", rmcSlot)),
111-
})
108+
c.filterBlock(
109+
block,
110+
ierrors.Join(iotago.ErrRMCNotFound, ierrors.Wrapf(err, "could not retrieve RMC for slot commitment %s", rmcSlot)),
111+
)
112112

113113
return
114114
}
115115
if basicBlock, isBasic := block.BasicBlock(); isBasic {
116116
manaCost, err := block.ProtocolBlock().ManaCost(rmc)
117117
if err != nil {
118-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
119-
Block: block,
120-
Reason: ierrors.Join(iotago.ErrFailedToCalculateManaCost, ierrors.Wrapf(err, "could not calculate Mana cost for block")),
121-
})
118+
c.filterBlock(
119+
block,
120+
ierrors.Join(iotago.ErrFailedToCalculateManaCost, ierrors.Wrapf(err, "could not calculate Mana cost for block")),
121+
)
122122
}
123123
if basicBlock.MaxBurnedMana < manaCost {
124-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
125-
Block: block,
126-
Reason: ierrors.Join(iotago.ErrBurnedInsufficientMana, ierrors.Errorf("block issuer account %s burned insufficient Mana, required %d, burned %d", block.ProtocolBlock().Header.IssuerID, manaCost, basicBlock.MaxBurnedMana)),
127-
})
124+
c.filterBlock(
125+
block,
126+
ierrors.Join(iotago.ErrBurnedInsufficientMana, ierrors.Errorf("block issuer account %s burned insufficient Mana, required %d, burned %d", block.ProtocolBlock().Header.IssuerID, manaCost, basicBlock.MaxBurnedMana)),
127+
)
128128

129129
return
130130
}
@@ -134,10 +134,10 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
134134
// Check that the issuer of this block has non-negative block issuance credit
135135
{
136136
if accountData.Credits.Value < 0 {
137-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
138-
Block: block,
139-
Reason: ierrors.Wrapf(iotago.ErrAccountLocked, "block issuer account %s", block.ProtocolBlock().Header.IssuerID),
140-
})
137+
c.filterBlock(
138+
block,
139+
ierrors.Wrapf(iotago.ErrAccountLocked, "block issuer account %s", block.ProtocolBlock().Header.IssuerID),
140+
)
141141

142142
return
143143
}
@@ -146,10 +146,10 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
146146
// Check that the account is not expired
147147
{
148148
if accountData.ExpirySlot < block.ProtocolBlock().Header.SlotCommitmentID.Slot() {
149-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
150-
Block: block,
151-
Reason: ierrors.Wrapf(iotago.ErrAccountExpired, "block issuer account %s is expired, expiry slot %d in commitment %d", block.ProtocolBlock().Header.IssuerID, accountData.ExpirySlot, block.ProtocolBlock().Header.SlotCommitmentID.Slot()),
152-
})
149+
c.filterBlock(
150+
block,
151+
ierrors.Wrapf(iotago.ErrAccountExpired, "block issuer account %s is expired, expiry slot %d in commitment %d", block.ProtocolBlock().Header.IssuerID, accountData.ExpirySlot, block.ProtocolBlock().Header.SlotCommitmentID.Slot()),
152+
)
153153

154154
return
155155
}
@@ -162,36 +162,36 @@ func (c *PostSolidBlockFilter) ProcessSolidBlock(block *blocks.Block) {
162162
expectedBlockIssuerKey := iotago.Ed25519PublicKeyHashBlockIssuerKeyFromPublicKey(signature.PublicKey)
163163

164164
if !accountData.BlockIssuerKeys.Has(expectedBlockIssuerKey) {
165-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
166-
Block: block,
167-
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "block issuer account %s does not have block issuer key corresponding to public key %s in slot %d", block.ProtocolBlock().Header.IssuerID, hexutil.EncodeHex(signature.PublicKey[:]), block.ProtocolBlock().Header.SlotCommitmentID.Index()),
168-
})
165+
c.filterBlock(
166+
block,
167+
ierrors.Wrapf(iotago.ErrInvalidSignature, "block issuer account %s does not have block issuer key corresponding to public key %s in slot %d", block.ProtocolBlock().Header.IssuerID, hexutil.EncodeHex(signature.PublicKey[:]), block.ProtocolBlock().Header.SlotCommitmentID.Index()),
168+
)
169169

170170
return
171171
}
172172

173173
signingMessage, err := block.ProtocolBlock().SigningMessage()
174174
if err != nil {
175-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
176-
Block: block,
177-
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "error: %s", err.Error()),
178-
})
175+
c.filterBlock(
176+
block,
177+
ierrors.Wrapf(iotago.ErrInvalidSignature, "error: %s", err.Error()),
178+
)
179179

180180
return
181181
}
182182
if !hiveEd25519.Verify(signature.PublicKey[:], signingMessage, signature.Signature[:]) {
183-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
184-
Block: block,
185-
Reason: iotago.ErrInvalidSignature,
186-
})
183+
c.filterBlock(
184+
block,
185+
iotago.ErrInvalidSignature,
186+
)
187187

188188
return
189189
}
190190
default:
191-
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
192-
Block: block,
193-
Reason: ierrors.Wrapf(iotago.ErrInvalidSignature, "only ed25519 signatures supported, got %s", block.ProtocolBlock().Signature.Type()),
194-
})
191+
c.filterBlock(
192+
block,
193+
ierrors.Wrapf(iotago.ErrInvalidSignature, "only ed25519 signatures supported, got %s", block.ProtocolBlock().Signature.Type()),
194+
)
195195

196196
return
197197
}
@@ -207,3 +207,12 @@ func (c *PostSolidBlockFilter) Reset() { /* nothing to reset but comply with int
207207
func (c *PostSolidBlockFilter) Shutdown() {
208208
c.TriggerStopped()
209209
}
210+
211+
func (c *PostSolidBlockFilter) filterBlock(block *blocks.Block, reason error) {
212+
block.SetInvalid()
213+
214+
c.events.BlockFiltered.Trigger(&postsolidfilter.BlockFilteredEvent{
215+
Block: block,
216+
Reason: reason,
217+
})
218+
}

0 commit comments

Comments
 (0)