check channel funding_tx amount and script in save_short_channel_id
This commit is contained in:
@@ -680,21 +680,6 @@ class Peer(Logger):
|
||||
self.lnworker.save_channel(chan)
|
||||
self.lnworker.lnwatcher.add_channel(chan.funding_outpoint.to_str(), chan.get_funding_address())
|
||||
self.lnworker.on_channels_updated()
|
||||
# TODO make more robust
|
||||
while True:
|
||||
try:
|
||||
funding_tx = Transaction(await self.network.get_transaction(funding_txid))
|
||||
except NetworkException as e:
|
||||
print("sleeping", str(e))
|
||||
await asyncio.sleep(1)
|
||||
else:
|
||||
break
|
||||
outp = funding_tx.outputs()[funding_idx]
|
||||
redeem_script = funding_output_script(chan.config[REMOTE], chan.config[LOCAL])
|
||||
funding_address = bitcoin.redeem_script_to_address('p2wsh', redeem_script)
|
||||
if not (outp.address == funding_address and outp.value == funding_sat):
|
||||
chan.set_state('DISCONNECTED')
|
||||
raise Exception('funding outpoint mismatch')
|
||||
|
||||
def validate_remote_reserve(self, payload_field: bytes, dust_limit: int, funding_sat: int) -> int:
|
||||
remote_reserve_sat = int.from_bytes(payload_field, 'big')
|
||||
|
||||
@@ -41,6 +41,8 @@ from .ecc import der_sig_from_sig_string
|
||||
from .ecc_fast import is_using_fast_ecc
|
||||
from .lnchannel import Channel, ChannelJsonEncoder
|
||||
from . import lnutil
|
||||
from .lnutil import funding_output_script
|
||||
from .bitcoin import redeem_script_to_address
|
||||
from .lnutil import (Outpoint, LNPeerAddr,
|
||||
get_compressed_pubkey_from_bech32, extract_nodeid,
|
||||
PaymentFailure, split_host_port, ConnStringFormatError,
|
||||
@@ -604,19 +606,32 @@ class LNWallet(LNWorker):
|
||||
if it's also deep enough, also save to disk.
|
||||
Returns tuple (mined_deep_enough, num_confirmations).
|
||||
"""
|
||||
conf = self.lnwatcher.get_tx_height(chan.funding_outpoint.txid).conf
|
||||
if conf > 0:
|
||||
block_height, tx_pos = self.lnwatcher.get_txpos(chan.funding_outpoint.txid)
|
||||
assert tx_pos >= 0
|
||||
chan.short_channel_id_predicted = ShortChannelID.from_components(
|
||||
block_height, tx_pos, chan.funding_outpoint.output_index)
|
||||
if conf >= chan.constraints.funding_txn_minimum_depth > 0:
|
||||
chan.short_channel_id = chan.short_channel_id_predicted
|
||||
self.logger.info(f"save_short_channel_id: {chan.short_channel_id}")
|
||||
self.save_channel(chan)
|
||||
self.on_channels_updated()
|
||||
else:
|
||||
funding_txid = chan.funding_outpoint.txid
|
||||
funding_idx = chan.funding_outpoint.output_index
|
||||
conf = self.lnwatcher.get_tx_height(funding_txid).conf
|
||||
if conf < chan.constraints.funding_txn_minimum_depth:
|
||||
self.logger.info(f"funding tx is still not at sufficient depth. actual depth: {conf}")
|
||||
return
|
||||
assert conf > 0
|
||||
# check funding_tx amount and script
|
||||
funding_tx = self.lnwatcher.db.get_transaction(funding_txid)
|
||||
if not funding_tx:
|
||||
self.logger.info(f"no funding_tx {funding_txid}")
|
||||
return
|
||||
outp = funding_tx.outputs()[funding_idx]
|
||||
redeem_script = funding_output_script(chan.config[REMOTE], chan.config[LOCAL])
|
||||
funding_address = redeem_script_to_address('p2wsh', redeem_script)
|
||||
funding_sat = chan.constraints.capacity
|
||||
if not (outp.address == funding_address and outp.value == funding_sat):
|
||||
self.logger.info('funding outpoint mismatch')
|
||||
return
|
||||
block_height, tx_pos = self.lnwatcher.get_txpos(chan.funding_outpoint.txid)
|
||||
assert tx_pos >= 0
|
||||
chan.short_channel_id = ShortChannelID.from_components(
|
||||
block_height, tx_pos, chan.funding_outpoint.output_index)
|
||||
self.logger.info(f"save_short_channel_id: {chan.short_channel_id}")
|
||||
self.save_channel(chan)
|
||||
self.on_channels_updated()
|
||||
|
||||
def channel_by_txo(self, txo):
|
||||
with self.lock:
|
||||
|
||||
Reference in New Issue
Block a user