tfollow-up prev: rm decorator, preprocess channel_id for all messages - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit ffa3760a179f006a7758309b16cb4bac9bb77be1
 (DIR) parent 386d3853895475039dc7d6a37347a5ef762dc34d
 (HTM) Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 11 Mar 2020 17:02:44 +0100
       
       follow-up prev: rm decorator, preprocess channel_id for all messages
       
       Diffstat:
         M electrum/lnpeer.py                  |      49 ++++++++++---------------------
       
       1 file changed, 16 insertions(+), 33 deletions(-)
       ---
 (DIR) diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
       t@@ -60,13 +60,6 @@ if TYPE_CHECKING:
        
        LN_P2P_NETWORK_TIMEOUT = 20
        
       -def channel_update(func):
       -    def wrapper(peer, payload):
       -        channel_id = payload["channel_id"]
       -        chan = peer.channels[channel_id]
       -        return func(peer, chan, payload)
       -    return wrapper
       -
        def channel_id_from_funding_tx(funding_txid: str, funding_index: int) -> Tuple[bytes, bytes]:
            funding_txid_bytes = bytes.fromhex(funding_txid)[::-1]
            i = int.from_bytes(funding_txid_bytes, 'big') ^ funding_index
       t@@ -159,6 +152,13 @@ class Peer(Logger):
                    chan_id = payload.get('channel_id') or payload["temporary_channel_id"]
                    self.ordered_message_queues[chan_id].put_nowait((message_type, payload))
                else:
       +            if message_type != 'error' and 'channel_id' in payload:
       +                chan = self.channels.get(payload['channel_id'])
       +                if chan is None:
       +                    raise Exception('Got unknown '+ message_type)
       +                args = (chan, payload)
       +            else:
       +                args = (payload,)
                    try:
                        f = getattr(self, 'on_' + message_type)
                    except AttributeError:
       t@@ -167,7 +167,7 @@ class Peer(Logger):
                    # raw message is needed to check signature
                    if message_type in ['node_announcement', 'channel_announcement', 'channel_update']:
                        payload['raw'] = message
       -            execution_result = f(payload)
       +            execution_result = f(*args)
                    if asyncio.iscoroutinefunction(f):
                        asyncio.ensure_future(execution_result)
        
       t@@ -229,13 +229,11 @@ class Peer(Logger):
                        chan.set_remote_update(payload['raw'])
                        self.logger.info("saved remote_update")
        
       -    def on_announcement_signatures(self, payload):
       -        channel_id = payload['channel_id']
       -        chan = self.channels[payload['channel_id']]
       +    def on_announcement_signatures(self, chan, payload):
                if chan.config[LOCAL].was_announced:
                    h, local_node_sig, local_bitcoin_sig = self.send_announcement_signatures(chan)
                else:
       -            self.announcement_signatures[channel_id].put_nowait(payload)
       +            self.announcement_signatures[chan.channel_id].put_nowait(payload)
        
            def handle_disconnect(func):
                async def wrapper_func(self, *args, **kwargs):
       t@@ -650,7 +648,6 @@ class Peer(Logger):
                funding_sat = int.from_bytes(payload['funding_satoshis'], 'big')
                push_msat = int.from_bytes(payload['push_msat'], 'big')
                feerate = int.from_bytes(payload['feerate_per_kw'], 'big')
       -
                temp_chan_id = payload['temporary_channel_id']
                local_config = self.make_local_config(funding_sat, push_msat, REMOTE)
                # for the first commitment transaction
       t@@ -903,12 +900,8 @@ class Peer(Logger):
                if chan.config[LOCAL].funding_locked_received and chan.short_channel_id:
                    self.mark_open(chan)
        
       -    def on_funding_locked(self, payload):
       -        channel_id = payload['channel_id']
       -        self.logger.info(f"on_funding_locked. channel: {bh2u(channel_id)}")
       -        chan = self.channels.get(channel_id)
       -        if not chan:
       -            raise Exception("Got unknown funding_locked", channel_id)
       +    def on_funding_locked(self, chan, payload):
       +        self.logger.info(f"on_funding_locked. channel: {bh2u(chan.channel_id)}")
                if not chan.config[LOCAL].funding_locked_received:
                    their_next_point = payload["next_per_commitment_point"]
                    chan.config[REMOTE].next_per_commitment_point = their_next_point
       t@@ -1007,10 +1000,8 @@ class Peer(Logger):
                    node_signature=node_signature,
                    bitcoin_signature=bitcoin_signature
                )
       -
                return msg_hash, node_signature, bitcoin_signature
        
       -    @channel_update
            def on_update_fail_htlc(self, chan, payload):
                htlc_id = int.from_bytes(payload["id"], "big")
                reason = payload["reason"]
       t@@ -1066,9 +1057,7 @@ class Peer(Logger):
                    next_per_commitment_point=rev.next_per_commitment_point)
                self.maybe_send_commitment(chan)
        
       -    def on_commitment_signed(self, payload):
       -        channel_id = payload['channel_id']
       -        chan = self.channels[channel_id]
       +    def on_commitment_signed(self, chan, payload):
                if chan.peer_state == peer_states.BAD:
                    return
                self.logger.info(f'on_commitment_signed. chan {chan.short_channel_id}. ctn: {chan.get_next_ctn(LOCAL)}.')
       t@@ -1086,7 +1075,6 @@ class Peer(Logger):
                chan.receive_new_commitment(payload["signature"], htlc_sigs)
                self.send_revoke_and_ack(chan)
        
       -    @channel_update
            def on_update_fulfill_htlc(self, chan, payload):
                preimage = payload["payment_preimage"]
                payment_hash = sha256(preimage)
       t@@ -1096,11 +1084,9 @@ class Peer(Logger):
                self.lnworker.save_preimage(payment_hash, preimage)
                self.maybe_send_commitment(chan)
        
       -    @channel_update
            def on_update_fail_malformed_htlc(self, chan, payload):
                self.logger.info(f"on_update_fail_malformed_htlc. error {payload['data'].decode('ascii')}")
        
       -    @channel_update
            def on_update_add_htlc(self, chan, payload):
                payment_hash = payload["payment_hash"]
                htlc_id = int.from_bytes(payload["id"], 'big')
       t@@ -1237,9 +1223,7 @@ class Peer(Logger):
                                  len=len(error_packet),
                                  reason=error_packet)
        
       -    def on_revoke_and_ack(self, payload):
       -        channel_id = payload["channel_id"]
       -        chan = self.channels[channel_id]
       +    def on_revoke_and_ack(self, chan, payload):
                if chan.peer_state == peer_states.BAD:
                    return
                self.logger.info(f'on_revoke_and_ack. chan {chan.short_channel_id}. ctn: {chan.get_oldest_unrevoked_ctn(REMOTE)}')
       t@@ -1248,7 +1232,6 @@ class Peer(Logger):
                self.lnworker.save_channel(chan)
                self.maybe_send_commitment(chan)
        
       -    @channel_update
            def on_update_fee(self, chan, payload):
                feerate = int.from_bytes(payload["feerate_per_kw"], "big")
                chan.update_fee(feerate, False)
       t@@ -1299,14 +1282,14 @@ class Peer(Logger):
                return txid
        
            @log_exceptions
       -    async def on_shutdown(self, payload):
       +    async def on_shutdown(self, chan, payload):
                their_scriptpubkey = payload['scriptpubkey']
                # BOLT-02 restrict the scriptpubkey to some templates:
                if not (match_script_against_template(their_scriptpubkey, transaction.SCRIPTPUBKEY_TEMPLATE_WITNESS_V0)
                        or match_script_against_template(their_scriptpubkey, transaction.SCRIPTPUBKEY_TEMPLATE_P2SH)
                        or match_script_against_template(their_scriptpubkey, transaction.SCRIPTPUBKEY_TEMPLATE_P2PKH)):
                    raise Exception(f'scriptpubkey in received shutdown message does not conform to any template: {their_scriptpubkey.hex()}')
       -        chan_id = payload['channel_id']
       +        chan_id = chan.channel_id
                if chan_id in self.shutdown_received:
                    self.shutdown_received[chan_id].set_result(payload)
                else: