Skip to content

Commit 926fee2

Browse files
authored
Feature/inject ger after n blocks (#885)
* new smc events * etherman implementation + unit tests * processBackwardLETSovereign * unsetClaim * processSetClaimSovereign * tools * Tool working properly + implementation verified * mocks * fix test
1 parent d16cb77 commit 926fee2

File tree

33 files changed

+8374
-1482
lines changed

33 files changed

+8374
-1482
lines changed

bridgectrl/bridgectrl.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ const (
1818
type BridgeController struct {
1919
exitTrees []*MerkleTree
2020
rollupsTree *MerkleTree
21-
merkleTreeIDs map[uint32]uint8
21+
merkleTreeIDs map[uint32]uint32
2222
}
2323

2424
// NewBridgeController creates new BridgeController.
2525
func NewBridgeController(ctx context.Context, cfg Config, networkIDs []uint32, mtStore interface{}) (*BridgeController, error) {
2626
var (
27-
merkleTreeIDs = make(map[uint32]uint8)
27+
merkleTreeIDs = make(map[uint32]uint32)
2828
exitTrees []*MerkleTree
2929
)
3030

3131
for i, networkID := range networkIDs {
32-
merkleTreeIDs[networkID] = uint8(i) // nolint:gosec
32+
merkleTreeIDs[networkID] = uint32(i) // nolint:gosec
3333
mt, err := NewMerkleTree(ctx, mtStore.(merkleTreeStore), cfg.Height, networkID)
3434
if err != nil {
3535
return nil, err
@@ -49,7 +49,7 @@ func NewBridgeController(ctx context.Context, cfg Config, networkIDs []uint32, m
4949
}, nil
5050
}
5151

52-
func (bt *BridgeController) GetMerkleTreeID(networkID uint32) (uint8, error) {
52+
func (bt *BridgeController) GetMerkleTreeID(networkID uint32) (uint32, error) {
5353
tID, found := bt.merkleTreeIDs[networkID]
5454
if !found {
5555
return 0, gerror.ErrNetworkNotRegister
@@ -59,7 +59,7 @@ func (bt *BridgeController) GetMerkleTreeID(networkID uint32) (uint8, error) {
5959

6060
// AddDeposit adds deposit information to the bridge tree.
6161
func (bt *BridgeController) AddDeposit(ctx context.Context, deposit *etherman.Deposit, dbTx interface{}) error {
62-
leaf := hashDeposit(deposit)
62+
leaf := HashDeposit(deposit)
6363
tID, err := bt.GetMerkleTreeID(deposit.NetworkID)
6464
if err != nil {
6565
return err
@@ -85,9 +85,12 @@ func (bt *BridgeController) RollbackMT(ctx context.Context, networkID uint32, db
8585
return bt.exitTrees[tID].rollbackMT(ctx, networkID, dbTx)
8686
}
8787

88-
// GetExitRoot returns the dedicated merkle tree's root.
89-
// only use for the test purpose
90-
func (bt *BridgeController) GetExitRoot(ctx context.Context, tID uint8, dbTx interface{}) ([]byte, error) {
88+
// GetExitRoot returns the dedicated merkle tree's root given the networkID.
89+
func (bt *BridgeController) GetExitRoot(ctx context.Context, networkID uint32, dbTx interface{}) ([]byte, error) {
90+
tID, err := bt.GetMerkleTreeID(networkID)
91+
if err != nil {
92+
return nil, err
93+
}
9194
return bt.exitTrees[tID].getRoot(ctx, dbTx)
9295
}
9396

bridgectrl/bridgectrl_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func TestBridgeTree(t *testing.T) {
7474
DepositCount: uint32(i), // nolint:gosec
7575
Metadata: common.FromHex(testVector.Metadata),
7676
}
77-
leafHash := hashDeposit(deposit)
77+
leafHash := HashDeposit(deposit)
7878
assert.Equal(t, testVector.ExpectedHash, hex.EncodeToString(leafHash[:]))
7979
depositID, err := testStore.AddDeposit(ctx, deposit, nil)
8080
require.NoError(t, err)

bridgectrl/hash.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func generateZeroHashes(height uint8) [][KeyLen]byte {
3434
return zeroHashes
3535
}
3636

37-
func hashDeposit(deposit *etherman.Deposit) [KeyLen]byte {
37+
func HashDeposit(deposit *etherman.Deposit) [KeyLen]byte {
3838
var res [KeyLen]byte
3939
origNet := make([]byte, 4) //nolint:mnd
4040
binary.BigEndian.PutUint32(origNet, uint32(deposit.OriginalNetwork))

bridgectrl/merkletree_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func TestLeafHash(t *testing.T) {
7777
DepositCount: uint32(ti + 1), // nolint:gosec
7878
Metadata: common.FromHex(testVector.Metadata),
7979
}
80-
leafHash := hashDeposit(deposit)
80+
leafHash := HashDeposit(deposit)
8181
assert.Equal(t, testVector.ExpectedHash[2:], hex.EncodeToString(leafHash[:]))
8282
})
8383
}
@@ -134,7 +134,7 @@ func TestMTAddLeaf(t *testing.T) {
134134
require.NoError(t, err)
135135
assert.Equal(t, hex.EncodeToString(curRoot), testVector.CurrentRoot[2:])
136136

137-
leafHash := hashDeposit(deposit)
137+
leafHash := HashDeposit(deposit)
138138
err = mt.addLeaf(ctx, depositIDs[len(depositIDs)-1], leafHash, uint32(len(testVector.ExistingLeaves)), nil) // nolint:gosec
139139
require.NoError(t, err)
140140
newRoot, err := mt.getRoot(ctx, nil)
@@ -183,7 +183,7 @@ func TestMTGetProof(t *testing.T) {
183183
}
184184
depositID, err := testStore.AddDeposit(ctx, deposit, nil)
185185
require.NoError(t, err)
186-
leafHash := hashDeposit(deposit)
186+
leafHash := HashDeposit(deposit)
187187
if li == int(testVector.Index) {
188188
cur = leafHash
189189
}
@@ -396,7 +396,7 @@ func TestCheckMerkleProof(t *testing.T) {
396396
DepositCount: 0,
397397
Metadata: []byte{},
398398
}
399-
leafHash := hashDeposit(deposit)
399+
leafHash := HashDeposit(deposit)
400400
smtProof := [][KeyLen]byte{
401401
common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"),
402402
common.HexToHash("0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"),
@@ -453,7 +453,7 @@ func TestCheckMerkleProof2(t *testing.T) {
453453
DepositCount: 0,
454454
Metadata: []byte{},
455455
}
456-
leafBytes := hashDeposit(deposit)
456+
leafBytes := HashDeposit(deposit)
457457
leafHash := common.BytesToHash(leafBytes[:])
458458
t.Log("leafHash: ", leafHash)
459459
assert.Equal(t, expectedLeafHash, leafHash)

db/pgstorage/migrations/0020.sql

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-- +migrate Up
2+
3+
CREATE TABLE IF NOT EXISTS sync.backward_let(
4+
id BIGSERIAL,
5+
block_id BIGINT REFERENCES sync.block (id) ON DELETE CASCADE,
6+
previous_deposit_cnt BIGINT,
7+
previous_root BYTEA,
8+
new_deposit_cnt BIGINT,
9+
new_root BYTEA,
10+
PRIMARY KEY (id)
11+
);
12+
13+
CREATE TABLE IF NOT EXISTS sync.set_unset_claim(
14+
id BIGSERIAL,
15+
block_id BIGINT REFERENCES sync.block (id) ON DELETE CASCADE,
16+
mainnet_flag BOOLEAN,
17+
rollup_index BIGINT,
18+
index BIGINT,
19+
global_index VARCHAR(255),
20+
type VARCHAR(255), -- "SET" or "UNSET"
21+
PRIMARY KEY (id)
22+
);
23+
24+
-- +migrate Down
25+
26+
DROP TABLE IF EXISTS sync.backward_let;
27+
DROP TABLE IF EXISTS sync.set_unset_claim;
28+
29+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package migrations_test
2+
3+
import (
4+
"database/sql"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
type migrationTest0020 struct{}
11+
12+
func (m migrationTest0020) InsertData(db *sql.DB) error {
13+
block := "INSERT INTO sync.block (id, block_num, block_hash, network_id) VALUES(1, 1, decode('C9B5033799ADF3739383A0489EFBE8A0D4D5E4478778A4F4304562FD51AE4C07','hex'), 0);"
14+
if _, err := db.Exec(block); err != nil {
15+
return err
16+
}
17+
return nil
18+
}
19+
20+
func (m migrationTest0020) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) {
21+
insertBackwardLET := `INSERT INTO sync.backward_let(block_id, previous_deposit_cnt, previous_root, new_deposit_cnt, new_root)
22+
VALUES(1, 2, decode('A9B5033799ADF3739383A0489EFBE8A0D4D5E4478778A4F4304562FD51AE4C08','hex'), 1, decode('B9B5033799ADF3739383A0489EFBE8A0D4D5E4478778A4F4304562FD51AE4C09','hex'));`
23+
_, err := db.Exec(insertBackwardLET)
24+
assert.NoError(t, err)
25+
insertSetClaim := `INSERT INTO sync.set_unset_claim(block_id, mainnet_flag, rollup_index, index, global_index, type)
26+
VALUES(1, true, 0, 11, '18446744073709551627', 'SET');`
27+
_, err = db.Exec(insertSetClaim)
28+
assert.NoError(t, err)
29+
insertUnSetClaim := `INSERT INTO sync.set_unset_claim(block_id, mainnet_flag, rollup_index, index, global_index, type)
30+
VALUES(1, false, 4294967295, 4294967295, '18446744073709551615', 'UNSET');`
31+
_, err = db.Exec(insertUnSetClaim)
32+
33+
assert.NoError(t, err)
34+
var count uint32
35+
selectCount := "SELECT count(*) FROM sync.backward_let"
36+
err = db.QueryRow(selectCount).Scan(&count)
37+
assert.NoError(t, err)
38+
assert.Equal(t, uint32(1), count)
39+
40+
selectCount1 := "SELECT count(*) FROM sync.set_unset_claim WHERE type='SET'"
41+
err = db.QueryRow(selectCount1).Scan(&count)
42+
assert.NoError(t, err)
43+
assert.Equal(t, uint32(1), count)
44+
45+
selectCount2 := "SELECT count(*) FROM sync.set_unset_claim WHERE type='UNSET'"
46+
err = db.QueryRow(selectCount2).Scan(&count)
47+
assert.NoError(t, err)
48+
assert.Equal(t, uint32(1), count)
49+
50+
selectCount3 := "SELECT count(*) FROM sync.set_unset_claim"
51+
err = db.QueryRow(selectCount3).Scan(&count)
52+
assert.NoError(t, err)
53+
assert.Equal(t, uint32(2), count)
54+
}
55+
56+
func (m migrationTest0020) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) {
57+
var count uint32
58+
selectCount := "SELECT count(*) FROM sync.backward_let"
59+
err := db.QueryRow(selectCount).Scan(&count)
60+
assert.Error(t, err)
61+
62+
selectCount1 := "SELECT count(*) FROM sync.set_unset_claim"
63+
err = db.QueryRow(selectCount1).Scan(&count)
64+
assert.Error(t, err)
65+
}
66+
67+
func TestMigration0020(t *testing.T) {
68+
runMigrationTest(t, 20, migrationTest0020{})
69+
}

db/pgstorage/pgstorage.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,50 @@ func (p *PostgresStorage) GetSyncStatus(ctx context.Context, dbTx interface{}) (
921921
return status, nil
922922
}
923923

924+
// ResetDeposits resets the state to a depositCount.
925+
func (p *PostgresStorage) ResetDeposits(ctx context.Context, depositCount uint32, networkID uint32, dbTx interface{}) error {
926+
if networkID == 0 {
927+
return errors.New("cannot reset L1 deposits")
928+
}
929+
const resetSQL = "DELETE FROM sync.deposit WHERE deposit_cnt >= $1 AND network_id = $2"
930+
e := p.getExecQuerier(dbTx)
931+
_, err := e.Exec(ctx, resetSQL, depositCount, networkID)
932+
return err
933+
}
934+
935+
// AddBackwardLET adds a new BackwardLET event to the db.
936+
func (p *PostgresStorage) AddBackwardLET(ctx context.Context, backwardLET *etherman.BackwardLET, dbTx interface{}) error {
937+
const addExitRootSQL = "INSERT INTO sync.backward_let(block_id, previous_deposit_cnt, previous_root, new_deposit_cnt, new_root) VALUES ($1, $2, $3, $4, $5)"
938+
e := p.getExecQuerier(dbTx)
939+
_, err := e.Exec(ctx, addExitRootSQL, backwardLET.BlockID, backwardLET.PreviousDepositCount, backwardLET.PreviousRoot, backwardLET.NewDepositCount, backwardLET.NewRoot)
940+
return err
941+
}
942+
943+
// AddSetClaim adds a new SetClaim event to the db.
944+
func (p *PostgresStorage) AddSetClaim(ctx context.Context, setClaim *etherman.SetClaim, dbTx interface{}) error {
945+
return p.addSetUnsetClaim(ctx, "SET", setClaim.BlockID, setClaim.MainnetFlag, setClaim.RollupIndex, setClaim.Index, setClaim.GlobalIndex, dbTx)
946+
}
947+
948+
// AddUnsetClaim adds a new UnsetClaim event to the db.
949+
func (p *PostgresStorage) AddUnsetClaim(ctx context.Context, unsetClaim *etherman.UnsetClaim, dbTx interface{}) error {
950+
return p.addSetUnsetClaim(ctx, "UNSET", unsetClaim.BlockID, unsetClaim.MainnetFlag, unsetClaim.RollupIndex, unsetClaim.Index, unsetClaim.GlobalIndex, dbTx)
951+
}
952+
953+
func (p *PostgresStorage) addSetUnsetClaim(ctx context.Context, eventType string, blockID uint64, mainnetFlag bool, rollupIndex, index uint32, globalIndex *big.Int, dbTx interface{}) error {
954+
const addExitRootSQL = "INSERT INTO sync.set_unset_claim(block_id, mainnet_flag, rollup_index, index, global_index, type) VALUES($1, $2, $3, $4, $5, $6)"
955+
e := p.getExecQuerier(dbTx)
956+
_, err := e.Exec(ctx, addExitRootSQL, blockID, mainnetFlag, rollupIndex, index, globalIndex.String(), eventType)
957+
return err
958+
}
959+
960+
// DeleteClaimByGlobalIndex resets the state to a depositCount.
961+
func (p *PostgresStorage) DeleteClaimByGlobalIndex(ctx context.Context, globalIndex *big.Int, networkID uint32, dbTx interface{}) error {
962+
const resetSQL = "DELETE FROM sync.claim WHERE global_index = $1 AND network_id = $2"
963+
e := p.getExecQuerier(dbTx)
964+
_, err := e.Exec(ctx, resetSQL, globalIndex.String(), networkID)
965+
return err
966+
}
967+
924968
// UpdateDepositsStatusForTesting updates the ready_for_claim status of all deposits for testing.
925969
func (p *PostgresStorage) UpdateDepositsStatusForTesting(ctx context.Context, dbTx interface{}) error {
926970
const updateDepositsStatusSQL = "UPDATE sync.deposit SET ready_for_claim = true;"

0 commit comments

Comments
 (0)