Skip to content

Commit

Permalink
#758 tested and fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
yegor256 committed May 14, 2019
1 parent cb3ff78 commit 1364db8
Show file tree
Hide file tree
Showing 12 changed files with 67 additions and 11 deletions.
4 changes: 2 additions & 2 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Style/ClassAndModuleChildren:
Layout/EmptyLineAfterGuardClause:
Enabled: false
Metrics/CyclomaticComplexity:
Max: 30
Max: 33
Metrics/MethodLength:
Enabled: false
Layout/MultilineMethodCallIndentation:
Expand All @@ -34,7 +34,7 @@ Metrics/ParameterLists:
Layout/AlignParameters:
Enabled: false
Metrics/PerceivedComplexity:
Max: 34
Max: 36
Metrics/LineLength:
Max: 120
Style/MultilineBlockChain:
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1,0.0.0.0,4096,10,NOW,M
1,0.0.0.0,4096,10,NOW,
6 changes: 6 additions & 0 deletions fixtures/merge/negative_overwriting/0123456789abcdef.z
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
test
2
0123456789abcdef
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnppnkzrCreiKaHF09XKS6bO+2274+wSGo+F8KHvVrNbqear/e09r9PB/P6bFdLoMh4Xc7p/7+NSEZLeu2Eg/dBkQLEb8M/zgkT4gBDGyETW/zusYHIznX/lgf0f8qleIQIIB/3Y7QpDztkamWYTKWlnmlrcQvCVB0uRRPm4ZMcMJouKR9n7E2DpL9eolKyOwr/JY08iJOuK3HuW6tRdvE+0x7I+wDprM65OH/PoArlfO5qnIGbeXwsEGRXt0w6a/ubPpeadFjPXotE7cT1SA4YSD1tWTIVm1ZWppOE967XoDIum6tzt5KfzDNRfs9GbCfO0BL235HxbO8I9rTlVLTKcNAiEe0CWolY9HR5pMaosOgZ6PB54InJEZJs4L2b10c+IlVUX1RSnwfFYg0vy5oqrYyqt7gnipl/06YW4PKIYc7TljogsEHf9Cz/kpEKzqDtsH2LrmjMNsbWiousvNHM+MPgcuMg8ZnwLKwDy9NWdI4XLTpg6hVRJNH9erZdfAO5tg/3ub3JLeJbyNo4Bd5f/Bnr5YN/9ahZ87kSpI7v0Qk94dR4hDPjstEcghyZ9RVUoN52+h1g83cd3cIqksJd0kifMCoBmObD013RSPQqNwr9GGU2JaJEm25Vq35dy2DHAkOQpUZVT8GNg9IM4qUDV0yagTN3bZyvuLWIgufb0CAwEAAQ==

0001;2018-01-01T01:01:01Z;ffffffe000000000;qJkKMWUC;146b852f2d9ad984;test;j9ozyBTjJ90TK1u3o4m6ueLWspbXCgEWhLYNQ8B9EonQ9bIsl19DbdsPwyY5M3o8dSefDOwsA9OE48x9ncyh3n/BSYKSUHzSrU1RmVLR2+hveEzwGKPZleUzurDbKZA06MuuP46KDv3uhJ9OjX6szVwBqHorxoJ0zyqRtRdjKop7gqTVbyIIGOM5fu4lx3KhdWJLzD0sN75rdCmuF2yw/V2D+AdkB+84C+rTjp4x9bUr5zIinQtAYn8AJbdpk/3CLHWR/RhqFdUmQrQlgLile016bfkKg8l2S7HufrKdGNVThuoOrpTKZV+prctV2f8/2XANrHoVrtT5y3aENXfvlvYMQYqJsOl8wvLtQEts4pwtQBOdKUC4i82aZW/3lkQr9T8JPoyIthmm8AoOAx6RU0ccDckarDYAg1t5nYA/wK+fBDFkwIwUoI6zkvmwpUCI6/Wf9smF69H+FQNi8OrH0MaO0nzh7zFxgpFKaJAGumEvGPtA7rY3zYZ0P4lK9QnIa887p8WgA7YCN9/WieY71DINfMjVRwC7kxCa7LqNtOlXyp2pMJzWGWGbZH/SF6HpeIMbq7J0yUrdyLz8OwgLk5Wzuv/mht+mvhbI54mZixs4MawAXs9kTPmqGIRpMFvqLmD6GtKEltKuHGnAs4QSFjMmWbGG0WS98TztzFMpLG0=
6 changes: 6 additions & 0 deletions fixtures/merge/negative_overwriting/146b852f2d9ad984.z
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
test
2
146b852f2d9ad984
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyevqT0h4CcDkA4jeC+u0ITqULIyKD4HlUTyoOl8QK6BqDZ5oc4jCIGHgVfwdRVhKdUukWb7AUIVPVf76qepNZLwQ8UGtEwk+nCfq0/4u4zlCr78ZMmpIbdme5a6rXjiB3TE8UVgTPROx5EecazKXcvgmqfl7o98QBkqSKVqvIHzED5wADQzxjmGMmLWP8aTs0/6v4NG7wXJnMEJ0QYf845HMjpiXlNgldU1M1gTCM/8RJJaGjbEOax8HWj4n7LnqPHL5wtSe0CI6BzQsm9lEHUyywMW+SleCc5yponz5ZPzVkMYIzvO36BqykeZ0AXJyE5JfMoljJXG5bJX4tMhvIDVlZDlDh07vd11x3qJEtKB0c/hYcUmrUMAr0jZXBjv+MVq3WMVMClrMDyc1LMmrGh7Jp4hyugYRmrRAiTiZvmd2MaVB16sU91aiDHo90MefQ+RTwGO0YDNDzW1jW0qEYlfXZQGALWDWnyP1h1qzu4SaWrp4Chnt5OmwV67gxUw/VKQekTaiN7/ApeB5wXakrZiuIITi39865qqkkjDWVrRneqF0YDZz1S7eOIZ3OJvCi5OMU1nTTxaycVofolVmfGZlWROS9ENj2gVk9RQLX9xBXC1Vk4C/U7bIPDhk+nMHaDriuTNlmRPwMa6Flj1A9cLDUFPu7F0rDv3iqJkKMWUCAwEAAQ==

0001;2019-05-14T14:34:56Z;0000001000000000;v4NG7wXJ;0123456789abcdef;test;
25 changes: 25 additions & 0 deletions fixtures/merge/negative_overwriting/assert.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# frozen_string_literal: true

# Copyright (c) 2018-2019 Zerocracy, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the 'Software'), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

require_relative 'asserts'
wallet = Zold::Wallet.new('0123456789abcdef.z')
assert_equal(Zold::Amount.new(zld: -16.0), wallet.balance)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
test
1
0123456789abcdef
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnppnkzrCreiKaHF09XKS6bO+2274+wSGo+F8KHvVrNbqear/e09r9PB/P6bFdLoMh4Xc7p/7+NSEZLeu2Eg/dBkQLEb8M/zgkT4gBDGyETW/zusYHIznX/lgf0f8qleIQIIB/3Y7QpDztkamWYTKWlnmlrcQvCVB0uRRPm4ZMcMJouKR9n7E2DpL9eolKyOwr/JY08iJOuK3HuW6tRdvE+0x7I+wDprM65OH/PoArlfO5qnIGbeXwsEGRXt0w6a/ubPpeadFjPXotE7cT1SA4YSD1tWTIVm1ZWppOE967XoDIum6tzt5KfzDNRfs9GbCfO0BL235HxbO8I9rTlVLTKcNAiEe0CWolY9HR5pMaosOgZ6PB54InJEZJs4L2b10c+IlVUX1RSnwfFYg0vy5oqrYyqt7gnipl/06YW4PKIYc7TljogsEHf9Cz/kpEKzqDtsH2LrmjMNsbWiousvNHM+MPgcuMg8ZnwLKwDy9NWdI4XLTpg6hVRJNH9erZdfAO5tg/3ub3JLeJbyNo4Bd5f/Bnr5YN/9ahZ87kSpI7v0Qk94dR4hDPjstEcghyZ9RVUoN52+h1g83cd3cIqksJd0kifMCoBmObD013RSPQqNwr9GGU2JaJEm25Vq35dy2DHAkOQpUZVT8GNg9IM4qUDV0yagTN3bZyvuLWIgufb0CAwEAAQ==

0001;2019-05-14T14:34:56Z;fffffff000000000;v4NG7wXJ;146b852f2d9ad984;test;NSOdJUTYidOne3T0VranU9H8Lb4weJQ1KYhMu7MfFTIiUWXc56O4c/cRIikjQ+EFsneFtYBEHs0TH2oevndGyrHcHkBkmsMRWD0ujYFD27oWEuOX828dYM/vjn7q1ggb9XTJN3kEKnrP8zbfVzJotsh2I9ctNByGoy33ecGfYtv7pFfcUItjd6SbYmGGOCt/Jf4/I5p+pgW2xGjG75jRMQ1Gh40aWGHfOxi38HyUqSr9pcymerbUaEKpFrk8+CJ3LbCUN9Ve2WYIwIZd9POpN2PH+aF+syzEv2Yj7LDTfkLQHLzIJJqtCJvSXeqKgVKQLmtkjgHDX6aTyb8w7+NJ2Mkjq6mREny8qbJnwLi+d7Pl+fFCArP3kFBULKQDzqe7sA8+xew6Dq8kVZWoBtuPFusMhBu7rq573waOcj6ZiW7tKww0abTGe96KUNssMhyF4alHvXQ0b7orK6l2DOBV/JDlgP5mEu2mOJ8Y81peCMNa1m8Y+AgrGijrm5aqk0JHjGH2hVRrHPZcyyO+msoLe7vP5umpf4DuMBMPgGZQc5Sqpc8wuSgD+XaiSVKv1Nr/gQYp2oZbGXnGl47reCvy1lJr2kBzLIWIPdrZIGh7iVy/DFcvw+t7wvoOm1fEfVfDgl04yHwNOiUOLKNlfGFliWJoCJ+sJv5DztHpDEKLBv4=
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1,0.0.0.0,4096,50,NOW,M
2 changes: 2 additions & 0 deletions fixtures/merge/negative_overwriting/opts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
--verbose
--allow-negative-balance
10 changes: 5 additions & 5 deletions lib/zold/commands/merge.rb
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def merge(id, cps, opts)
wallet = Wallet.new(c[:path])
baseline = idx.zero? && (c[:master] || opts['edge-baseline']) && !opts['no-baseline']
name = "#{c[:name]}/#{idx}/#{c[:score]}#{baseline ? '/baseline' : ''}"
merge_one(opts, patch, wallet, name, baseline: baseline)
merge_one(opts, patch, wallet, name, baseline: baseline, master: c[:master])
score += c[:score]
end
@wallets.acq(id) do |w|
Expand Down Expand Up @@ -152,11 +152,11 @@ def merge(id, cps, opts)
modified
end

def merge_one(opts, patch, wallet, name, baseline: false)
def merge_one(opts, patch, wallet, name, baseline: false, master: false)
start = Time.now
@log.debug("Building a patch for #{wallet.id} from remote copy ##{name} with #{wallet.mnemo}...")
@log.debug("Adding copy ##{name}#{master ? ' (master)' : ''} to the patch #{wallet.mnemo}...")
if opts['depth'].positive?
patch.join(wallet, ledger: opts['ledger'], baseline: baseline) do |txn|
patch.join(wallet, ledger: opts['ledger'], baseline: baseline, master: master) do |txn|
trusted = IO.read(opts['trusted']).split(',')
if trusted.include?(txn.bnf.to_s)
@log.debug("Won't PULL #{txn.bnf} since it is already trusted, among #{trusted.count} others")
Expand All @@ -176,7 +176,7 @@ def merge_one(opts, patch, wallet, name, baseline: false)
true
end
else
patch.join(wallet, ledger: opts['ledger'], baseline: baseline) do |txn|
patch.join(wallet, ledger: opts['ledger'], baseline: baseline, master: master) do |txn|
@log.debug("Paying wallet #{txn.bnf} is incomplete but there is not enough depth to PULL: #{txn.to_text}")
false
end
Expand Down
1 change: 1 addition & 0 deletions lib/zold/commands/pay.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ def pay(from, invoice, amount, details, opts)
@log.debug("Keygap \"#{'*' * opts['keygap'].length}\" injected into the RSA private key")
end
key = Zold::Key.new(text: pem)
from.refurbish
txn = from.sub(amount, invoice, key, details, time: Txn.parse_time(opts['time']))
@log.debug("#{amount} sent from #{from} to #{txn.bnf}: #{details}")
@log.debug("Don't forget to do 'zold push #{from}'")
Expand Down
12 changes: 10 additions & 2 deletions lib/zold/patch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ def legacy(wallet, hours: 24)
# The "baseline" flag, when set to TRUE, means that we should NOT validate
# the presence of positive incoming transactions in their correspondent
# wallets. We shall just trust them.
def join(wallet, ledger: '/dev/null', baseline: false)
#
# If the "master" flag is set, this copy is coming from a master node
# and we should allow it to overwrite negative transactions.
def join(wallet, ledger: '/dev/null', baseline: false, master: false)
if @id.nil?
@id = wallet.id
@key = wallet.key
Expand All @@ -95,11 +98,16 @@ def join(wallet, ledger: '/dev/null', baseline: false)
seen += 1
if txn.amount.negative?
dup = @txns.find { |t| t.id == txn.id && t.amount.negative? }
if dup
if dup && !master
@log.error("An attempt to overwrite existing transaction #{dup.to_text.inspect} \
with a new one #{txn.to_text.inspect} from #{wallet.mnemo}")
next
end
if dup && master
@log.debug("An overwrite to the existing transaction #{dup.to_text.inspect} \
is coming from a master node: #{txn.to_text.inspect} from #{wallet.mnemo}")
@txns.reject! { |t| t.id == txn.id && t.amount.negative? }
end
unless Signature.new(@network).valid?(@key, wallet.id, txn)
@log.error("Invalid RSA signature at the transaction ##{txn.id} of #{wallet.id}: #{txn.to_text.inspect}")
next
Expand Down
3 changes: 2 additions & 1 deletion test/commands/test_pay.rb
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,9 @@ def test_pay_in_many_threads
FakeHome.new(log: test_log).run do |home|
wallet = home.create_wallet
amount = Zold::Amount.new(zld: 2.0)
wallets = home.wallets
Threads.new(10).assert do
Zold::Pay.new(wallets: home.wallets, copies: home.dir, remotes: home.remotes, log: test_log).run(
Zold::Pay.new(wallets: wallets, copies: home.dir, remotes: home.remotes, log: test_log).run(
[
'pay', '--force', '--private-key=fixtures/id_rsa',
wallet.id.to_s, 'NOPREFIX@dddd0000dddd0000', amount.to_zld, '-'
Expand Down

0 comments on commit 1364db8

Please sign in to comment.