exonum-client-ruby 0.0.1 → 0.0.2
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/lib/exonum.rb +1 -1
- data/lib/exonum/types/array.rb +4 -4
- data/lib/exonum/types/message.rb +8 -11
- data/lib/exonum/types/primitive.rb +47 -47
- data/lib/exonum/types/struct.rb +2 -2
- data/lib/exonum/util/random.rb +15 -0
- data/lib/exonum/version.rb +1 -1
- data/spec/serialization_spec.rb +19 -6
- metadata +2 -2
- data/lib/exonum/util/seed.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d36a7b3d7326dfd340b7fe57359f9a1108085dcfe9ca321b6df76e5fa683e2e7
|
4
|
+
data.tar.gz: 3f55e725815ef517cf2ded1ed3c8169799f6e129866acf7a310d55bd8d9db08f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 226eaf5744c50639be204c53865d2ed3b263dc07152af6c909d60c56974fc715706a3c1c38be2e3295df4e628b05029c183f9d04b6d9e8aeca68344bdd90cf73
|
7
|
+
data.tar.gz: 1e2ba10868bc82cf0dd89e41bd8956ed078e25f979e7e82a88825de3ba376d076df17217d6b6de315dd3a1adf52c4148f1b42b7bd83971cd05d26bdaf3bf641f
|
data/lib/exonum.rb
CHANGED
data/lib/exonum/types/array.rb
CHANGED
@@ -17,8 +17,8 @@ module Exonum
|
|
17
17
|
|
18
18
|
def serialize data, buffer, from=0, shift=0
|
19
19
|
raise "Expecting array" unless data.is_a?(Array)
|
20
|
-
UInt32T.
|
21
|
-
UInt32T.
|
20
|
+
UInt32T.serialize buffer.length, buffer, from
|
21
|
+
UInt32T.serialize data.length, buffer, from + 4
|
22
22
|
if value_type.is_a?(StringT)
|
23
23
|
start = buffer.length
|
24
24
|
(start..(data.length*8-1)).each do |i|
|
@@ -27,9 +27,9 @@ module Exonum
|
|
27
27
|
(0..(data.length-1)).each do |i|
|
28
28
|
index = start + i*8
|
29
29
|
finish = buffer.length
|
30
|
-
UInt32T.
|
30
|
+
UInt32T.serialize finish - shift, buffer, index
|
31
31
|
value_type.serialize data[i], buffer, finish
|
32
|
-
UInt32T.
|
32
|
+
UInt32T.serialize buffer.length - finish, buffer, index + 4
|
33
33
|
end
|
34
34
|
elsif value_type.is_a?(ArrayT)
|
35
35
|
start = buffer.length
|
data/lib/exonum/types/message.rb
CHANGED
@@ -12,16 +12,16 @@ module Exonum
|
|
12
12
|
self.message_id = message_id
|
13
13
|
self.service_id = service_id
|
14
14
|
self.head = StructT.new([
|
15
|
-
{ name: 'network_id', type: UInt8T
|
16
|
-
{ name: 'protocol_version', type: UInt8T
|
17
|
-
{ name: 'message_id', type: UInt16T
|
18
|
-
{ name: 'service_id', type: UInt16T
|
19
|
-
{ name: 'payload', type: UInt32T
|
15
|
+
{ name: 'network_id', type: UInt8T },
|
16
|
+
{ name: 'protocol_version', type: UInt8T },
|
17
|
+
{ name: 'message_id', type: UInt16T },
|
18
|
+
{ name: 'service_id', type: UInt16T },
|
19
|
+
{ name: 'payload', type: UInt32T }
|
20
20
|
])
|
21
21
|
self.body = body
|
22
22
|
end
|
23
23
|
|
24
|
-
def serialize data
|
24
|
+
def serialize data
|
25
25
|
buffer = SparseArray.new
|
26
26
|
head_data = {
|
27
27
|
network_id: 0,
|
@@ -32,17 +32,14 @@ module Exonum
|
|
32
32
|
}
|
33
33
|
head.serialize head_data, buffer, 0
|
34
34
|
body.serialize data, buffer, head.size, 0, true
|
35
|
-
UInt32T.
|
36
|
-
unless cutSignature
|
37
|
-
SignatureT.new.serialize signature, buffer, buffer.length
|
38
|
-
end
|
35
|
+
UInt32T.serialize buffer.length + SignatureT.size, buffer, 6
|
39
36
|
buffer.serialize
|
40
37
|
end
|
41
38
|
|
42
39
|
def sign secret, data
|
43
40
|
raise "Expecting 64 bytes key in hex" unless secret.is_a?(String) and secret.length == 128
|
44
41
|
key = Ed25519::SigningKey.new [secret[0..63]].pack 'H*'
|
45
|
-
buffer = serialize(data
|
42
|
+
buffer = serialize(data).pack('c*')
|
46
43
|
key.sign(buffer).unpack('H*').first
|
47
44
|
end
|
48
45
|
end
|
@@ -13,15 +13,15 @@ module Exonum
|
|
13
13
|
MAX_UINT64 = 18446744073709551615
|
14
14
|
|
15
15
|
class Int8T
|
16
|
-
def size
|
16
|
+
def self.size
|
17
17
|
1
|
18
18
|
end
|
19
19
|
|
20
|
-
def fixed?
|
20
|
+
def self.fixed?
|
21
21
|
true
|
22
22
|
end
|
23
23
|
|
24
|
-
def serialize value, buffer, from, shift=0
|
24
|
+
def self.serialize value, buffer, from, shift=0
|
25
25
|
raise 'Incorrect integer value' if value < MIN_INT8 or value > MAX_INT8
|
26
26
|
[value].pack('c').bytes.each do |byte|
|
27
27
|
buffer[from] = byte
|
@@ -31,15 +31,15 @@ module Exonum
|
|
31
31
|
end
|
32
32
|
|
33
33
|
class UInt8T
|
34
|
-
def size
|
34
|
+
def self.size
|
35
35
|
1
|
36
36
|
end
|
37
37
|
|
38
|
-
def fixed?
|
38
|
+
def self.fixed?
|
39
39
|
true
|
40
40
|
end
|
41
41
|
|
42
|
-
def serialize value, buffer, from, shift=0
|
42
|
+
def self.serialize value, buffer, from, shift=0
|
43
43
|
raise 'Incorrect integer value' if value < 0 or value > MAX_UINT8
|
44
44
|
[value].pack('C').bytes.each do |byte|
|
45
45
|
buffer[from] = byte
|
@@ -49,15 +49,15 @@ module Exonum
|
|
49
49
|
end
|
50
50
|
|
51
51
|
class Int16T
|
52
|
-
def size
|
52
|
+
def self.size
|
53
53
|
2
|
54
54
|
end
|
55
55
|
|
56
|
-
def fixed?
|
56
|
+
def self.fixed?
|
57
57
|
true
|
58
58
|
end
|
59
59
|
|
60
|
-
def serialize value, buffer, from, shift=0
|
60
|
+
def self.serialize value, buffer, from, shift=0
|
61
61
|
raise 'Incorrect integer value' if value < MIN_INT16 or value > MAX_INT16
|
62
62
|
[value].pack('s<').bytes.each do |byte|
|
63
63
|
buffer[from] = byte
|
@@ -67,15 +67,15 @@ module Exonum
|
|
67
67
|
end
|
68
68
|
|
69
69
|
class UInt16T
|
70
|
-
def size
|
70
|
+
def self.size
|
71
71
|
2
|
72
72
|
end
|
73
73
|
|
74
|
-
def fixed?
|
74
|
+
def self.fixed?
|
75
75
|
true
|
76
76
|
end
|
77
77
|
|
78
|
-
def serialize value, buffer, from, shift=0
|
78
|
+
def self.serialize value, buffer, from, shift=0
|
79
79
|
raise 'Incorrect integer value' if value < 0 or value > MAX_UINT16
|
80
80
|
[value].pack('S<').bytes.each do |byte|
|
81
81
|
buffer[from] = byte
|
@@ -85,15 +85,15 @@ module Exonum
|
|
85
85
|
end
|
86
86
|
|
87
87
|
class Int32T
|
88
|
-
def size
|
88
|
+
def self.size
|
89
89
|
4
|
90
90
|
end
|
91
91
|
|
92
|
-
def fixed?
|
92
|
+
def self.fixed?
|
93
93
|
true
|
94
94
|
end
|
95
95
|
|
96
|
-
def serialize value, buffer, from, shift=0
|
96
|
+
def self.serialize value, buffer, from, shift=0
|
97
97
|
raise 'Incorrect integer value' if value < MIN_INT32 or value > MAX_INT32
|
98
98
|
[value].pack('l<').bytes.each do |byte|
|
99
99
|
buffer[from] = byte
|
@@ -103,15 +103,15 @@ module Exonum
|
|
103
103
|
end
|
104
104
|
|
105
105
|
class UInt32T
|
106
|
-
def size
|
106
|
+
def self.size
|
107
107
|
4
|
108
108
|
end
|
109
109
|
|
110
|
-
def fixed?
|
110
|
+
def self.fixed?
|
111
111
|
true
|
112
112
|
end
|
113
113
|
|
114
|
-
def serialize value, buffer, from, shift=0
|
114
|
+
def self.serialize value, buffer, from, shift=0
|
115
115
|
raise 'Incorrect integer value' if value < 0 or value > MAX_UINT32
|
116
116
|
[value].pack('L<').bytes.each do |byte|
|
117
117
|
buffer[from] = byte
|
@@ -121,15 +121,15 @@ module Exonum
|
|
121
121
|
end
|
122
122
|
|
123
123
|
class Int64T
|
124
|
-
def size
|
124
|
+
def self.size
|
125
125
|
8
|
126
126
|
end
|
127
127
|
|
128
|
-
def fixed?
|
128
|
+
def self.fixed?
|
129
129
|
true
|
130
130
|
end
|
131
131
|
|
132
|
-
def serialize value, buffer, from, shift=0
|
132
|
+
def self.serialize value, buffer, from, shift=0
|
133
133
|
[value].pack('q<').bytes.each do |byte|
|
134
134
|
buffer[from] = byte
|
135
135
|
from += 1
|
@@ -138,15 +138,15 @@ module Exonum
|
|
138
138
|
end
|
139
139
|
|
140
140
|
class UInt64T
|
141
|
-
def size
|
141
|
+
def self.size
|
142
142
|
8
|
143
143
|
end
|
144
144
|
|
145
|
-
def fixed?
|
145
|
+
def self.fixed?
|
146
146
|
true
|
147
147
|
end
|
148
148
|
|
149
|
-
def serialize value, buffer, from, shift=0
|
149
|
+
def self.serialize value, buffer, from, shift=0
|
150
150
|
[value].pack('Q<').bytes.each do |byte|
|
151
151
|
buffer[from] = byte
|
152
152
|
from += 1
|
@@ -155,15 +155,15 @@ module Exonum
|
|
155
155
|
end
|
156
156
|
|
157
157
|
class Float32T
|
158
|
-
def size
|
158
|
+
def self.size
|
159
159
|
4
|
160
160
|
end
|
161
161
|
|
162
|
-
def fixed?
|
162
|
+
def self.fixed?
|
163
163
|
true
|
164
164
|
end
|
165
165
|
|
166
|
-
def serialize value, buffer, from, shift=0
|
166
|
+
def self.serialize value, buffer, from, shift=0
|
167
167
|
[value].pack('e').bytes.each do |byte|
|
168
168
|
buffer[from] = byte
|
169
169
|
from += 1
|
@@ -172,15 +172,15 @@ module Exonum
|
|
172
172
|
end
|
173
173
|
|
174
174
|
class Float64T
|
175
|
-
def size
|
175
|
+
def self.size
|
176
176
|
8
|
177
177
|
end
|
178
178
|
|
179
|
-
def fixed?
|
179
|
+
def self.fixed?
|
180
180
|
true
|
181
181
|
end
|
182
182
|
|
183
|
-
def serialize value, buffer, from, shift=0
|
183
|
+
def self.serialize value, buffer, from, shift=0
|
184
184
|
[value].pack('E').bytes.each do |byte|
|
185
185
|
buffer[from] = byte
|
186
186
|
from += 1
|
@@ -189,29 +189,29 @@ module Exonum
|
|
189
189
|
end
|
190
190
|
|
191
191
|
class BoolT
|
192
|
-
def size
|
192
|
+
def self.size
|
193
193
|
1
|
194
194
|
end
|
195
195
|
|
196
|
-
def fixed?
|
196
|
+
def self.fixed?
|
197
197
|
true
|
198
198
|
end
|
199
199
|
|
200
|
-
def serialize value, buffer, from, shift=0
|
200
|
+
def self.serialize value, buffer, from, shift=0
|
201
201
|
buffer[from] = value ? 1 : 0
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
205
|
class PublicKeyT
|
206
|
-
def size
|
206
|
+
def self.size
|
207
207
|
32
|
208
208
|
end
|
209
209
|
|
210
|
-
def fixed?
|
210
|
+
def self.fixed?
|
211
211
|
true
|
212
212
|
end
|
213
213
|
|
214
|
-
def serialize value, buffer, from, shift=0
|
214
|
+
def self.serialize value, buffer, from, shift=0
|
215
215
|
raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
|
216
216
|
[value].pack('H*').bytes.each do |byte|
|
217
217
|
buffer[from] = byte
|
@@ -221,15 +221,15 @@ module Exonum
|
|
221
221
|
end
|
222
222
|
|
223
223
|
class HashT
|
224
|
-
def size
|
224
|
+
def self.size
|
225
225
|
32
|
226
226
|
end
|
227
227
|
|
228
|
-
def fixed?
|
228
|
+
def self.fixed?
|
229
229
|
true
|
230
230
|
end
|
231
231
|
|
232
|
-
def serialize value, buffer, from, shift=0
|
232
|
+
def self.serialize value, buffer, from, shift=0
|
233
233
|
raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
|
234
234
|
[value].pack('H*').bytes.each do |byte|
|
235
235
|
buffer[from] = byte
|
@@ -239,15 +239,15 @@ module Exonum
|
|
239
239
|
end
|
240
240
|
|
241
241
|
class SignatureT
|
242
|
-
def size
|
242
|
+
def self.size
|
243
243
|
64
|
244
244
|
end
|
245
245
|
|
246
|
-
def fixed?
|
246
|
+
def self.fixed?
|
247
247
|
true
|
248
248
|
end
|
249
249
|
|
250
|
-
def serialize value, buffer, from, shift=0
|
250
|
+
def self.serialize value, buffer, from, shift=0
|
251
251
|
raise "Expecting #{size} bytes in hex" unless value.is_a?(String) and value.length == size*2
|
252
252
|
[value].pack('H*').bytes.each do |byte|
|
253
253
|
buffer[from] = byte
|
@@ -257,24 +257,24 @@ module Exonum
|
|
257
257
|
end
|
258
258
|
|
259
259
|
class StringT
|
260
|
-
def size
|
260
|
+
def self.size
|
261
261
|
8
|
262
262
|
end
|
263
263
|
|
264
|
-
def fixed?
|
264
|
+
def self.fixed?
|
265
265
|
false
|
266
266
|
end
|
267
267
|
|
268
|
-
def serialize value, buffer, from, shift=0
|
268
|
+
def self.serialize value, buffer, from, shift=0
|
269
269
|
raise "Expecting string" unless value.is_a?(String)
|
270
270
|
bufferLengthOld = buffer.length
|
271
271
|
bufferLengthNew = bufferLengthOld
|
272
|
-
UInt32T.
|
272
|
+
UInt32T.serialize(bufferLengthOld - shift, buffer, from) # index where string content starts in buffer
|
273
273
|
value.bytes.each do |byte|
|
274
274
|
buffer[bufferLengthNew] = byte
|
275
275
|
bufferLengthNew += 1
|
276
276
|
end
|
277
|
-
UInt32T.
|
277
|
+
UInt32T.serialize(bufferLengthNew - bufferLengthOld, buffer, from + 4) # string length
|
278
278
|
end
|
279
279
|
end
|
280
280
|
end
|
data/lib/exonum/types/struct.rb
CHANGED
@@ -41,10 +41,10 @@ module Exonum
|
|
41
41
|
localShift += field[:type].size
|
42
42
|
else
|
43
43
|
bufferLengthOld = buffer.length
|
44
|
-
UInt32T.
|
44
|
+
UInt32T.serialize(bufferLengthOld - nestedShift, buffer, localFrom) # index where string content starts in buffer
|
45
45
|
field[:type].serialize value, buffer, bufferLengthOld, nestedShift
|
46
46
|
bufferLengthNew = buffer.length
|
47
|
-
UInt32T.
|
47
|
+
UInt32T.serialize(bufferLengthNew - bufferLengthOld, buffer, localFrom + 4) # string length
|
48
48
|
localShift += 8
|
49
49
|
end
|
50
50
|
else
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Exonum
|
2
|
+
module Random
|
3
|
+
def self.generate_seed
|
4
|
+
SecureRandom.random_bytes(16).unpack('Q<').first
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.generate_keypair
|
8
|
+
key = Ed25519::SigningKey.generate
|
9
|
+
{
|
10
|
+
public: key.verify_key.to_bytes.unpack('H*').first,
|
11
|
+
private: key.to_bytes.unpack('H*').first
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/exonum/version.rb
CHANGED
data/spec/serialization_spec.rb
CHANGED
@@ -2,7 +2,11 @@ require 'exonum'
|
|
2
2
|
|
3
3
|
RSpec.describe 'serialization' do
|
4
4
|
it "can serialize simple structure" do
|
5
|
-
fields = [
|
5
|
+
fields = [
|
6
|
+
{ name: 'pubkey', type: Exonum::PublicKeyT },
|
7
|
+
{ name: 'owner', type: Exonum::StringT },
|
8
|
+
{ name: 'balance', type: Exonum::UInt64T }
|
9
|
+
]
|
6
10
|
data = { 'pubkey' => '99ace6c721db293b0ed5b487e6d6111f22a8c55d2a1b7606b6fa6e6c29671aa1', 'owner' => 'Andrew', 'balance' => 1234 }
|
7
11
|
buffer = SparseArray.new
|
8
12
|
s = Exonum::StructT.new fields
|
@@ -11,7 +15,7 @@ RSpec.describe 'serialization' do
|
|
11
15
|
end
|
12
16
|
|
13
17
|
it "can serialize array" do
|
14
|
-
a=Exonum::ArrayT.new Exonum::Int16T
|
18
|
+
a=Exonum::ArrayT.new Exonum::Int16T
|
15
19
|
buffer = SparseArray.new
|
16
20
|
a.serialize [1,2,3], buffer
|
17
21
|
expect(buffer.serialize.pack('c*').unpack('H*').first).to eq("0000000003000000010002000300")
|
@@ -22,9 +26,9 @@ RSpec.describe 'serialization' do
|
|
22
26
|
signature = "46386a5ef9ad0ac5d1e2fe509e3e3bfa27f4f0d376628169df76b5c02f77f8699ed966031a42bbc1a94002c4ec666f4e7d143a481e19eee306a2dfd8280c3d0e"
|
23
27
|
|
24
28
|
fields = [
|
25
|
-
{ name: 'pub_key', type: Exonum::PublicKeyT
|
26
|
-
{ name: 'amount', type: Exonum::UInt64T
|
27
|
-
{ name: 'seed', type: Exonum::UInt64T
|
29
|
+
{ name: 'pub_key', type: Exonum::PublicKeyT },
|
30
|
+
{ name: 'amount', type: Exonum::UInt64T },
|
31
|
+
{ name: 'seed', type: Exonum::UInt64T }
|
28
32
|
]
|
29
33
|
data = {
|
30
34
|
'pub_key' => "29823166d18e2471a19b16d261fe329f1228048846c1acea2f370e6a89c7a4d9",
|
@@ -36,6 +40,15 @@ RSpec.describe 'serialization' do
|
|
36
40
|
end
|
37
41
|
|
38
42
|
it "can generate seed" do
|
39
|
-
expect(Exonum.generate_seed.is_a? Integer).to be true
|
43
|
+
expect(Exonum::Random.generate_seed.is_a? Integer).to be true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can generate keypair" do
|
47
|
+
keypair = Exonum::Random.generate_keypair
|
48
|
+
data = 'test'
|
49
|
+
signing_key = Ed25519::SigningKey.new [keypair[:private]].pack('H*')
|
50
|
+
verify_key = Ed25519::VerifyKey.new [keypair[:public]].pack('H*')
|
51
|
+
signature = signing_key.sign data
|
52
|
+
expect(verify_key.verify signature, data).to be true
|
40
53
|
end
|
41
54
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exonum-client-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuri Gomozov
|
@@ -83,7 +83,7 @@ files:
|
|
83
83
|
- lib/exonum/types/message.rb
|
84
84
|
- lib/exonum/types/primitive.rb
|
85
85
|
- lib/exonum/types/struct.rb
|
86
|
-
- lib/exonum/util/
|
86
|
+
- lib/exonum/util/random.rb
|
87
87
|
- lib/exonum/util/sparse_array.rb
|
88
88
|
- lib/exonum/version.rb
|
89
89
|
- spec/serialization_spec.rb
|