zold 0.26.10 → 0.26.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zold/commands/clean.rb +5 -2
- data/lib/zold/commands/fetch.rb +12 -9
- data/lib/zold/commands/node.rb +3 -1
- data/lib/zold/commands/propagate.rb +3 -0
- data/lib/zold/commands/routines/reconnect.rb +1 -2
- data/lib/zold/commands/routines/spread.rb +56 -0
- data/lib/zold/copies.rb +3 -2
- data/lib/zold/id.rb +8 -1
- data/lib/zold/node/entrance.rb +7 -4
- data/lib/zold/node/front.rb +3 -2
- data/lib/zold/patch.rb +2 -3
- data/lib/zold/version.rb +1 -1
- data/test/fake_home.rb +1 -3
- data/test/test_id.rb +4 -0
- data/test/upgrades/test_delete_banned_wallets.rb +1 -1
- data/upgrades/delete_banned_wallets.rb +2 -3
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d0d8d5abb824adcb3222588744bd9f51b095b6a35d7de3401d6155867899bbd
|
4
|
+
data.tar.gz: 04e0597677b18e5f3e63b2492b5541352391522d3f92b092bddba7095dcd8c38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9702cf51e271bbdad9ccb1a635e3274c49499e5070b3b18f20e239f97060c2f2edfc7b19b18f4af90c989eb33fb987c96312ccab8c172c26a131a4a0ebdc73f1
|
7
|
+
data.tar.gz: 96a39ed4f622342873430f0b9183ea1370f4520b3042d20fc5f3b40e313940f0fd844750ce6d5fcfbf12166b252c6c4408ef6fad446e3308c3d39e618c4e5f6a
|
data/lib/zold/commands/clean.rb
CHANGED
@@ -56,6 +56,9 @@ Available options:"
|
|
56
56
|
o.integer '--threads',
|
57
57
|
'How many threads to use for cleaning copies (default: 1)',
|
58
58
|
default: 1
|
59
|
+
o.integer '--max-age',
|
60
|
+
'Maximum age for a copy to stay, in hours (default: 24)',
|
61
|
+
default: 24
|
59
62
|
o.bool '--help', 'Print instructions'
|
60
63
|
end
|
61
64
|
mine = Args.new(opts, @log).take || return
|
@@ -65,9 +68,9 @@ Available options:"
|
|
65
68
|
end
|
66
69
|
end
|
67
70
|
|
68
|
-
def clean(cps,
|
71
|
+
def clean(cps, opts)
|
69
72
|
start = Time.now
|
70
|
-
deleted = cps.clean
|
73
|
+
deleted = cps.clean(max: opts['max-age'])
|
71
74
|
list = cps.all.map do |c|
|
72
75
|
wallet = Wallet.new(c[:path])
|
73
76
|
"#{c[:name]}: #{c[:score]} #{wallet.mnemo} \
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -156,15 +156,7 @@ run 'zold remote update' or use --tolerate-quorum=1"
|
|
156
156
|
r.assert_valid_score(score)
|
157
157
|
r.assert_score_ownership(score)
|
158
158
|
r.assert_score_strength(score) unless opts['ignore-score-weakness']
|
159
|
-
|
160
|
-
cps.all.each do |c|
|
161
|
-
next unless json['digest'] == OpenSSL::Digest::SHA256.file(c[:path]).hexdigest &&
|
162
|
-
json['size'] == File.size(c[:path])
|
163
|
-
copy = cps.add(IO.read(c[:path]), score.host, score.port, score.value, master: r.master?)
|
164
|
-
@log.debug("No need to fetch #{id} from #{r}, it's the same content as copy ##{copy}")
|
165
|
-
break
|
166
|
-
end
|
167
|
-
if copy.nil?
|
159
|
+
unless existing_copy_added(id, cps, score, r, json)
|
168
160
|
Tempfile.open(['', Wallet::EXT]) do |f|
|
169
161
|
r.http("/wallet/#{id}.bin").get_file(f)
|
170
162
|
wallet = Wallet.new(f.path)
|
@@ -208,6 +200,17 @@ as copy ##{copy}/#{cps.all.count} in #{Age.new(start, limit: 4)}: \
|
|
208
200
|
end
|
209
201
|
end
|
210
202
|
|
203
|
+
def existing_copy_added(id, cps, score, r, json)
|
204
|
+
cps.all.each do |c|
|
205
|
+
next unless json['digest'] == OpenSSL::Digest::SHA256.file(c[:path]).hexdigest &&
|
206
|
+
json['size'] == File.size(c[:path])
|
207
|
+
copy = cps.add(IO.read(c[:path]), score.host, score.port, score.value, master: r.master?)
|
208
|
+
@log.debug("No need to fetch #{id} from #{r}, it's the same content as copy ##{copy}")
|
209
|
+
return true
|
210
|
+
end
|
211
|
+
false
|
212
|
+
end
|
213
|
+
|
211
214
|
def digest(json)
|
212
215
|
hash = json['digest']
|
213
216
|
return '?' if hash.nil?
|
data/lib/zold/commands/node.rb
CHANGED
@@ -438,9 +438,11 @@ the node won\'t connect to the network like that; try to do "zold remote reset"
|
|
438
438
|
@log.info('Reconnect is disabled because of --skip-reconnect')
|
439
439
|
else
|
440
440
|
require_relative 'routines/reconnect'
|
441
|
-
metronome.add(Routines::Reconnect.new(opts, @remotes, farm,
|
441
|
+
metronome.add(Routines::Reconnect.new(opts, @remotes, farm, log: @log))
|
442
442
|
end
|
443
443
|
end
|
444
|
+
require_relative 'routines/spread'
|
445
|
+
metronome.add(Routines::Spread.new(opts, @wallets, @remotes, @copies, log: @log))
|
444
446
|
@log.info('Metronome started (use --no-metronome to disable it)')
|
445
447
|
metronome
|
446
448
|
end
|
@@ -95,6 +95,9 @@ Available options:"
|
|
95
95
|
modified.uniq!
|
96
96
|
@log.debug("Wallet #{id} propagated successfully, #{total} txns \
|
97
97
|
in #{Age.new(start, limit: 20 + total * 0.005)}, #{modified.count} wallets affected")
|
98
|
+
modified.each do |w|
|
99
|
+
@wallets.acq(w, &:refurbish)
|
100
|
+
end
|
98
101
|
modified
|
99
102
|
end
|
100
103
|
end
|
@@ -32,11 +32,10 @@ module Zold
|
|
32
32
|
module Routines
|
33
33
|
# Reconnect to the network
|
34
34
|
class Reconnect
|
35
|
-
def initialize(opts, remotes, farm = Farm::Empty.new,
|
35
|
+
def initialize(opts, remotes, farm = Farm::Empty.new, log: Log::NULL)
|
36
36
|
@opts = opts
|
37
37
|
@remotes = remotes
|
38
38
|
@farm = farm
|
39
|
-
@network = network
|
40
39
|
@log = log
|
41
40
|
end
|
42
41
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2018 Yegor Bugayenko
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
13
|
+
# copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
22
|
+
|
23
|
+
require_relative '../../log'
|
24
|
+
require_relative '../../id'
|
25
|
+
require_relative '../../copies'
|
26
|
+
require_relative '../push'
|
27
|
+
|
28
|
+
# Spread random wallets to the network.
|
29
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
30
|
+
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
31
|
+
# License:: MIT
|
32
|
+
module Zold
|
33
|
+
# Routines module
|
34
|
+
module Routines
|
35
|
+
# Spread them
|
36
|
+
class Spread
|
37
|
+
def initialize(opts, wallets, remotes, copies, log: Log::NULL)
|
38
|
+
@opts = opts
|
39
|
+
@wallets = wallets
|
40
|
+
@remotes = remotes
|
41
|
+
@copies = copies
|
42
|
+
@log = log
|
43
|
+
end
|
44
|
+
|
45
|
+
def exec(_ = 0)
|
46
|
+
sleep(60) unless @opts['routine-immediately']
|
47
|
+
@wallets.all.sample(100).each do |id|
|
48
|
+
next if Copies.new(File.join(@copies, id)).all.count < 2
|
49
|
+
Push.new(wallets: @wallets, remotes: @remotes, log: @log).run(
|
50
|
+
['push', "--network=#{@opts['network']}", id.to_s]
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/zold/copies.rb
CHANGED
@@ -53,10 +53,11 @@ module Zold
|
|
53
53
|
File.basename(@dir)
|
54
54
|
end
|
55
55
|
|
56
|
-
|
56
|
+
# Delete all copies that are older than the "max" age provided, in seconds.
|
57
|
+
def clean(max: 24 * 60 * 60)
|
57
58
|
Futex.new(file, log: @log).open do
|
58
59
|
list = load
|
59
|
-
list.reject! { |s| s[:time] < Time.now -
|
60
|
+
list.reject! { |s| s[:time] < Time.now - max }
|
60
61
|
save(list)
|
61
62
|
deleted = 0
|
62
63
|
files.each do |f|
|
data/lib/zold/id.rb
CHANGED
@@ -20,6 +20,8 @@
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
|
+
require 'csv'
|
24
|
+
|
23
25
|
# The ID of the wallet.
|
24
26
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
25
27
|
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
@@ -31,10 +33,15 @@ module Zold
|
|
31
33
|
PTN = Regexp.new('^[0-9a-fA-F]{16}$')
|
32
34
|
private_constant :PTN
|
33
35
|
|
36
|
+
# Returns a list of banned IDs, as strings
|
37
|
+
BANNED = begin
|
38
|
+
CSV.read(File.join(__dir__, '../../resources/banned-wallets.csv')).map { |r| r[0] }
|
39
|
+
end
|
40
|
+
|
34
41
|
def self.generate_id
|
35
42
|
loop do
|
36
43
|
id = format('%016x', rand(2**32..2**64 - 1))
|
37
|
-
next if
|
44
|
+
next if Id::BANNED.include?(id)
|
38
45
|
return id
|
39
46
|
end
|
40
47
|
end
|
data/lib/zold/node/entrance.rb
CHANGED
@@ -74,22 +74,25 @@ module Zold
|
|
74
74
|
raise 'Body can\'t be nil' if body.nil?
|
75
75
|
start = Time.now
|
76
76
|
copies = Copies.new(File.join(@copies, id.to_s))
|
77
|
-
|
78
|
-
copies.add(body,
|
77
|
+
host = '0.0.0.0'
|
78
|
+
copies.add(body, host, Remotes::PORT, 0)
|
79
79
|
unless @remotes.all.empty?
|
80
80
|
Fetch.new(
|
81
81
|
wallets: @wallets, remotes: @remotes, copies: copies.root, log: @log
|
82
82
|
).run(['fetch', id.to_s, "--ignore-node=#{@address}", "--network=#{@network}", '--quiet-if-absent'])
|
83
83
|
end
|
84
84
|
modified = merge(id, copies)
|
85
|
-
Clean.new(wallets: @wallets, copies: copies.root, log: @log).run(
|
86
|
-
|
85
|
+
Clean.new(wallets: @wallets, copies: copies.root, log: @log).run(
|
86
|
+
['clean', id.to_s, '--max-age=1']
|
87
|
+
)
|
88
|
+
copies.remove(host, Remotes::PORT)
|
87
89
|
modified += Rebase.new(wallets: @wallets, log: @log).run(['rebase', id.to_s])
|
88
90
|
if modified.empty?
|
89
91
|
@log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and not modified anything")
|
90
92
|
else
|
91
93
|
@log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and modified #{modified.join(', ')}")
|
92
94
|
end
|
95
|
+
modified << id if copies.all.count > 1
|
93
96
|
sec = (Time.now - start).round(2)
|
94
97
|
@mutex.synchronize do
|
95
98
|
@history.shift if @history.length >= 16
|
data/lib/zold/node/front.rb
CHANGED
@@ -313,7 +313,8 @@ this is not a normal behavior, you may want to report a bug to our GitHub reposi
|
|
313
313
|
"Balance: #{wallet.balance.to_zld(8)} ZLD (#{wallet.balance.to_i} zents)",
|
314
314
|
"Transactions: #{wallet.txns.count}",
|
315
315
|
"Taxes: #{Tax.new(wallet).paid} paid, the debt is #{Tax.new(wallet).debt}",
|
316
|
-
"File size: #{Size.new(wallet.size)}
|
316
|
+
"File size: #{Size.new(wallet.size)}/#{wallet.size}, \
|
317
|
+
#{Copies.new(File.join(settings.copies, wallet.id)).all.count} copies",
|
317
318
|
"Modified: #{wallet.mtime.utc.iso8601} (#{Age.new(wallet.mtime.utc.iso8601)} ago)",
|
318
319
|
"Digest: #{wallet.digest}"
|
319
320
|
].join("\n")
|
@@ -523,7 +524,7 @@ time to stop; use --skip-oom to never quit")
|
|
523
524
|
end
|
524
525
|
|
525
526
|
def ban(id)
|
526
|
-
return unless
|
527
|
+
return unless Id::BANNED.include?(id.to_s)
|
527
528
|
error(404, "The wallet #{id} is banned")
|
528
529
|
end
|
529
530
|
|
data/lib/zold/patch.rb
CHANGED
@@ -162,8 +162,8 @@ doesn't have this transaction: \"#{txn.to_text}\"")
|
|
162
162
|
def save(file, overwrite: false)
|
163
163
|
raise 'You have to join at least one wallet in' if empty?
|
164
164
|
before = ''
|
165
|
-
before = OpenSSL::Digest::SHA256.file(file).hexdigest if File.exist?(file)
|
166
165
|
wallet = Wallet.new(file)
|
166
|
+
before = wallet.digest if wallet.exists?
|
167
167
|
wallet.init(@id, @key, overwrite: overwrite, network: @network)
|
168
168
|
File.open(file, 'a') do |f|
|
169
169
|
@txns.each do |txn|
|
@@ -171,8 +171,7 @@ doesn't have this transaction: \"#{txn.to_text}\"")
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
wallet.refurbish
|
174
|
-
|
175
|
-
before != after
|
174
|
+
before != wallet.digest
|
176
175
|
end
|
177
176
|
end
|
178
177
|
end
|
data/lib/zold/version.rb
CHANGED
data/test/fake_home.rb
CHANGED
@@ -45,9 +45,7 @@ class FakeHome
|
|
45
45
|
def run
|
46
46
|
Dir.mktmpdir do |dir|
|
47
47
|
FileUtils.copy(File.expand_path(File.join(__dir__, '../fixtures/id_rsa')), File.join(dir, 'id_rsa'))
|
48
|
-
|
49
|
-
sleep 0.5 # It's a workaround against a bug (without it tests fail sporadically)
|
50
|
-
result
|
48
|
+
yield FakeHome.new(dir, log: @log)
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
data/test/test_id.rb
CHANGED
@@ -32,7 +32,7 @@ require_relative '../fake_home'
|
|
32
32
|
# License:: MIT
|
33
33
|
class TestDeleteBannedWallets < Zold::Test
|
34
34
|
def test_delete_them
|
35
|
-
id = Zold::Id.new(
|
35
|
+
id = Zold::Id.new(Zold::Id::BANNED[0])
|
36
36
|
FakeHome.new(log: test_log).run do |home|
|
37
37
|
home.create_wallet(id)
|
38
38
|
FileUtils.mkdir_p(File.join(home.dir, 'a/b/c'))
|
@@ -33,12 +33,11 @@ module Zold
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def exec
|
36
|
-
banned = IO.read(File.join(__dir__, '../resources/banned-wallets.csv'))
|
37
36
|
DirItems.new(@home).fetch.each do |path|
|
38
37
|
name = File.basename(path)
|
39
38
|
next unless name =~ /^[a-f0-9]{16}#{Wallet::EXT}$/
|
40
|
-
id = name[0..15]
|
41
|
-
next unless
|
39
|
+
id = Id.new(name[0..15])
|
40
|
+
next unless Id::BANNED.include?(id.to_s)
|
42
41
|
path = File.join(@home, path)
|
43
42
|
File.rename(path, path + '-banned')
|
44
43
|
@log.info("Wallet file #{path} renamed, since wallet #{id} is banned")
|
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.26.
|
4
|
+
version: 0.26.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -641,6 +641,7 @@ files:
|
|
641
641
|
- lib/zold/commands/routines/audit.rb
|
642
642
|
- lib/zold/commands/routines/gc.rb
|
643
643
|
- lib/zold/commands/routines/reconnect.rb
|
644
|
+
- lib/zold/commands/routines/spread.rb
|
644
645
|
- lib/zold/commands/show.rb
|
645
646
|
- lib/zold/commands/taxes.rb
|
646
647
|
- lib/zold/commands/thread_badge.rb
|
@@ -772,7 +773,7 @@ licenses:
|
|
772
773
|
- MIT
|
773
774
|
metadata: {}
|
774
775
|
post_install_message: |-
|
775
|
-
Thanks for installing Zold 0.26.
|
776
|
+
Thanks for installing Zold 0.26.11!
|
776
777
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
777
778
|
Read our blog posts: https://blog.zold.io
|
778
779
|
Try ZLD online wallet at: https://wts.zold.io
|