exonum-client-ruby 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|