@@ -8,22 +8,34 @@ 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+ }
18+
1119var _ types.KVStore = & Store {}
1220
1321// Store applies gas tracking to an underlying KVStore. It implements the
1422// KVStore interface.
1523type Store struct {
16- gasMeter types.GasMeter
17- gasConfig types.GasConfig
18- parent types.KVStore
24+ gasMeter types.GasMeter
25+ gasConfig types.GasConfig
26+ parent types.KVStore
27+ moduleName string
28+ tracer IStoreTracer
1929}
2030
2131// NewStore returns a reference to a new GasKVStore.
22- func NewStore (parent types.KVStore , gasMeter types.GasMeter , gasConfig types.GasConfig ) * Store {
32+ func NewStore (parent types.KVStore , gasMeter types.GasMeter , gasConfig types.GasConfig , moduleName string , tracer IStoreTracer ) * Store {
2333 kvs := & Store {
24- gasMeter : gasMeter ,
25- gasConfig : gasConfig ,
26- parent : parent ,
34+ gasMeter : gasMeter ,
35+ gasConfig : gasConfig ,
36+ parent : parent ,
37+ moduleName : moduleName ,
38+ tracer : tracer ,
2739 }
2840 return kvs
2941}
@@ -45,6 +57,9 @@ func (gs *Store) Get(key []byte) (value []byte) {
4557 // TODO overflow-safe math?
4658 gs .gasMeter .ConsumeGas (gs .gasConfig .ReadCostPerByte * types .Gas (len (key )), types .GasReadPerByteDesc )
4759 gs .gasMeter .ConsumeGas (gs .gasConfig .ReadCostPerByte * types .Gas (len (value )), types .GasReadPerByteDesc )
60+ if gs .tracer != nil {
61+ gs .tracer .Get (key , value , gs .moduleName )
62+ }
4863
4964 return value
5065}
@@ -64,7 +79,11 @@ func (gs *Store) Set(key []byte, value []byte) {
6479func (gs * Store ) Has (key []byte ) bool {
6580 defer telemetry .MeasureSince (time .Now (), "store" , "gaskv" , "has" )
6681 gs .gasMeter .ConsumeGas (gs .gasConfig .HasCost , types .GasHasDesc )
67- return gs .parent .Has (key )
82+ res := gs .parent .Has (key )
83+ if gs .tracer != nil && res {
84+ gs .tracer .Has (key , gs .moduleName )
85+ }
86+ return res
6887}
6988
7089// Implements KVStore.
@@ -113,7 +132,7 @@ func (gs *Store) iterator(start, end []byte, ascending bool) types.Iterator {
113132 parent = gs .parent .ReverseIterator (start , end )
114133 }
115134
116- gi := newGasIterator (gs .gasMeter , gs .gasConfig , parent )
135+ gi := newGasIterator (gs .gasMeter , gs .gasConfig , parent , gs . moduleName , gs . tracer )
117136 defer func () {
118137 if err := recover (); err != nil {
119138 // if there is a panic, we close the iterator then reraise
@@ -139,16 +158,20 @@ func (gs *Store) GetAllKeyStrsInRange(start, end []byte) (res []string) {
139158}
140159
141160type gasIterator struct {
142- gasMeter types.GasMeter
143- gasConfig types.GasConfig
144- parent types.Iterator
161+ gasMeter types.GasMeter
162+ gasConfig types.GasConfig
163+ parent types.Iterator
164+ moduleName string
165+ tracer IStoreTracer
145166}
146167
147- func newGasIterator (gasMeter types.GasMeter , gasConfig types.GasConfig , parent types.Iterator ) types.Iterator {
168+ func newGasIterator (gasMeter types.GasMeter , gasConfig types.GasConfig , parent types.Iterator , moduleName string , tracer IStoreTracer ) types.Iterator {
148169 return & gasIterator {
149- gasMeter : gasMeter ,
150- gasConfig : gasConfig ,
151- parent : parent ,
170+ gasMeter : gasMeter ,
171+ gasConfig : gasConfig ,
172+ parent : parent ,
173+ moduleName : moduleName ,
174+ tracer : tracer ,
152175 }
153176}
154177
@@ -174,13 +197,19 @@ func (gi *gasIterator) Next() {
174197// not incur any gas cost.
175198func (gi * gasIterator ) Key () (key []byte ) {
176199 key = gi .parent .Key ()
200+ if gi .tracer != nil {
201+ gi .tracer .Has (key , gi .moduleName )
202+ }
177203 return key
178204}
179205
180206// Value implements the Iterator interface. It returns the current value and it
181207// does not incur any gas cost.
182208func (gi * gasIterator ) Value () (value []byte ) {
183209 value = gi .parent .Value ()
210+ if gi .tracer != nil {
211+ gi .tracer .Get (gi .Key (), value , gi .moduleName )
212+ }
184213 return value
185214}
186215
0 commit comments