forked from alpe/cosmos-tracing
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstore.go
84 lines (68 loc) · 2.29 KB
/
store.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package tracing
import (
"bytes"
"github.com/cosmos/cosmos-sdk/store/gaskv"
"github.com/cosmos/cosmos-sdk/store/tracekv"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// TracingMultiStore Multistore that traces all operations
type TracingMultiStore struct {
sdk.MultiStore
buf bytes.Buffer
traceWritesOnly bool
traceGasMeter *TraceGasMeter
}
// NewTracingMultiStore constructor
func NewTracingMultiStore(store sdk.MultiStore, traceWritesOnly bool) *TracingMultiStore {
return &TracingMultiStore{
MultiStore: store,
traceWritesOnly: traceWritesOnly,
traceGasMeter: NewTraceGasMeter(sdk.NewInfiniteGasMeter()),
}
}
func (t *TracingMultiStore) GetStore(k storetypes.StoreKey) sdk.Store {
return tracekv.NewStore(t.MultiStore.GetKVStore(k), &t.buf, nil)
}
func (t *TracingMultiStore) GetKVStore(k storetypes.StoreKey) sdk.KVStore {
parentStore := t.MultiStore.GetKVStore(k)
// wrap with gaskv to track gas usage
parentStore = gaskv.NewStore(parentStore, t.traceGasMeter, storetypes.KVGasConfig())
// wrap with trace store
traceStore := tracekv.NewStore(parentStore, &t.buf, nil)
if !t.traceWritesOnly {
return traceStore
}
return NewTraceWritesOnlyStore(parentStore, traceStore)
}
var _ sdk.KVStore = &TraceWritesKVStore{}
// TraceWritesKVStore decorator to log only write operations
type TraceWritesKVStore struct {
parent sdk.KVStore
*tracekv.Store
}
// NewTraceWritesOnlyStore constructor
func NewTraceWritesOnlyStore(parent sdk.KVStore, traceStore *tracekv.Store) *TraceWritesKVStore {
return &TraceWritesKVStore{parent: parent, Store: traceStore}
}
func (t *TraceWritesKVStore) Iterator(start, end []byte) storetypes.Iterator {
return t.parent.Iterator(start, end)
}
func (t *TraceWritesKVStore) ReverseIterator(start, end []byte) storetypes.Iterator {
return t.parent.ReverseIterator(start, end)
}
func (t *TraceWritesKVStore) Get(key []byte) []byte {
return t.parent.Get(key)
}
func (t *TraceWritesKVStore) Has(key []byte) bool {
return t.parent.Has(key)
}
func (t *TraceWritesKVStore) Set(key, value []byte) {
t.Store.Set(key, value)
}
func (t *TraceWritesKVStore) Delete(key []byte) {
t.Store.Delete(key)
}
func (t *TracingMultiStore) getStoreDataLimited(max int) string {
return cutLength(t.buf.String(), max)
}