Skip to content

Commit e009434

Browse files
Minor improvments and test
1 parent beba88c commit e009434

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

system_tests/tx_address_filter_test.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ package arbtest
55

66
import (
77
"context"
8+
"crypto/sha256"
89
"math/big"
910
"strings"
1011
"testing"
1112

1213
"github.com/ethereum/go-ethereum/common"
1314
"github.com/ethereum/go-ethereum/crypto"
1415

16+
"github.com/offchainlabs/nitro/restrictedaddr"
1517
"github.com/offchainlabs/nitro/solgen/go/localgen"
1618
"github.com/offchainlabs/nitro/txfilter"
1719
)
@@ -23,6 +25,19 @@ func isFilteredError(err error) bool {
2325
return strings.Contains(err.Error(), "internal error")
2426
}
2527

28+
func newHashedChecker(addrs []common.Address) *txfilter.HashedAddressChecker {
29+
store := restrictedaddr.NewHashStore()
30+
if len(addrs) > 0 {
31+
salt := []byte("test-salt")
32+
hashes := make([][32]byte, len(addrs))
33+
for i, addr := range addrs {
34+
hashes[i] = sha256.Sum256(append(salt, addr.Bytes()...))
35+
}
36+
store.Load(salt, hashes, "test")
37+
}
38+
return txfilter.NewDefaultHashedAddressChecker(store)
39+
}
40+
2641
func TestAddressFilterDirectTransfer(t *testing.T) {
2742
ctx, cancel := context.WithCancel(context.Background())
2843
defer cancel()
@@ -42,7 +57,7 @@ func TestAddressFilterDirectTransfer(t *testing.T) {
4257

4358
// Set up address filter to block FilteredUser
4459
filteredAddr := builder.L2Info.GetAddress("FilteredUser")
45-
filter := txfilter.NewStaticAsyncChecker([]common.Address{filteredAddr})
60+
filter := newHashedChecker([]common.Address{filteredAddr})
4661
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
4762

4863
// Test 1: Transaction TO a filtered address should fail
@@ -105,7 +120,7 @@ func TestAddressFilterCall(t *testing.T) {
105120
targetAddr, _ := deployAddressFilterTestContract(t, ctx, builder)
106121

107122
// Set up filter to block the target contract
108-
filter := txfilter.NewStaticAsyncChecker([]common.Address{targetAddr})
123+
filter := newHashedChecker([]common.Address{targetAddr})
109124
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
110125

111126
// Test: CALL to filtered address should fail
@@ -143,7 +158,7 @@ func TestAddressFilterStaticCall(t *testing.T) {
143158
targetAddr, _ := deployAddressFilterTestContract(t, ctx, builder)
144159

145160
// Set up filter to block the target contract
146-
filter := txfilter.NewStaticAsyncChecker([]common.Address{targetAddr})
161+
filter := newHashedChecker([]common.Address{targetAddr})
147162
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
148163

149164
// Test: STATICCALL to filtered address within a transaction should fail
@@ -180,7 +195,7 @@ func TestAddressFilterDisabled(t *testing.T) {
180195
builder.L2.TransferBalance(t, "Owner", "TestUser", big.NewInt(1e18), builder.L2Info)
181196

182197
// Set up an empty filter (disabled)
183-
filter := txfilter.NewStaticAsyncChecker([]common.Address{})
198+
filter := newHashedChecker([]common.Address{})
184199
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
185200

186201
// All transactions should succeed when filter is disabled
@@ -215,7 +230,7 @@ func TestAddressFilterCreate2(t *testing.T) {
215230
Require(t, err)
216231

217232
// Set up filter to block the computed address
218-
filter := txfilter.NewStaticAsyncChecker([]common.Address{create2Addr})
233+
filter := newHashedChecker([]common.Address{create2Addr})
219234
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
220235

221236
// Test: CREATE2 to filtered address should fail
@@ -257,7 +272,7 @@ func TestAddressFilterCreate(t *testing.T) {
257272
createAddr := crypto.CreateAddress(callerAddr, nonce)
258273

259274
// Set up filter to block the computed address
260-
filter := txfilter.NewStaticAsyncChecker([]common.Address{createAddr})
275+
filter := newHashedChecker([]common.Address{createAddr})
261276
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
262277

263278
// Test: CREATE to filtered address should fail
@@ -272,7 +287,7 @@ func TestAddressFilterCreate(t *testing.T) {
272287

273288
// Test: CREATE to non-filtered address (after nonce incremented) should succeed
274289
// Clear the filter to allow the next CREATE
275-
emptyChecker := txfilter.NewStaticAsyncChecker([]common.Address{})
290+
emptyChecker := newHashedChecker([]common.Address{})
276291
builder.L2.ExecNode.ExecEngine.SetAddressChecker(emptyChecker)
277292

278293
auth = builder.L2Info.GetDefaultTransactOpts("Owner", ctx)
@@ -299,7 +314,7 @@ func TestAddressFilterSelfdestruct(t *testing.T) {
299314
filteredAddr := builder.L2Info.GetAddress("FilteredBeneficiary")
300315

301316
// Set up filter to block the beneficiary
302-
filter := txfilter.NewStaticAsyncChecker([]common.Address{filteredAddr})
317+
filter := newHashedChecker([]common.Address{filteredAddr})
303318
builder.L2.ExecNode.ExecEngine.SetAddressChecker(filter)
304319

305320
// Test: SELFDESTRUCT to filtered beneficiary should fail

txfilter/hashed_filter.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ import (
1313
"github.com/offchainlabs/nitro/restrictedaddr"
1414
)
1515

16+
// Default parameters for HashedAddressChecker, used in NewDefaultHashedAddressChecker
17+
const (
18+
restrictedAddrWorkerCount = 4
19+
restrictedAddrQueueSize = 1024
20+
)
21+
1622
// HashedAddressChecker is a global, shared address checker that filters
1723
// transactions using a HashStore. Hashing and caching are delegated to
1824
// the HashStore; this checker only manages async execution and per-tx
@@ -47,13 +53,21 @@ func NewHashedAddressChecker(
4753
workChan: make(chan workItem, queueSize),
4854
}
4955

50-
for i := 0; i < workerCount; i++ {
56+
for range workerCount {
5157
go c.worker()
5258
}
5359

5460
return c
5561
}
5662

63+
func NewDefaultHashedAddressChecker(store *restrictedaddr.HashStore) *HashedAddressChecker {
64+
return NewHashedAddressChecker(
65+
store,
66+
restrictedAddrWorkerCount,
67+
restrictedAddrQueueSize,
68+
)
69+
}
70+
5771
func (c *HashedAddressChecker) NewTxState() state.AddressCheckerState {
5872
return &HashedAddressCheckerState{
5973
checker: c,

txfilter/hashed_filter_test.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@ func TestHashedAddressCheckerSimple(t *testing.T) {
3434
filteredHash := sha256.Sum256(append(salt, addrFiltered.Bytes()...))
3535
store.Load(salt, [][32]byte{filteredHash}, "test")
3636

37-
checker := NewHashedAddressChecker(
38-
store,
39-
/* workerCount */ 2,
40-
/* queueSize */ 8,
41-
)
37+
checker := NewDefaultHashedAddressChecker(store)
4238

4339
// Tx 1: filtered address
4440
state1 := mustState(t, checker.NewTxState())
@@ -95,11 +91,7 @@ func TestHashedAddressCheckerHeavy(t *testing.T) {
9591
store := restrictedaddr.NewHashStore()
9692
store.Load(salt, filteredHashes, "heavy")
9793

98-
checker := NewHashedAddressChecker(
99-
store,
100-
/* workerCount */ 4,
101-
/* queueSize */ 32,
102-
)
94+
checker := NewDefaultHashedAddressChecker(store)
10395

10496
const txCount = 100
10597
const touchesPerTx = 100

0 commit comments

Comments
 (0)