zold 0.10.5 → 0.10.6

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
  SHA1:
3
- metadata.gz: d2d3e4b50eba2938f33f62b40e1a052b736ccdca
4
- data.tar.gz: 0d6fd2c89c0673606235a7eb99522cc8d886188d
3
+ metadata.gz: cc808990a7aeb6946114017c4754f6534493faab
4
+ data.tar.gz: 4c8f152bc663c64613fb864c0900977a60a613b6
5
5
  SHA512:
6
- metadata.gz: 1def9d8e89cd27ddac2e2692585887013bcfaefc99db4fea123c2b53446099f897f35803b9a3d8325185881dc741b86b73dfe8f345e8df8b989802edac8bce8a
7
- data.tar.gz: e91315346ae30f7c0946b66dd7d428f3557ff233268868b1e7b5b5ddd5ba16ed441cca192c1a8105ad5bd4006c13f5255412f215b82e7c13d9c288425f3248c9
6
+ metadata.gz: 1783a36f812fa552685868137567afbc671a1e8c27eef28e4b0421075872c3425c104b4c1defbc9107c095054b1dde86e9807b9c6ab33b927936dfaef32a60c7
7
+ data.tar.gz: 4f423df3b48d43f2018678c511139cbc2e6fb109508739f345cebf84c4ce71d7628982d04a8923a13e0416eae23095fc24ac17da3fbc9f71f39184b69ad32cff
data/Procfile CHANGED
@@ -1 +1 @@
1
- web: LC_ALL=UTF-8 ./bin/zold node --no-colors --verbose --trace --bind-port=$PORT --port=80 --host=b1.zold.io --threads=1 --invoice=JKFq17yipfjLtX@0000000000000000 --never-reboot
1
+ web: LC_ALL=UTF-8 ./bin/zold node --no-colors --verbose --trace --bind-port=$PORT --port=80 --host=b1.zold.io --threads=0 --invoice=JKFq17yipfjLtX@0000000000000000 --never-reboot
@@ -72,20 +72,21 @@ Available options:"
72
72
  end
73
73
 
74
74
  def fetch_one(id, r, cps, opts)
75
+ start = Time.now
75
76
  if opts['ignore-node'].include?(r.to_s)
76
77
  @log.info("#{r} ignored because of --ignore-node")
77
78
  return false
78
79
  end
79
80
  res = r.http("/wallet/#{id}").get
80
81
  raise "Wallet #{id} not found" if res.code == '404'
81
- raise "#{res.code} \"#{res.message}\"" unless res.code == '200'
82
+ r.assert_code(200, res)
82
83
  json = JSON.parse(res.body)
83
84
  score = Score.parse_json(json['score'])
84
- raise "Invalid score #{score}" unless score.valid?
85
- raise "Score expired #{score}" if score.expired?
85
+ r.assert_valid_score(score)
86
86
  raise "Score is too weak #{score.strength}" if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
87
87
  cps.add(json['body'], score.host, score.port, score.value)
88
- @log.info("#{r} #{json['body'].length}b/#{Rainbow(score.value).green} (#{json['version']})")
88
+ @log.info("#{r} #{json['body'].length}b/#{Rainbow(score.value).green} (#{json['version']}) \
89
+ in #{(Time.now - start).round(2)}s")
89
90
  end
90
91
  end
91
92
  end
@@ -63,9 +63,19 @@ Available options:"
63
63
  raise 'There are no remote copies, try FETCH first' if cps.all.empty?
64
64
  cps = cps.all.sort_by { |c| c[:score] }.reverse
65
65
  patch = Patch.new
66
- patch.start(Wallet.new(cps[0][:path]))
66
+ main = Wallet.new(cps[0][:path])
67
+ patch.start(main)
67
68
  cps[1..-1].each do |c|
68
- patch.join(Wallet.new(c[:path]))
69
+ extra = Wallet.new(c[:path])
70
+ if extra.network != main.network
71
+ @log.error("The wallet is from a different network '#{wallet.version}', ours is '#{@network}'")
72
+ next
73
+ end
74
+ if extra.key != main.key
75
+ @log.error('Public key mismatch')
76
+ next
77
+ end
78
+ patch.join(extra)
69
79
  end
70
80
  modified = patch.save(wallet.path, overwrite: true)
71
81
  if modified
@@ -58,18 +58,18 @@ Available options:"
58
58
  def push(wallet, _)
59
59
  total = 0
60
60
  @remotes.iterate(@log) do |r|
61
+ start = Time.now
61
62
  response = r.http("/wallet/#{wallet.id}").put(File.read(wallet.path))
62
63
  if response.code == '304'
63
64
  @log.info("#{r}: same version there")
64
65
  next
65
66
  end
66
- raise "#{response.code} \"#{response.message}\" at #{response.body}" unless response.code == '200'
67
+ r.assert_code(200, response)
67
68
  json = JSON.parse(response.body)['score']
68
69
  score = Score.parse_json(json)
69
- raise "Invalid score #{score}" unless score.valid?
70
- raise "Expired score #{score}" if score.expired?
70
+ r.assert_valid_score(score)
71
71
  raise "Score is too weak #{score}" if score.strength < Score::STRENGTH
72
- @log.info("#{r} accepted: #{Rainbow(score.value).green}")
72
+ @log.info("#{r} accepted in #{(Time.now - start).round(2)}s: #{Rainbow(score.value).green}")
73
73
  total += score.value
74
74
  end
75
75
  @log.info("Total score is #{total}")
@@ -116,12 +116,12 @@ Available options:"
116
116
  def update(opts, deep = true)
117
117
  capacity = []
118
118
  @remotes.iterate(@log) do |r|
119
+ start = Time.now
119
120
  res = r.http('/remotes').get
120
- raise "#{res.code} \"#{res.message}\"" unless res.code == '200'
121
+ r.assert_code(200, res)
121
122
  json = JSON.parse(res.body)
122
123
  score = Score.parse_json(json['score'])
123
- raise "Invalid score #{score}" unless score.valid?
124
- raise "Expired score #{score}" if score.expired?
124
+ r.assert_valid_score(score)
125
125
  raise "Score too weak: #{score.strength}" if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
126
126
  raise "Masqueraded as #{score.host}:#{score.port}" if r.host != score.host || r.port != score.port
127
127
  @remotes.rescore(score.host, score.port, score.value)
@@ -131,7 +131,7 @@ Available options:"
131
131
  end
132
132
  end
133
133
  capacity << { host: score.host, port: score.port, count: json['all'].count }
134
- @log.info("#{r}: #{Rainbow(score.value).green} (#{json['version']})")
134
+ @log.info("#{r}: #{Rainbow(score.value).green} (#{json['version']}) in #{(Time.now - start).round(2)}")
135
135
  end
136
136
  max_capacity = capacity.map { |c| c[:count] }.max || 0
137
137
  capacity.each do |c|
@@ -119,14 +119,13 @@ Available options:"
119
119
  best = []
120
120
  @remotes.iterate(@log) do |r|
121
121
  res = r.http.get
122
- raise "#{res.code} \"#{res.message}\" at #{res.body}" unless res.code == '200'
122
+ r.assert_code(200, res)
123
123
  json = JSON.parse(res.body)
124
124
  score = Score.parse_json(json['score'])
125
- raise "Invalid score #{score}" unless score.valid?
126
- raise "Expired score #{score}" if score.expired?
125
+ r.assert_valid_score(score)
127
126
  raise "Score is too weak (<#{Score::STRENGTH}) #{score}" if score.strength < Score::STRENGTH
128
127
  raise "Score is too small (<#{Tax::EXACT_SCORE})" if score.value < Tax::EXACT_SCORE
129
- @log.info("#{score.host}:#{score.port}: #{Rainbow(score.value).green}")
128
+ @log.info("#{r}: #{Rainbow(score.value).green}")
130
129
  best << score
131
130
  end
132
131
  best.sort_by(&:value).reverse
data/lib/zold/http.rb CHANGED
@@ -50,7 +50,7 @@ module Zold
50
50
  http.read_timeout = 5
51
51
  return http.request_get(@uri.path, headers)
52
52
  rescue StandardError => e
53
- return Net::HTTPServerError.new('1.1', '599', e.message)
53
+ Error.new(e)
54
54
  end
55
55
 
56
56
  def put(body)
@@ -64,11 +64,30 @@ module Zold
64
64
  )
65
65
  )
66
66
  rescue StandardError => e
67
- return Net::HTTPServerError.new('1.1', '599', e.message)
67
+ Error.new(e)
68
68
  end
69
69
 
70
70
  private
71
71
 
72
+ # The error, if connection fails
73
+ class Error
74
+ def initialize(ex)
75
+ @ex = ex
76
+ end
77
+
78
+ def body
79
+ @ex.message + "\n" + @ex.backtrace.join("\n\t")
80
+ end
81
+
82
+ def code
83
+ '599'
84
+ end
85
+
86
+ def message
87
+ @ex.message
88
+ end
89
+ end
90
+
72
91
  def headers
73
92
  headers = {
74
93
  'User-Agent': "Zold #{VERSION}",
data/lib/zold/key.rb CHANGED
@@ -48,6 +48,10 @@ module Zold
48
48
  end
49
49
  end
50
50
 
51
+ def ==(other)
52
+ to_s == other.to_s
53
+ end
54
+
51
55
  def to_s
52
56
  rsa.to_s.strip
53
57
  end
data/lib/zold/patch.rb CHANGED
@@ -37,9 +37,6 @@ module Zold
37
37
  end
38
38
 
39
39
  def join(wallet)
40
- if wallet.network != @network
41
- raise "The wallet is from a different network '#{wallet.version}', ours is '#{@network}'"
42
- end
43
40
  negative = @txns.select { |t| t.amount.negative? }
44
41
  max = negative.empty? ? 0 : negative.max_by(&:id).id
45
42
  wallet.txns.each do |txn|
data/lib/zold/remotes.rb CHANGED
@@ -61,6 +61,15 @@ module Zold
61
61
  def to_s
62
62
  "#{@host}:#{@port}"
63
63
  end
64
+
65
+ def assert_code(code, response)
66
+ raise "#{response.code} \"#{response.message}\" at \"#{response.body}\"" unless response.code.to_i == code
67
+ end
68
+
69
+ def assert_valid_score(score)
70
+ raise "Invalid score #{score}" unless score.valid?
71
+ raise "Expired score #{score}" if score.expired?
72
+ end
64
73
  end
65
74
 
66
75
  def initialize(file, farm = Farm::Empty.new)
data/lib/zold/version.rb CHANGED
@@ -23,5 +23,5 @@
23
23
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
24
24
  # License:: MIT
25
25
  module Zold
26
- VERSION = '0.10.5'.freeze
26
+ VERSION = '0.10.6'.freeze
27
27
  end
data/test/test_http.rb CHANGED
@@ -31,7 +31,16 @@ require_relative '../lib/zold/http'
31
31
  class TestHttp < Minitest::Test
32
32
  def test_pings_broken_uri
33
33
  stub_request(:get, 'http://bad-host/').to_return(status: 500)
34
- assert_equal('500', Zold::Http.new(URI('http://bad-host/')).get.code)
34
+ res = Zold::Http.new(URI('http://bad-host/')).get
35
+ assert_equal('500', res.code)
36
+ assert_equal('', res.body)
37
+ end
38
+
39
+ def test_pings_with_exception
40
+ stub_request(:get, 'http://exception/').to_return { raise 'Intentionally' }
41
+ res = Zold::Http.new(URI('http://exception/')).get
42
+ assert_equal('599', res.code)
43
+ assert(res.body.include?('Intentionally'))
35
44
  end
36
45
 
37
46
  def test_pings_live_uri
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.10.5
4
+ version: 0.10.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko