URI: 
       tlnhtlc: remove unnecessary double application of pending feerate - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 9145d61797e9740d32a33c3e60788e07579d62e7
   DIR parent cc48e146180864ece525bc6d19574cf2e4666788
  HTML Author: Janus <ysangkok@gmail.com>
       Date:   Tue, 10 Jul 2018 19:26:54 +0200
       
       lnhtlc: remove unnecessary double application of pending feerate
       
       Diffstat:
         M lib/lnhtlc.py                       |      94 +++++++++++++++----------------
       
       1 file changed, 46 insertions(+), 48 deletions(-)
       ---
   DIR diff --git a/lib/lnhtlc.py b/lib/lnhtlc.py
       t@@ -188,33 +188,32 @@ class HTLCStateMachine(PrintError):
                    self.pending_ack_fee_update = self.pending_fee_update
                    self.pending_fee_update = None
        
       -        with PendingFeerateApplied(self):
       -            sig_64 = sign_and_get_sig_string(self.pending_remote_commitment, self.local_config, self.remote_config)
       -
       -            their_remote_htlc_privkey_number = derive_privkey(
       -                int.from_bytes(self.local_config.htlc_basepoint.privkey, 'big'),
       -                self.remote_state.next_per_commitment_point)
       -            their_remote_htlc_privkey = their_remote_htlc_privkey_number.to_bytes(32, 'big')
       -
       -            for_us = False
       -
       -            htlcsigs = []
       -            for we_receive, htlcs in zip([True, False], [self.htlcs_in_remote, self.htlcs_in_local]):
       -                assert len(htlcs) <= 1
       -                for htlc in htlcs:
       -                    weight = HTLC_SUCCESS_WEIGHT if we_receive else HTLC_TIMEOUT_WEIGHT
       -                    fee = self.remote_state.feerate // 1000 * weight
       -                    if htlc.amount_msat // 1000 < self.remote_config.dust_limit_sat + fee:
       -                        print("value too small, skipping. htlc amt: {}, weight: {}, remote feerate {}, remote dust limit {}".format( htlc.amount_msat, weight, self.remote_state.feerate, self.remote_config.dust_limit_sat))
       -                        continue
       -                    original_htlc_output_index = 0
       -                    args = [self.remote_state.next_per_commitment_point, for_us, we_receive, htlc.amount_msat + htlc.total_fee, htlc.cltv_expiry, htlc.payment_hash, self.pending_remote_commitment, original_htlc_output_index]
       -                    htlc_tx = make_htlc_tx_with_open_channel(self, *args)
       -                    sig = bfh(htlc_tx.sign_txin(0, their_remote_htlc_privkey))
       -                    htlc_sig = ecc.sig_string_from_der_sig(sig[:-1])
       -                    htlcsigs.append(htlc_sig)
       -
       -            return sig_64, htlcsigs
       +        sig_64 = sign_and_get_sig_string(self.pending_remote_commitment, self.local_config, self.remote_config)
       +
       +        their_remote_htlc_privkey_number = derive_privkey(
       +            int.from_bytes(self.local_config.htlc_basepoint.privkey, 'big'),
       +            self.remote_state.next_per_commitment_point)
       +        their_remote_htlc_privkey = their_remote_htlc_privkey_number.to_bytes(32, 'big')
       +
       +        for_us = False
       +
       +        htlcsigs = []
       +        for we_receive, htlcs in zip([True, False], [self.htlcs_in_remote, self.htlcs_in_local]):
       +            assert len(htlcs) <= 1
       +            for htlc in htlcs:
       +                weight = HTLC_SUCCESS_WEIGHT if we_receive else HTLC_TIMEOUT_WEIGHT
       +                fee = self.remote_state.feerate // 1000 * weight
       +                if htlc.amount_msat // 1000 < self.remote_config.dust_limit_sat + fee:
       +                    print("value too small, skipping. htlc amt: {}, weight: {}, remote feerate {}, remote dust limit {}".format( htlc.amount_msat, weight, self.remote_state.feerate, self.remote_config.dust_limit_sat))
       +                    continue
       +                original_htlc_output_index = 0
       +                args = [self.remote_state.next_per_commitment_point, for_us, we_receive, htlc.amount_msat + htlc.total_fee, htlc.cltv_expiry, htlc.payment_hash, self.pending_remote_commitment, original_htlc_output_index]
       +                htlc_tx = make_htlc_tx_with_open_channel(self, *args)
       +                sig = bfh(htlc_tx.sign_txin(0, their_remote_htlc_privkey))
       +                htlc_sig = ecc.sig_string_from_der_sig(sig[:-1])
       +                htlcsigs.append(htlc_sig)
       +
       +        return sig_64, htlcsigs
        
            def receive_new_commitment(self, sig, htlc_sigs):
                """
       t@@ -238,27 +237,26 @@ class HTLCStateMachine(PrintError):
                    self.pending_ack_fee_update = self.pending_fee_update
                    self.pending_fee_update = None
        
       -        with PendingFeerateApplied(self):
       -            preimage_hex = self.pending_local_commitment.serialize_preimage(0)
       -            pre_hash = Hash(bfh(preimage_hex))
       -            if not ecc.verify_signature(self.remote_config.multisig_key.pubkey, sig, pre_hash):
       -                raise Exception('failed verifying signature of our updated commitment transaction: ' + str(sig))
       -
       -            _, this_point, _ = self.points
       -
       -            if len(self.htlcs_in_remote) > 0 and len(self.pending_local_commitment.outputs()) == 3:
       -                print("CHECKING HTLC SIGS")
       -                we_receive = True
       -                payment_hash = self.htlcs_in_remote[0].payment_hash
       -                amount_msat = self.htlcs_in_remote[0].amount_msat
       -                cltv_expiry = self.htlcs_in_remote[0].cltv_expiry
       -                htlc_tx = make_htlc_tx_with_open_channel(self, this_point, True, we_receive, amount_msat, cltv_expiry, payment_hash, self.pending_local_commitment, 0)
       -                pre_hash = Hash(bfh(htlc_tx.serialize_preimage(0)))
       -                remote_htlc_pubkey = derive_pubkey(self.remote_config.htlc_basepoint.pubkey, this_point)
       -                if not ecc.verify_signature(remote_htlc_pubkey, htlc_sigs[0], pre_hash):
       -                    raise Exception("failed verifying signature an HTLC tx spending from one of our commit tx'es HTLC outputs")
       -
       -            # TODO check htlc in htlcs_in_local
       +        preimage_hex = self.pending_local_commitment.serialize_preimage(0)
       +        pre_hash = Hash(bfh(preimage_hex))
       +        if not ecc.verify_signature(self.remote_config.multisig_key.pubkey, sig, pre_hash):
       +            raise Exception('failed verifying signature of our updated commitment transaction: ' + str(sig))
       +
       +        _, this_point, _ = self.points
       +
       +        if len(self.htlcs_in_remote) > 0 and len(self.pending_local_commitment.outputs()) == 3:
       +            print("CHECKING HTLC SIGS")
       +            we_receive = True
       +            payment_hash = self.htlcs_in_remote[0].payment_hash
       +            amount_msat = self.htlcs_in_remote[0].amount_msat
       +            cltv_expiry = self.htlcs_in_remote[0].cltv_expiry
       +            htlc_tx = make_htlc_tx_with_open_channel(self, this_point, True, we_receive, amount_msat, cltv_expiry, payment_hash, self.pending_local_commitment, 0)
       +            pre_hash = Hash(bfh(htlc_tx.serialize_preimage(0)))
       +            remote_htlc_pubkey = derive_pubkey(self.remote_config.htlc_basepoint.pubkey, this_point)
       +            if not ecc.verify_signature(remote_htlc_pubkey, htlc_sigs[0], pre_hash):
       +                raise Exception("failed verifying signature an HTLC tx spending from one of our commit tx'es HTLC outputs")
       +
       +        # TODO check htlc in htlcs_in_local
        
            def revoke_current_commitment(self):
                """