scale.rb 0.2.19 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Cargo.lock +8 -4
- data/Cargo.toml +2 -3
- data/Gemfile.lock +3 -3
- data/README.md +19 -3
- data/Rakefile +6 -0
- data/lib/helper.rb +19 -4
- data/lib/metadata/metadata.rb +27 -17
- data/lib/metadata/metadata_v0.rb +24 -20
- data/lib/metadata/metadata_v1.rb +13 -9
- data/lib/metadata/metadata_v10.rb +2 -2
- data/lib/metadata/metadata_v11.rb +2 -2
- data/lib/metadata/metadata_v12.rb +9 -8
- data/lib/metadata/metadata_v13.rb +161 -0
- data/lib/metadata/metadata_v2.rb +2 -2
- data/lib/metadata/metadata_v3.rb +2 -2
- data/lib/metadata/metadata_v4.rb +21 -11
- data/lib/metadata/metadata_v5.rb +21 -11
- data/lib/metadata/metadata_v6.rb +9 -9
- data/lib/metadata/metadata_v7.rb +26 -15
- data/lib/metadata/metadata_v8.rb +9 -9
- data/lib/metadata/metadata_v9.rb +2 -2
- data/lib/scale.rb +36 -376
- data/lib/scale/base.rb +136 -96
- data/lib/scale/block.rb +4 -4
- data/lib/scale/trie.rb +1 -1
- data/lib/scale/types.rb +89 -39
- data/lib/scale/version.rb +1 -1
- data/lib/scale_bytes.rb +63 -0
- data/lib/substrate_client.rb +9 -6
- data/lib/type_builder.rb +279 -0
- data/lib/type_registry.rb +91 -0
- data/lib/type_registry/darwinia.json +730 -554
- data/lib/type_registry/default.json +1 -0
- data/lib/type_registry/pangolin.json +571 -132
- data/scripts/mmr_root_to_sign.rb +10 -0
- data/src/lib.rs +80 -25
- metadata +11 -7
- data/src/storage_key.rs +0 -41
@@ -0,0 +1,10 @@
|
|
1
|
+
client = SubstrateClient.new "wss://pangolin-rpc.darwinia.network"
|
2
|
+
|
3
|
+
begin
|
4
|
+
block_number = Scale::Types.get("BlockNumberFor").new(670820)
|
5
|
+
puts client.get_storage("EthereumRelayAuthorities", "MmrRootsToSign", [block_number]).to_human
|
6
|
+
rescue => ex
|
7
|
+
puts ex.message
|
8
|
+
puts ex.backtrace
|
9
|
+
end
|
10
|
+
|
data/src/lib.rs
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
extern crate parity_scale_codec;
|
2
2
|
use std::slice;
|
3
|
-
use parity_scale_codec::
|
3
|
+
use parity_scale_codec::Decode;
|
4
4
|
use frame_support::Twox128;
|
5
|
+
use frame_support::Twox64Concat;
|
6
|
+
use frame_support::Identity;
|
5
7
|
use frame_support::Blake2_128Concat;
|
6
8
|
use frame_support::StorageHasher;
|
7
9
|
|
10
|
+
use libc::c_char;
|
11
|
+
use std::ffi::{CStr, CString};
|
12
|
+
|
8
13
|
fn to_u8_vec(v_pointer: *const u8, len: usize) -> Vec<u8> {
|
9
14
|
let data_slice = unsafe {
|
10
15
|
assert!(!v_pointer.is_null());
|
@@ -13,6 +18,38 @@ fn to_u8_vec(v_pointer: *const u8, len: usize) -> Vec<u8> {
|
|
13
18
|
data_slice.to_vec()
|
14
19
|
}
|
15
20
|
|
21
|
+
fn to_string(str_p: *const c_char) -> String {
|
22
|
+
let s = unsafe {
|
23
|
+
assert!(!str_p.is_null());
|
24
|
+
CStr::from_ptr(str_p)
|
25
|
+
};
|
26
|
+
|
27
|
+
s.to_str().unwrap().to_string()
|
28
|
+
}
|
29
|
+
|
30
|
+
fn v8_vec_to_pointer(key: Vec<u8>) -> *const c_char {
|
31
|
+
let key = CString::new(hex::encode(key)).unwrap();
|
32
|
+
let result = key.as_ptr();
|
33
|
+
std::mem::forget(key);
|
34
|
+
result
|
35
|
+
}
|
36
|
+
|
37
|
+
fn gen_param_hash(param_pointer: *const u8, param_len: usize, param_hasher: *const c_char) -> Vec<u8> {
|
38
|
+
let param_hasher = to_string(param_hasher);
|
39
|
+
let param_hasher = param_hasher.as_str();
|
40
|
+
let param = to_u8_vec(param_pointer, param_len);
|
41
|
+
|
42
|
+
if param_hasher == "blake2_128_concat" {
|
43
|
+
Blake2_128Concat::hash(¶m).to_vec()
|
44
|
+
} else if param_hasher == "twox64_concat" {
|
45
|
+
Twox64Concat::hash(¶m).to_vec()
|
46
|
+
} else if param_hasher == "identity" {
|
47
|
+
Identity::hash(¶m).to_vec()
|
48
|
+
} else {
|
49
|
+
panic!("Not supported hasher type")
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
16
53
|
fn decode_from_raw_parts<T: Decode + PartialEq + std::fmt::Debug>(v_pointer: *const u8, len: usize) -> T {
|
17
54
|
let data_slice = unsafe {
|
18
55
|
assert!(!v_pointer.is_null());
|
@@ -61,33 +98,51 @@ pub extern fn parse_opt_bool(v_pointer: *const u8, len: usize, inner_value: bool
|
|
61
98
|
}
|
62
99
|
|
63
100
|
#[no_mangle]
|
64
|
-
pub extern fn
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
)
|
69
|
-
let
|
70
|
-
|
71
|
-
let
|
72
|
-
|
73
|
-
|
74
|
-
|
101
|
+
pub extern fn get_storage_key_for_value(
|
102
|
+
module_name: *const c_char,
|
103
|
+
storage_name: *const c_char,
|
104
|
+
) -> *const c_char {
|
105
|
+
let module_name = to_string(module_name);
|
106
|
+
let storage_name = to_string(storage_name);
|
107
|
+
|
108
|
+
let storage_key = [Twox128::hash(module_name.as_bytes()), Twox128::hash(storage_name.as_bytes())].concat();
|
109
|
+
v8_vec_to_pointer(storage_key)
|
110
|
+
}
|
111
|
+
|
112
|
+
#[no_mangle]
|
113
|
+
pub extern fn get_storage_key_for_map(
|
114
|
+
module_name: *const c_char,
|
115
|
+
storage_name: *const c_char,
|
116
|
+
param_pointer: *const u8, param_len: usize, param_hasher: *const c_char,
|
117
|
+
) -> *const c_char {
|
118
|
+
let module_name = to_string(module_name);
|
119
|
+
let storage_name = to_string(storage_name);
|
120
|
+
let mut storage_key = [Twox128::hash(module_name.as_bytes()), Twox128::hash(storage_name.as_bytes())].concat();
|
121
|
+
|
122
|
+
let param_hash = gen_param_hash(param_pointer, param_len, param_hasher);
|
123
|
+
storage_key.extend(param_hash);
|
124
|
+
|
125
|
+
v8_vec_to_pointer(storage_key)
|
75
126
|
}
|
76
127
|
|
77
128
|
#[no_mangle]
|
78
|
-
pub extern fn
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
) {
|
84
|
-
let
|
85
|
-
let
|
86
|
-
let
|
87
|
-
|
88
|
-
let
|
89
|
-
|
90
|
-
|
129
|
+
pub extern fn get_storage_key_for_double_map(
|
130
|
+
module_name: *const c_char,
|
131
|
+
storage_name: *const c_char,
|
132
|
+
param1_pointer: *const u8, param1_len: usize, param1_hasher: *const c_char,
|
133
|
+
param2_pointer: *const u8, param2_len: usize, param2_hasher: *const c_char,
|
134
|
+
) -> *const c_char {
|
135
|
+
let module_name = to_string(module_name);
|
136
|
+
let storage_name = to_string(storage_name);
|
137
|
+
let mut storage_key = [Twox128::hash(module_name.as_bytes()), Twox128::hash(storage_name.as_bytes())].concat();
|
138
|
+
|
139
|
+
let param1_hash = gen_param_hash(param1_pointer, param1_len, param1_hasher);
|
140
|
+
storage_key.extend(param1_hash);
|
141
|
+
|
142
|
+
let param2_hash = gen_param_hash(param2_pointer, param2_len, param2_hasher);
|
143
|
+
storage_key.extend(param2_hash);
|
144
|
+
|
145
|
+
v8_vec_to_pointer(storage_key)
|
91
146
|
}
|
92
147
|
|
93
148
|
#[test]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scale.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wu Minzhe
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: blake2b_rs
|
@@ -196,6 +196,7 @@ files:
|
|
196
196
|
- lib/metadata/metadata_v10.rb
|
197
197
|
- lib/metadata/metadata_v11.rb
|
198
198
|
- lib/metadata/metadata_v12.rb
|
199
|
+
- lib/metadata/metadata_v13.rb
|
199
200
|
- lib/metadata/metadata_v2.rb
|
200
201
|
- lib/metadata/metadata_v3.rb
|
201
202
|
- lib/metadata/metadata_v4.rb
|
@@ -210,7 +211,10 @@ files:
|
|
210
211
|
- lib/scale/trie.rb
|
211
212
|
- lib/scale/types.rb
|
212
213
|
- lib/scale/version.rb
|
214
|
+
- lib/scale_bytes.rb
|
213
215
|
- lib/substrate_client.rb
|
216
|
+
- lib/type_builder.rb
|
217
|
+
- lib/type_registry.rb
|
214
218
|
- lib/type_registry/crab.json
|
215
219
|
- lib/type_registry/darwinia.json
|
216
220
|
- lib/type_registry/default.json
|
@@ -221,15 +225,15 @@ files:
|
|
221
225
|
- scale.gemspec
|
222
226
|
- scripts/block_events.rb
|
223
227
|
- scripts/example.rb
|
228
|
+
- scripts/mmr_root_to_sign.rb
|
224
229
|
- src/lib.rs
|
225
|
-
- src/storage_key.rs
|
226
230
|
homepage: https://github.com/itering/scale.rb
|
227
231
|
licenses:
|
228
232
|
- MIT
|
229
233
|
metadata:
|
230
234
|
allowed_push_host: https://rubygems.org
|
231
235
|
homepage_uri: https://github.com/itering/scale.rb
|
232
|
-
post_install_message:
|
236
|
+
post_install_message:
|
233
237
|
rdoc_options: []
|
234
238
|
require_paths:
|
235
239
|
- lib
|
@@ -244,8 +248,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
248
|
- !ruby/object:Gem::Version
|
245
249
|
version: '0'
|
246
250
|
requirements: []
|
247
|
-
rubygems_version: 3.
|
248
|
-
signing_key:
|
251
|
+
rubygems_version: 3.1.4
|
252
|
+
signing_key:
|
249
253
|
specification_version: 4
|
250
254
|
summary: Ruby SCALE Codec Library
|
251
255
|
test_files: []
|
data/src/storage_key.rs
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
use frame_support::Twox128;
|
2
|
-
use parity_scale_codec::Encode;
|
3
|
-
use frame_support::{Identity, Blake2_128Concat, Twox64Concat};
|
4
|
-
use frame_support::StorageHasher;
|
5
|
-
|
6
|
-
pub fn to_hex_string(bytes: Vec<u8>) -> String {
|
7
|
-
let strs: Vec<String> = bytes.iter()
|
8
|
-
.map(|b| format!("{:02x}", b))
|
9
|
-
.collect();
|
10
|
-
strs.join("")
|
11
|
-
}
|
12
|
-
|
13
|
-
fn main() {
|
14
|
-
// value
|
15
|
-
let k = [Twox128::hash(b"Sudo"), Twox128::hash(b"Key")].concat();
|
16
|
-
println!("{}", to_hex_string(k));
|
17
|
-
|
18
|
-
// map
|
19
|
-
let mut k = [Twox128::hash(b"ModuleAbc"), Twox128::hash(b"Map1")].concat();
|
20
|
-
k.extend(vec![1u8, 0, 0, 0].using_encoded(Blake2_128Concat::hash));
|
21
|
-
println!("{}", to_hex_string(k));
|
22
|
-
|
23
|
-
let mut k = [Twox128::hash(b"ModuleAbc"), Twox128::hash(b"Map2")].concat();
|
24
|
-
k.extend(1u32.using_encoded(Twox64Concat::hash));
|
25
|
-
println!("{}", to_hex_string(k));
|
26
|
-
|
27
|
-
let mut k = [Twox128::hash(b"ModuleAbc"), Twox128::hash(b"Map3")].concat();
|
28
|
-
k.extend(1u32.using_encoded(Identity::hash));
|
29
|
-
println!("{}", to_hex_string(k));
|
30
|
-
|
31
|
-
// double map
|
32
|
-
let mut k = [Twox128::hash(b"ModuleAbc"), Twox128::hash(b"DoubleMap1")].concat();
|
33
|
-
k.extend(1u32.using_encoded(Blake2_128Concat::hash));
|
34
|
-
k.extend(2u32.using_encoded(Blake2_128Concat::hash));
|
35
|
-
println!("{}", to_hex_string(k));
|
36
|
-
|
37
|
-
let mut k = [Twox128::hash(b"ModuleAbc"), Twox128::hash(b"DoubleMap2")].concat();
|
38
|
-
k.extend(1u32.using_encoded(Blake2_128Concat::hash));
|
39
|
-
k.extend(2u32.using_encoded(Twox64Concat::hash));
|
40
|
-
println!("{}", to_hex_string(k));
|
41
|
-
}
|