zold 0.18.9 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/zold +1 -1
- data/lib/zold/commands/fetch.rb +5 -5
- data/lib/zold/commands/invoice.rb +1 -1
- data/lib/zold/commands/merge.rb +1 -0
- data/lib/zold/commands/node.rb +1 -1
- data/lib/zold/commands/push.rb +5 -5
- data/lib/zold/commands/remote.rb +8 -8
- data/lib/zold/commands/remove.rb +10 -3
- data/lib/zold/commands/routines/reconnect.rb +1 -1
- data/lib/zold/node/front.rb +1 -0
- data/lib/zold/patch.rb +7 -2
- data/lib/zold/remotes.rb +9 -9
- data/lib/zold/thread_pool.rb +1 -1
- data/lib/zold/version.rb +1 -1
- data/resources/{remotes → masters} +0 -0
- data/test/commands/test_remote.rb +4 -4
- data/test/commands/test_remove.rb +9 -0
- data/test/test_remotes.rb +4 -4
- data/test/test_thread_pool.rb +11 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b6e5a80a2216feaeb4ac83bafc229c711bb981df2c1c7fa73a828f9620580c5
|
4
|
+
data.tar.gz: 9cb90c56a015453a5ababcabed994a119ae44b734d557bf00f3fabebe9a06660
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbd48e9a0ac951f438964c39e98d3e5942d41665b1bb8f61d7a5ef1942947566fd6be97eea8871a317a47004812ba56cccf4a7fafd2bd552112026189158aada
|
7
|
+
data.tar.gz: c661f88c9fe2de378dd2bb1107f5b7cd12ca0ab2cb2fd3465070da1b7be5105c0c3627257e0cb7eb4eb9e4680f58cb8d2044ae55069ef6deeaa8158ba17e335f
|
data/bin/zold
CHANGED
@@ -177,7 +177,7 @@ remotes = Zold::Remotes.new(file: fremotes, network: opts['network'])
|
|
177
177
|
if File.exist?(fremotes)
|
178
178
|
log.debug("Remote nodes: #{remotes.all.count} total")
|
179
179
|
else
|
180
|
-
remotes.
|
180
|
+
remotes.masters
|
181
181
|
log.debug("Default remotes have been set: #{remotes.all.count} total")
|
182
182
|
end
|
183
183
|
copies = File.join(zoldata, 'copies')
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -67,7 +67,7 @@ Available options:"
|
|
67
67
|
'Ignore this node and don\'t fetch from it',
|
68
68
|
default: []
|
69
69
|
o.bool '--tolerate-edges',
|
70
|
-
'Don\'t fail if only "edge" (not
|
70
|
+
'Don\'t fail if only "edge" (not "master" ones) nodes accepted the wallet',
|
71
71
|
default: false
|
72
72
|
o.bool '--quiet-if-absent',
|
73
73
|
'Don\'t fail if the wallet is absent in all remote nodes',
|
@@ -94,22 +94,22 @@ Available options:"
|
|
94
94
|
total = Concurrent::AtomicFixnum.new
|
95
95
|
nodes = Concurrent::AtomicFixnum.new
|
96
96
|
done = Concurrent::AtomicFixnum.new
|
97
|
-
|
97
|
+
masters = Concurrent::AtomicFixnum.new
|
98
98
|
@remotes.iterate(@log) do |r|
|
99
99
|
nodes.increment
|
100
100
|
total.increment(fetch_one(id, r, cps, opts))
|
101
|
-
|
101
|
+
masters.increment if r.master?
|
102
102
|
done.increment
|
103
103
|
end
|
104
104
|
raise "There are no remote nodes, run 'zold remote reset'" if nodes.value.zero?
|
105
105
|
unless opts['quiet-if-absent']
|
106
106
|
raise "No nodes out of #{nodes.value} have the wallet #{id}" if done.value.zero?
|
107
|
-
if
|
107
|
+
if masters.value.zero? && !opts['tolerate-edges']
|
108
108
|
raise "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
|
109
109
|
end
|
110
110
|
end
|
111
111
|
@log.info("#{done.value} copies of #{id} fetched in #{Age.new(start)} with the total score of \
|
112
|
-
#{total.value} from #{nodes.value} nodes (#{
|
112
|
+
#{total.value} from #{nodes.value} nodes (#{masters.value} master nodes)")
|
113
113
|
list = cps.all.map do |c|
|
114
114
|
" ##{c[:name]}: #{c[:score]} #{Wallet.new(c[:path]).mnemo} \
|
115
115
|
#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}"
|
@@ -52,7 +52,7 @@ Available options:"
|
|
52
52
|
'The length of the invoice prefix (default: 8)',
|
53
53
|
default: 8
|
54
54
|
o.bool '--tolerate-edges',
|
55
|
-
'Don\'t fail if only "edge" (not
|
55
|
+
'Don\'t fail if only "edge" (not "master" ones) nodes have the wallet',
|
56
56
|
default: false
|
57
57
|
o.string '--network',
|
58
58
|
'The name of the network we work in',
|
data/lib/zold/commands/merge.rb
CHANGED
@@ -92,6 +92,7 @@ Available options:"
|
|
92
92
|
@log.debug("Local copy of #{id} is absent, nothing to merge")
|
93
93
|
end
|
94
94
|
end
|
95
|
+
raise "There are no copies of #{id}, nothing to merge" if patch.empty?
|
95
96
|
modified = @wallets.acq(id, exclusive: true) { |w| patch.save(w.path, overwrite: true) }
|
96
97
|
if modified
|
97
98
|
@log.info("#{cps.count} copies with the total score of #{score} successfully merged \
|
data/lib/zold/commands/node.rb
CHANGED
@@ -98,7 +98,7 @@ module Zold
|
|
98
98
|
'Ignore score weakness of incoming requests and register those nodes anyway',
|
99
99
|
default: false
|
100
100
|
o.bool '--tolerate-edges',
|
101
|
-
'Don\'t fail if only "edge" (not
|
101
|
+
'Don\'t fail if only "edge" (not "master" ones) nodes accepted/have the wallet',
|
102
102
|
default: false
|
103
103
|
o.boolean '--nohup',
|
104
104
|
'Run it in background, rebooting when a higher version is available in the network',
|
data/lib/zold/commands/push.rb
CHANGED
@@ -59,7 +59,7 @@ Available options:"
|
|
59
59
|
'Don\'t complain when their score is too weak',
|
60
60
|
default: false
|
61
61
|
o.bool '--tolerate-edges',
|
62
|
-
'Don\'t fail if only "edge" (not
|
62
|
+
'Don\'t fail if only "edge" (not "master" ones) nodes accepted the wallet',
|
63
63
|
default: false
|
64
64
|
o.bool '--quiet-if-missed',
|
65
65
|
'Don\'t fail if the wallet wasn\'t delivered to any remotes',
|
@@ -85,22 +85,22 @@ Available options:"
|
|
85
85
|
total = Concurrent::AtomicFixnum.new
|
86
86
|
nodes = Concurrent::AtomicFixnum.new
|
87
87
|
done = Concurrent::AtomicFixnum.new
|
88
|
-
|
88
|
+
masters = Concurrent::AtomicFixnum.new
|
89
89
|
start = Time.now
|
90
90
|
@remotes.iterate(@log) do |r|
|
91
91
|
nodes.increment
|
92
92
|
total.increment(push_one(id, r, opts))
|
93
|
-
|
93
|
+
masters.increment if r.master?
|
94
94
|
done.increment
|
95
95
|
end
|
96
96
|
raise "There are no remote nodes, run 'zold remote reset'" if nodes.value.zero?
|
97
97
|
unless opts['quiet-if-missed']
|
98
98
|
raise "No nodes out of #{nodes} accepted the wallet #{id}" if done.value.zero?
|
99
|
-
if
|
99
|
+
if masters.value.zero? && !opts['tolerate-edges']
|
100
100
|
raise "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
|
101
101
|
end
|
102
102
|
end
|
103
|
-
@log.info("Push finished to #{done.value} nodes (#{
|
103
|
+
@log.info("Push finished to #{done.value} nodes (#{masters.value} master nodes) \
|
104
104
|
out of #{nodes.value} in #{Age.new(start)}, total score for #{id} is #{total.value}")
|
105
105
|
end
|
106
106
|
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -63,8 +63,8 @@ Available commands:
|
|
63
63
|
Remove all registered remote nodes
|
64
64
|
#{Rainbow('remote reset').green}
|
65
65
|
Restore it back to the default list of nodes
|
66
|
-
#{Rainbow('remote
|
67
|
-
Add all
|
66
|
+
#{Rainbow('remote masters').green}
|
67
|
+
Add all \"master\" nodes to the list
|
68
68
|
#{Rainbow('remote add').green} host [port]
|
69
69
|
Add a new remote node
|
70
70
|
#{Rainbow('remote remove').green} host [port]
|
@@ -139,8 +139,8 @@ Available options:"
|
|
139
139
|
clean
|
140
140
|
when 'reset'
|
141
141
|
reset(opts)
|
142
|
-
when '
|
143
|
-
|
142
|
+
when 'masters'
|
143
|
+
masters(opts)
|
144
144
|
when 'add'
|
145
145
|
add(mine[1], mine[2] ? mine[2].to_i : Remotes::PORT, opts)
|
146
146
|
when 'remove'
|
@@ -175,14 +175,14 @@ Available options:"
|
|
175
175
|
|
176
176
|
def reset(opts)
|
177
177
|
clean
|
178
|
-
|
178
|
+
masters(opts)
|
179
179
|
end
|
180
180
|
|
181
|
-
def
|
182
|
-
@remotes.
|
181
|
+
def masters(opts)
|
182
|
+
@remotes.masters do |host, port|
|
183
183
|
!opts['ignore-node'].include?("#{host}:#{port}")
|
184
184
|
end
|
185
|
-
@log.debug("
|
185
|
+
@log.debug("Masters nodes were added to the list, #{@remotes.all.count} total")
|
186
186
|
end
|
187
187
|
|
188
188
|
def add(host, port, opts)
|
data/lib/zold/commands/remove.rb
CHANGED
@@ -44,6 +44,9 @@ module Zold
|
|
44
44
|
opts = Slop.parse(args, help: true, suppress_errors: true) do |o|
|
45
45
|
o.banner = "Usage: zold remove [ID...] [options]
|
46
46
|
Available options:"
|
47
|
+
o.bool '--force',
|
48
|
+
'Don\'t report any errors if the wallet doesn\'t exist',
|
49
|
+
default: false
|
47
50
|
o.bool '--help', 'Print instructions'
|
48
51
|
end
|
49
52
|
mine = Args.new(opts, @log).take || return
|
@@ -52,10 +55,14 @@ Available options:"
|
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
|
-
def remove(id,
|
58
|
+
def remove(id, opts)
|
56
59
|
@wallets.acq(id, exclusive: true) do |w|
|
57
|
-
|
58
|
-
|
60
|
+
if w.exists?
|
61
|
+
File.delete(w.path)
|
62
|
+
else
|
63
|
+
raise "Wallet #{id} doesn't exist in #{w.path}" unless opts['force']
|
64
|
+
@log.info("Wallet #{id} file not found in #{w.path}")
|
65
|
+
end
|
59
66
|
end
|
60
67
|
@log.info("Wallet #{id} removed")
|
61
68
|
end
|
@@ -46,7 +46,7 @@ module Zold
|
|
46
46
|
args = ['remote', "--network=#{@opts['network']}", '--ignore-ping']
|
47
47
|
score = @farm.best[0]
|
48
48
|
args << "--ignore-node=#{score.host}:#{score.port}" if score
|
49
|
-
cmd.run(args + ['
|
49
|
+
cmd.run(args + ['masters']) unless @opts['routine-immediately']
|
50
50
|
return if @opts['routine-immediately'] && @remotes.all.empty?
|
51
51
|
cmd.run(args + ['update'] + (@opts['never-reboot'] ? [] : ['--reboot']))
|
52
52
|
cmd.run(args + ['trim'])
|
data/lib/zold/node/front.rb
CHANGED
@@ -84,6 +84,7 @@ module Zold
|
|
84
84
|
before do
|
85
85
|
Thread.current.name = "#{request.request_method}:#{request.url}"
|
86
86
|
Thread.current.thread_variable_set(:uri, request.url)
|
87
|
+
error(400, 'Can\'t detect your IP') if request.ip.nil? || request.ip.empty?
|
87
88
|
Thread.current.thread_variable_set(:ip, request.ip)
|
88
89
|
@start = Time.now
|
89
90
|
if !settings.opts['halt-code'].empty? && params[:halt] && params[:halt] == settings.opts['halt-code']
|
data/lib/zold/patch.rb
CHANGED
@@ -104,7 +104,8 @@ module Zold
|
|
104
104
|
next
|
105
105
|
end
|
106
106
|
unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
|
107
|
-
@log.error("The beneficiary
|
107
|
+
@log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
|
108
|
+
doesn't have this transaction: \"#{txn.to_text}\"")
|
108
109
|
next
|
109
110
|
end
|
110
111
|
end
|
@@ -113,9 +114,13 @@ module Zold
|
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
117
|
+
def empty?
|
118
|
+
@id.nil?
|
119
|
+
end
|
120
|
+
|
116
121
|
# Returns TRUE if the file was actually modified
|
117
122
|
def save(file, overwrite: false)
|
118
|
-
raise 'You have to join at least one wallet in' if
|
123
|
+
raise 'You have to join at least one wallet in' if empty?
|
119
124
|
before = ''
|
120
125
|
before = IO.read(file) if File.exist?(file)
|
121
126
|
wallet = Wallet.new(file)
|
data/lib/zold/remotes.rb
CHANGED
@@ -51,8 +51,8 @@ module Zold
|
|
51
51
|
MAX_NODES = 16
|
52
52
|
|
53
53
|
# Default nodes and their ports
|
54
|
-
|
55
|
-
private_constant :
|
54
|
+
MASTERS = CSV.read(File.expand_path(File.join(File.dirname(__FILE__), '../../resources/masters')))
|
55
|
+
private_constant :MASTERS
|
56
56
|
|
57
57
|
# Empty, for standalone mode
|
58
58
|
class Empty
|
@@ -88,8 +88,8 @@ module Zold
|
|
88
88
|
Http.new(uri: "http://#{@host}:#{@port}#{path}", score: @score, network: @network)
|
89
89
|
end
|
90
90
|
|
91
|
-
def
|
92
|
-
!
|
91
|
+
def master?
|
92
|
+
!MASTERS.find { |r| r[0] == @host && r[1].to_i == @port }.nil?
|
93
93
|
end
|
94
94
|
|
95
95
|
def to_s
|
@@ -148,8 +148,8 @@ module Zold
|
|
148
148
|
modify { [] }
|
149
149
|
end
|
150
150
|
|
151
|
-
def
|
152
|
-
|
151
|
+
def masters
|
152
|
+
MASTERS.each do |r|
|
153
153
|
if block_given?
|
154
154
|
next unless yield(r[0], r[1].to_i)
|
155
155
|
end
|
@@ -235,8 +235,8 @@ module Zold
|
|
235
235
|
File.exist?(@file) ? File.mtime(@file) : Time.now
|
236
236
|
end
|
237
237
|
|
238
|
-
def
|
239
|
-
!
|
238
|
+
def master?(host, port)
|
239
|
+
!MASTERS.find { |r| r[0] == host && r[1].to_i == port }.nil?
|
240
240
|
end
|
241
241
|
|
242
242
|
private
|
@@ -276,7 +276,7 @@ module Zold
|
|
276
276
|
port: row[1].to_i,
|
277
277
|
score: row[2].to_i,
|
278
278
|
errors: row[3].to_i,
|
279
|
-
|
279
|
+
master: master?(row[0], row[1].to_i)
|
280
280
|
}
|
281
281
|
end
|
282
282
|
raw.reject { |r| !r[:host] || r[:port].zero? }.map do |r|
|
data/lib/zold/thread_pool.rb
CHANGED
@@ -125,7 +125,7 @@ it was alive for #{Age.new(@start)}: #{@threads.map { |t| "#{t.name}/#{t.status}
|
|
125
125
|
name: t.name,
|
126
126
|
status: t.status,
|
127
127
|
alive: t.alive?,
|
128
|
-
vars: t.thread_variables.map { |v|
|
128
|
+
vars: Hash[t.thread_variables.map { |v| [v.to_s, t.thread_variable_get(v)] }]
|
129
129
|
}
|
130
130
|
end
|
131
131
|
end
|
data/lib/zold/version.rb
CHANGED
File without changes
|
@@ -193,7 +193,7 @@ class TestRemote < Zold::Test
|
|
193
193
|
def test_select_respects_max_nodes_option
|
194
194
|
Dir.mktmpdir do |dir|
|
195
195
|
remotes = Zold::Remotes.new(file: File.join(dir, 'remotes.txt'))
|
196
|
-
remotes.
|
196
|
+
remotes.masters
|
197
197
|
zero = Zold::Score::ZERO
|
198
198
|
cmd = Zold::Remote.new(remotes: remotes, log: test_log)
|
199
199
|
(5000..5010).each do |port|
|
@@ -215,17 +215,17 @@ class TestRemote < Zold::Test
|
|
215
215
|
)
|
216
216
|
cmd.run(%W[remote add localhost #{port}])
|
217
217
|
end
|
218
|
-
assert_equal(11 + File.readlines('resources/
|
218
|
+
assert_equal(11 + File.readlines('resources/masters').count, remotes.all.count)
|
219
219
|
cmd.run(%w[remote select --max-nodes=5])
|
220
220
|
assert_equal(5, remotes.all.count)
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
224
|
-
def
|
224
|
+
def test_sets_masters
|
225
225
|
Dir.mktmpdir do |dir|
|
226
226
|
remotes = Zold::Remotes.new(file: File.join(dir, 'remotes.txt'))
|
227
227
|
cmd = Zold::Remote.new(remotes: remotes, log: test_log)
|
228
|
-
cmd.run(%w[remote
|
228
|
+
cmd.run(%w[remote masters])
|
229
229
|
assert(!remotes.all.empty?)
|
230
230
|
end
|
231
231
|
end
|
@@ -54,4 +54,13 @@ class TestRemove < Zold::Test
|
|
54
54
|
assert(home.wallets.all.empty?)
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
def test_removes_absent_wallets
|
59
|
+
FakeHome.new(log: test_log).run do |home|
|
60
|
+
Zold::Remove.new(wallets: home.wallets, log: test_log).run(
|
61
|
+
['remove', '7654321076543210', '--force']
|
62
|
+
)
|
63
|
+
assert(home.wallets.all.empty?)
|
64
|
+
end
|
65
|
+
end
|
57
66
|
end
|
data/test/test_remotes.rb
CHANGED
@@ -45,12 +45,12 @@ class TestRemotes < Zold::Test
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
48
|
+
def test_finds_masters
|
49
49
|
Dir.mktmpdir do |dir|
|
50
50
|
file = File.join(dir, 'remotes')
|
51
51
|
FileUtils.touch(file)
|
52
52
|
remotes = Zold::Remotes.new(file: file)
|
53
|
-
assert(remotes.
|
53
|
+
assert(remotes.master?('b1.zold.io', 80))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -166,8 +166,8 @@ class TestRemotes < Zold::Test
|
|
166
166
|
Dir.mktmpdir do |dir|
|
167
167
|
remotes = Zold::Remotes.new(file: File.join(dir, 'remotes'))
|
168
168
|
remotes.clean
|
169
|
-
remotes.
|
170
|
-
remotes.
|
169
|
+
remotes.masters
|
170
|
+
remotes.masters
|
171
171
|
assert(!remotes.all.empty?)
|
172
172
|
end
|
173
173
|
end
|
data/test/test_thread_pool.rb
CHANGED
@@ -102,7 +102,18 @@ class TestThreadPool < Zold::Test
|
|
102
102
|
|
103
103
|
def test_prints_to_json
|
104
104
|
pool = Zold::ThreadPool.new('test', log: test_log)
|
105
|
+
pool.add do
|
106
|
+
Thread.current.thread_variable_set(:foo, 1)
|
107
|
+
loop do
|
108
|
+
# forever
|
109
|
+
end
|
110
|
+
end
|
105
111
|
assert(pool.to_json.is_a?(Array))
|
112
|
+
assert_equal('test', pool.to_json[0][:name])
|
113
|
+
assert_equal('run', pool.to_json[0][:status])
|
114
|
+
assert_equal(true, pool.to_json[0][:alive])
|
115
|
+
assert_equal(1, pool.to_json[0][:vars]['foo'])
|
116
|
+
pool.kill
|
106
117
|
end
|
107
118
|
|
108
119
|
def test_prints_to_text
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -610,7 +610,7 @@ files:
|
|
610
610
|
- lib/zold/version_file.rb
|
611
611
|
- lib/zold/wallet.rb
|
612
612
|
- lib/zold/wallets.rb
|
613
|
-
- resources/
|
613
|
+
- resources/masters
|
614
614
|
- resources/root.pub
|
615
615
|
- test/commands/routines/test_gc.rb
|
616
616
|
- test/commands/routines/test_reconnect.rb
|
@@ -690,7 +690,7 @@ licenses:
|
|
690
690
|
- MIT
|
691
691
|
metadata: {}
|
692
692
|
post_install_message: |-
|
693
|
-
Thanks for installing Zold 0.
|
693
|
+
Thanks for installing Zold 0.19.0!
|
694
694
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
695
695
|
Read our blog posts: https://blog.zold.io
|
696
696
|
Try online wallet at: https://wts.zold.io
|