zold 0.17.4 → 0.17.5

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 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