beowulf-ruby-testnet 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ module Beowulf
2
+ VERSION = '0.0.1'
3
+ AGENT_ID = "beowulf/#{VERSION}"
4
+ end
@@ -0,0 +1,212 @@
1
+ require 'bitcoin'
2
+ require 'digest'
3
+ require 'base58'
4
+ require 'json'
5
+
6
+ module Beowulf
7
+ class Wallet
8
+ include ChainConfig
9
+ include Utils
10
+
11
+ def initialize(options = {})
12
+ @name = options[:name] || ''
13
+ @private_key = options[:private_key] || ''
14
+ @public_key = options[:public_key] || ''
15
+ @cipher_keys = options[:cipher_keys] || ''
16
+ @cipher_type = 'aes-256-cbc'
17
+ @salt = options[:salt] || ''
18
+ end
19
+
20
+ def name
21
+ @name
22
+ end
23
+
24
+ def private_key
25
+ @private_key
26
+ end
27
+
28
+ def public_key
29
+ @public_key
30
+ end
31
+
32
+ def gen_keys
33
+ @private_key = gen_priv
34
+ # puts "priv_key:", @private_key
35
+ @public_key = gen_pub
36
+ # puts "pub_key:", @public_key
37
+ end
38
+
39
+ def gen_priv
40
+ rd = SecureRandom.alphanumeric(128)
41
+ # puts "rd:", rd
42
+ seed = @name + "owner" + rd
43
+ # puts "seed:", seed
44
+ bytes = pakStr(seed)
45
+ hashSha256 = Digest::SHA256.digest(bytes)
46
+ # create checksum
47
+ pk = unhexlify('80')
48
+ pk << hashSha256
49
+ chs = Digest::SHA256.digest(pk)
50
+ chs = Digest::SHA256.digest(chs)
51
+ # create private key.
52
+ b58 = pk
53
+ b58 << chs[0..3]
54
+ # puts "gen_priv.b58:", hexlify(b58)
55
+ priv_key = Base58.binary_to_base58(b58, :bitcoin)
56
+ priv_key
57
+ end
58
+
59
+ def gen_pub
60
+ if @private_key.length > 0
61
+ b58 = Base58.base58_to_binary(@private_key, :bitcoin)
62
+ # puts "b58:", hexlify(b58)
63
+ # Get checksum 4-bytes end.
64
+ lb58 = b58.length-4
65
+ chs = b58[lb58..-1]
66
+ # Get raw private key
67
+ hb58 = lb58-1
68
+ tpk = b58[0..hb58]
69
+ # Test checksum private key
70
+ nchs = Digest::SHA256.digest(tpk)
71
+ nchs = Digest::SHA256.digest(nchs)
72
+ achs = hexlify(chs)
73
+ bnchs = hexlify(nchs[0..3])
74
+ if !(achs.eql? bnchs)
75
+ puts achs, bnchs
76
+ puts 'Invalid private key (checksum miss-match)'
77
+ end
78
+ # Create Public Key
79
+ bk = Bitcoin::Key.new(hexlify(tpk[1..-1]), nil, {compressed: true})
80
+ # puts "bk.compressed:", bk.compressed
81
+ public_key_hex = bk.pub
82
+ # puts "public_key_hex.length:", public_key_hex.length
83
+ # puts "public_key_hex:", public_key_hex
84
+ public_key_byte = unhexlify(public_key_hex)
85
+ checksum = OpenSSL::Digest::RIPEMD160.digest(public_key_byte)
86
+ public_key = NETWORKS_BEOWULF_ADDRESS_PREFIX + Base58.binary_to_base58(public_key_byte + checksum[0..3], :bitcoin)
87
+ public_key
88
+ end
89
+ end
90
+
91
+ def save_wallet_file(wallet_path, wallet_filename, password)
92
+ # Validate
93
+ if password == nil || password.length == 0
94
+ puts "Password is not empty."
95
+ end
96
+ if password.length < 8
97
+ puts "Password length >= 8 character."
98
+ end
99
+ if @name == nil || @name.length == 0
100
+ puts "name is not empty."
101
+ end
102
+
103
+ # Encrypt data
104
+ # Create checksum
105
+ @salt = SecureRandom.alphanumeric(16)
106
+ new_password = password + @salt
107
+ # puts "new_password:", new_password
108
+ pw_bytes = pakStr(new_password)
109
+ checksum = Digest::SHA512.digest(pw_bytes)
110
+ chs = hexlify(checksum)
111
+ # puts "chs", chs
112
+ # Create plain_data
113
+ keys = {@public_key => @private_key}
114
+ # puts "keys:", keys
115
+ plain_keys = {"checksum" => chs, "keys" => keys}
116
+ plain_data = JSON.dump(plain_keys)
117
+ # puts "plain_data:", plain_data
118
+
119
+ # Encrypt AES
120
+ msg_encrypt = encrypt(chs, plain_data)
121
+ msg_hex = hexlify(msg_encrypt)
122
+ # puts "msg_hex:", msg_hex
123
+ @cipher_keys = msg_hex
124
+
125
+ # Write file
126
+ file_path = wallet_filename
127
+ if wallet_filename.length == 0
128
+ file_path = @name + "-wallet.json"
129
+ end
130
+ if wallet_path.length > 0
131
+ file_path = File.join(wallet_path, file_path)
132
+ end
133
+ # puts "file_path:", file_path
134
+ # Create data save.
135
+ wallet_data = {"cipher_keys" => @cipher_keys, "cipher_type" => @cipher_type, "salt" => @salt, "name" => @name}
136
+ wallet_json = JSON.dump(wallet_data)
137
+ # puts "wallet_json:", wallet_json
138
+ File.open(file_path, "w") { |file| file.puts wallet_json}
139
+ end
140
+
141
+ # https://gist.github.com/andrekandore/3140554
142
+ def encrypt(key, data)
143
+ block = key[0..31]
144
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
145
+ aes.encrypt
146
+ last = 31 + aes.block_size
147
+ # puts "last:", last
148
+ aes.iv = key[32..last]
149
+ aes.key = block
150
+ final_msg = aes.update(data) + aes.final
151
+ final_msg
152
+ end
153
+
154
+ def read_wallet_file(wallet_path_file, password)
155
+ # puts "wallet_path_file:", wallet_path_file
156
+ # Validate inputs
157
+ if wallet_path_file == nil || wallet_path_file.length == 0
158
+ puts "Path file wallet is not empty."
159
+ end
160
+ if password == nil || password.length == 0
161
+ puts "Password is not empty."
162
+ end
163
+ # Read file wallet
164
+ file = File.read(wallet_path_file)
165
+ wallet_json = JSON.parse(file)
166
+ # puts "wallet_json:", wallet_json
167
+ # Init properties wallet
168
+ @name = wallet_json['name']
169
+ @cipher_keys = wallet_json['cipher_keys']
170
+ # puts "read_wallet_file.cipher_keys:", @cipher_keys
171
+ @salt = wallet_json['salt']
172
+ # Create checksum
173
+ new_password = password + @salt
174
+ # puts "new_password:", new_password
175
+ pw_bytes = pakStr(new_password)
176
+ checksum = Digest::SHA512.digest(pw_bytes)
177
+ chs = hexlify(checksum)
178
+ # puts "chs", chs
179
+ # Decrypt data
180
+ data_byte = unhexlify(@cipher_keys)
181
+ # Decrypt AES
182
+ msg_decrypt = decrypt(chs, data_byte)
183
+ # puts "msg_decrypt:", msg_decrypt
184
+ msg_json = JSON.parse(msg_decrypt)
185
+ # puts "msg_json:", msg_json
186
+ dechs = msg_json['checksum']
187
+ if !(chs.eql? dechs)
188
+ puts "Password wrong."
189
+ end
190
+ keys = msg_json['keys']
191
+ keys.each do |key, value|
192
+ # puts "#{key} is #{value}"
193
+ @public_key = key
194
+ @private_key = value
195
+ end
196
+ end
197
+
198
+ # https://gist.github.com/andrekandore/3140554
199
+ def decrypt(key, data)
200
+ block = key[0..31]
201
+ aes = OpenSSL::Cipher.new('AES-256-CBC')
202
+ aes.decrypt
203
+ last = 31 + aes.block_size
204
+ # puts "last:", last
205
+ aes.iv = key[32..last]
206
+ aes.key = block
207
+ final_msg = aes.update(data) + aes.final
208
+ final_msg
209
+ end
210
+
211
+ end
212
+ end
metadata ADDED
@@ -0,0 +1,463 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: beowulf-ruby-testnet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - NghiaTC
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.1.0
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '12.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '5.10'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 5.10.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '5.10'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 5.10.3
73
+ - !ruby/object:Gem::Dependency
74
+ name: minitest-line
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 0.6.3
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.6.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: minitest-proveit
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.0.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: webmock
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '3.6'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 3.6.0
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.6'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.6.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: simplecov
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: 0.17.0
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.17.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: vcr
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '5.0'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 5.0.0
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '5.0'
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 5.0.0
161
+ - !ruby/object:Gem::Dependency
162
+ name: yard
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.9.20
168
+ type: :development
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.9.20
175
+ - !ruby/object:Gem::Dependency
176
+ name: pry
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '0.11'
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: 0.11.3
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '0.11'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 0.11.3
195
+ - !ruby/object:Gem::Dependency
196
+ name: rb-readline
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.5'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 0.5.5
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '0.5'
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: 0.5.5
215
+ - !ruby/object:Gem::Dependency
216
+ name: irb
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.0'
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: 1.0.0
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - "~>"
230
+ - !ruby/object:Gem::Version
231
+ version: '1.0'
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: 1.0.0
235
+ - !ruby/object:Gem::Dependency
236
+ name: net-http-persistent
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '2.5'
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: 2.5.2
245
+ type: :runtime
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '2.5'
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: 2.5.2
255
+ - !ruby/object:Gem::Dependency
256
+ name: json
257
+ requirement: !ruby/object:Gem::Requirement
258
+ requirements:
259
+ - - "~>"
260
+ - !ruby/object:Gem::Version
261
+ version: '2.0'
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: 2.0.2
265
+ type: :runtime
266
+ prerelease: false
267
+ version_requirements: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '2.0'
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: 2.0.2
275
+ - !ruby/object:Gem::Dependency
276
+ name: logging
277
+ requirement: !ruby/object:Gem::Requirement
278
+ requirements:
279
+ - - "~>"
280
+ - !ruby/object:Gem::Version
281
+ version: '2.2'
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: 2.2.0
285
+ type: :runtime
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - "~>"
290
+ - !ruby/object:Gem::Version
291
+ version: '2.2'
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: 2.2.0
295
+ - !ruby/object:Gem::Dependency
296
+ name: hashie
297
+ requirement: !ruby/object:Gem::Requirement
298
+ requirements:
299
+ - - "~>"
300
+ - !ruby/object:Gem::Version
301
+ version: '3.5'
302
+ - - ">="
303
+ - !ruby/object:Gem::Version
304
+ version: 3.5.5
305
+ type: :runtime
306
+ prerelease: false
307
+ version_requirements: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - "~>"
310
+ - !ruby/object:Gem::Version
311
+ version: '3.5'
312
+ - - ">="
313
+ - !ruby/object:Gem::Version
314
+ version: 3.5.5
315
+ - !ruby/object:Gem::Dependency
316
+ name: bitcoin-ruby
317
+ requirement: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - "~>"
320
+ - !ruby/object:Gem::Version
321
+ version: '0.0'
322
+ - - ">="
323
+ - !ruby/object:Gem::Version
324
+ version: 0.0.11
325
+ type: :runtime
326
+ prerelease: false
327
+ version_requirements: !ruby/object:Gem::Requirement
328
+ requirements:
329
+ - - "~>"
330
+ - !ruby/object:Gem::Version
331
+ version: '0.0'
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: 0.0.11
335
+ - !ruby/object:Gem::Dependency
336
+ name: ffi
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: '1.9'
342
+ - - ">="
343
+ - !ruby/object:Gem::Version
344
+ version: 1.9.18
345
+ type: :runtime
346
+ prerelease: false
347
+ version_requirements: !ruby/object:Gem::Requirement
348
+ requirements:
349
+ - - "~>"
350
+ - !ruby/object:Gem::Version
351
+ version: '1.9'
352
+ - - ">="
353
+ - !ruby/object:Gem::Version
354
+ version: 1.9.18
355
+ - !ruby/object:Gem::Dependency
356
+ name: awesome_print
357
+ requirement: !ruby/object:Gem::Requirement
358
+ requirements:
359
+ - - "~>"
360
+ - !ruby/object:Gem::Version
361
+ version: '1.7'
362
+ - - ">="
363
+ - !ruby/object:Gem::Version
364
+ version: 1.7.0
365
+ type: :runtime
366
+ prerelease: false
367
+ version_requirements: !ruby/object:Gem::Requirement
368
+ requirements:
369
+ - - "~>"
370
+ - !ruby/object:Gem::Version
371
+ version: '1.7'
372
+ - - ">="
373
+ - !ruby/object:Gem::Version
374
+ version: 1.7.0
375
+ - !ruby/object:Gem::Dependency
376
+ name: base58
377
+ requirement: !ruby/object:Gem::Requirement
378
+ requirements:
379
+ - - "~>"
380
+ - !ruby/object:Gem::Version
381
+ version: '0.2'
382
+ - - ">="
383
+ - !ruby/object:Gem::Version
384
+ version: 0.2.3
385
+ type: :runtime
386
+ prerelease: false
387
+ version_requirements: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - "~>"
390
+ - !ruby/object:Gem::Version
391
+ version: '0.2'
392
+ - - ">="
393
+ - !ruby/object:Gem::Version
394
+ version: 0.2.3
395
+ description: Beowulf-ruby is the official Beowulf library for Ruby.
396
+ email:
397
+ - contact@beowulfchain.com
398
+ executables: []
399
+ extensions: []
400
+ extra_rdoc_files: []
401
+ files:
402
+ - ".gitignore"
403
+ - Gemfile
404
+ - LICENSE
405
+ - README.md
406
+ - Rakefile
407
+ - beowulf.gemspec
408
+ - lib/beowulf.rb
409
+ - lib/beowulf/account_history_api.rb
410
+ - lib/beowulf/api.rb
411
+ - lib/beowulf/base_error.rb
412
+ - lib/beowulf/block_api.rb
413
+ - lib/beowulf/broadcast_operations.json
414
+ - lib/beowulf/chain_config.rb
415
+ - lib/beowulf/condenser_api.rb
416
+ - lib/beowulf/database_api.rb
417
+ - lib/beowulf/error_parser.rb
418
+ - lib/beowulf/logger.rb
419
+ - lib/beowulf/methods.json
420
+ - lib/beowulf/network_broadcast_api.rb
421
+ - lib/beowulf/operation.rb
422
+ - lib/beowulf/operation_ids.rb
423
+ - lib/beowulf/operation_types.rb
424
+ - lib/beowulf/transaction.rb
425
+ - lib/beowulf/type/amount.rb
426
+ - lib/beowulf/type/array.rb
427
+ - lib/beowulf/type/authority.rb
428
+ - lib/beowulf/type/authority_update.rb
429
+ - lib/beowulf/type/future.rb
430
+ - lib/beowulf/type/hash.rb
431
+ - lib/beowulf/type/permission.rb
432
+ - lib/beowulf/type/point_in_time.rb
433
+ - lib/beowulf/type/public_key.rb
434
+ - lib/beowulf/type/serializer.rb
435
+ - lib/beowulf/type/u_int16.rb
436
+ - lib/beowulf/type/u_int32.rb
437
+ - lib/beowulf/utils.rb
438
+ - lib/beowulf/version.rb
439
+ - lib/beowulf/wallet.rb
440
+ homepage: https://github.com/beowulf-foundation/beowulf-ruby
441
+ licenses:
442
+ - MIT
443
+ metadata: {}
444
+ post_install_message:
445
+ rdoc_options: []
446
+ require_paths:
447
+ - lib
448
+ required_ruby_version: !ruby/object:Gem::Requirement
449
+ requirements:
450
+ - - ">="
451
+ - !ruby/object:Gem::Version
452
+ version: '0'
453
+ required_rubygems_version: !ruby/object:Gem::Requirement
454
+ requirements:
455
+ - - ">="
456
+ - !ruby/object:Gem::Version
457
+ version: '0'
458
+ requirements: []
459
+ rubygems_version: 3.1.2
460
+ signing_key:
461
+ specification_version: 4
462
+ summary: Beowulf RPC Ruby Client
463
+ test_files: []