electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 75dd56eff09bab6a218658ccb396107adbad0f75
parent 5e7117ddddb2b39a6c835b5e90e6f9225f728e64
Author: ThomasV <thomasv@electrum.org>
Date:   Wed, 26 Sep 2018 19:35:38 +0200

avoid code duplication between methods that send channel updates

Diffstat:
Melectrum/lnbase.py | 36++++++++++++++----------------------
1 file changed, 14 insertions(+), 22 deletions(-)

diff --git a/electrum/lnbase.py b/electrum/lnbase.py @@ -841,10 +841,18 @@ class Peer(PrintError): await self.receive_revoke(chan) self.lnworker.save_channel(chan) + async def update_channel(self, chan, update): + """ generic channel update flow """ + self.send_message(update) + sig_64, htlc_sigs = chan.sign_next_commitment() + self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=len(htlc_sigs), htlc_signature=b"".join(htlc_sigs))) + await self.receive_revoke(chan) + await self.receive_commitment(chan) + self.revoke(chan) + async def pay(self, path, chan, amount_msat, payment_hash, pubkey_in_invoice, min_final_cltv_expiry): assert chan.get_state() == "OPEN", chan.get_state() assert amount_msat > 0, "amount_msat is not greater zero" - height = self.network.get_local_height() route = self.network.path_finder.create_route_from_path(path, self.lnworker.pubkey) hops_data = [] @@ -864,7 +872,6 @@ class Peer(PrintError): msat_local = chan.balance(LOCAL) - amount_msat msat_remote = chan.balance(REMOTE) + amount_msat htlc = {'amount_msat':amount_msat, 'payment_hash':payment_hash, 'cltv_expiry':final_cltv_expiry_with_deltas} - # FIXME if we raise here, this channel will not get blacklisted, and the payment can never succeed, # as we will just keep retrying this same path. using the current blacklisting is not a solution as # then no other payment can use this channel either. @@ -877,18 +884,11 @@ class Peer(PrintError): if msat_local < 0: # FIXME what about channel_reserve_satoshis? will the remote fail the channel if we go below? test. raise PaymentFailure('not enough local balance') - htlc_id = chan.add_htlc(htlc) chan.onion_keys[htlc_id] = secret_key - self.send_message(gen_msg("update_add_htlc", channel_id=chan.channel_id, id=htlc_id, cltv_expiry=final_cltv_expiry_with_deltas, amount_msat=amount_msat, payment_hash=payment_hash, onion_routing_packet=onion.to_bytes())) - + update = gen_msg("update_add_htlc", channel_id=chan.channel_id, id=htlc_id, cltv_expiry=final_cltv_expiry_with_deltas, amount_msat=amount_msat, payment_hash=payment_hash, onion_routing_packet=onion.to_bytes()) self.attempted_route[(chan.channel_id, htlc_id)] = route - - sig_64, htlc_sigs = chan.sign_next_commitment() - self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=len(htlc_sigs), htlc_signature=b"".join(htlc_sigs))) - await self.receive_revoke(chan) - await self.receive_commitment(chan) - self.revoke(chan) + await self.update_channel(chan, update) async def receive_revoke(self, m): revoke_and_ack_msg = await self.revoke_and_ack[m.channel_id].get() @@ -1047,27 +1047,19 @@ class Peer(PrintError): if not chan.constraints.is_initiator: # TODO force close if initiator does not update_fee enough return - feerate_per_kw = self.current_feerate_per_kw() chan_fee = chan.pending_feerate(REMOTE) self.print_error("current pending feerate", chan_fee) self.print_error("new feerate", feerate_per_kw) if feerate_per_kw < chan_fee / 2: self.print_error("FEES HAVE FALLEN") - chan.update_fee(feerate_per_kw) elif feerate_per_kw > chan_fee * 2: self.print_error("FEES HAVE RISEN") - chan.update_fee(feerate_per_kw) else: return - - self.send_message(gen_msg("update_fee", channel_id=chan.channel_id, feerate_per_kw=feerate_per_kw)) - sig_64, htlc_sigs = chan.sign_next_commitment() - self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=len(htlc_sigs), htlc_signature=b"".join(htlc_sigs))) - await self.receive_revoke(chan) - await self.receive_commitment(chan) - self.revoke(chan) - self.lnworker.save_channel(chan) + chan.update_fee(feerate_per_kw) + update = gen_msg("update_fee", channel_id=chan.channel_id, feerate_per_kw=feerate_per_kw) + await self.update_channel(chan, update) def current_feerate_per_kw(self): from .simple_config import FEE_LN_ETA_TARGET, FEERATE_FALLBACK_STATIC_FEE