Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update spec to latest changes #4556

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CCANDIR := ccan

# Where we keep the BOLT RFCs
BOLTDIR := ../lightning-rfc/
DEFAULT_BOLTVERSION := b201efe0546120c14bf154ce5f4e18da7243fe7a
DEFAULT_BOLTVERSION := 3508e4e85d26240ae7492c3d2e02770cdc360fe9
# Can be overridden on cmdline.
BOLTVERSION := $(DEFAULT_BOLTVERSION)

Expand Down
4 changes: 2 additions & 2 deletions channeld/channeld.c
Original file line number Diff line number Diff line change
Expand Up @@ -1494,8 +1494,8 @@ static void handle_peer_revoke_and_ack(struct peer *peer, const u8 *msg)
/* BOLT #2:
*
* A receiving node:
* - if `per_commitment_secret` does not generate the previous
* `per_commitment_point`:
* - if `per_commitment_secret` is not a valid secret key or does not
* generate the previous `per_commitment_point`:
* - MUST fail the channel.
*/
memcpy(&privkey, &old_commit_secret, sizeof(privkey));
Expand Down
8 changes: 4 additions & 4 deletions channeld/test/run-commit_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,11 @@ static const struct htlc **setup_htlcs_0_to_4(const tal_t *ctx)
/* BOLT #3:
* htlc 5 direction: local->remote
* htlc 5 amount_msat: 5000000
* htlc 5 expiry: 505
* htlc 5 expiry: 506
* htlc 5 payment_preimage: 0505050505050505050505050505050505050505050505050505050505050505
* htlc 6 direction: local->remote
* htlc 6 amount_msat: 5000000
* htlc 6 expiry: 506
* htlc 6 amount_msat: 5000001
* htlc 6 expiry: 505
* htlc 6 payment_preimage: 0505050505050505050505050505050505050505050505050505050505050505
*/
static const struct htlc **setup_htlcs_1_5_and_6(const tal_t *ctx)
Expand Down Expand Up @@ -211,7 +211,7 @@ static const struct htlc **setup_htlcs_1_5_and_6(const tal_t *ctx)
break;
case 6:
htlc->state = SENT_ADD_ACK_REVOCATION;
htlc->amount = AMOUNT_MSAT(5000000);
htlc->amount = AMOUNT_MSAT(5000001);
htlc->expiry.locktime = 506;
memset(htlc->r, 5, sizeof(*htlc->r));
break;
Expand Down
2 changes: 0 additions & 2 deletions common/features.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,10 @@ static const struct feature_style feature_styles[] = {
[NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT,
[BOLT11_FEATURE] = FEATURE_REPRESENT,
[CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT} },
#if EXPERIMENTAL_FEATURES
{ OPT_SHUTDOWN_ANYSEGWIT,
.copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT,
[NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT,
[CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT } },
#endif
};

struct dependency {
Expand Down
6 changes: 1 addition & 5 deletions common/features.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,16 +107,12 @@ u8 *featurebits_or(const tal_t *ctx, const u8 *f1 TAKES, const u8 *f2 TAKES);
* | 16/17 | `basic_mpp` |... IN9 ...
* | 18/19 | `option_support_large_channel` |... IN ...
* | 20/21 | `option_anchor_outputs` |... IN ...
* | 26/27 | `option_shutdown_anysegwit` |... IN ...
*/
#define OPT_PAYMENT_SECRET 14
#define OPT_BASIC_MPP 16
#define OPT_LARGE_CHANNELS 18
#define OPT_ANCHOR_OUTPUTS 20

/* BOLT-4e329271a358ee52bf43ddbd96776943c5d74508 #9:
*
* | 26/27 | `option_shutdown_anysegwit` |... IN ...
*/
#define OPT_SHUTDOWN_ANYSEGWIT 26

/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #9:
Expand Down
2 changes: 1 addition & 1 deletion common/shutdown_scriptpubkey.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <stdio.h>

/* BOLT-4e329271a358ee52bf43ddbd96776943c5d74508 #2:
/* BOLT #2:
* 5. if (and only if) `option_shutdown_anysegwit` is negotiated:
* * `OP_1` through `OP_16` inclusive, followed by a single
* push of 2 to 40 bytes
Expand Down
5 changes: 4 additions & 1 deletion common/shutdown_scriptpubkey.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
* (pay to pubkey hash), OR
* 2. `OP_HASH160` `20` 20-bytes `OP_EQUAL` (pay to script hash), OR
* 3. `OP_0` `20` 20-bytes (version 0 pay to witness pubkey hash), OR
* 4. `OP_0` `32` 32-bytes (version 0 pay to witness script hash)
* 4. `OP_0` `32` 32-bytes (version 0 pay to witness script hash), OR
* 5. if (and only if) `option_shutdown_anysegwit` is negotiated:
* * `OP_1` through `OP_16` inclusive, followed by a single push of 2 to 40 bytes
* (witness program versions 1 through 16)
*
* A receiving node:
*...
Expand Down
13 changes: 5 additions & 8 deletions lightningd/dual_open_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <common/json_tok.h>
#include <common/per_peer_state.h>
#include <common/psbt_open.h>
#include <common/shutdown_scriptpubkey.h>
#include <common/type_to_string.h>
#include <connectd/connectd_wiregen.h>
#include <hsmd/capabilities.h>
Expand Down Expand Up @@ -1212,6 +1213,9 @@ static void handle_peer_wants_to_close(struct subd *dualopend,
struct lightningd *ld = dualopend->ld;
struct channel *channel = dualopend->channel;
char *errmsg;
bool anysegwit = feature_negotiated(ld->our_features,
channel->peer->their_features,
OPT_SHUTDOWN_ANYSEGWIT);

/* We shouldn't get this message while we're waiting to finish */
if (channel_unsaved(channel)) {
Expand All @@ -1237,20 +1241,13 @@ static void handle_peer_wants_to_close(struct subd *dualopend,
channel->shutdown_scriptpubkey[REMOTE] = scriptpubkey;

/* BOLT #2:
*
* 1. `OP_DUP` `OP_HASH160` `20` 20-bytes `OP_EQUALVERIFY` `OP_CHECKSIG`
* (pay to pubkey hash), OR
* 2. `OP_HASH160` `20` 20-bytes `OP_EQUAL` (pay to script hash), OR
* 3. `OP_0` `20` 20-bytes (version 0 pay to witness pubkey hash), OR
* 4. `OP_0` `32` 32-bytes (version 0 pay to witness script hash)
*
* A receiving node:
*...
* - if the `scriptpubkey` is not in one of the above forms:
* - SHOULD fail the connection.
*/
if (!is_p2pkh(scriptpubkey, NULL) && !is_p2sh(scriptpubkey, NULL)
&& !is_p2wpkh(scriptpubkey, NULL) && !is_p2wsh(scriptpubkey, NULL)) {
if (!valid_shutdown_scriptpubkey(scriptpubkey, anysegwit)) {
channel_fail_permanent(channel,
REASON_PROTOCOL,
"Bad shutdown scriptpubkey %s",
Expand Down
2 changes: 1 addition & 1 deletion lightningd/lightningd.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,10 +802,10 @@ static struct feature_set *default_features(const tal_t *ctx)
OPTIONAL_FEATURE(OPT_BASIC_MPP),
OPTIONAL_FEATURE(OPT_GOSSIP_QUERIES_EX),
OPTIONAL_FEATURE(OPT_STATIC_REMOTEKEY),
OPTIONAL_FEATURE(OPT_SHUTDOWN_ANYSEGWIT),
#if EXPERIMENTAL_FEATURES
OPTIONAL_FEATURE(OPT_ANCHOR_OUTPUTS),
OPTIONAL_FEATURE(OPT_ONION_MESSAGES),
OPTIONAL_FEATURE(OPT_SHUTDOWN_ANYSEGWIT),
#endif
};

Expand Down
17 changes: 5 additions & 12 deletions tests/test_closing.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from utils import (
only_one, sync_blockheight, wait_for, TIMEOUT,
account_balance, first_channel_id, basic_fee, TEST_NETWORK,
EXPERIMENTAL_FEATURES, scriptpubkey_addr
scriptpubkey_addr
)

import os
Expand Down Expand Up @@ -2626,7 +2626,7 @@ def test_segwit_shutdown_script(node_factory, bitcoind, executor):
"""
l1 = node_factory.get_node(allow_warning=True)

# BOLT-4e329271a358ee52bf43ddbd96776943c5d74508 #2:
# BOLT #2:
# 5. if (and only if) `option_shutdown_anysegwit` is negotiated:
# * `OP_1` through `OP_16` inclusive, followed by a single push of 2 to 40 bytes
# (witness program versions 1 through 16)
Expand Down Expand Up @@ -2659,15 +2659,8 @@ def test_segwit_shutdown_script(node_factory, bitcoind, executor):
else:
valid = edge_valid + other_valid

if EXPERIMENTAL_FEATURES:
xsuccess = valid
xfail = invalid
else:
xsuccess = []
xfail = valid + invalid

# More efficient to create them all up-front.
nodes = node_factory.get_nodes(len(xfail) + len(xsuccess))
nodes = node_factory.get_nodes(len(valid) + len(invalid))

# Give it one UTXO to spend for each node.
addresses = {}
Expand All @@ -2680,7 +2673,7 @@ def test_segwit_shutdown_script(node_factory, bitcoind, executor):
# FIXME: Since we don't support other non-v0 encodings, we need a protocol
# test for this (we're actually testing our upfront check, not the real
# shutdown one!),
for script in xsuccess:
for script in valid:
# Insist on upfront script we're not going to match.
l1.stop()
l1.daemon.env["DEV_OPENINGD_UPFRONT_SHUTDOWN_SCRIPT"] = script
Expand All @@ -2690,7 +2683,7 @@ def test_segwit_shutdown_script(node_factory, bitcoind, executor):
l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l1.rpc.fundchannel(l2.info['id'], 10**6)

for script in xfail:
for script in invalid:
# Insist on upfront script we're not going to match.
l1.stop()
l1.daemon.env["DEV_OPENINGD_UPFRONT_SHUTDOWN_SCRIPT"] = script
Expand Down
2 changes: 2 additions & 0 deletions tests/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1897,6 +1897,8 @@ def test_list_features_only(node_factory):
expected += ['option_anchor_outputs/odd']
expected += ['option_shutdown_anysegwit/odd']
expected += ['option_onion_messages/odd']
else:
expected += ['option_shutdown_anysegwit/odd']
assert features == expected


Expand Down
8 changes: 2 additions & 6 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,12 @@ def hex_bits(features):

def expected_peer_features(wumbo_channels=False, extra=[]):
"""Return the expected peer features hexstring for this configuration"""
features = [1, 5, 7, 9, 11, 13, 15, 17]
features = [1, 5, 7, 9, 11, 13, 15, 17, 27]
if EXPERIMENTAL_FEATURES:
# OPT_ONION_MESSAGES
features += [103]
# option_anchor_outputs
features += [21]
# option_shutdown_anysegwit
features += [27]
if wumbo_channels:
features += [19]
if EXPERIMENTAL_DUAL_FUND:
Expand All @@ -42,14 +40,12 @@ def expected_peer_features(wumbo_channels=False, extra=[]):
# features for the 'node' and the 'peer' feature sets
def expected_node_features(wumbo_channels=False, extra=[]):
"""Return the expected node features hexstring for this configuration"""
features = [1, 5, 7, 9, 11, 13, 15, 17, 55]
features = [1, 5, 7, 9, 11, 13, 15, 17, 27, 55]
if EXPERIMENTAL_FEATURES:
# OPT_ONION_MESSAGES
features += [103]
# option_anchor_outputs
features += [21]
# option_shutdown_anysegwit
features += [27]
if wumbo_channels:
features += [19]
if EXPERIMENTAL_DUAL_FUND:
Expand Down