4
4
"encoding/binary"
5
5
"fmt"
6
6
7
+ "github.com/ledgerwatch/erigon-lib/kv"
7
8
"github.com/ledgerwatch/erigon-lib/kv/dbutils"
8
9
"github.com/ledgerwatch/erigon/rlp"
9
10
"github.com/ledgerwatch/erigon/zk/types"
@@ -41,6 +42,12 @@ func (db *HermezDbReader) GetInnerTxs(blockNum uint64) [][]*types.InnerTx {
41
42
log .Error ("inner txs fetching failed" , "err" , err )
42
43
return nil
43
44
}
45
+ defer func () {
46
+ if casted , ok := it .(kv.Closer ); ok {
47
+ casted .Close ()
48
+ }
49
+ }()
50
+
44
51
for it .HasNext () {
45
52
_ , v , err := it .Next ()
46
53
if err != nil {
@@ -59,3 +66,44 @@ func (db *HermezDbReader) GetInnerTxs(blockNum uint64) [][]*types.InnerTx {
59
66
}
60
67
return blockInnerTxs
61
68
}
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