mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
opening: clearer messages for negotiation failures.
'negotiation_failed' is currently just a useless wrapper around peer_failed (a vestige from when peer_failed would close the connection). Change it to send different local and remote messages, and use it wherever we dislike their parameters: stick with peer_failed if we dislike our own parameters. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Christian Decker
parent
21fbae6df8
commit
429c853fac
@@ -10,6 +10,7 @@
|
|||||||
#include <common/crypto_sync.h>
|
#include <common/crypto_sync.h>
|
||||||
#include <common/derive_basepoints.h>
|
#include <common/derive_basepoints.h>
|
||||||
#include <common/funding_tx.h>
|
#include <common/funding_tx.h>
|
||||||
|
#include <common/gen_peer_status_wire.h>
|
||||||
#include <common/initial_channel.h>
|
#include <common/initial_channel.h>
|
||||||
#include <common/key_derive.h>
|
#include <common/key_derive.h>
|
||||||
#include <common/peer_billboard.h>
|
#include <common/peer_billboard.h>
|
||||||
@@ -67,18 +68,29 @@ struct state {
|
|||||||
const struct chainparams *chainparams;
|
const struct chainparams *chainparams;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* For negotiation failures: we can still gossip with client. */
|
/* For negotiation failures: we tell them it's their fault. Same
|
||||||
|
* as peer_failed, with slightly different local and remote wording. */
|
||||||
static void negotiation_failed(struct state *state, const char *fmt, ...)
|
static void negotiation_failed(struct state *state, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
const char *errmsg;
|
const char *errmsg;
|
||||||
|
u8 *msg;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
errmsg = tal_vfmt(state, fmt, ap);
|
errmsg = tal_vfmt(state, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
|
peer_billboard(true, errmsg);
|
||||||
|
msg = towire_status_peer_error(NULL, &state->channel_id,
|
||||||
|
errmsg, &state->cs, state->gossip_index,
|
||||||
|
towire_errorfmt(errmsg,
|
||||||
|
&state->channel_id,
|
||||||
|
"You gave bad parameters:%s",
|
||||||
|
errmsg));
|
||||||
|
tal_free(errmsg);
|
||||||
|
status_send_fatal(take(msg), PEER_FD, GOSSIP_FD);
|
||||||
peer_failed(&state->cs, state->gossip_index, &state->channel_id,
|
peer_failed(&state->cs, state->gossip_index, &state->channel_id,
|
||||||
"%s", errmsg);
|
"You gave bad parameters: %s", errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_config_bounds(struct state *state,
|
static void check_config_bounds(struct state *state,
|
||||||
@@ -112,8 +124,8 @@ static void check_config_bounds(struct state *state,
|
|||||||
/* Overflow check before capacity calc. */
|
/* Overflow check before capacity calc. */
|
||||||
if (remoteconf->channel_reserve_satoshis > state->funding_satoshis)
|
if (remoteconf->channel_reserve_satoshis > state->funding_satoshis)
|
||||||
negotiation_failed(state,
|
negotiation_failed(state,
|
||||||
"Invalid channel_reserve_satoshis %"PRIu64
|
"channel_reserve_satoshis %"PRIu64
|
||||||
" for funding_satoshis %"PRIu64,
|
" too large for funding_satoshis %"PRIu64,
|
||||||
remoteconf->channel_reserve_satoshis,
|
remoteconf->channel_reserve_satoshis,
|
||||||
state->funding_satoshis);
|
state->funding_satoshis);
|
||||||
|
|
||||||
@@ -129,8 +141,8 @@ static void check_config_bounds(struct state *state,
|
|||||||
|
|
||||||
if (remoteconf->htlc_minimum_msat * (u64)1000 > capacity_msat)
|
if (remoteconf->htlc_minimum_msat * (u64)1000 > capacity_msat)
|
||||||
negotiation_failed(state,
|
negotiation_failed(state,
|
||||||
"Invalid htlc_minimum_msat %"PRIu64
|
"htlc_minimum_msat %"PRIu64
|
||||||
" for funding_satoshis %"PRIu64
|
" too large for funding_satoshis %"PRIu64
|
||||||
" capacity_msat %"PRIu64,
|
" capacity_msat %"PRIu64,
|
||||||
remoteconf->htlc_minimum_msat,
|
remoteconf->htlc_minimum_msat,
|
||||||
state->funding_satoshis,
|
state->funding_satoshis,
|
||||||
@@ -138,7 +150,7 @@ static void check_config_bounds(struct state *state,
|
|||||||
|
|
||||||
if (capacity_msat < state->min_effective_htlc_capacity_msat)
|
if (capacity_msat < state->min_effective_htlc_capacity_msat)
|
||||||
negotiation_failed(state,
|
negotiation_failed(state,
|
||||||
"Channel capacity with funding %"PRIu64" msat,"
|
"channel capacity with funding %"PRIu64" msat,"
|
||||||
" reserves %"PRIu64"/%"PRIu64" msat,"
|
" reserves %"PRIu64"/%"PRIu64" msat,"
|
||||||
" max_htlc_value_in_flight_msat %"PRIu64
|
" max_htlc_value_in_flight_msat %"PRIu64
|
||||||
" is %"PRIu64" msat, which is below %"PRIu64" msat",
|
" is %"PRIu64" msat, which is below %"PRIu64" msat",
|
||||||
@@ -161,10 +173,9 @@ static void check_config_bounds(struct state *state,
|
|||||||
* than 483.
|
* than 483.
|
||||||
*/
|
*/
|
||||||
if (remoteconf->max_accepted_htlcs > 483)
|
if (remoteconf->max_accepted_htlcs > 483)
|
||||||
peer_failed(&state->cs, state->gossip_index,
|
negotiation_failed(state,
|
||||||
&state->channel_id,
|
"max_accepted_htlcs %u too large",
|
||||||
"max_accepted_htlcs %u too large",
|
remoteconf->max_accepted_htlcs);
|
||||||
remoteconf->max_accepted_htlcs);
|
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
@@ -174,12 +185,12 @@ static void check_config_bounds(struct state *state,
|
|||||||
*/
|
*/
|
||||||
if (remoteconf->dust_limit_satoshis
|
if (remoteconf->dust_limit_satoshis
|
||||||
> remoteconf->channel_reserve_satoshis)
|
> remoteconf->channel_reserve_satoshis)
|
||||||
peer_failed(&state->cs, state->gossip_index,
|
negotiation_failed(state,
|
||||||
&state->channel_id,
|
"dust_limit_satoshis %"PRIu64
|
||||||
"dust_limit_satoshis %"PRIu64
|
" too large for channel_reserve_satoshis %"
|
||||||
" too large for channel_reserve_satoshis %"PRIu64,
|
PRIu64,
|
||||||
remoteconf->dust_limit_satoshis,
|
remoteconf->dust_limit_satoshis,
|
||||||
remoteconf->channel_reserve_satoshis);
|
remoteconf->channel_reserve_satoshis);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We always set channel_reserve_satoshis to 1%, rounded up. */
|
/* We always set channel_reserve_satoshis to 1%, rounded up. */
|
||||||
@@ -362,14 +373,14 @@ static u8 *funder_channel(struct state *state,
|
|||||||
if (state->remoteconf->channel_reserve_satoshis
|
if (state->remoteconf->channel_reserve_satoshis
|
||||||
< state->localconf.dust_limit_satoshis)
|
< state->localconf.dust_limit_satoshis)
|
||||||
negotiation_failed(state,
|
negotiation_failed(state,
|
||||||
"Their channel reserve %"PRIu64
|
"channel reserve %"PRIu64
|
||||||
" would be below our dust %"PRIu64,
|
" would be below our dust %"PRIu64,
|
||||||
state->remoteconf->channel_reserve_satoshis,
|
state->remoteconf->channel_reserve_satoshis,
|
||||||
state->localconf.dust_limit_satoshis);
|
state->localconf.dust_limit_satoshis);
|
||||||
if (state->localconf.channel_reserve_satoshis
|
if (state->localconf.channel_reserve_satoshis
|
||||||
< state->remoteconf->dust_limit_satoshis)
|
< state->remoteconf->dust_limit_satoshis)
|
||||||
negotiation_failed(state,
|
negotiation_failed(state,
|
||||||
"Their dust limit %"PRIu64
|
"dust limit %"PRIu64
|
||||||
" would be above our reserve %"PRIu64,
|
" would be above our reserve %"PRIu64,
|
||||||
state->remoteconf->dust_limit_satoshis,
|
state->remoteconf->dust_limit_satoshis,
|
||||||
state->localconf.channel_reserve_satoshis);
|
state->localconf.channel_reserve_satoshis);
|
||||||
@@ -586,10 +597,9 @@ static u8 *fundee_channel(struct state *state,
|
|||||||
* The receiving node ... MUST fail the channel if `funding-satoshis`
|
* The receiving node ... MUST fail the channel if `funding-satoshis`
|
||||||
* is greater than or equal to 2^24 */
|
* is greater than or equal to 2^24 */
|
||||||
if (state->funding_satoshis > MAX_FUNDING_SATOSHI)
|
if (state->funding_satoshis > MAX_FUNDING_SATOSHI)
|
||||||
peer_failed(&state->cs, state->gossip_index,
|
negotiation_failed(state,
|
||||||
&state->channel_id,
|
"funding_satoshis %"PRIu64" too large",
|
||||||
"funding_satoshis %"PRIu64" too large",
|
state->funding_satoshis);
|
||||||
state->funding_satoshis);
|
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
@@ -599,8 +609,8 @@ static u8 *fundee_channel(struct state *state,
|
|||||||
if (state->push_msat > state->funding_satoshis * 1000)
|
if (state->push_msat > state->funding_satoshis * 1000)
|
||||||
peer_failed(&state->cs, state->gossip_index,
|
peer_failed(&state->cs, state->gossip_index,
|
||||||
&state->channel_id,
|
&state->channel_id,
|
||||||
"push_msat %"PRIu64
|
"Our push_msat %"PRIu64
|
||||||
" too large for funding_satoshis %"PRIu64,
|
" would be too large for funding_satoshis %"PRIu64,
|
||||||
state->push_msat, state->funding_satoshis);
|
state->push_msat, state->funding_satoshis);
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
@@ -704,7 +714,7 @@ static u8 *fundee_channel(struct state *state,
|
|||||||
if (!state->channel)
|
if (!state->channel)
|
||||||
peer_failed(&state->cs, state->gossip_index,
|
peer_failed(&state->cs, state->gossip_index,
|
||||||
&state->channel_id,
|
&state->channel_id,
|
||||||
"could not create channel with given config");
|
"We could not create channel with given config");
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user