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]