@@ -8,22 +8,35 @@ import (
88 "github.com/cosmos/cosmos-sdk/telemetry"
99)
1010
11+ type IStoreTracer interface {
12+ Get ([]byte , []byte , string )
13+ Has ([]byte , string )
14+ Set ([]byte , []byte , string )
15+ Delete ([]byte , string )
16+ DerivePrestateToJson () []byte
17+ Clear ()
18+ }
19+
1120var _ types.KVStore = & Store {}
1221
1322// Store applies gas tracking to an underlying KVStore. It implements the
1423// KVStore interface.
1524type Store struct {
16- gasMeter types.GasMeter
17- gasConfig types.GasConfig
18- parent types.KVStore
25+ gasMeter types.GasMeter
26+ gasConfig types.GasConfig
27+ parent types.KVStore
28+ moduleName string
29+ tracer IStoreTracer
1930}
2031
2132// NewStore returns a reference to a new GasKVStore.
22- func NewStore (parent types.KVStore , gasMeter types.GasMeter , gasConfig types.GasConfig ) * Store {
33+ func NewStore (parent types.KVStore , gasMeter types.GasMeter , gasConfig types.GasConfig , moduleName string , tracer IStoreTracer ) * Store {
2334 kvs := & Store {
24- gasMeter : gasMeter ,
25- gasConfig : gasConfig ,
26- parent : parent ,
35+ gasMeter : gasMeter ,
36+ gasConfig : gasConfig ,
37+ parent : parent ,
38+ moduleName : moduleName ,
39+ tracer : tracer ,
2740 }
2841 return kvs
2942}
@@ -45,6 +58,9 @@ func (gs *Store) Get(key []byte) (value []byte) {
4558 // TODO overflow-safe math?
4659 gs .gasMeter .ConsumeGas (gs .gasConfig .ReadCostPerByte * types .Gas (len (key )), types .GasReadPerByteDesc )
4760 gs .gasMeter .ConsumeGas (gs .gasConfig .ReadCostPerByte * types .Gas (len (value )), types .GasReadPerByteDesc )
61+ if gs .tracer != nil {
62+ gs .tracer .Get (key , value , gs .moduleName )
63+ }
4864
4965 return value
5066}
@@ -64,7 +80,11 @@ func (gs *Store) Set(key []byte, value []byte) {
6480func (gs * Store ) Has (key []byte ) bool {
6581 defer telemetry .MeasureSince (time .Now (), "store" , "gaskv" , "has" )
6682 gs .gasMeter .ConsumeGas (gs .gasConfig .HasCost , types .GasHasDesc )
67- return gs .parent .Has (key )
83+ res := gs .parent .Has (key )
84+ if gs .tracer != nil && res {
85+ gs .tracer .Has (key , gs .moduleName )
86+ }
87+ return res
6888}
6989
7090// Implements KVStore.
@@ -113,7 +133,7 @@ func (gs *Store) iterator(start, end []byte, ascending bool) types.Iterator {
113133 parent = gs .parent .ReverseIterator (start , end )
114134 }
115135
116- gi := newGasIterator (gs .gasMeter , gs .gasConfig , parent )
136+ gi := newGasIterator (gs .gasMeter , gs .gasConfig , parent , gs . moduleName , gs . tracer )
117137 defer func () {
118138 if err := recover (); err != nil {
119139 // if there is a panic, we close the iterator then reraise
@@ -139,16 +159,20 @@ func (gs *Store) GetAllKeyStrsInRange(start, end []byte) (res []string) {
139159}
140160
141161type gasIterator struct {
142- gasMeter types.GasMeter
143- gasConfig types.GasConfig
144- parent types.Iterator
162+ gasMeter types.GasMeter
163+ gasConfig types.GasConfig
164+ parent types.Iterator
165+ moduleName string
166+ tracer IStoreTracer
145167}
146168
147- func newGasIterator (gasMeter types.GasMeter , gasConfig types.GasConfig , parent types.Iterator ) types.Iterator {
169+ func newGasIterator (gasMeter types.GasMeter , gasConfig types.GasConfig , parent types.Iterator , moduleName string , tracer IStoreTracer ) types.Iterator {
148170 return & gasIterator {
149- gasMeter : gasMeter ,
150- gasConfig : gasConfig ,
151- parent : parent ,
171+ gasMeter : gasMeter ,
172+ gasConfig : gasConfig ,
173+ parent : parent ,
174+ moduleName : moduleName ,
175+ tracer : tracer ,
152176 }
153177}
154178
@@ -174,13 +198,19 @@ func (gi *gasIterator) Next() {
174198// not incur any gas cost.
175199func (gi * gasIterator ) Key () (key []byte ) {
176200 key = gi .parent .Key ()
201+ if gi .tracer != nil {
202+ gi .tracer .Has (key , gi .moduleName )
203+ }
177204 return key
178205}
179206
180207// Value implements the Iterator interface. It returns the current value and it
181208// does not incur any gas cost.
182209func (gi * gasIterator ) Value () (value []byte ) {
183210 value = gi .parent .Value ()
211+ if gi .tracer != nil {
212+ gi .tracer .Get (gi .Key (), value , gi .moduleName )
213+ }
184214 return value
185215}
186216
0 commit comments