zold 0.16.16 → 0.16.17
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/README.md +1 -0
- data/lib/zold/cached_wallets.rb +11 -10
- data/lib/zold/commands/clean.rb +12 -13
- data/lib/zold/commands/fetch.rb +5 -6
- data/lib/zold/commands/list.rb +1 -1
- data/lib/zold/commands/propagate.rb +21 -22
- data/lib/zold/commands/push.rb +1 -1
- data/lib/zold/commands/remote.rb +44 -32
- data/lib/zold/copies.rb +4 -4
- data/lib/zold/http.rb +6 -6
- data/lib/zold/version.rb +1 -1
- data/test/test_cached_wallets.rb +1 -0
- data/zold.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 294ae5c8edd1bfd6c8f8567f5e19161356d656d87a04050e29c82bcf5a5303cf
|
4
|
+
data.tar.gz: 63646cc0ed79fcb7de5c1c9498db578248aa6ff3e22a840138ccede01eed468e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31dc5ac7025b04c949c0ee1329bcdc773fa159322437c665b48722b3e21a2295f37ba465f5bc7df13cf5d7654a3e234bfaf999399b9c0fc9bbe42881995226d5
|
7
|
+
data.tar.gz: 7e79554604ca13438cd05c467ce6f46274a8bbbb7bbedfee84e3d28ea8989f4707d7ad924e6c896108e6a282baee7c02cee76533f75ec78353eb070f9f823383
|
data/README.md
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
[](http://badge.fury.io/rb/zold)
|
14
14
|
[](https://codecov.io/github/zold-io/zold?branch=master)
|
15
15
|
|
16
|
+
[](http://rubydoc.info/github/zold-io/zold/master/frames)
|
16
17
|
[](https://codeclimate.com/github/zold-io/zold/maintainability)
|
17
18
|
|
18
19
|
**NOTICE**: It's an experiment and a very early draft! Please, feel free to
|
data/lib/zold/cached_wallets.rb
CHANGED
@@ -19,9 +19,9 @@
|
|
19
19
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
# SOFTWARE.
|
22
|
-
|
23
|
-
|
24
|
-
require_relative '
|
22
|
+
|
23
|
+
require 'zache'
|
24
|
+
require_relative 'endless'
|
25
25
|
|
26
26
|
# Cached collection of wallets.
|
27
27
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -32,8 +32,13 @@ module Zold
|
|
32
32
|
class CachedWallets
|
33
33
|
def initialize(wallets)
|
34
34
|
@wallets = wallets
|
35
|
-
@
|
36
|
-
@
|
35
|
+
@zache = Zache.new
|
36
|
+
@clean = Thread.start do
|
37
|
+
Endless.new('cached_wallets').run do
|
38
|
+
sleep 60
|
39
|
+
@zache.clean
|
40
|
+
end
|
41
|
+
end
|
37
42
|
end
|
38
43
|
|
39
44
|
def to_s
|
@@ -50,11 +55,7 @@ module Zold
|
|
50
55
|
|
51
56
|
def find(id)
|
52
57
|
@wallets.find(id) do |wallet|
|
53
|
-
|
54
|
-
@cache[id] = wallet unless @cache[id]
|
55
|
-
@cache[id]
|
56
|
-
end
|
57
|
-
yield w
|
58
|
+
yield @zache.get(id.to_s, lifetime: 5 * 60) { wallet }
|
58
59
|
end
|
59
60
|
end
|
60
61
|
end
|
data/lib/zold/commands/clean.rb
CHANGED
@@ -55,24 +55,23 @@ Available options:"
|
|
55
55
|
end
|
56
56
|
mine = Args.new(opts, @log).take || return
|
57
57
|
(mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }).each do |id|
|
58
|
-
clean(
|
58
|
+
clean(Copies.new(File.join(@copies, id), log: @log), opts)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
def clean(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
in #{Age.new(start, limit: 0.01)}, #{cps.all.count} left:\n" +
|
69
|
-
cps.all.map do |c|
|
70
|
-
wallet = Wallet.new(c[:path])
|
71
|
-
" #{c[:name]}: #{c[:score]} #{wallet.mnemo} \
|
62
|
+
def clean(cps, _)
|
63
|
+
start = Time.now
|
64
|
+
deleted = cps.clean
|
65
|
+
list = cps.all.map do |c|
|
66
|
+
wallet = Wallet.new(c[:path])
|
67
|
+
" #{c[:name]}: #{c[:score]} #{wallet.mnemo} \
|
72
68
|
#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}"
|
73
|
-
end.join("\n")
|
74
|
-
)
|
75
69
|
end
|
70
|
+
@log.debug(
|
71
|
+
"#{deleted} expired local copies removed for #{cps} \
|
72
|
+
in #{Age.new(start, limit: 0.01)}, \
|
73
|
+
#{list.empty? ? 'nothing left' : "#{list.count} left:\n#{list.join("\n")}"}"
|
74
|
+
)
|
76
75
|
end
|
77
76
|
end
|
78
77
|
end
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -90,12 +90,11 @@ Available options:"
|
|
90
90
|
raise "No nodes out of #{nodes.value} have the wallet #{id}" if done.value.zero? && !opts['quiet-if-absent']
|
91
91
|
@log.info("#{done.value} copies of #{id} fetched in #{Age.new(start)} with the total score of \
|
92
92
|
#{total.value} from #{nodes.value} nodes")
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
@log.debug(" #{c[:name]}: #{c[:score]} #{wallet.mnemo} \
|
97
|
-
#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}")
|
93
|
+
list = cps.all.map do |c|
|
94
|
+
" ##{c[:name]}: #{c[:score]} #{Wallet.new(c[:path]).mnemo} \
|
95
|
+
#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}"
|
98
96
|
end
|
97
|
+
@log.debug("#{cps.all.count} local copies of #{id}:\n#{list.join("\n")}")
|
99
98
|
end
|
100
99
|
|
101
100
|
def fetch_one(id, r, cps, opts)
|
@@ -105,7 +104,7 @@ Available options:"
|
|
105
104
|
return 0
|
106
105
|
end
|
107
106
|
uri = "/wallet/#{id}"
|
108
|
-
res = r.http(uri).get
|
107
|
+
res = r.http(uri).get(timeout: 60)
|
109
108
|
raise "Wallet #{id} not found" if res.code == '404'
|
110
109
|
r.assert_code(200, res)
|
111
110
|
json = JsonPage.new(res.body, uri).to_hash
|
data/lib/zold/commands/list.rb
CHANGED
@@ -63,31 +63,30 @@ Available options:"
|
|
63
63
|
start = Time.now
|
64
64
|
modified = []
|
65
65
|
total = 0
|
66
|
-
@wallets.find(id)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
network = @wallets.find(id, &:network)
|
67
|
+
@wallets.find(id, &:txns).select { |t| t.amount.negative? }.each do |t|
|
68
|
+
total += 1
|
69
|
+
if t.bnf == id
|
70
|
+
@log.error("Paying itself in #{id}? #{t}")
|
71
|
+
next
|
72
|
+
end
|
73
|
+
@wallets.find(t.bnf) do |target|
|
74
|
+
unless target.exists?
|
75
|
+
@log.debug("#{t.amount * -1} to #{t.bnf}: wallet is absent")
|
76
|
+
next
|
77
|
+
end
|
78
|
+
unless target.network == network
|
79
|
+
@log.error("#{t.amount * -1} to #{t.bnf}: network mismatch, '#{target.network}'!='#{network}'")
|
71
80
|
next
|
72
81
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
-
unless target.network == wallet.network
|
79
|
-
@log.error("#{t.amount * -1} to #{t.bnf}: network mismatch, '#{target.network}'!='#{wallet.network}'")
|
80
|
-
next
|
81
|
-
end
|
82
|
-
next if target.includes_positive?(t.id, id)
|
83
|
-
unless target.prefix?(t.prefix)
|
84
|
-
@log.error("#{t.amount * -1} to #{t.bnf}: wrong prefix")
|
85
|
-
next
|
86
|
-
end
|
87
|
-
target.add(t.inverse(id))
|
88
|
-
@log.info("#{t.amount * -1} arrived to #{t.bnf}: #{t.details}")
|
89
|
-
modified << t.bnf
|
82
|
+
next if target.includes_positive?(t.id, id)
|
83
|
+
unless target.prefix?(t.prefix)
|
84
|
+
@log.error("#{t.amount * -1} to #{t.bnf}: wrong prefix")
|
85
|
+
next
|
90
86
|
end
|
87
|
+
target.add(t.inverse(id))
|
88
|
+
@log.info("#{t.amount * -1} arrived to #{t.bnf}: #{t.details}")
|
89
|
+
modified << t.bnf
|
91
90
|
end
|
92
91
|
end
|
93
92
|
modified.uniq!
|
data/lib/zold/commands/push.rb
CHANGED
@@ -92,7 +92,7 @@ total score for #{id} is #{total}")
|
|
92
92
|
IO.read(wallet.path)
|
93
93
|
end
|
94
94
|
uri = "/wallet/#{id}"
|
95
|
-
response = r.http(uri).put(content)
|
95
|
+
response = r.http(uri).put(content, timeout: 60)
|
96
96
|
@wallets.find(id) do |wallet|
|
97
97
|
if response.code == '304'
|
98
98
|
@log.info("#{r}: same version of #{wallet.mnemo} there, in #{Age.new(start, limit: 0.5)}")
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -96,6 +96,9 @@ Available options:"
|
|
96
96
|
o.bool '--skip-ping',
|
97
97
|
'Don\'t ping back the node when adding it (not recommended)',
|
98
98
|
default: false
|
99
|
+
o.integer '--depth',
|
100
|
+
'The amount of update cycles to run, in order to fetch as many nodes as possible (default: 2)',
|
101
|
+
default: 2
|
99
102
|
o.string '--network',
|
100
103
|
"The name of the network we work in (default: #{Wallet::MAIN_NETWORK}",
|
101
104
|
required: true,
|
@@ -139,7 +142,6 @@ Available options:"
|
|
139
142
|
trim(opts)
|
140
143
|
when 'update'
|
141
144
|
update(opts)
|
142
|
-
update(opts, false)
|
143
145
|
when 'select'
|
144
146
|
select(opts)
|
145
147
|
else
|
@@ -157,8 +159,9 @@ Available options:"
|
|
157
159
|
end
|
158
160
|
|
159
161
|
def clean
|
162
|
+
before = @remotes.all.count
|
160
163
|
@remotes.clean
|
161
|
-
@log.debug(
|
164
|
+
@log.debug("All #{before} remote nodes deleted")
|
162
165
|
end
|
163
166
|
|
164
167
|
def reset
|
@@ -217,44 +220,53 @@ Available options:"
|
|
217
220
|
all = @remotes.all
|
218
221
|
all.each do |r|
|
219
222
|
next if r[:errors] <= opts['tolerate']
|
220
|
-
remove(r[:host], r[:port]
|
223
|
+
@remotes.remove(r[:host], r[:port])
|
221
224
|
@log.info("#{r[:host]}:#{r[:port]} removed because of #{r[:errors]} errors (over #{opts['tolerate']})")
|
222
225
|
end
|
223
226
|
@log.info("The list of #{all.count} remotes trimmed, #{@remotes.all.count} nodes left there")
|
224
227
|
end
|
225
228
|
|
226
|
-
def update(opts
|
229
|
+
def update(opts)
|
230
|
+
st = Time.now
|
227
231
|
capacity = []
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
(
|
245
|
-
|
232
|
+
opts['depth'].times do |cycle|
|
233
|
+
@remotes.iterate(@log, farm: @farm) do |r|
|
234
|
+
start = Time.now
|
235
|
+
uri = '/remotes'
|
236
|
+
res = r.http(uri).get
|
237
|
+
r.assert_code(200, res)
|
238
|
+
json = JsonPage.new(res.body, uri).to_hash
|
239
|
+
score = Score.parse_json(json['score'])
|
240
|
+
r.assert_valid_score(score)
|
241
|
+
r.assert_score_ownership(score)
|
242
|
+
r.assert_score_strength(score) unless opts['ignore-score-weakness']
|
243
|
+
@remotes.rescore(score.host, score.port, score.value)
|
244
|
+
gem = Zold::Gem.new
|
245
|
+
if Semantic::Version.new(VERSION) < Semantic::Version.new(json['version']) ||
|
246
|
+
Semantic::Version.new(VERSION) < Semantic::Version.new(gem.last_version)
|
247
|
+
if opts['reboot']
|
248
|
+
@log.info("#{r}: their version #{json['version']} is higher than mine #{VERSION}, reboot! \
|
249
|
+
(use --never-reboot to avoid this from happening)")
|
250
|
+
terminate
|
251
|
+
end
|
252
|
+
@log.debug("#{r}: their version #{json['version']} is higher than mine #{VERSION}, \
|
253
|
+
it's recommended to reboot, but I don't do it because of --never-reboot")
|
246
254
|
end
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
255
|
+
if cycle.positive?
|
256
|
+
json['all'].each do |s|
|
257
|
+
if opts['ignore-node'].include?("#{s['host']}:#{s['port']}")
|
258
|
+
@log.debug("#{s['host']}:#{s['port']}, which is found at #{r} \
|
259
|
+
won't be added since it's in the --ignore-node list")
|
260
|
+
next
|
261
|
+
end
|
262
|
+
next if @remotes.exists?(s['host'], s['port'])
|
263
|
+
@remotes.add(s['host'], s['port'])
|
264
|
+
@log.info("#{s['host']}:#{s['port']} found at #{r} and added to the list of #{@remotes.all.count}")
|
265
|
+
end
|
254
266
|
end
|
267
|
+
capacity << { host: score.host, port: score.port, count: json['all'].count }
|
268
|
+
@log.info("#{r}: the score is #{Rainbow(score.value).green} (#{json['version']}) in #{Age.new(start)}")
|
255
269
|
end
|
256
|
-
capacity << { host: score.host, port: score.port, count: json['all'].count }
|
257
|
-
@log.info("#{r}: the score is #{Rainbow(score.value).green} (#{json['version']}) in #{Age.new(start)}")
|
258
270
|
end
|
259
271
|
max_capacity = capacity.map { |c| c[:count] }.max || 0
|
260
272
|
capacity.each do |c|
|
@@ -264,7 +276,7 @@ it's recommended to reboot, but I don't do it because of --never-reboot")
|
|
264
276
|
if total.zero?
|
265
277
|
@log.info("The list of remotes is #{Rainbow('empty').red}, run 'zold remote reset'!")
|
266
278
|
else
|
267
|
-
@log.info("There are #{total} known remotes")
|
279
|
+
@log.info("There are #{total} known remotes after update in #{Age.new(st)}")
|
268
280
|
end
|
269
281
|
end
|
270
282
|
|
data/lib/zold/copies.rb
CHANGED
@@ -67,13 +67,13 @@ module Zold
|
|
67
67
|
deleted += 1
|
68
68
|
end
|
69
69
|
files.each do |f|
|
70
|
-
|
71
|
-
wallet = Wallet.new(
|
70
|
+
cp = File.join(@dir, f)
|
71
|
+
wallet = Wallet.new(cp)
|
72
72
|
begin
|
73
73
|
wallet.refurbish
|
74
|
-
raise "Invalid protocol #{wallet.protocol} in #{
|
74
|
+
raise "Invalid protocol #{wallet.protocol} in #{cp}" unless wallet.protocol == Zold::PROTOCOL
|
75
75
|
rescue StandardError => e
|
76
|
-
FileUtils.rm_rf(
|
76
|
+
FileUtils.rm_rf(cp)
|
77
77
|
@log.debug("Copy at #{f} deleted: #{Backtrace.new(e)}")
|
78
78
|
deleted += 1
|
79
79
|
end
|
data/lib/zold/http.rb
CHANGED
@@ -55,10 +55,10 @@ module Zold
|
|
55
55
|
PROTOCOL_HEADER = 'X-Zold-Protocol'
|
56
56
|
|
57
57
|
# Read timeout in seconds
|
58
|
-
READ_TIMEOUT =
|
58
|
+
READ_TIMEOUT = 0.4
|
59
59
|
|
60
60
|
# Connect timeout in seconds
|
61
|
-
CONNECT_TIMEOUT =
|
61
|
+
CONNECT_TIMEOUT = 0.2
|
62
62
|
|
63
63
|
def initialize(uri:, score: Score::ZERO, network: 'test')
|
64
64
|
@uri = uri.is_a?(URI) ? uri : URI(uri)
|
@@ -66,28 +66,28 @@ module Zold
|
|
66
66
|
@network = network
|
67
67
|
end
|
68
68
|
|
69
|
-
def get
|
69
|
+
def get(timeout: Http::READ_TIMEOUT + Http::CONNECT_TIMEOUT)
|
70
70
|
http = Net::HTTP.new(@uri.host, @uri.port)
|
71
71
|
http.use_ssl = @uri.scheme == 'https'
|
72
72
|
http.read_timeout = Http::READ_TIMEOUT
|
73
73
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
74
74
|
path = @uri.path
|
75
75
|
path += '?' + @uri.query if @uri.query
|
76
|
-
Timeout.timeout(
|
76
|
+
Timeout.timeout(timeout) do
|
77
77
|
http.request_get(path, headers)
|
78
78
|
end
|
79
79
|
rescue StandardError => e
|
80
80
|
Error.new(e)
|
81
81
|
end
|
82
82
|
|
83
|
-
def put(body)
|
83
|
+
def put(body, timeout: Http::READ_TIMEOUT + Http::CONNECT_TIMEOUT)
|
84
84
|
http = Net::HTTP.new(@uri.host, @uri.port)
|
85
85
|
http.use_ssl = @uri.scheme == 'https'
|
86
86
|
http.read_timeout = Http::READ_TIMEOUT
|
87
87
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
88
88
|
path = @uri.path
|
89
89
|
path += '?' + @uri.query if @uri.query
|
90
|
-
Timeout.timeout(
|
90
|
+
Timeout.timeout(timeout) do
|
91
91
|
http.request_put(
|
92
92
|
path, body,
|
93
93
|
headers.merge(
|
data/lib/zold/version.rb
CHANGED
data/test/test_cached_wallets.rb
CHANGED
data/zold.gemspec
CHANGED
@@ -75,7 +75,7 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
75
75
|
s.add_runtime_dependency 'threads', '0.3.0'
|
76
76
|
s.add_runtime_dependency 'usagewatch_ext', '0.2.1'
|
77
77
|
s.add_runtime_dependency 'xcop', '0.6'
|
78
|
-
s.add_runtime_dependency 'zache', '0.
|
78
|
+
s.add_runtime_dependency 'zache', '0.3.0'
|
79
79
|
s.add_runtime_dependency 'zold-score', '0.2.0'
|
80
80
|
s.add_development_dependency 'codecov', '0.1.13'
|
81
81
|
s.add_development_dependency 'minitest', '5.11.3'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -310,14 +310,14 @@ dependencies:
|
|
310
310
|
requirements:
|
311
311
|
- - '='
|
312
312
|
- !ruby/object:Gem::Version
|
313
|
-
version: 0.
|
313
|
+
version: 0.3.0
|
314
314
|
type: :runtime
|
315
315
|
prerelease: false
|
316
316
|
version_requirements: !ruby/object:Gem::Requirement
|
317
317
|
requirements:
|
318
318
|
- - '='
|
319
319
|
- !ruby/object:Gem::Version
|
320
|
-
version: 0.
|
320
|
+
version: 0.3.0
|
321
321
|
- !ruby/object:Gem::Dependency
|
322
322
|
name: zold-score
|
323
323
|
requirement: !ruby/object:Gem::Requirement
|