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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2234809e9ae540d2ae606a94240b4c2f7643a03473617058824e115dd5d60b21
4
- data.tar.gz: f731faae600d904377c8a504f6ae7efe9537bae7cce5c47f1ce3bea78838d0ef
3
+ metadata.gz: d36a7b3d7326dfd340b7fe57359f9a1108085dcfe9ca321b6df76e5fa683e2e7
4
+ data.tar.gz: 3f55e725815ef517cf2ded1ed3c8169799f6e129866acf7a310d55bd8d9db08f
5
5
  SHA512:
6
- metadata.gz: 503e23958b618d4262619dd97d68e157bf30536ef50ac3ee884c04449186a3d57eacca34bf258267604485644d6471986cfbbaadc097c3b4f22b2fa4373f3954
7
- data.tar.gz: 96ed0b2cca0afc8f645796638dcbb19760576e95de4f2d674bc85b5374305fbda3d93b26a97a9138140a62a7efc1f51a1318bafa9314e44811742a8f0ab4ecc8
6
+ metadata.gz: 226eaf5744c50639be204c53865d2ed3b263dc07152af6c909d60c56974fc715706a3c1c38be2e3295df4e628b05029c183f9d04b6d9e8aeca68344bdd90cf73
7
+ data.tar.gz: 1e2ba10868bc82cf0dd89e41bd8956ed078e25f979e7e82a88825de3ba376d076df17217d6b6de315dd3a1adf52c4148f1b42b7bd83971cd05d26bdaf3bf641f
@@ -3,7 +3,7 @@ require 'sparse_array'
3
3
  require 'ed25519'
4
4
  require 'securerandom'
5
5
  require 'exonum/util/sparse_array'
6
- require 'exonum/util/seed'
6
+ require 'exonum/util/random'
7
7
  require 'exonum/types/primitive'
8
8
  require 'exonum/types/struct'
9
9
  require 'exonum/types/array'
@@ -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.new.serialize buffer.length, buffer, from
21
- UInt32T.new.serialize data.length, buffer, from + 4
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.new.serialize finish - shift, buffer, index
30
+ UInt32T.serialize finish - shift, buffer, index
31
31
  value_type.serialize data[i], buffer, finish
32
- UInt32T.new.serialize buffer.length - finish, buffer, index + 4
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
@@ -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.new },
16
- { name: 'protocol_version', type: UInt8T.new },
17
- { name: 'message_id', type: UInt16T.new },
18
- { name: 'service_id', type: UInt16T.new },
19
- { name: 'payload', type: UInt32T.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 }
20
20
  ])
21
21
  self.body = body
22
22
  end
23
23
 
24
- def serialize data, cutSignature
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.new.serialize buffer.length + SignatureT.new.size, buffer, 6
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, true).pack('c*')
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.new.serialize(bufferLengthOld - shift, buffer, from) # index where string content starts in buffer
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.new.serialize(bufferLengthNew - bufferLengthOld, buffer, from + 4) # string length
277
+ UInt32T.serialize(bufferLengthNew - bufferLengthOld, buffer, from + 4) # string length
278
278
  end
279
279
  end
280
280
  end
@@ -41,10 +41,10 @@ module Exonum
41
41
  localShift += field[:type].size
42
42
  else
43
43
  bufferLengthOld = buffer.length
44
- UInt32T.new.serialize(bufferLengthOld - nestedShift, buffer, localFrom) # index where string content starts in buffer
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.new.serialize(bufferLengthNew - bufferLengthOld, buffer, localFrom + 4) # string length
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
@@ -1,4 +1,4 @@
1
1
  module Exonum
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
@@ -2,7 +2,11 @@ require 'exonum'
2
2
 
3
3
  RSpec.describe 'serialization' do
4
4
  it "can serialize simple structure" do
5
- fields = [{name: 'pubkey', type: Exonum::PublicKeyT.new}, { name: 'owner', type: Exonum::StringT.new}, { name: 'balance', type: Exonum::UInt64T.new}]
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.new
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.new },
26
- { name: 'amount', type: Exonum::UInt64T.new },
27
- { name: 'seed', type: Exonum::UInt64T.new }
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.1
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/seed.rb
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
@@ -1,5 +0,0 @@
1
- module Exonum
2
- def self.generate_seed
3
- SecureRandom.random_bytes(16).unpack('Q<').first
4
- end
5
- end