URI: 
       tlnbase: avoid copying variables, insert newlines - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 1363dfb522a46881125e6764873b86167a65d191
   DIR parent 96544b8b580149d808fd46bb574d7497f8ae70c6
  HTML Author: Janus <ysangkok@gmail.com>
       Date:   Wed,  2 May 2018 12:32:31 +0200
       
       lnbase: avoid copying variables, insert newlines
       
       Diffstat:
         M lib/lnbase.py                       |     151 +++++++++++++++----------------
       
       1 file changed, 72 insertions(+), 79 deletions(-)
       ---
   DIR diff --git a/lib/lnbase.py b/lib/lnbase.py
       t@@ -438,9 +438,9 @@ def make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, p
                + bitcoin.add_number_to_script(cltv_expiry) \
                + bytes([opcodes.OP_CLTV, opcodes.OP_DROP, opcodes.OP_CHECKSIG, opcodes.OP_ENDIF, opcodes.OP_ENDIF])
        
       -def make_commitment_using_open_channel(openchannel, ctn, for_us, pcp, local_sat, remote_sat, htlcs=[]):
       -    conf = openchannel.local_config if for_us else openchannel.remote_config
       -    other_conf = openchannel.local_config if not for_us else openchannel.remote_config
       +def make_commitment_using_open_channel(chan, ctn, for_us, pcp, local_sat, remote_sat, htlcs=[]):
       +    conf = chan.local_config if for_us else chan.remote_config
       +    other_conf = chan.local_config if not for_us else chan.remote_config
            payment_pubkey = derive_pubkey(other_conf.payment_basepoint.pubkey, pcp)
            remote_revocation_pubkey = derive_blinded_pubkey(other_conf.revocation_basepoint.pubkey, pcp)
            return make_commitment(
       t@@ -448,17 +448,17 @@ def make_commitment_using_open_channel(openchannel, ctn, for_us, pcp, local_sat,
                conf.multisig_key.pubkey,
                other_conf.multisig_key.pubkey,
                payment_pubkey,
       -        openchannel.local_config.payment_basepoint.pubkey,
       -        openchannel.remote_config.payment_basepoint.pubkey,
       +        chan.local_config.payment_basepoint.pubkey,
       +        chan.remote_config.payment_basepoint.pubkey,
                remote_revocation_pubkey,
                derive_pubkey(conf.delayed_basepoint.pubkey, pcp),
                other_conf.to_self_delay,
       -        *openchannel.funding_outpoint,
       -        openchannel.constraints.capacity,
       +        *chan.funding_outpoint,
       +        chan.constraints.capacity,
                local_sat,
                remote_sat,
       -        openchannel.local_config.dust_limit_sat,
       -        openchannel.constraints.feerate,
       +        chan.local_config.dust_limit_sat,
       +        chan.constraints.feerate,
                for_us, htlcs=htlcs)
        
        def make_commitment(ctn, local_funding_pubkey, remote_funding_pubkey, remote_payment_pubkey,
       t@@ -733,7 +733,6 @@ class Peer(PrintError):
                self.print_error('closing lnbase')
                self.writer.close()
        
       -    @aiosafe
            async def channel_establishment_flow(self, wallet, config, password, funding_sat, push_msat, temp_channel_id):
                await self.initialized
                # see lnd/keychain/derivation.go
       t@@ -746,10 +745,6 @@ class Peer(PrintError):
                keyfamilynodekey = 6 # TODO currently unused
                # amounts
                local_feerate = 20000
       -        to_self_delay = 144
       -        dust_limit_sat = 10
       -        local_max_htlc_value_in_flight_msat = 500000 * 1000
       -        local_max_accepted_htlcs = 5
                # key derivation
                keypair_generator = lambda family, i: Keypair(*wallet.keystore.get_keypair([family, i], password))
                local_config=ChannelConfig(
       t@@ -758,10 +753,10 @@ class Peer(PrintError):
                    htlc_basepoint=keypair_generator(keyfamilyhtlcbase, 0),
                    delayed_basepoint=keypair_generator(keyfamilydelaybase, 0),
                    revocation_basepoint=keypair_generator(keyfamilyrevocationbase, 0),
       -            to_self_delay=to_self_delay,
       -            dust_limit_sat=dust_limit_sat,
       -            max_htlc_value_in_flight_msat=local_max_htlc_value_in_flight_msat,
       -            max_accepted_htlcs=local_max_accepted_htlcs
       +            to_self_delay=144,
       +            dust_limit_sat=10,
       +            max_htlc_value_in_flight_msat=500000 * 1000,
       +            max_accepted_htlcs=5
                )
                # TODO derive this?
                per_commitment_secret_seed = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100.to_bytes(32, "big")
       t@@ -777,19 +772,18 @@ class Peer(PrintError):
                    chain_hash=bytes.fromhex(rev_hex(constants.net.GENESIS)),
                    funding_satoshis=funding_sat,
                    push_msat=push_msat,
       -            dust_limit_satoshis=dust_limit_sat,
       +            dust_limit_satoshis=local_config.dust_limit_sat,
                    feerate_per_kw=local_feerate,
       -            max_accepted_htlcs=local_max_accepted_htlcs,
       +            max_accepted_htlcs=local_config.max_accepted_htlcs,
                    funding_pubkey=local_config.multisig_key.pubkey,
                    revocation_basepoint=local_config.revocation_basepoint.pubkey,
                    htlc_basepoint=local_config.htlc_basepoint.pubkey,
                    payment_basepoint=local_config.payment_basepoint.pubkey,
                    delayed_payment_basepoint=local_config.delayed_basepoint.pubkey,
                    first_per_commitment_point=per_commitment_point_first,
       -            to_self_delay=to_self_delay,
       -            max_htlc_value_in_flight_msat=local_max_htlc_value_in_flight_msat
       +            to_self_delay=local_config.to_self_delay,
       +            max_htlc_value_in_flight_msat=local_config.max_htlc_value_in_flight_msat
                )
       -        #self.channel_accepted[temp_channel_id] = asyncio.Future()
                self.send_message(msg)
                try:
                    payload = await self.channel_accepted[temp_channel_id]
       t@@ -841,7 +835,7 @@ class Peer(PrintError):
                    0,
                    remote_config.multisig_key.pubkey, local_config.multisig_key.pubkey, local_payment_pubkey,
                    local_config.payment_basepoint.pubkey, remote_config.payment_basepoint.pubkey,
       -            revocation_pubkey, remote_delayedpubkey, to_self_delay,
       +            revocation_pubkey, remote_delayedpubkey, local_config.to_self_delay,
                    funding_txid, funding_index, funding_sat,
                    remote_amount, local_amount, remote_config.dust_limit_sat, local_feerate, False, htlcs=[])
                remote_ctx.sign({bh2u(local_config.multisig_key.pubkey): (local_config.multisig_key.privkey, True)})
       t@@ -851,7 +845,11 @@ class Peer(PrintError):
                sig_64 = sigencode_string_canonize(r, s, SECP256k1.generator.order())
                funding_txid_bytes = bytes.fromhex(funding_txid)[::-1]
                channel_id = int.from_bytes(funding_txid_bytes, byteorder="big") ^ funding_index
       -        self.send_message(gen_msg("funding_created", temporary_channel_id=temp_channel_id, funding_txid=funding_txid_bytes, funding_output_index=funding_index, signature=sig_64))
       +        self.send_message(gen_msg("funding_created",
       +            temporary_channel_id=temp_channel_id,
       +            funding_txid=funding_txid_bytes,
       +            funding_output_index=funding_index,
       +            signature=sig_64))
                try:
                    payload = await self.funding_signed[channel_id]
                finally:
       t@@ -865,7 +863,7 @@ class Peer(PrintError):
                    local_config.payment_basepoint.pubkey, remote_config.payment_basepoint.pubkey,
                    remote_revocation_pubkey, local_delayedpubkey, remote_config.to_self_delay,
                    funding_txid, funding_index, funding_sat,
       -            local_amount, remote_amount, dust_limit_sat, local_feerate, True, htlcs=[])
       +            local_amount, remote_amount, local_config.dust_limit_sat, local_feerate, True, htlcs=[])
                pre_hash = bitcoin.Hash(bfh(local_ctx.serialize_preimage(0)))
                if not bitcoin.verify_signature(remote_config.multisig_key.pubkey, remote_sig, pre_hash):
                    raise Exception('verifying remote signature failed.')
       t@@ -921,23 +919,11 @@ class Peer(PrintError):
                        constraints=ChannelConstraints(capacity=funding_sat, feerate=local_feerate, is_initiator=True)
                )
        
       -    async def receive_commitment_revoke_ack(self, openchannel, expected_received_sat, payment_preimage):
       -        channel_id = openchannel.channel_id
       -        local_per_commitment_secret_seed = openchannel.local_state.per_commitment_secret_seed
       -        assert openchannel.local_state.ctn == 0
       +    async def receive_commitment_revoke_ack(self, chan, expected_received_sat, payment_preimage):
       +        channel_id = chan.channel_id
       +        local_per_commitment_secret_seed = chan.local_state.per_commitment_secret_seed
       +        assert chan.local_state.ctn == 0
                local_next_pcs_index = 2**48 - 2
       -        remote_funding_pubkey = openchannel.remote_config.multisig_key.pubkey
       -        remote_next_commitment_point = openchannel.remote_state.next_per_commitment_point
       -        remote_revocation_basepoint = openchannel.remote_config.revocation_basepoint.pubkey
       -        remote_htlc_basepoint = openchannel.remote_config.htlc_basepoint.pubkey
       -        local_htlc_basepoint = openchannel.local_config.htlc_basepoint.pubkey
       -        delayed_payment_basepoint = openchannel.local_config.delayed_basepoint.pubkey
       -        revocation_basepoint = openchannel.local_config.revocation_basepoint.pubkey
       -        remote_delayed_payment_basepoint = openchannel.remote_config.delayed_basepoint.pubkey
       -        remote_delay = openchannel.remote_config.to_self_delay
       -        remote_dust_limit_sat = openchannel.remote_config.dust_limit_sat
       -        funding_privkey = openchannel.local_config.multisig_key.privkey
       -        htlc_privkey = openchannel.local_config.htlc_basepoint.privkey
                try:
                    commitment_signed_msg = await self.commitment_signed[channel_id]
                finally:
       t@@ -948,8 +934,8 @@ class Peer(PrintError):
                    local_next_per_commitment_secret,
                    byteorder="big"))
        
       -        remote_htlc_pubkey = derive_pubkey(remote_htlc_basepoint, local_next_per_commitment_point)
       -        local_htlc_pubkey = derive_pubkey(local_htlc_basepoint, local_next_per_commitment_point)
       +        remote_htlc_pubkey = derive_pubkey(chan.remote_config.htlc_basepoint.pubkey, local_next_per_commitment_point)
       +        local_htlc_pubkey = derive_pubkey(chan.local_config.htlc_basepoint.pubkey, local_next_per_commitment_point)
                htlc_id = int.from_bytes(self.unfulfilled_htlcs[0]["id"], "big")
                assert htlc_id == 0, htlc_id
                payment_hash = self.unfulfilled_htlcs[0]["payment_hash"]
       t@@ -957,7 +943,7 @@ class Peer(PrintError):
                # TODO verify sanity of their cltv expiry
                amount_msat = int.from_bytes(self.unfulfilled_htlcs[0]["amount_msat"], "big")
        
       -        remote_revocation_pubkey = derive_blinded_pubkey(remote_revocation_basepoint, local_next_per_commitment_point)
       +        remote_revocation_pubkey = derive_blinded_pubkey(chan.remote_config.revocation_basepoint.pubkey, local_next_per_commitment_point)
        
                htlcs_in_local = [
                    (
       t@@ -966,14 +952,14 @@ class Peer(PrintError):
                    )
                ]
        
       -        new_commitment = make_commitment_using_open_channel(openchannel, 1, True, local_next_per_commitment_point,
       -                openchannel.local_state.amount_sat,
       -                openchannel.remote_state.amount_sat - expected_received_sat,
       -                htlcs_in_local)
       +        new_commitment = make_commitment_using_open_channel(chan, 1, True, local_next_per_commitment_point,
       +            chan.local_state.amount_sat,
       +            chan.remote_state.amount_sat - expected_received_sat,
       +            htlcs_in_local)
        
                preimage_hex = new_commitment.serialize_preimage(0)
                pre_hash = bitcoin.Hash(bfh(preimage_hex))
       -        if not bitcoin.verify_signature(remote_funding_pubkey, commitment_signed_msg["signature"], pre_hash):
       +        if not bitcoin.verify_signature(chan.remote_config.multisig_key.pubkey, commitment_signed_msg["signature"], pre_hash):
                    raise Exception('failed verifying signature of our updated commitment transaction')
        
                htlc_sigs_len = len(commitment_signed_msg["htlc_signature"])
       t@@ -982,43 +968,47 @@ class Peer(PrintError):
        
                # TODO verify htlc_signature
        
       -        local_last_pcs_index = 2**48 - openchannel.local_state.ctn - 1
       +        local_last_pcs_index = 2**48 - chan.local_state.ctn - 1
                local_last_per_commitment_secret = get_per_commitment_secret_from_seed(local_per_commitment_secret_seed, local_last_pcs_index)
        
       -        self.send_message(gen_msg("revoke_and_ack", channel_id=channel_id, per_commitment_secret=local_last_per_commitment_secret, next_per_commitment_point=local_next_per_commitment_point))
       -
       -        funding_pubkey = openchannel.local_config.multisig_key.pubkey
       -        pubkeys = sorted([bh2u(funding_pubkey), bh2u(remote_funding_pubkey)])
       -        their_local_htlc_pubkey = derive_pubkey(remote_htlc_basepoint, remote_next_commitment_point)
       -        their_remote_htlc_pubkey = derive_pubkey(local_htlc_basepoint, remote_next_commitment_point)
       -        their_remote_htlc_privkey_number = derive_privkey(int.from_bytes(htlc_privkey, "big"), remote_next_commitment_point)
       +        self.send_message(gen_msg("revoke_and_ack",
       +            channel_id=channel_id,
       +            per_commitment_secret=local_last_per_commitment_secret,
       +            next_per_commitment_point=local_next_per_commitment_point))
       +
       +        pubkeys = sorted([bh2u(chan.local_config.multisig_key.pubkey), bh2u(chan.remote_config.multisig_key.pubkey)])
       +        their_local_htlc_pubkey = derive_pubkey(chan.remote_config.htlc_basepoint.pubkey, chan.remote_state.next_per_commitment_point)
       +        their_remote_htlc_pubkey = derive_pubkey(chan.local_config.htlc_basepoint.pubkey, chan.remote_state.next_per_commitment_point)
       +        their_remote_htlc_privkey_number = derive_privkey(
       +            int.from_bytes(chan.local_config.htlc_basepoint.privkey, "big"),
       +            chan.remote_state.next_per_commitment_point)
                their_remote_htlc_privkey = their_remote_htlc_privkey_number.to_bytes(32, "big")
                # TODO check payment_hash
       -        revocation_pubkey = derive_blinded_pubkey(revocation_basepoint, remote_next_commitment_point)
       +        revocation_pubkey = derive_blinded_pubkey(chan.local_config.revocation_basepoint.pubkey, chan.remote_state.next_per_commitment_point)
                htlcs_in_remote = [(make_offered_htlc(revocation_pubkey, their_remote_htlc_pubkey, their_local_htlc_pubkey, payment_hash), amount_msat)]
       -        remote_ctx = make_commitment_using_open_channel(openchannel, 1, False, remote_next_commitment_point,
       -            openchannel.remote_state.amount_sat - expected_received_sat, openchannel.local_state.amount_sat, htlcs_in_remote)
       -        remote_ctx.sign({bh2u(funding_pubkey): (funding_privkey, True)})
       -        sig_index = pubkeys.index(bh2u(funding_pubkey))
       +        remote_ctx = make_commitment_using_open_channel(chan, 1, False, chan.remote_state.next_per_commitment_point,
       +            chan.remote_state.amount_sat - expected_received_sat, chan.local_state.amount_sat, htlcs_in_remote)
       +        remote_ctx.sign({bh2u(chan.local_config.multisig_key.pubkey): (chan.local_config.multisig_key.privkey, True)})
       +        sig_index = pubkeys.index(bh2u(chan.local_config.multisig_key.pubkey))
                sig = bytes.fromhex(remote_ctx.inputs()[0]["signatures"][sig_index])
                r, s = sigdecode_der(sig[:-1], SECP256k1.generator.order())
                sig_64 = sigencode_string_canonize(r, s, SECP256k1.generator.order())
        
       -        remote_delayedpubkey = derive_pubkey(remote_delayed_payment_basepoint, remote_next_commitment_point)
       +        remote_delayedpubkey = derive_pubkey(chan.remote_config.delayed_basepoint.pubkey, chan.remote_state.next_per_commitment_point)
                htlc_tx_output = make_htlc_tx_output(
       -                amount_msat = amount_msat,
       -                local_feerate = openchannel.constraints.feerate,
       -                revocationpubkey=revocation_pubkey,
       -                local_delayedpubkey=remote_delayedpubkey,
       -                success = False) # timeout for the one offering an HTLC
       +            amount_msat = amount_msat,
       +            local_feerate = chan.constraints.feerate,
       +            revocationpubkey=revocation_pubkey,
       +            local_delayedpubkey=remote_delayedpubkey,
       +            success = False) # timeout for the one offering an HTLC
                preimage_script = htlcs_in_remote[0][0]
                htlc_output_txid = remote_ctx.txid()
                htlc_tx_inputs = make_htlc_tx_inputs(
       -                remote_ctx.txid(), remote_ctx.htlc_output_indices[0],
       -                revocationpubkey=revocation_pubkey,
       -                local_delayedpubkey=remote_delayedpubkey,
       -                amount_msat=amount_msat,
       -                witness_script=bh2u(preimage_script))
       +            remote_ctx.txid(), remote_ctx.htlc_output_indices[0],
       +            revocationpubkey=revocation_pubkey,
       +            local_delayedpubkey=remote_delayedpubkey,
       +            amount_msat=amount_msat,
       +            witness_script=bh2u(preimage_script))
                htlc_tx = make_htlc_tx(cltv_expiry, inputs=htlc_tx_inputs, output=htlc_tx_output)
        
                # htlc_sig signs the HTLC transaction that spends from THEIR commitment transaction's offered_htlc output
       t@@ -1040,11 +1030,11 @@ class Peer(PrintError):
                remote_next_commitment_point = revoke_and_ack_msg["next_per_commitment_point"]
        
                # remote commitment transaction without htlcs
       -        bare_ctx = make_commitment_using_open_channel(openchannel, 2, False, remote_next_commitment_point,
       -            openchannel.remote_state.amount_sat - expected_received_sat, openchannel.local_state.amount_sat + expected_received_sat)
       +        bare_ctx = make_commitment_using_open_channel(chan, 2, False, remote_next_commitment_point,
       +            chan.remote_state.amount_sat - expected_received_sat, chan.local_state.amount_sat + expected_received_sat)
        
       -        bare_ctx.sign({bh2u(funding_pubkey): (funding_privkey, True)})
       -        sig_index = pubkeys.index(bh2u(funding_pubkey))
       +        bare_ctx.sign({bh2u(chan.local_config.multisig_key.pubkey): (chan.local_config.multisig_key.privkey, True)})
       +        sig_index = pubkeys.index(bh2u(chan.local_config.multisig_key.pubkey))
                sig = bytes.fromhex(bare_ctx.inputs()[0]["signatures"][sig_index])
                r, s = sigdecode_der(sig[:-1], SECP256k1.generator.order())
                sig_64 = sigencode_string_canonize(r, s, SECP256k1.generator.order())
       t@@ -1071,7 +1061,10 @@ class Peer(PrintError):
                    local_next_per_commitment_secret,
                    byteorder="big"))
        
       -        self.send_message(gen_msg("revoke_and_ack", channel_id=channel_id, per_commitment_secret=local_last_per_commitment_secret, next_per_commitment_point=local_next_per_commitment_point))
       +        self.send_message(gen_msg("revoke_and_ack",
       +            channel_id=channel_id,
       +            per_commitment_secret=local_last_per_commitment_secret,
       +            next_per_commitment_point=local_next_per_commitment_point))
        
        
            def on_commitment_signed(self, payload):