vchain_client 1.0.23 → 1.0.24
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/vchain_client/bitcoind_blockchain_adapter.rb +2 -2
- data/lib/vchain_client/blockchain_adapter_factory.rb +3 -3
- data/lib/vchain_client/blockchain_connection.rb +1 -1
- data/lib/vchain_client/blockcypher_blockchain_adapter.rb +2 -2
- data/lib/vchain_client/signatures.rb +248 -96
- data/lib/vchain_client.rb +332 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45eab3023d999ff109e6276094ad539f90b58cd5
|
4
|
+
data.tar.gz: 5ba7df0e979f407888885065f52c7b806407411f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e15a53253f36814cd6c59f7b59109dfcc9f052a23678d686b88be16c6676a8cd4aba8f1537d007bb565febbfdd94b7caae15261be1d540656a7f7f353638feb
|
7
|
+
data.tar.gz: 1769eb0e95bfb74529ad4dfe569d3d8b7c91e34efeb492c24b79f193470a3db3ee05f50691343e39ad32bf3e48458234ef9b0730e1bb2db701adc172d66781ee
|
@@ -13,13 +13,13 @@ module VChainClient
|
|
13
13
|
|
14
14
|
@@tx_cache = {}
|
15
15
|
|
16
|
-
def initialize(server, port, rpc_username, rpc_password,
|
16
|
+
def initialize(server, port, rpc_username, rpc_password, adapter_config, app_config)
|
17
17
|
@server = server
|
18
18
|
@port = port
|
19
19
|
@rpc_username = rpc_username
|
20
20
|
@rpc_password = rpc_password
|
21
21
|
|
22
|
-
@config =
|
22
|
+
@config = app_config
|
23
23
|
|
24
24
|
@log = Log4r::Logger["vchain_client"]
|
25
25
|
end
|
@@ -2,12 +2,12 @@ module VChainClient
|
|
2
2
|
|
3
3
|
class BlockchainAdapterFactory
|
4
4
|
|
5
|
-
def self.getAdapter(type, config)
|
5
|
+
def self.getAdapter(type, config, app_config)
|
6
6
|
if type == "bitcoind"
|
7
|
-
return VChainClient::BitcoindBlockchainAdapter.new(config["server"], config["port"], config["rpc_username"], config["rpc_password"], config)
|
7
|
+
return VChainClient::BitcoindBlockchainAdapter.new(config["server"], config["port"], config["rpc_username"], config["rpc_password"], config, app_config)
|
8
8
|
|
9
9
|
elsif type == "blockcypher"
|
10
|
-
return VChainClient::BlockcypherBlockchainAdapter.new(config["api_token"], config)
|
10
|
+
return VChainClient::BlockcypherBlockchainAdapter.new(config["api_token"], config, app_config)
|
11
11
|
end
|
12
12
|
|
13
13
|
raise "No such adapter '#{type}'"
|
@@ -35,7 +35,7 @@ module VChainClient
|
|
35
35
|
|
36
36
|
begin
|
37
37
|
|
38
|
-
adapter = VChainClient::BlockchainAdapterFactory.getAdapter(adapter_config["type"], adapter_config)
|
38
|
+
adapter = VChainClient::BlockchainAdapterFactory.getAdapter(adapter_config["type"], adapter_config, @config)
|
39
39
|
|
40
40
|
rescue => e
|
41
41
|
if @log.error?
|
@@ -8,10 +8,10 @@ module VChainClient
|
|
8
8
|
|
9
9
|
@api_token = nil
|
10
10
|
|
11
|
-
def initialize(api_token,
|
11
|
+
def initialize(api_token, adapter_config, app_config)
|
12
12
|
@api_token = api_token
|
13
13
|
|
14
|
-
@config =
|
14
|
+
@config = app_config
|
15
15
|
|
16
16
|
@log = Log4r::Logger["vchain_client"]
|
17
17
|
end
|
@@ -5,76 +5,203 @@ module VChainClient
|
|
5
5
|
@config = nil
|
6
6
|
@log = nil
|
7
7
|
|
8
|
+
@@priv_key = nil
|
9
|
+
@@ec_priv = nil
|
10
|
+
|
8
11
|
def initialize(config)
|
9
12
|
@config = config
|
10
13
|
|
11
14
|
@log = Log4r::Logger["vchain_client"]
|
12
15
|
end
|
13
16
|
|
14
|
-
|
17
|
+
def signBatchRequest(batch, timestamp)
|
15
18
|
OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
|
16
19
|
|
17
20
|
priv_key_path = @config["private_key_location"]
|
18
21
|
|
19
22
|
if @log.debug?
|
20
|
-
@log.debug("[Signatures.
|
21
|
-
@log.debug("-> point_type: "+ point_type)
|
22
|
-
@log.debug("-> weight: "+ weight.to_s)
|
23
|
+
@log.debug("[Signatures.signBatchRequest] input:")
|
23
24
|
@log.debug("-> timestamp: "+ timestamp.to_s)
|
24
25
|
@log.debug("-> key path: #{priv_key_path}")
|
25
26
|
@log.debug("-> input:")
|
26
|
-
@log.debug(
|
27
|
+
@log.debug(batch)
|
27
28
|
end
|
28
29
|
|
29
|
-
priv_key
|
30
|
+
if @@priv_key == nil
|
30
31
|
|
31
|
-
|
32
|
+
begin
|
32
33
|
|
33
|
-
|
34
|
+
@@priv_key = File.read(priv_key_path)
|
34
35
|
|
35
|
-
|
36
|
+
rescue => e
|
37
|
+
if @log.error?
|
38
|
+
@log.error("[Signatures.signBatchRequest] File.read raised exception:")
|
39
|
+
@log.error("#{e.class}, #{e.message}")
|
40
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
41
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
42
|
+
@log.error("-> input:")
|
43
|
+
@log.error(batch)
|
44
|
+
end
|
45
|
+
|
46
|
+
raise e
|
47
|
+
end
|
48
|
+
|
49
|
+
if @log.debug?
|
50
|
+
@log.debug("[Signatures.signBatchRequest] priv key is loaded")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
if @@priv_key == nil
|
36
56
|
if @log.error?
|
37
|
-
@log.error("[Signatures.
|
38
|
-
@log.error("#{e.class}, #{e.message}")
|
39
|
-
@log.error("-> point_type: "+ point_type)
|
40
|
-
@log.error("-> weight: "+ weight.to_s)
|
57
|
+
@log.error("[Signatures.signBatchRequest] failed to load private key")
|
41
58
|
@log.error("-> timestamp: "+ timestamp.to_s)
|
42
|
-
@log.error("-> input:")
|
43
|
-
@log.error(document)
|
44
59
|
@log.error("--> priv_key_path: #{priv_key_path}")
|
60
|
+
@log.error("-> input:")
|
61
|
+
@log.error(batch)
|
62
|
+
end
|
63
|
+
|
64
|
+
return nil
|
65
|
+
end
|
66
|
+
|
67
|
+
if @@ec_priv == nil
|
68
|
+
|
69
|
+
begin
|
70
|
+
|
71
|
+
@@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
|
72
|
+
|
73
|
+
rescue => e
|
74
|
+
if @log.error?
|
75
|
+
@log.error("[Signatures.signBatchRequest] OpenSSL::PKey::EC.new raised exception:")
|
76
|
+
@log.error("#{e.class}, #{e.message}")
|
77
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
78
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
79
|
+
@log.error("-> input:")
|
80
|
+
@log.error(batch)
|
81
|
+
end
|
82
|
+
|
83
|
+
raise e
|
84
|
+
end
|
85
|
+
|
86
|
+
if @log.debug?
|
87
|
+
@log.debug("[Signatures.signBatchRequest] key initialized")
|
45
88
|
end
|
46
89
|
|
47
|
-
raise e
|
48
90
|
end
|
49
91
|
|
50
|
-
if
|
92
|
+
if @@ec_priv == nil
|
51
93
|
if @log.error?
|
52
|
-
@log.error("[Signatures.
|
53
|
-
@log.error("-> point_type: "+ point_type)
|
54
|
-
@log.error("-> weight: "+ weight.to_s)
|
94
|
+
@log.error("[Signatures.signBatchRequest] failed init EC key")
|
55
95
|
@log.error("-> timestamp: "+ timestamp.to_s)
|
56
|
-
@log.error("-> input:")
|
57
|
-
@log.error(document)
|
58
96
|
@log.error("--> priv_key_path: #{priv_key_path}")
|
97
|
+
@log.error("-> input:")
|
98
|
+
@log.error(batch)
|
59
99
|
end
|
60
100
|
|
61
101
|
return nil
|
62
102
|
end
|
63
103
|
|
104
|
+
digest = OpenSSL::Digest::SHA256.new
|
105
|
+
|
106
|
+
whole_sign = ""
|
107
|
+
|
108
|
+
batch.each { |batch_element|
|
109
|
+
whole_sign += batch_element["data"].to_json
|
110
|
+
whole_sign += batch_element["point_type"]
|
111
|
+
whole_sign += batch_element["weight"].to_s
|
112
|
+
whole_sign += timestamp.to_s
|
113
|
+
}
|
114
|
+
|
64
115
|
if @log.debug?
|
65
|
-
@log.debug("[Signatures.
|
116
|
+
@log.debug("[Signatures.signBatchRequest] whole_to_sign: "+ whole_sign)
|
66
117
|
end
|
67
118
|
|
68
|
-
|
119
|
+
whole_signature = nil
|
69
120
|
|
70
121
|
begin
|
71
122
|
|
72
|
-
|
123
|
+
whole_signature = @@ec_priv.sign(digest, whole_sign)
|
73
124
|
|
74
125
|
rescue => e
|
75
126
|
if @log.error?
|
76
|
-
@log.error("[Signatures.
|
127
|
+
@log.error("[Signatures.signBatchRequest] ec.sign raised exception:")
|
77
128
|
@log.error("#{e.class}, #{e.message}")
|
129
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
130
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
131
|
+
@log.error("--> whole_sign: #{whole_sign}")
|
132
|
+
@log.error("-> input:")
|
133
|
+
@log.error(batch)
|
134
|
+
end
|
135
|
+
|
136
|
+
raise e
|
137
|
+
end
|
138
|
+
|
139
|
+
if whole_signature == nil
|
140
|
+
if @log.error?
|
141
|
+
@log.error("[Signatures.signBatchRequest] failed to sign")
|
142
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
143
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
144
|
+
@log.error("--> whole_sign: #{whole_sign}")
|
145
|
+
@log.error("-> input:")
|
146
|
+
@log.error(batch)
|
147
|
+
end
|
148
|
+
|
149
|
+
return nil
|
150
|
+
end
|
151
|
+
|
152
|
+
if @log.debug?
|
153
|
+
@log.debug("[Signatures.signBatchRequest] whole_signature raw: "+ Base64.encode64(whole_signature))
|
154
|
+
end
|
155
|
+
|
156
|
+
return Base64.encode64(whole_signature).gsub(/\n/, "")
|
157
|
+
end
|
158
|
+
|
159
|
+
def signRequest(document, point_type, weight, timestamp)
|
160
|
+
|
161
|
+
OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
|
162
|
+
|
163
|
+
priv_key_path = @config["private_key_location"]
|
164
|
+
|
165
|
+
if @log.debug?
|
166
|
+
@log.debug("[Signatures.signRequest] input:")
|
167
|
+
@log.debug("-> point_type: "+ point_type)
|
168
|
+
@log.debug("-> weight: "+ weight.to_s)
|
169
|
+
@log.debug("-> timestamp: "+ timestamp.to_s)
|
170
|
+
@log.debug("-> key path: #{priv_key_path}")
|
171
|
+
@log.debug("-> input:")
|
172
|
+
@log.debug(document)
|
173
|
+
end
|
174
|
+
|
175
|
+
if @@priv_key == nil
|
176
|
+
|
177
|
+
begin
|
178
|
+
|
179
|
+
@@priv_key = File.read(priv_key_path)
|
180
|
+
|
181
|
+
rescue => e
|
182
|
+
if @log.error?
|
183
|
+
@log.error("[Signatures.signRequest] File.read raised exception:")
|
184
|
+
@log.error("#{e.class}, #{e.message}")
|
185
|
+
@log.error("-> point_type: "+ point_type)
|
186
|
+
@log.error("-> weight: "+ weight.to_s)
|
187
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
188
|
+
@log.error("-> input:")
|
189
|
+
@log.error(document)
|
190
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
191
|
+
end
|
192
|
+
|
193
|
+
raise e
|
194
|
+
end
|
195
|
+
|
196
|
+
if @log.debug?
|
197
|
+
@log.debug("[Signatures.signRequest] priv key is loaded")
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
if @@priv_key == nil
|
203
|
+
if @log.error?
|
204
|
+
@log.error("[Signatures.signRequest] failed to load private key")
|
78
205
|
@log.error("-> point_type: "+ point_type)
|
79
206
|
@log.error("-> weight: "+ weight.to_s)
|
80
207
|
@log.error("-> timestamp: "+ timestamp.to_s)
|
@@ -83,10 +210,37 @@ module VChainClient
|
|
83
210
|
@log.error("--> priv_key_path: #{priv_key_path}")
|
84
211
|
end
|
85
212
|
|
86
|
-
|
213
|
+
return nil
|
87
214
|
end
|
88
215
|
|
89
|
-
if
|
216
|
+
if @@ec_priv == nil
|
217
|
+
|
218
|
+
begin
|
219
|
+
|
220
|
+
@@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
|
221
|
+
|
222
|
+
rescue => e
|
223
|
+
if @log.error?
|
224
|
+
@log.error("[Signatures.signRequest] OpenSSL::PKey::EC.new raised exception:")
|
225
|
+
@log.error("#{e.class}, #{e.message}")
|
226
|
+
@log.error("-> point_type: "+ point_type)
|
227
|
+
@log.error("-> weight: "+ weight.to_s)
|
228
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
229
|
+
@log.error("-> input:")
|
230
|
+
@log.error(document)
|
231
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
232
|
+
end
|
233
|
+
|
234
|
+
raise e
|
235
|
+
end
|
236
|
+
|
237
|
+
if @log.debug?
|
238
|
+
@log.debug("[Signatures.signRequest] key initialized")
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
|
243
|
+
if @@ec_priv == nil
|
90
244
|
if @log.error?
|
91
245
|
@log.error("[Signatures.signRequest] failed init EC key")
|
92
246
|
@log.error("-> point_type: "+ point_type)
|
@@ -100,10 +254,6 @@ module VChainClient
|
|
100
254
|
return nil
|
101
255
|
end
|
102
256
|
|
103
|
-
if @log.debug?
|
104
|
-
@log.debug("[Signatures.signRequest] key initialized")
|
105
|
-
end
|
106
|
-
|
107
257
|
digest = OpenSSL::Digest::SHA256.new
|
108
258
|
|
109
259
|
whole_sign = document.to_json + point_type + weight.to_s + timestamp.to_s
|
@@ -116,7 +266,7 @@ module VChainClient
|
|
116
266
|
|
117
267
|
begin
|
118
268
|
|
119
|
-
whole_signature =
|
269
|
+
whole_signature = @@ec_priv.sign(digest, whole_sign)
|
120
270
|
|
121
271
|
rescue => e
|
122
272
|
if @log.error?
|
@@ -235,16 +385,39 @@ module VChainClient
|
|
235
385
|
@log.debug(data)
|
236
386
|
end
|
237
387
|
|
238
|
-
priv_key
|
388
|
+
if @@priv_key == nil
|
389
|
+
|
390
|
+
begin
|
391
|
+
|
392
|
+
@@priv_key = File.read(priv_key_path)
|
393
|
+
|
394
|
+
rescue => e
|
395
|
+
if @log.error?
|
396
|
+
@log.error("[Signatures.signDataPoint] File.read raised exception:")
|
397
|
+
@log.error("#{e.class}, #{e.message}")
|
398
|
+
@log.error("-> this_client_id: #{this_client_id}")
|
399
|
+
@log.error("-> doc_hash: #{doc_hash}")
|
400
|
+
@log.error("-> credentials_hash: #{credentials_hash}")
|
401
|
+
@log.error("-> weight: "+ weight.to_s)
|
402
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
403
|
+
@log.error("-> point_type: #{point_type}")
|
404
|
+
@log.error("-> key path: #{priv_key_path}")
|
405
|
+
@log.error("-> data:")
|
406
|
+
@log.error(data)
|
407
|
+
end
|
239
408
|
|
240
|
-
|
409
|
+
raise e
|
410
|
+
end
|
241
411
|
|
242
|
-
|
412
|
+
if @log.debug?
|
413
|
+
@log.debug("[Signatures.signDataPoint] priv key loaded")
|
414
|
+
end
|
243
415
|
|
244
|
-
|
416
|
+
end
|
417
|
+
|
418
|
+
if @@priv_key == nil
|
245
419
|
if @log.error?
|
246
|
-
@log.error("[Signatures.signDataPoint]
|
247
|
-
@log.error("#{e.class}, #{e.message}")
|
420
|
+
@log.error("[Signatures.signDataPoint] failed to load private key")
|
248
421
|
@log.error("-> this_client_id: #{this_client_id}")
|
249
422
|
@log.error("-> doc_hash: #{doc_hash}")
|
250
423
|
@log.error("-> credentials_hash: #{credentials_hash}")
|
@@ -254,15 +427,45 @@ module VChainClient
|
|
254
427
|
@log.error("-> key path: #{priv_key_path}")
|
255
428
|
@log.error("-> data:")
|
256
429
|
@log.error(data)
|
257
|
-
@log.error("--> priv_key_path: #{priv_key_path}")
|
258
430
|
end
|
259
431
|
|
260
|
-
|
432
|
+
return nil
|
261
433
|
end
|
262
434
|
|
263
|
-
if
|
435
|
+
if @@ec_priv == nil
|
436
|
+
|
437
|
+
begin
|
438
|
+
|
439
|
+
@@ec_priv = OpenSSL::PKey::EC.new(@@priv_key)
|
440
|
+
|
441
|
+
rescue => e
|
442
|
+
if @log.error?
|
443
|
+
@log.error("[Signatures.signDataPoint] OpenSSL::PKey::EC.new raised exception:")
|
444
|
+
@log.error("#{e.class}, #{e.message}")
|
445
|
+
@log.error("-> this_client_id: #{this_client_id}")
|
446
|
+
@log.error("-> doc_hash: #{doc_hash}")
|
447
|
+
@log.error("-> credentials_hash: #{credentials_hash}")
|
448
|
+
@log.error("-> weight: "+ weight.to_s)
|
449
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
450
|
+
@log.error("-> point_type: #{point_type}")
|
451
|
+
@log.error("-> key path: #{priv_key_path}")
|
452
|
+
@log.error("-> data:")
|
453
|
+
@log.error(data)
|
454
|
+
@log.error("--> priv_key_path: #{priv_key_path}")
|
455
|
+
end
|
456
|
+
|
457
|
+
raise e
|
458
|
+
end
|
459
|
+
|
460
|
+
if @log.debug?
|
461
|
+
@log.debug("[Signatures.signDataPoint] key created")
|
462
|
+
end
|
463
|
+
|
464
|
+
end
|
465
|
+
|
466
|
+
if @@ec_priv == nil
|
264
467
|
if @log.error?
|
265
|
-
@log.error("[Signatures.signDataPoint] failed
|
468
|
+
@log.error("[Signatures.signDataPoint] failed init EC key")
|
266
469
|
@log.error("-> this_client_id: #{this_client_id}")
|
267
470
|
@log.error("-> doc_hash: #{doc_hash}")
|
268
471
|
@log.error("-> credentials_hash: #{credentials_hash}")
|
@@ -278,9 +481,7 @@ module VChainClient
|
|
278
481
|
return nil
|
279
482
|
end
|
280
483
|
|
281
|
-
|
282
|
-
@log.debug("[Signatures.signDataPoint] priv key loaded")
|
283
|
-
end
|
484
|
+
digest = OpenSSL::Digest::SHA256.new
|
284
485
|
|
285
486
|
output = {}
|
286
487
|
|
@@ -313,60 +514,11 @@ module VChainClient
|
|
313
514
|
@log.debug("[Signatures.signDataPoint] value_hash: #{value_hash}")
|
314
515
|
end
|
315
516
|
|
316
|
-
ec = nil
|
317
|
-
|
318
|
-
begin
|
319
|
-
|
320
|
-
ec = OpenSSL::PKey::EC.new(priv_key)
|
321
|
-
|
322
|
-
rescue => e
|
323
|
-
if @log.error?
|
324
|
-
@log.error("[Signatures.signDataPoint] OpenSSL::PKey::EC.new raised exception:")
|
325
|
-
@log.error("#{e.class}, #{e.message}")
|
326
|
-
@log.error("-> this_client_id: #{this_client_id}")
|
327
|
-
@log.error("-> doc_hash: #{doc_hash}")
|
328
|
-
@log.error("-> credentials_hash: #{credentials_hash}")
|
329
|
-
@log.error("-> weight: "+ weight.to_s)
|
330
|
-
@log.error("-> timestamp: "+ timestamp.to_s)
|
331
|
-
@log.error("-> point_type: #{point_type}")
|
332
|
-
@log.error("-> key path: #{priv_key_path}")
|
333
|
-
@log.error("-> data:")
|
334
|
-
@log.error(data)
|
335
|
-
@log.error("--> priv_key_path: #{priv_key_path}")
|
336
|
-
end
|
337
|
-
|
338
|
-
raise e
|
339
|
-
end
|
340
|
-
|
341
|
-
if ec == nil
|
342
|
-
if @log.error?
|
343
|
-
@log.error("[Signatures.signDataPoint] failed init EC key")
|
344
|
-
@log.error("-> this_client_id: #{this_client_id}")
|
345
|
-
@log.error("-> doc_hash: #{doc_hash}")
|
346
|
-
@log.error("-> credentials_hash: #{credentials_hash}")
|
347
|
-
@log.error("-> weight: "+ weight.to_s)
|
348
|
-
@log.error("-> timestamp: "+ timestamp.to_s)
|
349
|
-
@log.error("-> point_type: #{point_type}")
|
350
|
-
@log.error("-> key path: #{priv_key_path}")
|
351
|
-
@log.error("-> data:")
|
352
|
-
@log.error(data)
|
353
|
-
@log.error("--> priv_key_path: #{priv_key_path}")
|
354
|
-
end
|
355
|
-
|
356
|
-
return nil
|
357
|
-
end
|
358
|
-
|
359
|
-
if @log.debug?
|
360
|
-
@log.debug("[Signatures.signDataPoint] key created")
|
361
|
-
end
|
362
|
-
|
363
|
-
digest = OpenSSL::Digest::SHA256.new
|
364
|
-
|
365
517
|
signature = nil
|
366
518
|
|
367
519
|
begin
|
368
520
|
|
369
|
-
signature =
|
521
|
+
signature = @@ec_priv.sign(digest, what_to_sign)
|
370
522
|
|
371
523
|
rescue => e
|
372
524
|
if @log.error?
|
data/lib/vchain_client.rb
CHANGED
@@ -24,7 +24,7 @@ module VChainClient
|
|
24
24
|
|
25
25
|
DATA_POINT_VERSION = "1"
|
26
26
|
|
27
|
-
CLIENT_LIB_VERSION = "1.0.
|
27
|
+
CLIENT_LIB_VERSION = "1.0.24"
|
28
28
|
|
29
29
|
@config = nil
|
30
30
|
@log = nil
|
@@ -221,6 +221,286 @@ module VChainClient
|
|
221
221
|
return previous_parent
|
222
222
|
end
|
223
223
|
|
224
|
+
def generate_batch_data_points(input_arr)
|
225
|
+
output = []
|
226
|
+
|
227
|
+
input_arr.each { |raw_document|
|
228
|
+
|
229
|
+
if !raw_document.key?("point_type")
|
230
|
+
if @log.error?
|
231
|
+
@log.error("CLIENT LIB VERSION: "+ CLIENT_LIB_VERSION)
|
232
|
+
@log.error("[generate_batch_data_points] point_type not set for element in input array")
|
233
|
+
end
|
234
|
+
|
235
|
+
return false
|
236
|
+
end
|
237
|
+
point_type = raw_document["point_type"]
|
238
|
+
raw_document.delete("point_type")
|
239
|
+
|
240
|
+
weight = 1
|
241
|
+
if raw_document.key?("weight")
|
242
|
+
weight = raw_document["weight"]
|
243
|
+
raw_document.delete("weight")
|
244
|
+
end
|
245
|
+
|
246
|
+
surnames_arr = raw_document["surname"].split
|
247
|
+
given_names_arr = raw_document["given_names"].split
|
248
|
+
|
249
|
+
hashed_surname = ""
|
250
|
+
sep = ""
|
251
|
+
surnames_arr.each { |surname_part|
|
252
|
+
hashed_surname += sep
|
253
|
+
hashed_surname += Digest::SHA512.hexdigest(surname_part.downcase)
|
254
|
+
sep = " "
|
255
|
+
}
|
256
|
+
|
257
|
+
hashed_given_names = ""
|
258
|
+
sep = ""
|
259
|
+
given_names_arr.each { |given_names_part|
|
260
|
+
hashed_given_names += sep
|
261
|
+
hashed_given_names += Digest::SHA512.hexdigest(given_names_part.downcase)
|
262
|
+
sep = " "
|
263
|
+
}
|
264
|
+
|
265
|
+
raw_document["given_names"] = hashed_given_names
|
266
|
+
raw_document["surname"] = hashed_surname
|
267
|
+
|
268
|
+
out_document = self.hash(raw_document)
|
269
|
+
|
270
|
+
out_document = self.cut(out_document)
|
271
|
+
|
272
|
+
doc_hash = self.get_doc_hash(out_document)
|
273
|
+
out_document["doc_hash"] = doc_hash
|
274
|
+
|
275
|
+
credentials_hash = self.get_credentials_hash(out_document)
|
276
|
+
out_document["credentials_hash"] = credentials_hash
|
277
|
+
|
278
|
+
if weight > 1
|
279
|
+
weight = 1
|
280
|
+
elsif weight < 0
|
281
|
+
weight = 0
|
282
|
+
end
|
283
|
+
|
284
|
+
out_document["weight"] = weight
|
285
|
+
out_document["point_type"] = point_type
|
286
|
+
|
287
|
+
output.push(out_document)
|
288
|
+
}
|
289
|
+
|
290
|
+
return output
|
291
|
+
end
|
292
|
+
|
293
|
+
def add_batch_data_points(input_arr)
|
294
|
+
|
295
|
+
signaturesHelper = VChainClient::Signatures.new(@config)
|
296
|
+
|
297
|
+
time = Time.now.getutc
|
298
|
+
timestamp = time.to_i
|
299
|
+
|
300
|
+
batch = []
|
301
|
+
|
302
|
+
index = 0
|
303
|
+
input_arr.each { |hashed_document|
|
304
|
+
|
305
|
+
if !hashed_document.key?("point_type")
|
306
|
+
if @log.error?
|
307
|
+
@log.error("CLIENT LIB VERSION: "+ CLIENT_LIB_VERSION)
|
308
|
+
@log.error("[add_batch_data_points] point_type not set for "+ index +" element in input array")
|
309
|
+
end
|
310
|
+
|
311
|
+
return false
|
312
|
+
end
|
313
|
+
|
314
|
+
if !hashed_document.key?("doc_hash")
|
315
|
+
if @log.error?
|
316
|
+
@log.error("CLIENT LIB VERSION: "+ CLIENT_LIB_VERSION)
|
317
|
+
@log.error("[add_batch_data_points] doc_hash not set for "+ index +" element in input array")
|
318
|
+
end
|
319
|
+
|
320
|
+
return false
|
321
|
+
end
|
322
|
+
|
323
|
+
if !hashed_document.key?("credentials_hash")
|
324
|
+
if @log.error?
|
325
|
+
@log.error("CLIENT LIB VERSION: "+ CLIENT_LIB_VERSION)
|
326
|
+
@log.error("[add_batch_data_points] credentials_hash not set for "+ index +" element in input array")
|
327
|
+
end
|
328
|
+
|
329
|
+
return false
|
330
|
+
end
|
331
|
+
|
332
|
+
point_type = hashed_document["point_type"]
|
333
|
+
hashed_document.delete("point_type")
|
334
|
+
|
335
|
+
doc_hash = hashed_document["doc_hash"]
|
336
|
+
hashed_document.delete("doc_hash")
|
337
|
+
|
338
|
+
credentials_hash = hashed_document["credentials_hash"]
|
339
|
+
hashed_document.delete("credentials_hash")
|
340
|
+
|
341
|
+
weight = 1
|
342
|
+
if hashed_document.key?("weight")
|
343
|
+
weight = hashed_document["weight"]
|
344
|
+
end
|
345
|
+
hashed_document.delete("weight")
|
346
|
+
|
347
|
+
if weight > 1
|
348
|
+
weight = 1
|
349
|
+
elsif weight < 0
|
350
|
+
weight = 0
|
351
|
+
end
|
352
|
+
|
353
|
+
point_signatures = nil
|
354
|
+
|
355
|
+
begin
|
356
|
+
|
357
|
+
point_signatures = signaturesHelper.signDataPoint(point_type, hashed_document, doc_hash, credentials_hash, weight, timestamp)
|
358
|
+
|
359
|
+
rescue => e
|
360
|
+
if @log.error?
|
361
|
+
@log.error("[add_batch_data_points] Signatures.signDataPoint raised exception")
|
362
|
+
@log.error("#{e.class}, #{e.message}")
|
363
|
+
@log.error("-> point_type: "+ point_type)
|
364
|
+
@log.error("-> weight: "+ weight.to_s)
|
365
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
366
|
+
@log.error("-> document:")
|
367
|
+
@log.error(hashed_document)
|
368
|
+
end
|
369
|
+
|
370
|
+
raise e
|
371
|
+
end
|
372
|
+
|
373
|
+
if point_signatures == nil
|
374
|
+
if @log.error?
|
375
|
+
@log.error("[add_batch_data_points] failed to Signatures.signDataPoint")
|
376
|
+
@log.error("-> point_type: "+ point_type)
|
377
|
+
@log.error("-> weight: "+ weight.to_s)
|
378
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
379
|
+
@log.error("-> document:")
|
380
|
+
@log.error(hashed_document)
|
381
|
+
end
|
382
|
+
|
383
|
+
return false
|
384
|
+
end
|
385
|
+
|
386
|
+
if @log.debug?
|
387
|
+
@log.debug("[add_batch_data_points] point_signatures:")
|
388
|
+
@log.debug(point_signatures)
|
389
|
+
end
|
390
|
+
|
391
|
+
batch_element = {
|
392
|
+
"data" => Hash[hashed_document.sort],
|
393
|
+
"point_type" => point_type,
|
394
|
+
"weight" => weight,
|
395
|
+
"signatures" => point_signatures
|
396
|
+
}
|
397
|
+
|
398
|
+
batch.push(batch_element)
|
399
|
+
|
400
|
+
index += 1
|
401
|
+
}
|
402
|
+
|
403
|
+
client_id = @config["client_id"]
|
404
|
+
api_url = @config["api"]["url"] + "v0.2/batchAddDataPoint/"
|
405
|
+
|
406
|
+
whole_signature = nil
|
407
|
+
|
408
|
+
begin
|
409
|
+
|
410
|
+
whole_signature = signaturesHelper.signBatchRequest(batch, timestamp)
|
411
|
+
|
412
|
+
rescue => e
|
413
|
+
|
414
|
+
if @log.error?
|
415
|
+
@log.error("[add_batch_data_points] Signatures.signRequest raised exception:")
|
416
|
+
@log.error("#{e.class}: #{e.message}")
|
417
|
+
end
|
418
|
+
|
419
|
+
raise e
|
420
|
+
|
421
|
+
else
|
422
|
+
|
423
|
+
if whole_signature == nil
|
424
|
+
|
425
|
+
if @log.error?
|
426
|
+
@log.error("[add_batch_data_points] failed to sign request")
|
427
|
+
end
|
428
|
+
|
429
|
+
return false
|
430
|
+
end
|
431
|
+
|
432
|
+
if @log.debug?
|
433
|
+
@log.debug("[add_batch_data_points] signaturesHelper.signRequest went well, whole_signature:")
|
434
|
+
@log.debug(whole_signature)
|
435
|
+
end
|
436
|
+
|
437
|
+
send_data = {}
|
438
|
+
send_data["client_id"] = client_id
|
439
|
+
send_data["signature"] = whole_signature
|
440
|
+
send_data["timestamp"] = timestamp.to_s
|
441
|
+
|
442
|
+
send_data["data"] = []
|
443
|
+
|
444
|
+
batch.each { |doc|
|
445
|
+
send_doc = {}
|
446
|
+
|
447
|
+
send_doc["data"] = doc["data"]
|
448
|
+
send_doc["weight"] = doc["weight"].to_s
|
449
|
+
send_doc["type"] = doc["point_type"]
|
450
|
+
send_doc["point_signatures"] = doc["signatures"]
|
451
|
+
|
452
|
+
send_data["data"].push(send_doc)
|
453
|
+
}
|
454
|
+
|
455
|
+
if @log.debug?
|
456
|
+
@log.debug("[add_batch_data_points] send_data:")
|
457
|
+
@log.debug(send_data)
|
458
|
+
end
|
459
|
+
|
460
|
+
begin
|
461
|
+
req = RestClient.post(api_url,
|
462
|
+
send_data.to_json,
|
463
|
+
{'Content-Type' => 'application/json'})
|
464
|
+
|
465
|
+
if req.code != 200
|
466
|
+
|
467
|
+
if @log.error?
|
468
|
+
@log.error("[add_batch_data_points] response with code "+ req.code.to_s)
|
469
|
+
@log.error("-> client_id: #{client_id}")
|
470
|
+
@log.error("-> api_url: #{api_url}")
|
471
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
472
|
+
@log.error("-> send_data:")
|
473
|
+
@log.error(send_data)
|
474
|
+
end
|
475
|
+
|
476
|
+
return false
|
477
|
+
end
|
478
|
+
|
479
|
+
if @log.debug?
|
480
|
+
@log.debug("[add_batch_data_points] response code is 200:")
|
481
|
+
@log.debug(req.body)
|
482
|
+
end
|
483
|
+
|
484
|
+
return true
|
485
|
+
|
486
|
+
rescue => e
|
487
|
+
if @log.error?
|
488
|
+
@log.error("[add_batch_data_points] RestClient.post raised exception")
|
489
|
+
@log.error("#{e.class}, #{e.message}")
|
490
|
+
@log.error("-> client_id: #{client_id}")
|
491
|
+
@log.error("-> api_url: #{api_url}")
|
492
|
+
@log.error("-> timestamp: "+ timestamp.to_s)
|
493
|
+
@log.error("-> send_data:")
|
494
|
+
@log.error(send_data)
|
495
|
+
end
|
496
|
+
|
497
|
+
raise e
|
498
|
+
end
|
499
|
+
|
500
|
+
end
|
501
|
+
|
502
|
+
end
|
503
|
+
|
224
504
|
def add_data_point(point_type, input, weight = 1)
|
225
505
|
|
226
506
|
client_id = @config["client_id"]
|
@@ -439,7 +719,49 @@ module VChainClient
|
|
439
719
|
end
|
440
720
|
end
|
441
721
|
|
442
|
-
def
|
722
|
+
def generate_batch_check(input_arr)
|
723
|
+
|
724
|
+
if !input_arr.kind_of?(Array)
|
725
|
+
if @log.error?
|
726
|
+
@log.error("[generate_batch_check] input should be array")
|
727
|
+
@log.error("-> input_arr:")
|
728
|
+
@log.error(input_arr)
|
729
|
+
end
|
730
|
+
|
731
|
+
return false
|
732
|
+
end
|
733
|
+
|
734
|
+
output = []
|
735
|
+
|
736
|
+
input_arr.each { |raw_document|
|
737
|
+
|
738
|
+
names = {}
|
739
|
+
if raw_document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT
|
740
|
+
names = raw_document["names"]
|
741
|
+
raw_document.delete("names")
|
742
|
+
end
|
743
|
+
|
744
|
+
out_document = self.hash(raw_document)
|
745
|
+
|
746
|
+
out_document = self.cut(out_document)
|
747
|
+
|
748
|
+
if out_document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
749
|
+
out_document["names"] = []
|
750
|
+
|
751
|
+
names.each { |name|
|
752
|
+
name_hash = Digest::SHA512.hexdigest(name.downcase)
|
753
|
+
|
754
|
+
out_document["names"].push(name_hash)
|
755
|
+
}
|
756
|
+
end
|
757
|
+
|
758
|
+
output.push(out_document)
|
759
|
+
}
|
760
|
+
|
761
|
+
return output
|
762
|
+
end
|
763
|
+
|
764
|
+
def check(input, is_already_hashed = false)
|
443
765
|
|
444
766
|
client_id = @config["client_id"]
|
445
767
|
|
@@ -448,7 +770,7 @@ module VChainClient
|
|
448
770
|
document = input
|
449
771
|
|
450
772
|
names = {}
|
451
|
-
if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT
|
773
|
+
if (!is_already_hashed && document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT) || (is_already_hashed && document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED)
|
452
774
|
names = document["names"]
|
453
775
|
document.delete("names")
|
454
776
|
end
|
@@ -463,8 +785,14 @@ module VChainClient
|
|
463
785
|
|
464
786
|
if document["type"] == FIELD_TYPE_TRAVEL_DOCUMENT_HASHED
|
465
787
|
document["names"] = []
|
788
|
+
|
466
789
|
names.each { |name|
|
467
|
-
name_hash =
|
790
|
+
name_hash = name
|
791
|
+
|
792
|
+
if (!is_already_hashed)
|
793
|
+
name_hash = Digest::SHA512.hexdigest(name.downcase)
|
794
|
+
end
|
795
|
+
|
468
796
|
names_index[name_hash] = name
|
469
797
|
document["names"].push(name_hash)
|
470
798
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vchain_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aleksandr Gorelik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: log4r
|