From 26fcc48c5a6af00207e9438a7eb09992c590563a Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Fri, 7 Dec 2018 03:53:52 -0300 Subject: [PATCH] fix for name collision on channel path --- lbrynet/extras/wallet/resolve.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lbrynet/extras/wallet/resolve.py b/lbrynet/extras/wallet/resolve.py index ed0b8d41f..c27446a10 100644 --- a/lbrynet/extras/wallet/resolve.py +++ b/lbrynet/extras/wallet/resolve.py @@ -122,7 +122,12 @@ class Resolver: if not claims_in_channel: log.error("No valid claims for this name for this channel") elif len(claims_in_channel) > 1: - log.error("Multiple signed claims for the same name") + log.warning("Multiple signed claims for the same name.") + winner = pick_winner_from_channel_path_collision(claims_in_channel) + if winner: + result['claim'] = winner + else: + log.error("No valid claims for this name for this channel") else: result['claim'] = claims_in_channel[0] @@ -475,3 +480,19 @@ def _handle_claim_result(results): assert False, msg return results + + +def pick_winner_from_channel_path_collision(claims_in_channel): + # we should be doing this by effective amount so we pick the controlling claim, however changing the resolved + # claim triggers another issue where 2 claims cant be saved for the same file. This code picks the oldest, so it + # stays the same. Using effective amount would change the resolved claims for a channel path on takeovers, + # potentially triggering that. + winner = None + for claim in claims_in_channel: + if not claim['signature_is_valid']: + continue + if winner is None: + winner = claim + elif claim['claim_sequence'] < winner['claim_sequence']: + winner = claim + return winner