lnpeer: warnings for shutdown and open_channel
This commit is contained in:
@@ -42,7 +42,7 @@ from .lnutil import (Outpoint, LocalConfig, RECEIVED, UpdateAddHtlc, ChannelConf
|
||||
LightningPeerConnectionClosed, HandshakeFailed,
|
||||
RemoteMisbehaving, ShortChannelID,
|
||||
IncompatibleLightningFeatures, derive_payment_secret_from_payment_preimage,
|
||||
UpfrontShutdownScriptViolation, ChannelType)
|
||||
ChannelType, LNProtocolWarning)
|
||||
from .lnutil import FeeUpdate, channel_id_from_funding_tx
|
||||
from .lntransport import LNTransport, LNTransportBase
|
||||
from .lnmsg import encode_msg, decode_msg, UnknownOptionalMsgType
|
||||
@@ -861,7 +861,10 @@ class Peer(Logger):
|
||||
payload = await self.wait_for_message('funding_signed', channel_id)
|
||||
self.logger.info('received funding_signed')
|
||||
remote_sig = payload['signature']
|
||||
chan.receive_new_commitment(remote_sig, [])
|
||||
try:
|
||||
chan.receive_new_commitment(remote_sig, [])
|
||||
except LNProtocolWarning as e:
|
||||
await self.send_warning(channel_id, message=str(e), close_connection=True)
|
||||
chan.open_with_first_pcp(remote_per_commitment_point, remote_sig)
|
||||
chan.set_state(ChannelState.OPENING)
|
||||
self.lnworker.add_new_channel(chan)
|
||||
@@ -1020,7 +1023,10 @@ class Peer(Logger):
|
||||
if isinstance(self.transport, LNTransport):
|
||||
chan.add_or_update_peer_addr(self.transport.peer_addr)
|
||||
remote_sig = funding_created['signature']
|
||||
chan.receive_new_commitment(remote_sig, [])
|
||||
try:
|
||||
chan.receive_new_commitment(remote_sig, [])
|
||||
except LNProtocolWarning as e:
|
||||
await self.send_warning(channel_id, message=str(e), close_connection=True)
|
||||
sig_64, _ = chan.sign_next_commitment()
|
||||
self.send_message('funding_signed',
|
||||
channel_id=channel_id,
|
||||
@@ -1868,12 +1874,18 @@ class Peer(Logger):
|
||||
return txid
|
||||
|
||||
async def on_shutdown(self, chan: Channel, payload):
|
||||
# TODO: A receiving node: if it hasn't received a funding_signed (if it is a
|
||||
# funder) or a funding_created (if it is a fundee):
|
||||
# SHOULD send an error and fail the channel.
|
||||
their_scriptpubkey = payload['scriptpubkey']
|
||||
their_upfront_scriptpubkey = chan.config[REMOTE].upfront_shutdown_script
|
||||
# BOLT-02 check if they use the upfront shutdown script they advertized
|
||||
if their_upfront_scriptpubkey:
|
||||
if self.is_upfront_shutdown_script() and their_upfront_scriptpubkey:
|
||||
if not (their_scriptpubkey == their_upfront_scriptpubkey):
|
||||
raise UpfrontShutdownScriptViolation("remote didn't use upfront shutdown script it commited to in channel opening")
|
||||
await self.send_warning(
|
||||
chan.channel_id,
|
||||
"remote didn't use upfront shutdown script it commited to in channel opening",
|
||||
close_connection=True)
|
||||
else:
|
||||
# BOLT-02 restrict the scriptpubkey to some templates:
|
||||
if self.is_shutdown_anysegwit() and match_script_against_template(their_scriptpubkey, transaction.SCRIPTPUBKEY_TEMPLATE_ANYSEGWIT):
|
||||
@@ -1881,7 +1893,10 @@ class Peer(Logger):
|
||||
elif match_script_against_template(their_scriptpubkey, transaction.SCRIPTPUBKEY_TEMPLATE_WITNESS_V0):
|
||||
pass
|
||||
else:
|
||||
raise Exception(f'scriptpubkey in received shutdown message does not conform to any template: {their_scriptpubkey.hex()}')
|
||||
await self.send_warning(
|
||||
chan.channel_id,
|
||||
f'scriptpubkey in received shutdown message does not conform to any template: {their_scriptpubkey.hex()}',
|
||||
close_connection=True)
|
||||
|
||||
chan_id = chan.channel_id
|
||||
if chan_id in self.shutdown_received:
|
||||
|
||||
Reference in New Issue
Block a user