Skip to content

Commit 7ec387f

Browse files
authored
Fix innertx unwind (#200)
1 parent 7b9ddaa commit 7ec387f

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

eth/stagedsync/stage_execute.go

+8
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,14 @@ func unwindExecutionStage(u *UnwindState, s *StageState, txc wrap.TxContainer, c
979979
return fmt.Errorf("delete newer epochs: %w", err)
980980
}
981981

982+
// For X Layer
983+
hermezDb := hermez_db.NewHermezDb(txc.Tx)
984+
for blk := u.UnwindPoint + 1; blk <= s.BlockNumber; blk++ {
985+
if err := hermezDb.TruncateInnerTx(blk); err != nil {
986+
return fmt.Errorf("truncate inner tx: %w", err)
987+
}
988+
}
989+
982990
// Truncate CallTraceSet
983991
keyStart := hexutility.EncodeTs(u.UnwindPoint + 1)
984992
c, err := txc.Tx.RwCursorDupSort(kv.CallTraceSet)

test/Makefile

+4-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ run: ## Runs a full node
7272
$(RUN_DOCKER_AGGREGATOR)
7373
$(RUN_DOCKER_POOL_MANAGER)
7474
$(RUN_DOCKER_RPC)
75-
$(RUN_DOCKER_PROMETHEUS)
76-
$(RUN_DOCKER_GRAFANA)
7775

7876
.PHONY: all
7977
all: ## Runs a full node
@@ -109,6 +107,10 @@ all: ## Runs a full node
109107
sleep 3
110108
$(RUN_DOCKER_BRIDGE_UI)
111109

110+
# monitoring services
111+
$(RUN_DOCKER_PROMETHEUS)
112+
$(RUN_DOCKER_GRAFANA)
113+
112114
.PHONY: stop
113115
stop: ## Stops all services
114116
$(STOP)

zk/hermez_db/db_xlayer.go

+48
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/binary"
55
"fmt"
66

7+
"github.com/ledgerwatch/erigon-lib/kv"
78
"github.com/ledgerwatch/erigon-lib/kv/dbutils"
89
"github.com/ledgerwatch/erigon/rlp"
910
"github.com/ledgerwatch/erigon/zk/types"
@@ -41,6 +42,12 @@ func (db *HermezDbReader) GetInnerTxs(blockNum uint64) [][]*types.InnerTx {
4142
log.Error("inner txs fetching failed", "err", err)
4243
return nil
4344
}
45+
defer func() {
46+
if casted, ok := it.(kv.Closer); ok {
47+
casted.Close()
48+
}
49+
}()
50+
4451
for it.HasNext() {
4552
_, v, err := it.Next()
4653
if err != nil {
@@ -59,3 +66,44 @@ func (db *HermezDbReader) GetInnerTxs(blockNum uint64) [][]*types.InnerTx {
5966
}
6067
return blockInnerTxs
6168
}
69+
70+
// TruncateInnerTx deletes all inner txs of a block
71+
func (db *HermezDb) TruncateInnerTx(block uint64) error {
72+
prefix := make([]byte, 8)
73+
binary.BigEndian.PutUint64(prefix, block)
74+
75+
it, err := db.tx.Prefix(INNER_TX, prefix)
76+
if err != nil {
77+
log.Error("inner txs fetching failed", "err", err)
78+
return nil
79+
}
80+
defer func() {
81+
if casted, ok := it.(kv.Closer); ok {
82+
casted.Close()
83+
}
84+
}()
85+
86+
var keyList [][]byte
87+
for it.HasNext() {
88+
k, _, err := it.Next()
89+
if err != nil {
90+
log.Error("inner txs fetching failed", "err", err)
91+
return nil
92+
}
93+
keyCopy := make([]byte, len(k))
94+
copy(keyCopy, k)
95+
keyList = append(keyList, keyCopy)
96+
}
97+
98+
for _, k := range keyList {
99+
err = db.tx.Delete(INNER_TX, k)
100+
if err != nil {
101+
log.Error("inner txs fetching failed", "err", err)
102+
return err
103+
}
104+
}
105+
106+
remainTxs := db.GetInnerTxs(block)
107+
log.Info("Delete inner txs", "block", block, "deleted count", len(keyList), "expect remain count 0:", len(remainTxs))
108+
return nil
109+
}

0 commit comments

Comments
 (0)