electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 20f0464009c3a9c085cbef397b195d085a4f29d3
parent 5f380194204fbff4bdeeffe80aa972c292f4f69d
Author: Janus <ysangkok@gmail.com>
Date:   Tue,  1 May 2018 13:58:55 +0200

lnbase: avoid code duplication, return htlc outpoint dict in make_commitment

Diffstat:
Mlib/lnbase.py | 42+++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/lib/lnbase.py b/lib/lnbase.py @@ -507,14 +507,22 @@ def make_commitment(ctn, local_funding_pubkey, remote_funding_pubkey, remote_pay c_outputs = [to_local, to_remote] for script, msat_amount in htlcs: c_outputs += [(bitcoin.TYPE_ADDRESS, bitcoin.redeem_script_to_address('p2wsh', bh2u(script)), msat_amount // 1000)] + # trim outputs - c_outputs = list(filter(lambda x:x[2]>= dust_limit_sat, c_outputs)) + c_outputs_filtered = list(filter(lambda x:x[2]>= dust_limit_sat, c_outputs)) assert sum(x[2] for x in c_outputs) <= funding_sat # create commitment tx - tx = Transaction.from_io(c_inputs, c_outputs, locktime=locktime, version=2) + tx = Transaction.from_io(c_inputs, c_outputs_filtered, locktime=locktime, version=2) tx.BIP_LI01_sort() - return tx + + htlc_output_indices = {} + for idx, output in enumerate(c_outputs): + if output in tx.outputs(): + # minus the first two outputs (to_local, to_remote) + htlc_output_indices[idx - 2] = tx.outputs().index(output) + + return tx, {i: Outpoint(tx.txid(), j) for i, j in htlc_output_indices.items()} class Peer(PrintError): @@ -834,7 +842,7 @@ class Peer(PrintError): local_amount = to_local_msat // 1000 remote_amount = to_remote_msat // 1000 # remote commitment transaction - remote_ctx = make_commitment( + remote_ctx, _ = make_commitment( 0, remote_funding_pubkey, funding_key.pubkey, local_payment_pubkey, base_point.pubkey, remote_payment_basepoint, @@ -857,7 +865,7 @@ class Peer(PrintError): self.print_error('received funding_signed') remote_sig = payload['signature'] # verify remote signature - local_ctx = make_commitment( + local_ctx, _ = make_commitment( 0, funding_key.pubkey, remote_funding_pubkey, remote_payment_pubkey, base_point.pubkey, remote_payment_basepoint, @@ -987,7 +995,7 @@ class Peer(PrintError): ) ] - new_commitment = make_commitment_using_open_channel(openchannel, 1, True, local_next_per_commitment_point, + 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) @@ -1010,29 +1018,22 @@ class Peer(PrintError): funding_pubkey = openchannel.local_config.multisig_key.pubkey pubkeys = sorted([bh2u(funding_pubkey), bh2u(remote_funding_pubkey)]) - revocation_pubkey = derive_blinded_pubkey(revocation_basepoint, remote_next_commitment_point) - remote_delayedpubkey = derive_pubkey(remote_delayed_payment_basepoint, remote_next_commitment_point) 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) 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) htlcs_in_remote = [(make_offered_htlc(revocation_pubkey, their_remote_htlc_pubkey, their_local_htlc_pubkey, payment_hash), amount_msat)] - local_payment_pubkey = derive_pubkey(openchannel.local_config.payment_key.pubkey, remote_next_commitment_point) - remote_ctx = make_commitment( - 1, - remote_funding_pubkey, funding_pubkey, local_payment_pubkey, - openchannel.local_config.payment_key.pubkey, openchannel.remote_config.payment_key.pubkey, - revocation_pubkey, remote_delayedpubkey, remote_delay, - *openchannel.funding_outpoint, openchannel.constraints.capacity, - openchannel.remote_state.amount_sat - expected_received_sat, openchannel.local_state.amount_sat, remote_dust_limit_sat, - openchannel.constraints.feerate, False, htlcs=htlcs_in_remote) + remote_ctx, htlc_outpoints = 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)) 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) htlc_tx_output = make_htlc_tx_output( amount_msat = amount_msat, local_feerate = openchannel.constraints.feerate, @@ -1042,15 +1043,14 @@ class Peer(PrintError): preimage_script = htlcs_in_remote[0][0] htlc_output_txid = remote_ctx.txid() htlc_tx_inputs = make_htlc_tx_inputs( - htlc_output_txid=htlc_output_txid, - htlc_output_index=1, # TODO find index of htlc output in remote_ctx + *htlc_outpoints[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 received_htlc output + # htlc_sig signs the HTLC transaction that spends from THEIR commitment transaction's offered_htlc output sig = bfh(htlc_tx.sign_txin(0, their_remote_htlc_privkey)) r, s = sigdecode_der(sig[:-1], SECP256k1.generator.order()) htlc_sig = sigencode_string_canonize(r, s, SECP256k1.generator.order()) @@ -1070,7 +1070,7 @@ 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, + 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.sign({bh2u(funding_pubkey): (funding_privkey, True)})