tlnbase: derive next keys when making updated local commitment transaction - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit e264a21c644c645c21456bee7dc3bf213e7fa8ae DIR parent 3c34628ffbf6af5bf40d8601d284d0fa5960d4d4 HTML Author: Janus <ysangkok@gmail.com> Date: Tue, 24 Apr 2018 18:19:39 +0200 lnbase: derive next keys when making updated local commitment transaction Diffstat: M lib/lnbase.py | 20 +++++++++++++++----- M lib/tests/test_lnbase_online.py | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) --- DIR diff --git a/lib/lnbase.py b/lib/lnbase.py t@@ -761,6 +761,11 @@ class Peer(PrintError): remote_revocation_basepoint = payload['revocation_basepoint'] remote_payment_basepoint = payload['payment_basepoint'] remote_delayed_payment_basepoint = payload['delayed_payment_basepoint'] + #basepoints = { + # "delayed_payment_basepoint": delayed_payment_basepoint, + # "remote_payment_basepoint": remote_payment_basepoint, + # "remote_revocation_basepoint": remote_revocation_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") t@@ -865,9 +870,9 @@ class Peer(PrintError): 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 channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, htlc_basepoint + return channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, htlc_basepoint, delayed_payment_basepoint - async def receive_commitment_revoke_ack(self, channel_id, local_per_commitment_secret_seed, local_last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number, remote_next_commitment_point, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint): + async def receive_commitment_revoke_ack(self, channel_id, local_per_commitment_secret_seed, local_last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number, remote_next_commitment_point, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint, delayed_payment_basepoint): try: commitment_signed_msg = await self.commitment_signed[channel_id] finally: t@@ -881,9 +886,6 @@ class Peer(PrintError): local_next_per_commitment_secret, byteorder="big")) - local_ctx_args = local_ctx_args._replace(remote_amount = local_ctx_args.remote_amount - expected_received_sat) - local_ctx_args = local_ctx_args._replace(ctn = local_next_commitment_number) - remote_revocation_pubkey = derive_blinded_pubkey(remote_revocation_basepoint, remote_next_commitment_point) remote_htlc_pubkey = derive_pubkey(remote_htlc_basepoint, remote_next_commitment_point) local_htlc_pubkey = derive_pubkey(local_htlc_basepoint, local_next_per_commitment_point) t@@ -891,6 +893,12 @@ class Peer(PrintError): cltv_expiry = int.from_bytes(self.unfulfilled_htlcs[0]["cltv_expiry"],"big") amount_msat = int.from_bytes(self.unfulfilled_htlcs[0]["amount_msat"], "big") + local_ctx_args = local_ctx_args._replace(remote_amount = local_ctx_args.remote_amount - expected_received_sat) + local_ctx_args = local_ctx_args._replace(ctn = local_next_commitment_number) + local_ctx_args = local_ctx_args._replace(remote_revocation_pubkey = remote_revocation_pubkey) + local_ctx_args = local_ctx_args._replace(remotepubkey = derive_pubkey(local_ctx_args.remote_payment_basepoint, remote_next_commitment_point)) + local_ctx_args = local_ctx_args._replace(local_delayedpubkey = derive_pubkey(delayed_payment_basepoint, local_next_per_commitment_point)) + # make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_hash, cltv_expiry) htlcs = [ ( t@@ -903,6 +911,8 @@ class Peer(PrintError): preimage_hex = new_commitment.serialize_preimage(0) print("new commitment tx", new_commitment) print("new commitment tx outputs", new_commitment.outputs()) + for idx, output in enumerate(new_commitment.outputs()): + print("output {}: ".format(idx), bitcoin.address_to_script(output[1] )) pre_hash = bitcoin.Hash(bfh(preimage_hex)) if not bitcoin.verify_signature(remote_funding_pubkey, commitment_signed_msg["signature"], pre_hash): raise Exception('failed verifying signature of updated commitment transaction') DIR diff --git a/lib/tests/test_lnbase_online.py b/lib/tests/test_lnbase_online.py t@@ -50,12 +50,12 @@ if __name__ == "__main__": async def async_test(): payment_preimage = bytes.fromhex("01"*32) RHASH = sha256(payment_preimage) - channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint = await peer.channel_establishment_flow(wallet, config, funding_satoshis, push_msat) + channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint, delayed_payment_basepoint = await peer.channel_establishment_flow(wallet, config, funding_satoshis, push_msat) expected_received_sat = 400000 pay_req = lnencode(LnAddr(RHASH, amount=Decimal("0.00000001")*expected_received_sat, tags=[('d', 'one cup of coffee')]), peer.privkey[:32]) print("payment request", pay_req) last_pcs_index = 2**48 - 1 - await peer.receive_commitment_revoke_ack(channel_id, per_commitment_secret_seed, last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number=1, remote_next_commitment_point=remote_funding_locked_msg["next_per_commitment_point"], remote_revocation_basepoint=remote_revocation_basepoint, remote_htlc_basepoint=remote_htlc_basepoint, local_htlc_basepoint=local_htlc_basepoint) + await peer.receive_commitment_revoke_ack(channel_id, per_commitment_secret_seed, last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number=1, remote_next_commitment_point=remote_funding_locked_msg["next_per_commitment_point"], remote_revocation_basepoint=remote_revocation_basepoint, remote_htlc_basepoint=remote_htlc_basepoint, local_htlc_basepoint=local_htlc_basepoint, delayed_payment_basepoint=delayed_payment_basepoint) htlc_id = 0 # TODO should correspond with received htlc (when handling more than just one update) await peer.fulfill_htlc(channel_id, htlc_id, payment_preimage) while True: