Skip to content

Commit bb04c00

Browse files
committed
add kvstore
1 parent ea6fdf3 commit bb04c00

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package substrate
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/centrifuge/go-substrate-rpc-client/v4/types"
7+
"github.com/pkg/errors"
8+
)
9+
10+
func (s *Substrate) KVStoreSet(identity Identity, key string, value string) error {
11+
cl, meta, err := s.GetClient()
12+
if err != nil {
13+
return err
14+
}
15+
16+
c, err := types.NewCall(meta, "TFKVStore.set",
17+
key, value,
18+
)
19+
if err != nil {
20+
return errors.Wrap(err, "failed to create call")
21+
}
22+
23+
res, err := s.Call(cl, meta, identity, c)
24+
if err != nil {
25+
return errors.Wrap(err, "failed to create contract")
26+
}
27+
28+
if err := s.checkForError(res); err != nil {
29+
return err
30+
}
31+
32+
return nil
33+
}
34+
35+
func (s *Substrate) KVStoreDelete(identity Identity, key string) error {
36+
cl, meta, err := s.GetClient()
37+
if err != nil {
38+
return err
39+
}
40+
41+
c, err := types.NewCall(meta, "TFKVStore.delete",
42+
key,
43+
)
44+
if err != nil {
45+
return errors.Wrap(err, "failed to create call")
46+
}
47+
48+
res, err := s.Call(cl, meta, identity, c)
49+
if err != nil {
50+
return errors.Wrap(err, "failed to create contract")
51+
}
52+
53+
if err := s.checkForError(res); err != nil {
54+
return err
55+
}
56+
return nil
57+
}
58+
59+
func (s *Substrate) KVStoreGet(identity Identity, key string) ([]byte, error) {
60+
cl, meta, err := s.GetClient()
61+
if err != nil {
62+
return nil, err
63+
}
64+
65+
bytes, err := Encode(key)
66+
if err != nil {
67+
return nil, err
68+
}
69+
70+
storageKey, err := types.CreateStorageKey(meta, "TFKVStore", "TFKVStore", identity.PublicKey(), bytes)
71+
if err != nil {
72+
return nil, errors.Wrap(err, "failed to create substrate query key")
73+
}
74+
75+
var value []byte
76+
ok, err := cl.RPC.State.GetStorageLatest(storageKey, &value)
77+
if err != nil {
78+
return nil, errors.Wrap(err, "failed to lookup entity")
79+
}
80+
81+
if !ok {
82+
return nil, errors.Wrap(ErrNotFound, "key not found")
83+
}
84+
85+
return value, nil
86+
}
87+
88+
type Val struct {
89+
Id string
90+
Key string
91+
}
92+
93+
func (s *Substrate) KVStoreList(identity Identity) (map[string]string, error) {
94+
cl, meta, err := s.GetClient()
95+
if err != nil {
96+
return nil, err
97+
}
98+
99+
bytes, err := Encode(types.NewOptionBytes1024Empty())
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
storageKey, err := types.CreateStorageKey(meta, "TFKVStore", "TFKVStore", identity.PublicKey(), bytes)
105+
if err != nil {
106+
return nil, errors.Wrap(err, "failed to create substrate query key")
107+
}
108+
109+
keys, err := cl.RPC.State.GetKeysLatest(storageKey)
110+
if err != nil {
111+
return nil, errors.Wrap(err, "failed to lookup entity")
112+
}
113+
114+
fmt.Println(len(keys))
115+
116+
query, err := cl.RPC.State.QueryStorageAtLatest(keys)
117+
if err != nil {
118+
return nil, err
119+
}
120+
121+
pairs := make(map[string]string)
122+
for _, q := range query {
123+
for _, c := range q.Changes {
124+
pairs[string(c.StorageKey)] = string(c.StorageData)
125+
}
126+
}
127+
128+
return pairs, nil
129+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package substrate
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestKVStore(t *testing.T) {
12+
pairs := map[string]string{"key1": "value1", "key2": "value2", "key3": "value3"}
13+
mnem := "route visual hundred rabbit wet crunch ice castle milk model inherit outside"
14+
15+
id, err := NewIdentityFromSr25519Phrase(mnem)
16+
require.NoError(t, err)
17+
18+
sub := startLocalConnection(t)
19+
defer sub.Close()
20+
21+
t.Run("kvstore set values", func(t *testing.T) {
22+
for key, val := range pairs {
23+
err = sub.KVStoreSet(id, key, val)
24+
assert.NoError(t, err)
25+
}
26+
})
27+
28+
t.Run("kvstore get values", func(t *testing.T) {
29+
for key, val := range pairs {
30+
value, err := sub.KVStoreGet(id, key)
31+
assert.NoError(t, err)
32+
assert.Equal(t, []byte(val), value)
33+
}
34+
})
35+
36+
t.Run("kvstore list keys", func(t *testing.T) {
37+
values, err := sub.KVStoreList(id)
38+
39+
fmt.Println(len(values))
40+
assert.NoError(t, err)
41+
assert.Equal(t, pairs, values)
42+
})
43+
44+
t.Run("kvstore delete", func(t *testing.T) {
45+
for key := range pairs {
46+
err = sub.KVStoreDelete(id, key)
47+
assert.NoError(t, err)
48+
}
49+
50+
values, err := sub.KVStoreList(id)
51+
assert.NoError(t, err)
52+
assert.Equal(t, 0, len(values))
53+
})
54+
}

0 commit comments

Comments
 (0)