Skip to content

Commit 35937fc

Browse files
Re-organise (#1062)
1 parent 2a83ebc commit 35937fc

5 files changed

Lines changed: 85 additions & 1 deletion

File tree

consensus/consensus_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,25 @@ func TestValidateBlockBody(t *testing.T) {
638638
assert.Equal(t, expected, err)
639639
},
640640
},
641+
{
642+
"TxDelegatorBlocked", func(t *testing.T) {
643+
thor.MockBlocklist([]string{genesis.DevAccounts()[9].Address.String()})
644+
builder := txBuilder(tc.tag)
645+
builder = builder.Features(tx.Features(0x01))
646+
trx := tx.MustSignDelegated(builder.Build(), genesis.DevAccounts()[8].PrivateKey, genesis.DevAccounts()[9].PrivateKey)
647+
blk, err := tc.sign(
648+
tc.builder(tc.original.Header()).Transaction(trx),
649+
)
650+
if err != nil {
651+
t.Fatal(err)
652+
}
653+
err = tc.consent(blk)
654+
expected := consensusError(
655+
fmt.Sprintf("tx delegator blocked got packed: %v", genesis.DevAccounts()[9].Address),
656+
)
657+
assert.Equal(t, expected, err)
658+
},
659+
},
641660
{
642661
"TxSignerUnavailable", func(t *testing.T) {
643662
tx := txBuilder(tc.tag).Build()

consensus/validator.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,14 @@ func (c *Consensus) validateBlockBody(blk *block.Block) error {
237237
return consensusError(fmt.Sprintf("tx origin blocked got packed: %v", origin))
238238
}
239239

240+
delegator, err := tx.Delegator()
241+
if err != nil {
242+
return consensusError(fmt.Sprintf("tx delegator unavailable: %v", err))
243+
}
244+
if header.Number() >= c.forkConfig.BLOCKLIST && delegator != nil && thor.IsOriginBlocked(*delegator) {
245+
return consensusError(fmt.Sprintf("tx delegator blocked got packed: %v", delegator))
246+
}
247+
240248
switch {
241249
case tx.ChainTag() != c.repo.ChainTag():
242250
return consensusError(fmt.Sprintf("tx chain tag mismatch: want %v, have %v", c.repo.ChainTag(), tx.ChainTag()))

packer/flow.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ func (f *Flow) Adopt(tx *tx.Transaction) error {
9696
return badTxError{"tx origin blocked"}
9797
}
9898

99+
delegator, err := tx.Delegator()
100+
if err != nil {
101+
return badTxError{"delegator cannot be extracted"}
102+
}
103+
if f.Number() >= f.packer.forkConfig.BLOCKLIST && delegator != nil && thor.IsOriginBlocked(*delegator) {
104+
return badTxError{"tx delegator blocked"}
105+
}
106+
99107
if err := tx.TestFeatures(f.features); err != nil {
100108
return badTxError{err.Error()}
101109
}

packer/flow_test.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func TestAdoptErr(t *testing.T) {
154154
addr := thor.BytesToAddress([]byte("to"))
155155
clause := tx.NewClause(&addr).WithValue(big.NewInt(10000))
156156

157-
pkr := packer.New(repo, stater, genesis.DevAccounts()[0].Address, &genesis.DevAccounts()[0].Address, thor.NoFork)
157+
pkr := packer.New(repo, stater, genesis.DevAccounts()[0].Address, &genesis.DevAccounts()[0].Address, thor.SoloFork)
158158
sum, _ := repo.GetBlockSummary(b.Header().ID())
159159

160160
flow, _ := pkr.Schedule(sum, uint64(time.Now().Unix()))
@@ -179,4 +179,38 @@ func TestAdoptErr(t *testing.T) {
179179
if err := flow.Adopt(tx3); err.Error() != expectedErrorMessage {
180180
t.Fatalf("Expected error message: '%s', but got: '%s'", expectedErrorMessage, err.Error())
181181
}
182+
183+
thor.MockBlocklist([]string{genesis.DevAccounts()[9].Address.String()})
184+
// Test origin blacklisted
185+
builder := new(tx.Builder).
186+
ChainTag(repo.ChainTag()).
187+
GasPriceCoef(1).
188+
Expiration(0).
189+
Gas(10e18).
190+
Nonce(nonce).
191+
Clause(clause).
192+
BlockRef(tx.NewBlockRef(1))
193+
tx4 := tx.MustSign(builder.Build(), genesis.DevAccounts()[9].PrivateKey)
194+
195+
expectedErrorMessage = "bad tx: tx origin blocked"
196+
if err := flow.Adopt(tx4); err.Error() != expectedErrorMessage {
197+
t.Fatalf("Expected error message: '%s', but got: '%s'", expectedErrorMessage, err.Error())
198+
}
199+
200+
// Test delegator blacklisted
201+
builder = new(tx.Builder).
202+
ChainTag(repo.ChainTag()).
203+
GasPriceCoef(1).
204+
Expiration(0).
205+
Gas(10e18).
206+
Nonce(nonce).
207+
Clause(clause).
208+
Features(tx.Features(0x01)).
209+
BlockRef(tx.NewBlockRef(1))
210+
tx5 := tx.MustSignDelegated(builder.Build(), genesis.DevAccounts()[8].PrivateKey, genesis.DevAccounts()[9].PrivateKey)
211+
212+
expectedErrorMessage = "bad tx: tx delegator blocked"
213+
if err := flow.Adopt(tx5); err.Error() != expectedErrorMessage {
214+
t.Fatalf("Expected error message: '%s', but got: '%s'", expectedErrorMessage, err.Error())
215+
}
182216
}

txpool/tx_pool.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ func (p *TxPool) add(newTx *tx.Transaction, rejectNonExecutable bool, localSubmi
219219
return nil
220220
}
221221

222+
delegator, _ := newTx.Delegator()
223+
if delegator != nil && (thor.IsOriginBlocked(*delegator) || p.blocklist.Contains(*delegator)) {
224+
return nil
225+
}
226+
222227
headSummary := p.repo.BestBlockSummary()
223228

224229
// validation
@@ -355,6 +360,10 @@ func (p *TxPool) Fill(txs tx.Transactions) {
355360
if thor.IsOriginBlocked(origin) || p.blocklist.Contains(origin) {
356361
continue
357362
}
363+
delegator, _ := tx.Delegator()
364+
if delegator != nil && (thor.IsOriginBlocked(*delegator) || p.blocklist.Contains(*delegator)) {
365+
continue
366+
}
358367
// here we ignore errors
359368
if txObj, err := resolveTx(tx, false); err == nil {
360369
txObjs = append(txObjs, txObj)
@@ -418,6 +427,12 @@ func (p *TxPool) wash(headSummary *chain.BlockSummary) (executables tx.Transacti
418427
logger.Trace("tx washed out", "id", txObj.ID(), "err", "blocked")
419428
continue
420429
}
430+
delegator := txObj.Delegator()
431+
if delegator != nil && (thor.IsOriginBlocked(*delegator) || p.blocklist.Contains(*delegator)) {
432+
toRemove = append(toRemove, txObj)
433+
logger.Trace("tx washed out", "id", txObj.ID(), "err", "blocked delegator")
434+
continue
435+
}
421436

422437
// out of lifetime
423438
if !txObj.localSubmitted && now > txObj.timeAdded+int64(p.options.MaxLifetime) {

0 commit comments

Comments
 (0)