URI: 
       tlnbase: avoid local variables, remote useless comments, name basepoints as such - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit bdec72dd4b7afb133c259de65070eafa09dbb02b
   DIR parent e1f7eb6cb3f066cb839833ffde9bceefb1b29b5d
  HTML Author: Janus <ysangkok@gmail.com>
       Date:   Wed,  2 May 2018 12:11:28 +0200
       
       lnbase: avoid local variables, remote useless comments, name basepoints as such
       
       Diffstat:
         M lib/lnbase.py                       |     161 ++++++++++++++-----------------
       
       1 file changed, 70 insertions(+), 91 deletions(-)
       ---
   DIR diff --git a/lib/lnbase.py b/lib/lnbase.py
       t@@ -284,7 +284,7 @@ def create_ephemeral_key(privkey):
        Keypair = namedtuple("Keypair", ["pubkey", "privkey"])
        Outpoint = namedtuple("Outpoint", ["txid", "output_index"])
        ChannelConfig = namedtuple("ChannelConfig", [
       -    "payment_key", "multisig_key", "htlc_key", "delayed_key", "revocation_key",
       +    "payment_basepoint", "multisig_key", "htlc_basepoint", "delayed_basepoint", "revocation_basepoint",
            "to_self_delay", "dust_limit_sat", "max_htlc_value_in_flight_msat", "max_accepted_htlcs"])
        OnlyPubkeyKeypair = namedtuple("OnlyPubkeyKeypair", ["pubkey"])
        RemoteState = namedtuple("RemoteState", ["ctn", "next_per_commitment_point", "amount_sat"])
       t@@ -451,17 +451,17 @@ def make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, p
        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
       -    payment_pubkey = derive_pubkey(other_conf.payment_key.pubkey, pcp)
       -    remote_revocation_pubkey = derive_blinded_pubkey(other_conf.revocation_key.pubkey, pcp)
       +    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(
                ctn,
                conf.multisig_key.pubkey,
                other_conf.multisig_key.pubkey,
                payment_pubkey,
       -        openchannel.local_config.payment_key.pubkey,
       -        openchannel.remote_config.payment_key.pubkey,
       +        openchannel.local_config.payment_basepoint.pubkey,
       +        openchannel.remote_config.payment_basepoint.pubkey,
                remote_revocation_pubkey,
       -        derive_pubkey(conf.delayed_key.pubkey, pcp),
       +        derive_pubkey(conf.delayed_basepoint.pubkey, pcp),
                other_conf.to_self_delay,
                *openchannel.funding_outpoint,
                openchannel.constraints.capacity,
       t@@ -746,10 +746,8 @@ class Peer(PrintError):
            @aiosafe
            async def channel_establishment_flow(self, wallet, config, funding_sat, push_msat, temp_channel_id, keypair_generator=None):
                await self.initialized
       -
                if keypair_generator is None:
                    keypair_generator = KeypairGenerator(b"testseed")
       -
                # see lnd/keychain/derivation.go
                keyfamilymultisig = 0
                keyfamilyrevocationbase = 1
       t@@ -758,25 +756,32 @@ class Peer(PrintError):
                keyfamilydelaybase = 4
                keyfamilyrevocationroot = 5
                keyfamilynodekey = 6 # TODO currently unused
       -
       -        funding_key = keypair_generator.get(keyfamilymultisig, 0)
       -        revocation_key = keypair_generator.get(keyfamilyrevocationbase, 0)
       -        htlc_key = keypair_generator.get(keyfamilyhtlcbase, 0)
       -        delayed_key = keypair_generator.get(keyfamilydelaybase, 0)
       -        base_point = keypair_generator.get(keyfamilypaymentbase, 0)
       -        per_commitment_secret_seed = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100.to_bytes(32, "big")
       -        per_commitment_secret_index = 2**48 - 1
                # 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
       +        local_config=ChannelConfig(
       +            payment_basepoint=keypair_generator.get(keyfamilypaymentbase, 0),
       +            multisig_key=keypair_generator.get(keyfamilymultisig, 0),
       +            htlc_basepoint=keypair_generator.get(keyfamilyhtlcbase, 0),
       +            delayed_basepoint=keypair_generator.get(keyfamilydelaybase, 0),
       +            revocation_basepoint=keypair_generator.get(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
       +        )
       +        # TODO derive this?
       +        per_commitment_secret_seed = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100.to_bytes(32, "big")
       +        per_commitment_secret_index = 2**48 - 1
       +        # for the first commitment transaction
                per_commitment_secret_first = get_per_commitment_secret_from_seed(per_commitment_secret_seed, per_commitment_secret_index)
                per_commitment_point_first = secret_to_pubkey(int.from_bytes(
                    per_commitment_secret_first,
                    byteorder="big"))
       -        local_max_htlc_value_in_flight_msat = 500000 * 1000
       -        local_max_accepted_htlcs = 5
                msg = gen_msg(
                    "open_channel",
                    temporary_channel_id=temp_channel_id,
       t@@ -786,11 +791,11 @@ class Peer(PrintError):
                    dust_limit_satoshis=dust_limit_sat,
                    feerate_per_kw=local_feerate,
                    max_accepted_htlcs=local_max_accepted_htlcs,
       -            funding_pubkey=funding_key.pubkey,
       -            revocation_basepoint=revocation_key.pubkey,
       -            htlc_basepoint=htlc_key.pubkey,
       -            payment_basepoint=base_point.pubkey,
       -            delayed_payment_basepoint=delayed_key.pubkey,
       +            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
       t@@ -801,26 +806,27 @@ class Peer(PrintError):
                    payload = await self.channel_accepted[temp_channel_id]
                finally:
                    del self.channel_accepted[temp_channel_id]
       -        remote_max_accepted_htlcs = payload["max_accepted_htlcs"]
                remote_per_commitment_point = payload['first_per_commitment_point']
       -        remote_funding_pubkey = payload["funding_pubkey"]
       -        remote_delay = int.from_bytes(payload['to_self_delay'], byteorder="big")
       -        remote_dust_limit_sat = int.from_bytes(payload['dust_limit_satoshis'], byteorder="big")
       -        remote_revocation_basepoint = payload['revocation_basepoint']
       -        remote_payment_basepoint = payload['payment_basepoint']
       -        remote_delayed_payment_basepoint = payload['delayed_payment_basepoint']
       -        remote_htlc_basepoint = payload['htlc_basepoint']
       -        remote_htlc_minimum_msat = int.from_bytes(payload['htlc_minimum_msat'], "big")
       -        remote_max_htlc_value_in_flight_msat = int.from_bytes(payload['max_htlc_value_in_flight_msat'], "big")
       +        remote_config=ChannelConfig(
       +            payment_basepoint=OnlyPubkeyKeypair(payload['payment_basepoint']),
       +            multisig_key=OnlyPubkeyKeypair(payload["funding_pubkey"]),
       +            htlc_basepoint=OnlyPubkeyKeypair(payload['htlc_basepoint']),
       +            delayed_basepoint=OnlyPubkeyKeypair(payload['delayed_payment_basepoint']),
       +            revocation_basepoint=OnlyPubkeyKeypair(payload['revocation_basepoint']),
       +            to_self_delay=int.from_bytes(payload['to_self_delay'], byteorder="big"),
       +            dust_limit_sat=int.from_bytes(payload['dust_limit_satoshis'], byteorder="big"),
       +            max_htlc_value_in_flight_msat=int.from_bytes(payload['max_htlc_value_in_flight_msat'], "big"),
       +            max_accepted_htlcs=payload["max_accepted_htlcs"]
       +        )
                funding_txn_minimum_depth = int.from_bytes(payload['minimum_depth'], byteorder="big")
       -        print('remote dust limit', remote_dust_limit_sat)
       -        assert remote_dust_limit_sat < 600
       -        assert remote_htlc_minimum_msat < 600 * 1000
       -        assert remote_max_htlc_value_in_flight_msat >= 500 * 1000 * 1000, remote_max_htlc_value_in_flight_msat
       -        self.print_error('remote delay', remote_delay)
       +        print('remote dust limit', remote_config.dust_limit_sat)
       +        assert remote_config.dust_limit_sat < 600
       +        assert int.from_bytes(payload['htlc_minimum_msat'], "big") < 600 * 1000
       +        assert remote_config.max_htlc_value_in_flight_msat >= 500 * 1000 * 1000, remote_config.max_htlc_value_in_flight_msat
       +        self.print_error('remote delay', remote_config.to_self_delay)
                self.print_error('funding_txn_minimum_depth', funding_txn_minimum_depth)
                # create funding tx
       -        pubkeys = sorted([bh2u(funding_key.pubkey), bh2u(remote_funding_pubkey)])
       +        pubkeys = sorted([bh2u(local_config.multisig_key.pubkey), bh2u(remote_config.multisig_key.pubkey)])
                redeem_script = transaction.multisig_script(pubkeys, 2)
                funding_address = bitcoin.redeem_script_to_address('p2wsh', redeem_script)
                funding_output = (bitcoin.TYPE_ADDRESS, funding_address, funding_sat)
       t@@ -828,13 +834,13 @@ class Peer(PrintError):
                funding_txid = funding_tx.txid()
                funding_index = funding_tx.outputs().index(funding_output)
                # derive keys
       -        local_payment_pubkey = derive_pubkey(base_point.pubkey, remote_per_commitment_point)
       +        local_payment_pubkey = derive_pubkey(local_config.payment_basepoint.pubkey, remote_per_commitment_point)
                #local_payment_privkey = derive_privkey(base_secret, remote_per_commitment_point)
       -        remote_payment_pubkey = derive_pubkey(remote_payment_basepoint, per_commitment_point_first)
       -        revocation_pubkey = derive_blinded_pubkey(revocation_key.pubkey, remote_per_commitment_point)
       -        remote_revocation_pubkey = derive_blinded_pubkey(remote_revocation_basepoint, per_commitment_point_first)
       -        local_delayedpubkey = derive_pubkey(delayed_key.pubkey, per_commitment_point_first)
       -        remote_delayedpubkey = derive_pubkey(remote_delayed_payment_basepoint, remote_per_commitment_point)
       +        remote_payment_pubkey = derive_pubkey(remote_config.payment_basepoint.pubkey, per_commitment_point_first)
       +        revocation_pubkey = derive_blinded_pubkey(local_config.revocation_basepoint.pubkey, remote_per_commitment_point)
       +        remote_revocation_pubkey = derive_blinded_pubkey(remote_config.revocation_basepoint.pubkey, per_commitment_point_first)
       +        local_delayedpubkey = derive_pubkey(local_config.delayed_basepoint.pubkey, per_commitment_point_first)
       +        remote_delayedpubkey = derive_pubkey(remote_config.delayed_basepoint.pubkey, remote_per_commitment_point)
                # compute amounts
                htlcs = []
                to_local_msat = funding_sat*1000 - push_msat
       t@@ -844,20 +850,19 @@ class Peer(PrintError):
                # remote commitment transaction
                remote_ctx = make_commitment(
                    0,
       -            remote_funding_pubkey, funding_key.pubkey, local_payment_pubkey,
       -            base_point.pubkey, remote_payment_basepoint,
       +            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,
                    funding_txid, funding_index, funding_sat,
       -            remote_amount, local_amount, remote_dust_limit_sat, local_feerate, False, htlcs=[])
       -        remote_ctx.sign({bh2u(funding_key.pubkey): (funding_key.privkey, True)})
       -        sig_index = pubkeys.index(bh2u(funding_key.pubkey))
       +            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)})
       +        sig_index = pubkeys.index(bh2u(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())
                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.funding_signed[channel_id] = asyncio.Future()
                try:
                    payload = await self.funding_signed[channel_id]
                finally:
       t@@ -867,17 +872,15 @@ class Peer(PrintError):
                # verify remote signature
                local_ctx = make_commitment(
                    0,
       -            funding_key.pubkey, remote_funding_pubkey, remote_payment_pubkey,
       -            base_point.pubkey, remote_payment_basepoint,
       -            remote_revocation_pubkey, local_delayedpubkey, remote_delay,
       +            local_config.multisig_key.pubkey, remote_config.multisig_key.pubkey, remote_payment_pubkey,
       +            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=[])
                pre_hash = bitcoin.Hash(bfh(local_ctx.serialize_preimage(0)))
       -        if not bitcoin.verify_signature(remote_funding_pubkey, remote_sig, pre_hash):
       +        if not bitcoin.verify_signature(remote_config.multisig_key.pubkey, remote_sig, pre_hash):
                    raise Exception('verifying remote signature failed.')
                # broadcast funding tx
       -        #self.local_funding_locked[channel_id] = asyncio.Future()
       -        #self.remote_funding_locked[channel_id] = asyncio.Future()
                success, _txid = self.network.broadcast(funding_tx)
                assert success, success
                # wait until we see confirmations
       t@@ -910,33 +913,12 @@ class Peer(PrintError):
                finally:
                    del self.remote_funding_locked[channel_id]
                self.print_error('Done waiting for remote_funding_locked', remote_funding_locked_msg)
       -        #self.commitment_signed[channel_id] = asyncio.Future()
        
                return OpenChannel(
                        channel_id=channel_id,
                        funding_outpoint=Outpoint(funding_txid, funding_index),
       -                local_config=ChannelConfig(
       -                    payment_key=base_point,
       -                    multisig_key=funding_key,
       -                    htlc_key=htlc_key,
       -                    delayed_key=delayed_key,
       -                    revocation_key=revocation_key,
       -                    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
       -                ),
       -                remote_config=ChannelConfig(
       -                    payment_key=OnlyPubkeyKeypair(remote_payment_basepoint),
       -                    multisig_key=OnlyPubkeyKeypair(remote_funding_pubkey),
       -                    htlc_key=OnlyPubkeyKeypair(remote_htlc_basepoint),
       -                    delayed_key=OnlyPubkeyKeypair(remote_delayed_payment_basepoint),
       -                    revocation_key=OnlyPubkeyKeypair(remote_revocation_basepoint),
       -                    to_self_delay=remote_delay,
       -                    dust_limit_sat=remote_dust_limit_sat,
       -                    max_htlc_value_in_flight_msat=remote_max_htlc_value_in_flight_msat,
       -                    max_accepted_htlcs=remote_max_accepted_htlcs
       -                ),
       +                local_config=local_config,
       +                remote_config=remote_config,
                        remote_state=RemoteState(
                            ctn = 0,
                            next_per_commitment_point=remote_funding_locked_msg["next_per_commitment_point"],
       t@@ -957,16 +939,16 @@ class Peer(PrintError):
                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_key.pubkey
       -        remote_htlc_basepoint = openchannel.remote_config.htlc_key.pubkey
       -        local_htlc_basepoint = openchannel.local_config.htlc_key.pubkey
       -        delayed_payment_basepoint = openchannel.local_config.delayed_key.pubkey
       -        revocation_basepoint = openchannel.local_config.revocation_key.pubkey
       -        remote_delayed_payment_basepoint = openchannel.remote_config.delayed_key.pubkey
       +        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_key.privkey
       +        htlc_privkey = openchannel.local_config.htlc_basepoint.privkey
                try:
                    commitment_signed_msg = await self.commitment_signed[channel_id]
                finally:
       t@@ -1055,7 +1037,6 @@ class Peer(PrintError):
                r, s = sigdecode_der(sig[:-1], SECP256k1.generator.order())
                htlc_sig = sigencode_string_canonize(r, s, SECP256k1.generator.order())
        
       -        #self.revoke_and_ack[channel_id] = asyncio.Future()
                self.send_message(gen_msg("commitment_signed", channel_id=channel_id, signature=sig_64, num_htlcs=1, htlc_signature=htlc_sig))
        
                try:
       t@@ -1079,8 +1060,6 @@ class Peer(PrintError):
                r, s = sigdecode_der(sig[:-1], SECP256k1.generator.order())
                sig_64 = sigencode_string_canonize(r, s, SECP256k1.generator.order())
        
       -        #self.revoke_and_ack[channel_id] = asyncio.Future()
       -        #self.commitment_signed[channel_id] = asyncio.Future() # we will also receive a new commitment transaction shortly after sending ours
                self.send_message(gen_msg("commitment_signed", channel_id=channel_id, signature=sig_64, num_htlcs=0))
                try:
                    revoke_and_ack_msg = await self.revoke_and_ack[channel_id]