zold 0.17.4 → 0.17.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 622a8738f318299d195dd0efbe8cdb8bc41aac3432a964b775a31a1b78cc592f
4
- data.tar.gz: 06ed79ff0550b5e4f66eb28af66051b14b3d840caf4ea936cfd40b36e6693124
3
+ metadata.gz: c06af13af0d59a21c9855dc36c17c13cfe838286f7aadcb1ac3b130ed934d65d
4
+ data.tar.gz: 4349ebaee96c42a6224b92a4fc9a398f28d0f7c07352a34fd965d63bbf00b706
5
5
  SHA512:
6
- metadata.gz: d0e4e8282e87e826b31e3662f0139aa4e0634c4d5e7d2cdb13b48a8958bb48557c007605a4f07d79f50b678acf7beab1860ddb1283b2819b00b66f208ab3b850
7
- data.tar.gz: 9a4fb162a36f9db69b3c5916ffca1658c75ea3450b975e05d29054a6b6da991e46e4bdb6c201394a724dcf1461284e1d1a101a000a09bdfebec2420a5c9957f5
6
+ metadata.gz: 69b146cdf8bcc399e5213e1c8af4faa2aba937fd93a96ee845a0c9552ffbfe24fcb34d37c724298319aeddfde91ab2b30546f9afcb517232959000893ef40b4b
7
+ data.tar.gz: 82943553b346434e975041142b6ac21ffe301bae24695dc509613ef9b8fd8c0a625003f1b060360550b3eab1076f3cd42ad02a7f5de7b7d405f09534f36a3c10
@@ -41,6 +41,7 @@ require_relative '../node/spread_entrance'
41
41
  require_relative '../node/async_entrance'
42
42
  require_relative '../node/sync_entrance'
43
43
  require_relative '../node/nodup_entrance'
44
+ require_relative '../node/nospam_entrance'
44
45
  require_relative '../node/front'
45
46
  require_relative '../node/trace'
46
47
  require_relative '../node/farm'
@@ -123,6 +124,9 @@ module Zold
123
124
  o.bool '--no-cache',
124
125
  'Skip caching of front JSON pages (will seriously slow down, mostly useful for testing)',
125
126
  default: false
127
+ o.bool '--allow-spam',
128
+ 'Don\'t filter the incoming spam via PUT requests (duplicate wallets)',
129
+ default: false
126
130
  o.bool '--skip-oom',
127
131
  'Skip Out Of Memory check and never exit, no matter how much RAM is consumed',
128
132
  default: false
@@ -225,27 +229,32 @@ module Zold
225
229
  ).run(['invoice', invoice, "--network=#{opts['network']}"])
226
230
  end
227
231
  SafeEntrance.new(
228
- NoDupEntrance.new(
229
- AsyncEntrance.new(
230
- SpreadEntrance.new(
231
- SyncEntrance.new(
232
- Entrance.new(
233
- @wallets,
234
- @remotes, @copies, address,
235
- log: @log, network: opts['network']
232
+ NoSpamEntrance.new(
233
+ NoDupEntrance.new(
234
+ AsyncEntrance.new(
235
+ SpreadEntrance.new(
236
+ SyncEntrance.new(
237
+ Entrance.new(
238
+ @wallets,
239
+ @remotes, @copies, address,
240
+ log: @log, network: opts['network']
241
+ ),
242
+ File.join(home, '.zoldata/sync-entrance'),
243
+ log: @log
236
244
  ),
237
- File.join(home, '.zoldata/sync-entrance'),
238
- log: @log
245
+ @wallets, @remotes, address,
246
+ log: @log,
247
+ ignore_score_weakeness: opts['ignore-score-weakness']
239
248
  ),
240
- @wallets, @remotes, address,
249
+ File.join(home, '.zoldata/async-entrance'),
241
250
  log: @log,
242
- ignore_score_weakeness: opts['ignore-score-weakness']
251
+ queue_limit: opts['queue-limit']
243
252
  ),
244
- File.join(home, '.zoldata/async-entrance'),
245
- log: @log,
246
- queue_limit: opts['queue-limit']
253
+ @wallets,
254
+ log: @log
247
255
  ),
248
- @wallets
256
+ period: opts['allow-spam'] ? 0 : 60 * 60,
257
+ log: @log
249
258
  ),
250
259
  network: opts['network']
251
260
  ).start do |entrance|
@@ -21,7 +21,6 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'shellwords'
24
- require 'posix/spawn'
25
24
 
26
25
  # Items in a directory.
27
26
  #
@@ -40,12 +39,7 @@ module Zold
40
39
  end
41
40
 
42
41
  def fetch(recursive: true)
43
- spawn = POSIX::Spawn::Child.new(
44
- 'find',
45
- *([@dir, '-type', 'f', '-print'] + (recursive ? [] : ['-maxdepth', '1']))
46
- )
47
- raise spawn.err unless spawn.status.success?
48
- spawn.out
42
+ `find #{([@dir, '-type', 'f', '-print'] + (recursive ? [] : ['-maxdepth', '1'])).join(' ')}`
49
43
  .strip
50
44
  .split(' ')
51
45
  .select { |f| f.start_with?(@dir) && f.length > @dir.length }
@@ -24,7 +24,6 @@ require 'open3'
24
24
  require 'backtrace'
25
25
  require 'zold/score'
26
26
  require 'shellwords'
27
- require 'posix/spawn'
28
27
  require_relative '../log'
29
28
  require_relative '../age'
30
29
 
@@ -54,67 +53,6 @@ module Zold
54
53
  end
55
54
  end
56
55
 
57
- # In a child process
58
- class Spawn
59
- def initialize(log: Log::NULL)
60
- @log = log
61
- end
62
-
63
- def up(score)
64
- raise "We are farming the score already: #{score}" if
65
- POSIX::Spawn::Child.new('ps', 'ax').out.include?(score.to_s.split(' ').take(4).join(' '))
66
- start = Time.now
67
- bin = File.expand_path(File.join(File.dirname(__FILE__), '../../../bin/zold'))
68
- raise "Zold binary not found at #{bin}" unless File.exist?(bin)
69
- cmd = [
70
- 'ruby',
71
- Shellwords.escape(bin),
72
- '--skip-upgrades',
73
- "--info-tid=#{Thread.current.thread_variable_get(:tid)}",
74
- "--info-thread=#{Shellwords.escape(Thread.current.name)}",
75
- "--info-start=#{Time.now.utc.iso8601}",
76
- '--low-priority',
77
- 'next',
78
- Shellwords.escape(score)
79
- ].join(' ')
80
- Open3.popen2e(cmd) do |stdin, stdout, thr|
81
- Thread.current.thread_variable_set(:pid, thr.pid.to_s)
82
- at_exit { Farmers.kill(@log, thr.pid, start) }
83
- @log.debug("Scoring started in proc ##{thr.pid} \
84
- for #{score.value}/#{score.strength} at #{score.host}:#{score.port}")
85
- begin
86
- stdin.close
87
- buffer = +''
88
- loop do
89
- begin
90
- buffer << stdout.read_nonblock(16 * 1024)
91
- # rubocop:disable Lint/HandleExceptions
92
- rescue IO::WaitReadable => _
93
- # rubocop:enable Lint/HandleExceptions
94
- # nothing to do here
95
- rescue StandardError => e
96
- @log.error(buffer)
97
- raise e
98
- end
99
- break if buffer.end_with?("\n") && thr.value.to_i.zero?
100
- if stdout.closed?
101
- raise "Failed to calculate the score (##{thr.value}): #{buffer}" unless thr.value.to_i.zero?
102
- break
103
- end
104
- sleep(1)
105
- Thread.current.thread_variable_set(:buffer, buffer.length.to_s)
106
- end
107
- after = Score.parse(buffer.strip)
108
- @log.debug("Next score #{after.value}/#{after.strength} found in proc ##{thr.pid} \
109
- for #{after.host}:#{after.port} in #{Age.new(start)}: #{after.suffixes}")
110
- after
111
- ensure
112
- Farmers.kill(@log, thr.pid, start)
113
- end
114
- end
115
- end
116
- end
117
-
118
56
  # In a child process using fork
119
57
  class Fork
120
58
  def initialize(log: Log::NULL)
@@ -29,7 +29,6 @@ require 'sinatra/base'
29
29
  require 'concurrent'
30
30
  require 'backtrace'
31
31
  require 'zache'
32
- require 'posix/spawn'
33
32
  require_relative '../version'
34
33
  require_relative '../size'
35
34
  require_relative '../wallet'
@@ -313,7 +312,7 @@ in #{Age.new(@start, limit: 1)}")
313
312
  "Balance: #{wallet.balance.to_zld(8)} ZLD (#{wallet.balance.to_i} zents)",
314
313
  "Transactions: #{wallet.txns.count}",
315
314
  "Taxes: #{Tax.new(wallet).paid} paid, the debt is #{Tax.new(wallet).debt}",
316
- "File size: #{wallet.size} bytes (#{Copies.new(File.join(settings.copies, wallet.id)).all.count} copies)",
315
+ "File size: #{Size.new(wallet.size)}, #{Copies.new(File.join(settings.copies, wallet.id)).all.count} copies",
317
316
  "Modified: #{wallet.mtime.utc.iso8601} (#{Age.new(wallet.mtime.utc.iso8601)} ago)",
318
317
  "Digest: #{wallet.digest}"
319
318
  ].join("\n")
@@ -458,10 +457,7 @@ in #{Age.new(@start, limit: 1)}")
458
457
  end
459
458
 
460
459
  def processes
461
- []
462
- # This is temporarily disabled. We suspect that this line causes
463
- # memory leakage.
464
- # POSIX::Spawn::Child.new('ps', 'ax').out.split("\n").select { |t| t.include?('zold') }
460
+ `ps ax`.split("\n").select { |t| t.include?('zold') }
465
461
  end
466
462
 
467
463
  def pretty(json)
@@ -31,7 +31,7 @@ require_relative '../wallet'
31
31
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
32
  # License:: MIT
33
33
  module Zold
34
- # The safe entrance
34
+ # The entrance that ignores dups
35
35
  class NoDupEntrance
36
36
  def initialize(entrance, wallets, log: Log::NULL)
37
37
  @entrance = entrance
@@ -53,10 +53,10 @@ module Zold
53
53
  before = @wallets.acq(id) { |w| w.exists? ? w.digest : '' }
54
54
  after = OpenSSL::Digest::SHA256.new(body).hexdigest
55
55
  if before == after
56
- @log.debug("Duplicate of #{id} ignored (#{Size.new(body.length)} bytes)")
56
+ @log.debug("Duplicate of #{id} ignored #{Size.new(body.length)}")
57
57
  return []
58
58
  end
59
- @log.debug("New content for #{id} arrived (#{Size.new(body.length)} bytes)")
59
+ @log.debug("New content for #{id} arrived #{Size.new(body.length)}")
60
60
  @entrance.push(id, body)
61
61
  end
62
62
  end
@@ -0,0 +1,70 @@
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 'tempfile'
24
+ require 'openssl'
25
+ require 'zache'
26
+ require_relative '../log'
27
+ require_relative '../size'
28
+
29
+ # The entrance that ignores something we've seen already.
30
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
+ # License:: MIT
33
+ module Zold
34
+ # The no-spam entrance
35
+ class NoSpamEntrance
36
+ def initialize(entrance, period: 60 * 60, log: Log::NULL)
37
+ @entrance = entrance
38
+ @log = log
39
+ @period = period
40
+ @zache = Zache.new
41
+ end
42
+
43
+ def start
44
+ raise 'Block must be given to start()' unless block_given?
45
+ @entrance.start { yield(self) }
46
+ end
47
+
48
+ def to_json
49
+ @entrance.to_json
50
+ end
51
+
52
+ # Returns a list of modifed wallets (as Zold::Id)
53
+ def push(id, body)
54
+ before = @zache.get(id.to_s, lifetime: @period) { '' }
55
+ after = hash(id, body)
56
+ if before == after
57
+ @log.debug("Spam of #{id} ignored #{Size.new(body.length)}")
58
+ return []
59
+ end
60
+ @zache.put(id.to_s, after)
61
+ @entrance.push(id, body)
62
+ end
63
+
64
+ private
65
+
66
+ def hash(id, body)
67
+ OpenSSL::Digest::SHA256.new(id.to_s + ' ' + body).hexdigest
68
+ end
69
+ end
70
+ end
data/lib/zold/version.rb CHANGED
@@ -25,6 +25,6 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.17.4'
28
+ VERSION = '0.17.5'
29
29
  PROTOCOL = 2
30
30
  end
@@ -79,6 +79,7 @@ class FakeNode
79
79
  ensure
80
80
  Zold::Front.stop!
81
81
  node.join
82
+ sleep(0.25)
82
83
  end
83
84
  end
84
85
  end
@@ -30,7 +30,7 @@ require_relative '../../lib/zold/verbose_thread'
30
30
  class FarmersTest < Zold::Test
31
31
  def test_calculates_next_score
32
32
  before = Zold::Score.new(host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 3)
33
- [Zold::Farmers::Plain, Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
33
+ [Zold::Farmers::Plain, Zold::Farmers::Fork].each do |farmer_class|
34
34
  farmer = farmer_class.new(log: test_log)
35
35
  after = farmer.up(before)
36
36
  assert_equal(1, after.value)
@@ -41,21 +41,20 @@ class FarmersTest < Zold::Test
41
41
  end
42
42
 
43
43
  def test_calculates_large_score
44
- log = TestLogger.new(test_log)
45
- thread = Thread.start do
46
- [Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
47
- farmer = farmer_class.new(log: log)
44
+ [Zold::Farmers::Plain, Zold::Farmers::Fork].each do |type|
45
+ log = TestLogger.new(test_log)
46
+ thread = Thread.start do
47
+ farmer = type.new(log: log)
48
48
  farmer.up(Zold::Score.new(host: 'a', port: 1, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 20))
49
49
  end
50
+ sleep(0.1)
51
+ thread.kill
52
+ thread.join
50
53
  end
51
- assert_wait { !log.msgs.find { |m| m.include?('Scoring started') }.nil? }
52
- thread.kill
53
- thread.join
54
- assert(log.msgs.find { |m| m.include?('killed') })
55
54
  end
56
55
 
57
56
  def test_kills_farmer
58
- [Zold::Farmers::Plain, Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |type|
57
+ [Zold::Farmers::Plain, Zold::Farmers::Fork].each do |type|
59
58
  farmer = type.new(log: test_log)
60
59
  thread = Thread.start do
61
60
  Zold::VerboseThread.new(test_log).run do
@@ -67,25 +66,4 @@ class FarmersTest < Zold::Test
67
66
  thread.join
68
67
  end
69
68
  end
70
-
71
- def test_avoid_duplicate_processes
72
- log = TestLogger.new(test_log)
73
- time = Time.now
74
- thread = Thread.start do
75
- [Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
76
- farmer = farmer_class.new(log: log)
77
- farmer.up(Zold::Score.new(time: time, host: 'a', port: 1, invoice: 'prefixone@ffffffffffffffff', strength: 20))
78
- end
79
- end
80
- assert_wait { !log.msgs.find { |m| m.include?('Scoring started') }.nil? }
81
- assert_raises do
82
- [Zold::Farmers::Spawn, Zold::Farmers::Fork].each do |farmer_class|
83
- farmer_class.new(log: log).up(
84
- Zold::Score.new(time: time, host: 'a', port: 1, invoice: 'prefixtwo@ffffffffffffffff', strength: 20)
85
- )
86
- end
87
- end
88
- thread.kill
89
- thread.join
90
- end
91
69
  end
@@ -31,7 +31,7 @@ require_relative 'fake_entrance'
31
31
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
32
32
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
33
33
  # License:: MIT
34
- class TestAsyncEntrance < Zold::Test
34
+ class TestNoDupEntrance < Zold::Test
35
35
  def test_ignores_dup
36
36
  FakeHome.new(log: test_log).run do |home|
37
37
  wallet = home.create_wallet
@@ -0,0 +1,49 @@
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 'minitest/autorun'
24
+ require_relative '../test__helper'
25
+ require_relative '../../lib/zold/id'
26
+ require_relative '../../lib/zold/node/nospam_entrance'
27
+ require_relative 'fake_entrance'
28
+
29
+ # NoSpamEntrance test.
30
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
+ # License:: MIT
33
+ class TestNoSpamEntrance < Zold::Test
34
+ def test_ignores_spam
35
+ Zold::NoSpamEntrance.new(RealEntrance.new, log: test_log).start do |e|
36
+ id = Zold::Id.new
37
+ content = 'hello'
38
+ assert(!e.push(id, content).empty?)
39
+ assert(e.push(id, content).empty?)
40
+ assert(e.push(id, content).empty?)
41
+ end
42
+ end
43
+
44
+ class RealEntrance < FakeEntrance
45
+ def push(id, _)
46
+ [id]
47
+ end
48
+ end
49
+ end
data/zold.gemspec CHANGED
@@ -71,7 +71,6 @@ and suggests a different architecture for digital wallet maintenance.'
71
71
  s.add_runtime_dependency 'memory_profiler', '0.9.12'
72
72
  s.add_runtime_dependency 'openssl', '2.1.2'
73
73
  s.add_runtime_dependency 'parallel', '1.12.1'
74
- s.add_runtime_dependency 'posix-spawn', '0.3.13'
75
74
  s.add_runtime_dependency 'rainbow', '3.0.0'
76
75
  s.add_runtime_dependency 'rake', '12.3.1' # has to stay here for Heroku
77
76
  s.add_runtime_dependency 'rubocop', '0.60.0' # has to stay here for Heroku
@@ -85,7 +84,7 @@ and suggests a different architecture for digital wallet maintenance.'
85
84
  s.add_runtime_dependency 'typhoeus', '1.3.1'
86
85
  s.add_runtime_dependency 'usagewatch_ext', '0.2.1'
87
86
  s.add_runtime_dependency 'xcop', '0.6'
88
- s.add_runtime_dependency 'zache', '0.3.1'
87
+ s.add_runtime_dependency 'zache', '0.4.0'
89
88
  s.add_runtime_dependency 'zold-score', '0.3.4'
90
89
  s.add_development_dependency 'codecov', '0.1.13'
91
90
  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.17.4
4
+ version: 0.17.5
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-30 00:00:00.000000000 Z
11
+ date: 2018-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -150,20 +150,6 @@ dependencies:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
152
  version: 1.12.1
153
- - !ruby/object:Gem::Dependency
154
- name: posix-spawn
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - '='
158
- - !ruby/object:Gem::Version
159
- version: 0.3.13
160
- type: :runtime
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - '='
165
- - !ruby/object:Gem::Version
166
- version: 0.3.13
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: rainbow
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -352,14 +338,14 @@ dependencies:
352
338
  requirements:
353
339
  - - '='
354
340
  - !ruby/object:Gem::Version
355
- version: 0.3.1
341
+ version: 0.4.0
356
342
  type: :runtime
357
343
  prerelease: false
358
344
  version_requirements: !ruby/object:Gem::Requirement
359
345
  requirements:
360
346
  - - '='
361
347
  - !ruby/object:Gem::Version
362
- version: 0.3.1
348
+ version: 0.4.0
363
349
  - !ruby/object:Gem::Dependency
364
350
  name: zold-score
365
351
  requirement: !ruby/object:Gem::Requirement
@@ -615,6 +601,7 @@ files:
615
601
  - lib/zold/node/farmers.rb
616
602
  - lib/zold/node/front.rb
617
603
  - lib/zold/node/nodup_entrance.rb
604
+ - lib/zold/node/nospam_entrance.rb
618
605
  - lib/zold/node/safe_entrance.rb
619
606
  - lib/zold/node/spread_entrance.rb
620
607
  - lib/zold/node/sync_entrance.rb
@@ -667,6 +654,7 @@ files:
667
654
  - test/node/test_farmers.rb
668
655
  - test/node/test_front.rb
669
656
  - test/node/test_nodup_entrance.rb
657
+ - test/node/test_nospam_entrance.rb
670
658
  - test/node/test_safe_entrance.rb
671
659
  - test/node/test_spread_entrance.rb
672
660
  - test/node/test_sync_entrance.rb
@@ -711,7 +699,7 @@ licenses:
711
699
  - MIT
712
700
  metadata: {}
713
701
  post_install_message: |-
714
- Thanks for installing Zold 0.17.4!
702
+ Thanks for installing Zold 0.17.5!
715
703
  Study our White Paper: https://papers.zold.io/wp.pdf
716
704
  Read our blog posts: https://blog.zold.io
717
705
  Try online wallet at: https://wts.zold.io
@@ -773,6 +761,7 @@ test_files:
773
761
  - test/node/test_farmers.rb
774
762
  - test/node/test_front.rb
775
763
  - test/node/test_nodup_entrance.rb
764
+ - test/node/test_nospam_entrance.rb
776
765
  - test/node/test_safe_entrance.rb
777
766
  - test/node/test_spread_entrance.rb
778
767
  - test/node/test_sync_entrance.rb