Skip to content

Commit 3e97443

Browse files
authored
Update to Substrate v2.0.0 (#100)
* Add metadata V12 * FIX AccountInfo Refcount should be unsigned 32 (see paritytech/substrate#7164) * FIX Use Module index when looking for Call index * FIX Use released v2.0.0 substrate version * FIX Goimports types/metadataV12.go * FIX Add some unit tests * Remove run-substrate-docker v1 makefile target. Co-authored-by: Laurent Turek <laurent.turek@gmail.com>
1 parent 305d63b commit 3e97443

10 files changed

Lines changed: 389 additions & 11 deletions

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FROM parity/subkey:2.0.0 as subkey
66
RUN subkey --version
77

88
## Second Phase - Build context for tests
9-
FROM parity/substrate:v2.0.0-rc6
9+
FROM parity/substrate:v2.0.0
1010

1111
USER root
1212

Makefile

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,10 @@ test-e2e-deployed: ## runs only end-to-end (e2e) tests against a deployed test
4646
@docker build . -t gsrpc-test
4747
@docker run --rm -e RPC_URL -e TEST_PRIV_KEY gsrpc-test go test -v github.com/centrifuge/go-substrate-rpc-client/teste2e
4848

49-
run-substrate-docker: ## runs the Substrate 1.0 Default Docker image, this can be used to run the tests
50-
docker run -p 9933:9933 -p 9944:9944 -p 30333:30333 parity/substrate:latest-v1.0 --dev --rpc-external --ws-external
51-
52-
run-substrate-docker-v2: ## runs the Substrate 2.0 Default Docker image, this can be used to run the tests
53-
docker run -p 9933:9933 -p 9944:9944 -p 30333:30333 parity/substrate:v2.0.0-rc6 --dev --rpc-external --ws-external
49+
run-substrate-docker: ## runs the Substrate 2.0 Default Docker image, this can be used to run the tests
50+
docker run -p 9933:9933 -p 9944:9944 -p 30333:30333 parity/substrate:v2.0.0 --dev --rpc-external --ws-external
5451

5552
help: ## shows this help
5653
@sed -ne '/@sed/!s/## //p' $(MAKEFILE_LIST)
5754

58-
.PHONY: clean install lint lint-fix test test-dockerized run-substrate-docker run-substrate-docker-v2
55+
.PHONY: clean install lint lint-fix test test-dockerized run-substrate-docker

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Please refer to https://godoc.org/github.com/centrifuge/go-substrate-rpc-client
3434

3535
## Run tests locally against the Substrate Default Docker image
3636

37-
1. Start the Substrate Default Docker image: `make run-substrate-docker-v2`
37+
1. Start the Substrate Default Docker image: `make run-substrate-docker`
3838
1. In another terminal, run the tests against that image: `make test`
3939
1. Visit https://polkadot.js.org/apps for inspection
4040

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: "3.7"
22
services:
33
substrate:
4-
image: parity/substrate:v2.0.0-rc6
4+
image: parity/substrate:v2.0.0
55
ports:
66
- 9933:9933
77
- 9944:9944

main_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func Example_simpleConnect() {
5050

5151
fmt.Printf("You are connected to chain %v using %v v%v\n", chain, nodeName, nodeVersion)
5252

53-
// Output: You are connected to chain Development using Substrate Node v2.0.0-rc6-be8bb186-x86_64-linux-gnu
53+
// Output: You are connected to chain Development using Substrate Node v2.0.0-a200cdb9-x86_64-linux-gnu
5454
}
5555

5656
func Example_listenToNewBlocks() {

types/account_data.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package types
1919
// AccountInfo contains information of an account
2020
type AccountInfo struct {
2121
Nonce U32
22-
Refcount U8
22+
Refcount U32
2323
Data struct {
2424
Free U128
2525
Reserved U128

types/metadata.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ type Metadata struct {
4141
AsMetadataV10 MetadataV10
4242
IsMetadataV11 bool
4343
AsMetadataV11 MetadataV11
44+
IsMetadataV12 bool
45+
AsMetadataV12 MetadataV12
4446
}
4547

4648
func NewMetadataV4() *Metadata {
@@ -71,6 +73,14 @@ func NewMetadataV11() *Metadata {
7173
}
7274
}
7375

76+
func NewMetadataV12() *Metadata {
77+
return &Metadata{
78+
Version: 12,
79+
IsMetadataV12: true,
80+
AsMetadataV12: MetadataV12{Modules: make([]ModuleMetadataV12, 0)},
81+
}
82+
}
83+
7484
func (m *Metadata) Decode(decoder scale.Decoder) error {
7585
err := decoder.Decode(&m.MagicNumber)
7686
if err != nil {
@@ -104,6 +114,9 @@ func (m *Metadata) Decode(decoder scale.Decoder) error {
104114
case 11:
105115
m.IsMetadataV11 = true
106116
err = decoder.Decode(&m.AsMetadataV11)
117+
case 12:
118+
m.IsMetadataV12 = true
119+
err = decoder.Decode(&m.AsMetadataV12)
107120
default:
108121
return fmt.Errorf("unsupported metadata version %v", m.Version)
109122
}
@@ -135,6 +148,8 @@ func (m Metadata) Encode(encoder scale.Encoder) error {
135148
err = encoder.Encode(m.AsMetadataV10)
136149
case 11:
137150
err = encoder.Encode(m.AsMetadataV11)
151+
case 12:
152+
err = encoder.Encode(m.AsMetadataV12)
138153
default:
139154
return fmt.Errorf("unsupported metadata version %v", m.Version)
140155
}
@@ -156,6 +171,8 @@ func (m *Metadata) FindCallIndex(call string) (CallIndex, error) {
156171
return m.AsMetadataV10.FindCallIndex(call)
157172
case m.IsMetadataV11:
158173
return m.AsMetadataV11.FindCallIndex(call)
174+
case m.IsMetadataV12:
175+
return m.AsMetadataV12.FindCallIndex(call)
159176
default:
160177
return CallIndex{}, fmt.Errorf("unsupported metadata version")
161178
}
@@ -175,6 +192,8 @@ func (m *Metadata) FindEventNamesForEventID(eventID EventID) (Text, Text, error)
175192
return m.AsMetadataV10.FindEventNamesForEventID(eventID)
176193
case m.IsMetadataV11:
177194
return m.AsMetadataV11.FindEventNamesForEventID(eventID)
195+
case m.IsMetadataV12:
196+
return m.AsMetadataV12.FindEventNamesForEventID(eventID)
178197
default:
179198
return "", "", fmt.Errorf("unsupported metadata version")
180199
}
@@ -194,6 +213,8 @@ func (m *Metadata) FindStorageEntryMetadata(module string, fn string) (StorageEn
194213
return m.AsMetadataV10.FindStorageEntryMetadata(module, fn)
195214
case m.IsMetadataV11:
196215
return m.AsMetadataV11.FindStorageEntryMetadata(module, fn)
216+
case m.IsMetadataV12:
217+
return m.AsMetadataV12.FindStorageEntryMetadata(module, fn)
197218
default:
198219
return nil, fmt.Errorf("unsupported metadata version")
199220
}
@@ -213,6 +234,8 @@ func (m *Metadata) ExistsModuleMetadata(module string) bool {
213234
return m.AsMetadataV10.ExistsModuleMetadata(module)
214235
case m.IsMetadataV11:
215236
return m.AsMetadataV11.ExistsModuleMetadata(module)
237+
case m.IsMetadataV12:
238+
return m.AsMetadataV12.ExistsModuleMetadata(module)
216239
default:
217240
return false
218241
}

types/metadataV12.go

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
package types
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/centrifuge/go-substrate-rpc-client/scale"
8+
)
9+
10+
// Modelled after packages/types/src/Metadata/v11/toV12.ts
11+
type MetadataV12 struct {
12+
Modules []ModuleMetadataV12
13+
Extrinsic ExtrinsicV11
14+
}
15+
16+
func (m *MetadataV12) Decode(decoder scale.Decoder) error {
17+
err := decoder.Decode(&m.Modules)
18+
if err != nil {
19+
return err
20+
}
21+
return decoder.Decode(&m.Extrinsic)
22+
}
23+
24+
func (m MetadataV12) Encode(encoder scale.Encoder) error {
25+
err := encoder.Encode(m.Modules)
26+
if err != nil {
27+
return err
28+
}
29+
return encoder.Encode(m.Extrinsic)
30+
}
31+
32+
func (m *MetadataV12) FindCallIndex(call string) (CallIndex, error) {
33+
s := strings.Split(call, ".")
34+
for _, mod := range m.Modules {
35+
if !mod.HasCalls {
36+
continue
37+
}
38+
if string(mod.Name) != s[0] {
39+
continue
40+
}
41+
for ci, f := range mod.Calls {
42+
if string(f.Name) == s[1] {
43+
return CallIndex{mod.Index, uint8(ci)}, nil
44+
}
45+
}
46+
return CallIndex{}, fmt.Errorf("method %v not found within module %v for call %v", s[1], mod.Name, call)
47+
}
48+
return CallIndex{}, fmt.Errorf("module %v not found in metadata for call %v", s[0], call)
49+
}
50+
51+
func (m *MetadataV12) FindEventNamesForEventID(eventID EventID) (Text, Text, error) {
52+
for _, mod := range m.Modules {
53+
if !mod.HasEvents {
54+
continue
55+
}
56+
if mod.Index != eventID[0] {
57+
continue
58+
}
59+
if int(eventID[1]) >= len(mod.Events) {
60+
return "", "", fmt.Errorf("event index %v for module %v out of range", eventID[1], mod.Name)
61+
}
62+
return mod.Name, mod.Events[eventID[1]].Name, nil
63+
}
64+
return "", "", fmt.Errorf("module index %v out of range", eventID[0])
65+
}
66+
67+
func (m *MetadataV12) FindStorageEntryMetadata(module string, fn string) (StorageEntryMetadata, error) {
68+
for _, mod := range m.Modules {
69+
if !mod.HasStorage {
70+
continue
71+
}
72+
if string(mod.Storage.Prefix) != module {
73+
continue
74+
}
75+
for _, s := range mod.Storage.Items {
76+
if string(s.Name) != fn {
77+
continue
78+
}
79+
return s, nil
80+
}
81+
return nil, fmt.Errorf("storage %v not found within module %v", fn, module)
82+
}
83+
return nil, fmt.Errorf("module %v not found in metadata", module)
84+
}
85+
86+
func (m *MetadataV12) ExistsModuleMetadata(module string) bool {
87+
for _, mod := range m.Modules {
88+
if string(mod.Name) == module {
89+
return true
90+
}
91+
}
92+
return false
93+
}
94+
95+
type ModuleMetadataV12 struct {
96+
Name Text
97+
HasStorage bool
98+
Storage StorageMetadataV10
99+
HasCalls bool
100+
Calls []FunctionMetadataV4
101+
HasEvents bool
102+
Events []EventMetadataV4
103+
Constants []ModuleConstantMetadataV6
104+
Errors []ErrorMetadataV8
105+
Index uint8
106+
}
107+
108+
func (m *ModuleMetadataV12) Decode(decoder scale.Decoder) error {
109+
err := decoder.Decode(&m.Name)
110+
if err != nil {
111+
return err
112+
}
113+
114+
err = decoder.Decode(&m.HasStorage)
115+
if err != nil {
116+
return err
117+
}
118+
119+
if m.HasStorage {
120+
err = decoder.Decode(&m.Storage)
121+
if err != nil {
122+
return err
123+
}
124+
}
125+
126+
err = decoder.Decode(&m.HasCalls)
127+
if err != nil {
128+
return err
129+
}
130+
131+
if m.HasCalls {
132+
err = decoder.Decode(&m.Calls)
133+
if err != nil {
134+
return err
135+
}
136+
}
137+
138+
err = decoder.Decode(&m.HasEvents)
139+
if err != nil {
140+
return err
141+
}
142+
143+
if m.HasEvents {
144+
err = decoder.Decode(&m.Events)
145+
if err != nil {
146+
return err
147+
}
148+
}
149+
150+
err = decoder.Decode(&m.Constants)
151+
if err != nil {
152+
return err
153+
}
154+
155+
err = decoder.Decode(&m.Errors)
156+
if err != nil {
157+
return err
158+
}
159+
160+
return decoder.Decode(&m.Index)
161+
}
162+
163+
func (m ModuleMetadataV12) Encode(encoder scale.Encoder) error {
164+
err := encoder.Encode(m.Name)
165+
if err != nil {
166+
return err
167+
}
168+
169+
err = encoder.Encode(m.HasStorage)
170+
if err != nil {
171+
return err
172+
}
173+
174+
if m.HasStorage {
175+
err = encoder.Encode(m.Storage)
176+
if err != nil {
177+
return err
178+
}
179+
}
180+
181+
err = encoder.Encode(m.HasCalls)
182+
if err != nil {
183+
return err
184+
}
185+
186+
if m.HasCalls {
187+
err = encoder.Encode(m.Calls)
188+
if err != nil {
189+
return err
190+
}
191+
}
192+
193+
err = encoder.Encode(m.HasEvents)
194+
if err != nil {
195+
return err
196+
}
197+
198+
if m.HasEvents {
199+
err = encoder.Encode(m.Events)
200+
if err != nil {
201+
return err
202+
}
203+
}
204+
205+
err = encoder.Encode(m.Constants)
206+
if err != nil {
207+
return err
208+
}
209+
210+
err = encoder.Encode(m.Errors)
211+
if err != nil {
212+
return err
213+
}
214+
215+
return encoder.Encode(m.Index)
216+
}

types/metadataV12_examplary_string.go

Lines changed: 20 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)