diff --git a/Makefile b/Makefile index 24fc44c6aedf..631978921c2b 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ CCANDIR := ccan # Where we keep the BOLT RFCs BOLTDIR := ../bolts/ -DEFAULT_BOLTVERSION := ccfa38ed4f592c3711156bb4ded77f44ec01101d +DEFAULT_BOLTVERSION := 68881992b97f20aca29edf7a4d673b8e6a70379a # Can be overridden on cmdline. BOLTVERSION := $(DEFAULT_BOLTVERSION) diff --git a/channeld/channeld.c b/channeld/channeld.c index 37452adfe966..21bfcd2d6c5f 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -51,8 +51,6 @@ #include #include -#define EXPERIMENTAL_UPGRADE_ENABLED 0 - /* stdin == requests, 3 == peer, 4 = HSM */ #define MASTER_FD STDIN_FILENO #define HSM_FD 4 @@ -191,9 +189,6 @@ struct peer { /* We allow a 'tx-sigs' message between reconnect + channel_ready */ bool tx_sigs_allowed; - - /* --experimental-upgrade-protocol */ - bool experimental_upgrade; }; static void start_commit_timer(struct peer *peer); @@ -360,38 +355,6 @@ static bool handle_master_request_later(struct peer *peer, const u8 *msg) return false; } -#if EXPERIMENTAL_UPGRADE_ENABLED -/* Compare, with false if either is NULL */ -static bool match_type(const u8 *t1, const u8 *t2) -{ - /* Missing fields are possible. */ - if (!t1 || !t2) - return false; - - return featurebits_eq(t1, t2); -} - -static void set_channel_type(struct channel *channel, const u8 *type) -{ - const struct channel_type *cur = channel->type; - - if (featurebits_eq(cur->features, type)) - return; - - /* We only allow one upgrade at the moment, so that's it. */ - assert(!channel_has(channel, OPT_STATIC_REMOTEKEY)); - assert(feature_offered(type, OPT_STATIC_REMOTEKEY)); - - /* Do upgrade, tell master. */ - tal_free(channel->type); - channel->type = channel_type_from(channel, type); - status_unusual("Upgraded channel to [%s]", - fmt_featurebits(tmpctx, type)); - wire_sync_write(MASTER_FD, - take(towire_channeld_upgraded(NULL, channel->type))); -} -#endif - static void lock_signer_outpoint(const struct bitcoin_outpoint *outpoint) { const u8 *msg; @@ -5312,27 +5275,6 @@ static bool capture_premature_msg(const u8 ***shit_lnd_says, const u8 *msg) return true; } -#if EXPERIMENTAL_UPGRADE_ENABLED -/* Unwrap a channel_type into a raw byte array for the wire: can be NULL */ -static u8 *to_bytearr(const tal_t *ctx, - const struct channel_type *channel_type TAKES) -{ - u8 *ret; - bool steal; - - steal = taken(channel_type); - if (!channel_type) - return NULL; - - if (steal) { - ret = tal_steal(ctx, channel_type->features); - tal_free(channel_type); - } else - ret = tal_dup_talarr(ctx, u8, channel_type->features); - return ret; -} -#endif - static void peer_reconnect(struct peer *peer, const struct secret *last_remote_per_commit_secret) { @@ -5370,47 +5312,6 @@ static void peer_reconnect(struct peer *peer, send_tlvs = NULL; -#if EXPERIMENTAL_UPGRADE_ENABLED - if (peer->experimental_upgrade) { - /* Subtle: we free tmpctx below as we loop, so tal off peer */ - send_tlvs = tlv_channel_reestablish_tlvs_new(peer); - - /* BOLT-upgrade_protocol #2: - * A node sending `channel_reestablish`, if it supports upgrading channels: - * - MUST set `next_to_send` the commitment number of the next - * `commitment_signed` it expects to send. - */ - send_tlvs->next_to_send = tal_dup(send_tlvs, u64, &peer->next_index[REMOTE]); - - /* BOLT-upgrade_protocol #2: - * - if it initiated the channel: - * - MUST set `desired_type` to the channel_type it wants for the - * channel. - */ - if (peer->channel->opener == LOCAL) { - send_tlvs->desired_channel_type = - to_bytearr(send_tlvs, - take(channel_desired_type(NULL, - peer->channel))); - } else { - /* BOLT-upgrade_protocol #2: - * - otherwise: - * - MUST set `current_type` to the current channel_type of the - * channel. - * - MUST set `upgradable` to the channel types it could change - * to. - * - MAY not set `upgradable` if it would be empty. - */ - send_tlvs->current_channel_type - = to_bytearr(send_tlvs, peer->channel->type); - send_tlvs->upgradable_channel_type - = to_bytearr(send_tlvs, - take(channel_upgradable_type(NULL, - peer->channel))); - } - } -#endif - inflight = last_inflight(peer); send_next_commitment_number = peer->next_index[LOCAL]; @@ -5876,86 +5777,6 @@ static void peer_reconnect(struct peer *peer, /* (If we had sent `closing_signed`, we'd be in closingd). */ maybe_send_shutdown(peer); -#if EXPERIMENTAL_UPGRADE_ENABLED - if (recv_tlvs->desired_channel_type) - status_debug("They sent desired_channel_type [%s]", - fmt_featurebits(tmpctx, - recv_tlvs->desired_channel_type)); - if (recv_tlvs->current_channel_type) - status_debug("They sent current_channel_type [%s]", - fmt_featurebits(tmpctx, - recv_tlvs->current_channel_type)); - - if (recv_tlvs->upgradable_channel_type) - status_debug("They offered upgrade to [%s]", - fmt_featurebits(tmpctx, - recv_tlvs->upgradable_channel_type)); - - /* BOLT-upgrade_protocol #2: - * - * A node receiving `channel_reestablish`: - * - if it has to retransmit `commitment_signed` or `revoke_and_ack`: - * - MUST consider the channel feature change failed. - */ - if (retransmit_commitment_signed || retransmit_revoke_and_ack) { - status_debug("No upgrade: we retransmitted"); - /* BOLT-upgrade_protocol #2: - * - * - if `next_to_send` is missing, or not equal to the - * `next_commitment_number` it sent: - * - MUST consider the channel feature change failed. - */ - } else if (!recv_tlvs->next_to_send) { - status_debug("No upgrade: no next_to_send received"); - } else if (*recv_tlvs->next_to_send != peer->next_index[LOCAL]) { - status_debug("No upgrade: they're retransmitting"); - /* BOLT-upgrade_protocol #2: - * - * - if updates are pending on either sides' commitment transaction: - * - MUST consider the channel feature change failed. - */ - /* Note that we can have HTLCs we *want* to add or remove - * but haven't yet: thats OK! */ - } else if (pending_updates(peer->channel, LOCAL, true) - || pending_updates(peer->channel, REMOTE, true)) { - status_debug("No upgrade: pending changes"); - } else if (send_tlvs && recv_tlvs) { - const struct tlv_channel_reestablish_tlvs *initr, *ninitr; - const u8 *type; - - if (peer->channel->opener == LOCAL) { - initr = send_tlvs; - ninitr = recv_tlvs; - } else { - initr = recv_tlvs; - ninitr = send_tlvs; - } - - /* BOLT-upgrade_protocol #2: - * - * - if `desired_channel_type` matches `current_channel_type` or any - * `upgradable_channel_type`: - * - MUST consider the channel type to be `desired_channel_type`. - * - otherwise: - * - MUST consider the channel type change failed. - * - if there is a `current_channel_type` field: - * - MUST consider the channel type to be `current_channel_type`. - */ - if (match_type(initr->desired_channel_type, - ninitr->current_channel_type) - || match_type(initr->desired_channel_type, - ninitr->upgradable_channel_type)) - type = initr->desired_channel_type; - else if (ninitr->current_channel_type) - type = ninitr->current_channel_type; - else - type = NULL; - - if (type) - set_channel_type(peer->channel, type); - } -#endif - tal_free(send_tlvs); /* We've reestablished! */ @@ -6645,7 +6466,6 @@ static void init_channel(struct peer *peer) &channel_type, &peer->dev_disable_commit, &pbases, - &peer->experimental_upgrade, &peer->splice_state->inflights, &peer->local_alias)) { master_badmsg(WIRE_CHANNELD_INIT, msg); diff --git a/channeld/channeld_wire.csv b/channeld/channeld_wire.csv index c2833504153a..43ee7af9ddf7 100644 --- a/channeld/channeld_wire.csv +++ b/channeld/channeld_wire.csv @@ -72,7 +72,6 @@ msgdata,channeld_init,desired_type,channel_type, msgdata,channeld_init,dev_disable_commit,?u32, msgdata,channeld_init,num_penalty_bases,u32, msgdata,channeld_init,pbases,penalty_base,num_penalty_bases -msgdata,channeld_init,experimental_upgrade,bool, msgdata,channeld_init,num_inflights,u16, msgdata,channeld_init,inflights,inflight,num_inflights msgdata,channeld_init,scid_alias,short_channel_id, diff --git a/common/bolt11.c b/common/bolt11.c index db9209fdaa2f..bcc00cf38775 100644 --- a/common/bolt11.c +++ b/common/bolt11.c @@ -64,8 +64,9 @@ static const char *pull_bits(struct hash_u5 *hu5, /* Helper for pulling a variable-length big-endian int. */ static const char *pull_uint(struct hash_u5 *hu5, - const u5 **data, size_t *data_len, - u64 *val, size_t databits) + const u5 **data, size_t *data_len, + u64 *val, size_t databits, + bool must_be_minimal) { be64 be_val; const char *err; @@ -73,6 +74,11 @@ static const char *pull_uint(struct hash_u5 *hu5, /* Too big. */ if (databits > sizeof(be_val) * CHAR_BIT) return "integer too large"; + if (must_be_minimal + && databits >= 5 + && *data_len > 1 + && (*data)[0] == 0) + return "not a minimal value"; err = pull_bits(hu5, data, data_len, &be_val, databits, true); if (err) return err; @@ -173,16 +179,15 @@ static const char *decode_p(struct bolt11 *b11, { /* BOLT #11: * - * A payer... SHOULD use the first `p` field that it did NOT - * skip as the payment hash. + * A payer... SHOULD use the first `p` field as the payment hash. */ assert(!*have_p); /* BOLT #11: * - * A reader... MUST skip over unknown fields, OR an `f` field - * with unknown `version`, OR `p`, `h`, `s` or `n` fields that do - * NOT have `data_length`s of 52, 52, 52 or 53, respectively. + * A reader... + * - MUST fail the payment if any mandatory field (`p`, `h`, `s`, `n`) + * does not have the correct length (52, 52, 52, 53). */ return pull_expected_length(b11, hu5, data, field_len, 52, 'p', have_p, &b11->payment_hash); @@ -234,9 +239,9 @@ static const char *decode_h(struct bolt11 *b11, assert(!*have_h); /* BOLT #11: * - * A reader... MUST skip over unknown fields, OR an `f` field - * with unknown `version`, OR `p`, `h`, `s` or `n` fields that do - * NOT have `data_length`s of 52, 52, 52 or 53, respectively. */ + * A reader... + * - MUST fail the payment if any mandatory field (`p`, `h`, `s`, `n`) + * does not have the correct length (52, 52, 52, 53). */ err = pull_expected_length(b11, hu5, data, field_len, 52, 'h', have_h, &hash); @@ -262,8 +267,12 @@ static const char *decode_x(struct bolt11 *b11, assert(!*have_x); - /* FIXME: Put upper limit in bolt 11 */ - err = pull_uint(hu5, data, field_len, &b11->expiry, *field_len * 5); + /* BOLT #11: + * - if a `c`, `x`, or `9` field is provided which has a non-minimal `data_length` + * (i.e. begins with 0 field elements): + * - SHOULD treat the invoice as invalid. + */ + err = pull_uint(hu5, data, field_len, &b11->expiry, *field_len * 5, true); if (err) return tal_fmt(b11, "x: %s", err); @@ -287,8 +296,12 @@ static const char *decode_c(struct bolt11 *b11, assert(!*have_c); - /* FIXME: Put upper limit in bolt 11 */ - err = pull_uint(hu5, data, field_len, &c, *field_len * 5); + /* BOLT #11: + * - if a `c`, `x`, or `9` field is provided which has a non-minimal `data_length` + * (i.e. begins with 0 field elements): + * - SHOULD treat the invoice as invalid. + */ + err = pull_uint(hu5, data, field_len, &c, *field_len * 5, true); if (err) return tal_fmt(b11, "c: %s", err); b11->min_final_cltv_expiry = c; @@ -311,9 +324,9 @@ static const char *decode_n(struct bolt11 *b11, assert(!*have_n); /* BOLT #11: * - * A reader... MUST skip over unknown fields, OR an `f` field - * with unknown `version`, OR `p`, `h`, `s` or `n` fields that do - * NOT have `data_length`s of 52, 52, 52 or 53, respectively. */ + * A reader... + * - MUST fail the payment if any mandatory field (`p`, `h`, `s`, `n`) + * does not have the correct length (52, 52, 52, 53). */ err = pull_expected_length(b11, hu5, data, field_len, 53, 'n', have_n, &b11->receiver_id.k); @@ -347,9 +360,9 @@ static const char *decode_s(struct bolt11 *b11, /* BOLT #11: * - * A reader... MUST skip over unknown fields, OR an `f` field - * with unknown `version`, OR `p`, `h`, `s` or `n` fields that do - * NOT have `data_length`s of 52, 52, 52 or 53, respectively. */ + * A reader... + * - MUST fail the payment if any mandatory field (`p`, `h`, `s`, `n`) + * does not have the correct length (52, 52, 52, 53). */ err = pull_expected_length(b11, hu5, data, field_len, 52, 's', have_s, &secret); if (*have_s) @@ -375,7 +388,7 @@ static const char *decode_f(struct bolt11 *b11, size_t orig_len = *field_len; const char *err; - err = pull_uint(hu5, data, field_len, &version, 5); + err = pull_uint(hu5, data, field_len, &version, 5, false); if (err) return tal_fmt(b11, "f: %s", err); @@ -429,6 +442,9 @@ static const char *decode_f(struct bolt11 *b11, fallback = scriptpubkey_witness_raw(b11, version, f, tal_count(f)); } else { + /* BOLT #11: + * - MUST skip over `f` fields that use an unknown `version`. + */ /* Restore version for unknown field! */ *data = orig_data; *field_len = orig_len; @@ -550,6 +566,14 @@ static const char *decode_9(struct bolt11 *b11, if (!b11->features) return err; + /* BOLT #11: + * - if a `c`, `x`, or `9` field is provided which has a non-minimal `data_length` + * (i.e. begins with 0 field elements): + * - SHOULD treat the invoice as invalid. + */ + if (tal_count(b11->features) > 0 && b11->features[0] == 0) + return tal_fmt(b11, "9: non-minimal length (begins with 0)"); + /* pull_bits pads with zero bits: we need to remove them. */ shift_bitmap_down(b11->features, flen * 8 - databits); @@ -642,8 +666,7 @@ struct decoder { static const struct decoder decoders[] = { /* BOLT #11: * - * A payer... SHOULD use the first `p` field that it did NOT - * skip as the payment hash. + * A payer... SHOULD use the first `p` field as the payment hash. */ { 'p', false, decode_p }, { 'd', false, decode_d }, @@ -847,7 +870,7 @@ struct bolt11 *bolt11_decode_nosig(const tal_t *ctx, const char *str, * 1. zero or more tagged parts * 1. `signature`: Bitcoin-style signature of above (520 bits) */ - err = pull_uint(&hu5, &data, &data_len, &b11->timestamp, 35); + err = pull_uint(&hu5, &data, &data_len, &b11->timestamp, 35, false); if (err) return decode_fail(b11, fail, "Can't get 35-bit timestamp: %s", err); @@ -866,11 +889,11 @@ struct bolt11 *bolt11_decode_nosig(const tal_t *ctx, const char *str, * 1. `data_length` (10 bits, big-endian) * 1. `data` (`data_length` x 5 bits) */ - err = pull_uint(&hu5, &data, &data_len, &type, 5); + err = pull_uint(&hu5, &data, &data_len, &type, 5, false); if (err) return decode_fail(b11, fail, "Can't get tag: %s", err); - err = pull_uint(&hu5, &data, &data_len, &field_len64, 10); + err = pull_uint(&hu5, &data, &data_len, &field_len64, 10, false); if (err) return decode_fail(b11, fail, "Can't get length: %s", err); @@ -906,6 +929,9 @@ struct bolt11 *bolt11_decode_nosig(const tal_t *ctx, const char *str, if (!have_field[bech32_charset_rev['p']]) return decode_fail(b11, fail, "No valid 'p' field found"); + if (!have_field[bech32_charset_rev['s']]) + return decode_fail(b11, fail, "Missing required payment secret (s field)"); + if (have_field[bech32_charset_rev['h']] && description) { struct sha256 sha; @@ -1053,10 +1079,11 @@ static void push_field(u5 **data, char type, const void *src, size_t nbits) /* BOLT #11: * * - if `x` is included: - * - SHOULD use the minimum `data_length` possible. + * - MUST use the minimum `data_length` possible, i.e. no leading 0 field-elements. * - SHOULD include one `c` field (`min_final_cltv_expiry_delta`). - *... - * - SHOULD use the minimum `data_length` possible. + * - MUST set `c` to the minimum `cltv_expiry` it will accept for the last + * HTLC in the route. + * - MUST use the minimum `data_length` possible, i.e. no leading 0 field-elements. */ static void push_varlen_field(u5 **data, char type, u64 val) { @@ -1197,7 +1224,8 @@ static void maybe_encode_9(u5 **data, const u8 *features, /* BOLT #11: * * - if `9` contains non-zero bits: - * - SHOULD use the minimum `data_length` possible. + * - MUST use the minimum `data_length` possible to encode the non-zero bits + * with no 0 field-elements at the start. * - otherwise: * - MUST omit the `9` field altogether. */ diff --git a/common/test/run-bolt11.c b/common/test/run-bolt11.c index 630536eeca89..e4fbbd797cbd 100644 --- a/common/test/run-bolt11.c +++ b/common/test/run-bolt11.c @@ -300,6 +300,8 @@ int main(int argc, char *argv[]) b11 = new_bolt11(tmpctx, &msatoshi); b11->chain = chainparams_for_network("bitcoin"); b11->timestamp = 1496314658; + b11->payment_secret = tal(b11, struct secret); + memset(b11->payment_secret, 0x11, sizeof(*b11->payment_secret)); if (!hex_decode("0001020304050607080900010203040506070809000102030405060708090102", strlen("0001020304050607080900010203040506070809000102030405060708090102"), &b11->payment_hash, sizeof(b11->payment_hash))) @@ -308,9 +310,7 @@ int main(int argc, char *argv[]) b11->description = "1 cup coffee"; b11->expiry = 60; - dev_bolt11_omit_c_value = true; - test_b11("LNBC2500U1PVJLUEZPP5QQQSYQCYQ5RQWZQFQQQSYQCYQ5RQWZQFQQQSYQCYQ5RQWZQFQYPQDQ5XYSXXATSYP3K7ENXV4JSXQZPUAZTRNWNGZN3KDZW5HYDLZF03QDGM2HDQ27CQV3AGM2AWHZ5SE903VRUATFHQ77W3LS4EVS3CH9ZW97J25EMUDUPQ63NYW24CG27H2RSPFJ9SRP", b11, NULL); - dev_bolt11_omit_c_value = false; + test_b11("LNBC2500U1PVJLUEZSP5ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYG3ZYGSPP5QQQSYQCYQ5RQWZQFQQQSYQCYQ5RQWZQFQQQSYQCYQ5RQWZQFQYPQDQ5XYSXXATSYP3K7ENXV4JSXQZPUCQPJEJ3HDW922T23KQLTFQDTUF2MGFQESVYFKKAQVE0HW8VD0CHQSTEJ60K02J4W6NP4CUJV87TUS82EDUYX7YTWFW4S58CJTG0U0A6TD6CQ3ADH8K", b11, NULL); /* Unknown field handling */ if (!node_id_from_hexstr("02330d13587b67a85c0a36ea001c4dba14bcd48dda8988f7303275b040bffb6abd", strlen("02330d13587b67a85c0a36ea001c4dba14bcd48dda8988f7303275b040bffb6abd"), &node)) @@ -319,6 +319,8 @@ int main(int argc, char *argv[]) b11 = new_bolt11(tmpctx, &msatoshi); b11->chain = chainparams_for_network("testnet"); b11->timestamp = 1554294928; + b11->payment_secret = tal(b11, struct secret); + memset(b11->payment_secret, 0x11, sizeof(*b11->payment_secret)); if (!hex_decode("850aeaf5f69670e8889936fc2e0cff3ceb0c3b5eab8f04ae57767118db673a91", strlen("850aeaf5f69670e8889936fc2e0cff3ceb0c3b5eab8f04ae57767118db673a91"), &b11->payment_hash, sizeof(b11->payment_hash))) @@ -334,9 +336,7 @@ int main(int argc, char *argv[]) extra->data[i] = bech32_charset_rev[(u8)"dp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8g"[i]]; list_add(&b11->extra_fields, &extra->list); - dev_bolt11_omit_c_value = true; - test_b11("lntb30m1pw2f2yspp5s59w4a0kjecw3zyexm7zur8l8n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zqun9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2ursdae8gxqruyqvzddp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8g4a3hx0v945csrmpm7yxyaamgt2xu7mu4xyt3vp7045n4k4czxf9kj0vw0m8dr5t3pjxuek04rtgyy8uzss5eet5gcyekd6m7u0mzv5sp7mdsag", b11, NULL); - dev_bolt11_omit_c_value = false; + test_b11("lntb30m1pw2f2yssp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5s59w4a0kjecw3zyexm7zur8l8n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zqun9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2ursdae8gxqruyqcqpjvzddp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8gcz45tperrgam4d3t6hc9kaguyzx08mrqsfhfxkx5fmpufvxfvypypyjcpxzvnnzq9jwsm3htpkwkxqsp8jt95ekkzq8ck5vze4lpehqq5cdj22", b11, NULL); /* BOLT #11: * @@ -690,6 +690,13 @@ int main(int argc, char *argv[]) assert(!bolt11_decode(tmpctx, "lnbc2500000001p1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpusp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9qrsgq0lzc236j96a95uv0m3umg28gclm5lqxtqqwk32uuk4k6673k6n5kfvx3d2h8s295fad45fdhmusm8sjudfhlf6dcsxmfvkeywmjdkxcp99202x", NULL, NULL, NULL, &fail)); assert(streq(fail, "Invalid sub-millisatoshi amount '2500000001p'")); + /* BOLT #11: + * > ### Missing required `s` field. + * > lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs9qrsgq7ea976txfraylvgzuxs8kgcw23ezlrszfnh8r6qtfpr6cxga50aj6txm9rxrydzd06dfeawfk6swupvz4erwnyutnjq7x39ymw6j38gp49qdkj + */ + assert(!bolt11_decode(tmpctx, "lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs9qrsgq7ea976txfraylvgzuxs8kgcw23ezlrszfnh8r6qtfpr6cxga50aj6txm9rxrydzd06dfeawfk6swupvz4erwnyutnjq7x39ymw6j38gp49qdkj", NULL, NULL, NULL, &fail)); + assert(streq(fail, "Missing required payment secret (s field)")); + /* Invalid UTF-8 tests. */ /* Description: Bad UTF-8: 0xC0" */ assert(!bolt11_decode(tmpctx, "lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5gfskggz423rz6wp6yrqqcqpjkkrsmq07c4ht7qgjdmf2a8savsafcy8lqn4av4gs80gz88ff2y780tdcve7sxp80kd4vk7hajt5mskcsegz2qfll4jywfwhap2q2n6cqyz5tv4", NULL, NULL, NULL, &fail)); diff --git a/doc/lightningd-config.5.md b/doc/lightningd-config.5.md index d7cfc0ba8023..86ac15dbc22d 100644 --- a/doc/lightningd-config.5.md +++ b/doc/lightningd-config.5.md @@ -816,13 +816,6 @@ of the prior channel balance and the new one. Specifying this option advertizes `option_quiesce`. Not very useful by itself, except for testing. -* **experimental-upgrade-protocol** - - Specifying this option means we send (and allow receipt of) a simple -protocol to update channel types. At the moment, we only support setting -`option_static_remotekey` to ancient channels. The peer must also support -this option. - BUGS diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index a2447136a200..337f8f21ab38 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -1887,7 +1887,6 @@ bool peer_start_channeld(struct channel *channel, ? NULL : (u32 *)&ld->dev_disable_commit, pbases, - ld->experimental_upgrade_protocol, cast_const2(const struct inflight **, inflights), *channel->alias[LOCAL]); diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 68b2e2462ec5..b75a3087cf94 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -264,9 +264,6 @@ static struct lightningd *new_lightningd(const tal_t *ctx) ld->recover_secret = NULL; ld->db_upgrade_ok = NULL; - /* --experimental-upgrade-protocol */ - ld->experimental_upgrade_protocol = false; - /* --invoices-onchain-fallback */ ld->unified_invoices = false; diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index 65383c46bdad..34c8a15802f1 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -410,9 +410,6 @@ struct lightningd { * since we otherwise would outright reject them. */ u64 *accept_extra_tlv_types; - /* --experimental-upgrade-protocol */ - bool experimental_upgrade_protocol; - /* --invoices-onchain-fallback */ bool unified_invoices; diff --git a/lightningd/onchain_control.c b/lightningd/onchain_control.c index 725e434a5551..0fe32e4d920e 100644 --- a/lightningd/onchain_control.c +++ b/lightningd/onchain_control.c @@ -120,11 +120,14 @@ static bool tell_if_missing(const struct channel *channel, * * - for any committed HTLC that does NOT have an output in this * commitment transaction: - * - once the commitment transaction has reached reasonable depth: - * - MUST fail the corresponding incoming HTLC (if any). - * - if no *valid* commitment transaction contains an output - * corresponding to the HTLC. - * - MAY fail the corresponding incoming HTLC sooner. + * - if the payment preimage is known: + * - MUST fulfill the corresponding incoming HTLC (if any). + * - otherwise: + * - once the commitment transaction has reached reasonable depth: + * - MUST fail the corresponding incoming HTLC (if any). + * - if no *valid* commitment transaction contains an output + * corresponding to the HTLC: + * - MAY fail the corresponding incoming HTLC sooner. */ if (hout->hstate >= RCVD_ADD_REVOCATION && hout->hstate < SENT_REMOVE_REVOCATION) @@ -484,12 +487,16 @@ static void handle_missing_htlc_output(struct channel *channel, const u8 *msg) * * - for any committed HTLC that does NOT have an output in this * commitment transaction: - * - once the commitment transaction has reached reasonable depth: - * - MUST fail the corresponding incoming HTLC (if any). - * - if no *valid* commitment transaction contains an output - * corresponding to the HTLC. - * - MAY fail the corresponding incoming HTLC sooner. + * - if the payment preimage is known: + * - MUST fulfill the corresponding incoming HTLC (if any). + * - otherwise: + * - once the commitment transaction has reached reasonable depth: + * - MUST fail the corresponding incoming HTLC (if any). + * - if no *valid* commitment transaction contains an output + * corresponding to the HTLC: + * - MAY fail the corresponding incoming HTLC sooner. */ + /* Note: we already succeeded any incoming which we preimage for */ onchain_failed_our_htlc(channel, &htlc, "missing in commitment tx", false); } diff --git a/lightningd/options.c b/lightningd/options.c index 115c7ded7eab..b55238c565bd 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1585,9 +1585,6 @@ static void register_opts(struct lightningd *ld) "--subdaemon=hsmd:remote_signer " "would use a hypothetical remote signing subdaemon."); - opt_register_noarg("--experimental-upgrade-protocol", - opt_set_bool, &ld->experimental_upgrade_protocol, - "experimental: allow channel types to be upgraded on reconnect"); opt_register_noarg("--invoices-onchain-fallback", opt_set_bool, &ld->unified_invoices, "Include an onchain address in invoices and mark them as paid if payment is received on-chain"); diff --git a/tests/plugins/channeld_fakenet.c b/tests/plugins/channeld_fakenet.c index 8151b875c01f..7b44cf381712 100644 --- a/tests/plugins/channeld_fakenet.c +++ b/tests/plugins/channeld_fakenet.c @@ -1076,7 +1076,6 @@ static struct channel *handle_init(struct info *info, const u8 *init_msg) u8 *final_scriptpubkey; u8 *their_features; u8 *remote_upfront_shutdown_script; - bool experimental_upgrade; u32 *dev_disable_commit; struct inflight **inflights; struct short_channel_id local_alias; @@ -1136,7 +1135,6 @@ static struct channel *handle_init(struct info *info, const u8 *init_msg) &channel_type, &dev_disable_commit, &pbases, - &experimental_upgrade, &inflights, &local_alias)) abort(); diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 1c810965b0db..1e0260415de4 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -571,19 +571,20 @@ def test_waitanyinvoice_reversed(node_factory, executor): def test_decode_unknown(node_factory): l1 = node_factory.get_node() - b11 = l1.rpc.decode('lntb30m1pw2f2yspp5s59w4a0kjecw3zyexm7zur8l8n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zqun9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2ursdae8gxqruyqvzddp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8gu2etcvsym36pdjpz04wm9nn96f9ntc3t3h5r08pe9d62p3js5wt5rkurqnrl7zkj2fjpvl3rmn7wwazt80letwxlm22hngu8n88g7hsp542qpl') + # Made with "devtools/bolt11-cli encode 41bfd2660762506c9933ade59f1debf7e6495b10c14a92dbcd2d623da2507d3d s=0000000000000000000000000000000000000000000000000000000000000000 timestamp=1554294928 p=850aeaf5f69670e8889936fc2e0cff3ceb0c3b5eab8f04ae57767118db673a91 d='Payment request with multipart support' x=28800 118=0d011a07081c011a051c1713020e0912051819121c0c0911061017030e0d191a07001803100e090f0d151a16181d03090e011017041d011f0e1110160e0f0b0d0e151607081a0b100c05190708" amount=3000000000 currency=tb + b11 = l1.rpc.decode('lntb30m1pw2f2yssp5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp5s59w4a0kjecw3zyexm7zur8l8n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zqun9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2ursdae8gxqruyqcqpjvzddp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8g02pjf6p8tqx0fy6vmxnrvsjmnx7us54ml9uk0927wy4mq5wne8pr6g6mmew03y60lt5mvzyksf7yjwq4qxlun5cca9amgkxggr2xkvcqukuyuf') assert b11['type'] == 'bolt11 invoice' assert b11['currency'] == 'tb' assert b11['created_at'] == 1554294928 assert b11['payment_hash'] == '850aeaf5f69670e8889936fc2e0cff3ceb0c3b5eab8f04ae57767118db673a91' assert b11['description'] == 'Payment request with multipart support' assert b11['expiry'] == 28800 - assert b11['payee'] == '02330d13587b67a85c0a36ea001c4dba14bcd48dda8988f7303275b040bffb6abd' + assert b11['payee'] == '0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518' assert b11['min_final_cltv_expiry'] == 18 extra = only_one(b11['extra']) assert extra['tag'] == 'v' assert extra['data'] == 'dp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8g' - assert b11['signature'] == '3045022100e2b2bc3204dc7416c8227d5db2ce65d24b35e22b8de8379c392b74a0c650a397022041db8304c7ff0ad25264167e23dcfce7744b3bff95b8dfda9579a38799ce8f5e' + assert b11['signature'] == '304402207a8324e827580cf4934cd9a636425b99bdc852bbf97967955e712bb051d3c9c202203d235bde5cf8934ffae9b60896827c49381501bfc9d318e97bb458c840d46b33' assert 'fallbacks' not in b11 assert 'routes' not in b11 diff --git a/tests/test_pay.py b/tests/test_pay.py index f6531d85b439..6963a93e84e0 100644 --- a/tests/test_pay.py +++ b/tests/test_pay.py @@ -814,26 +814,30 @@ def test_decode(node_factory): # BOLT #11: # > ### Please make a donation of any amount using payment_hash 0001020304050607080900010203040506070809000102030405060708090102 to me @03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad - # > lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w + # > lnbc1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq9qrsgq357wnc5r2ueh7ck6q93dj32dlqnls087fxdwk8qakdyafkq3yap9us6v52vjjsrvywa6rt52cm9r9zqt8r2t7mlcwspyetp5h2tztugp9lfyql # # Breakdown: # # * `lnbc`: prefix, lightning on bitcoin mainnet # * `1`: Bech32 separator # * `pvjluez`: timestamp (1496314658) + # * `s`: payment secret + # * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) + # * `zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs`: payment secret 1111111111111111111111111111111111111111111111111111111111111111 # * `p`: payment hash # * `p5`: `data_length` (`p` = 1, `5` = 20. 1 * 32 + 20 == 52) # * `qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypq`: payment hash 0001020304050607080900010203040506070809000102030405060708090102 # * `d`: short description # * `pl`: `data_length` (`p` = 1, `l` = 31. 1 * 32 + 31 == 63) # * `2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq`: 'Please consider supporting this project' - # * `32vjcgqxyuj7nqphl3xmmhls2rkl3t97uan4j0xa87gj5779czc8p0z58zf5wpt9ggem6adl64cvawcxlef9djqwp2jzzfvs272504sp`: signature - # * `0lkg3c`: Bech32 checksum + # * `357wnc5r2ueh7ck6q93dj32dlqnls087fxdwk8qakdyafkq3yap9us6v52vjjsrvywa6rt52cm9r9zqt8r2t7mlcwspyetp5h2tztugp`: signature + # * `9lfyql`: Bech32 checksum b11 = l1.rpc.decode( - 'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqd' - 'pl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rk' - 'x3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatg' - 'ddc6k63n7erqz25le42c4u4ecky03ylcqca784w' + 'lnbc1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3z' + 'ygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pk' + 'x2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq9qrs' + 'gq357wnc5r2ueh7ck6q93dj32dlqnls087fxdwk8qakdyafkq3yap9us6v52vjjs' + 'rvywa6rt52cm9r9zqt8r2t7mlcwspyetp5h2tztugp9lfyql' ) assert b11['currency'] == 'bc' assert b11['created_at'] == 1496314658 @@ -843,8 +847,8 @@ def test_decode(node_factory): assert b11['payee'] == '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad' # BOLT #11: - # > ### Please send $3 for a cup of coffee to the same peer, within 1 minute - # > lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspfj9srp + # > ### Please send $3 for a cup of coffee to the same peer, within one minute + # > lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpu9qrsgquk0rl77nj30yxdy8j9vdx85fkpmdla2087ne0xh8nhedh8w27kyke0lp53ut353s06fv3qfegext0eh0ymjpf39tuven09sam30g4vgpfna3rh # # Breakdown: # @@ -852,6 +856,7 @@ def test_decode(node_factory): # * `2500u`: amount (2500 micro-bitcoin) # * `1`: Bech32 separator # * `pvjluez`: timestamp (1496314658) + # * `s`: payment secret... # * `p`: payment hash... # * `d`: short description # * `q5`: `data_length` (`q` = 0, `5` = 20. 0 * 32 + 20 == 20) @@ -859,13 +864,13 @@ def test_decode(node_factory): # * `x`: expiry time # * `qz`: `data_length` (`q` = 0, `z` = 2. 0 * 32 + 2 == 2) # * `pu`: 60 seconds (`p` = 1, `u` = 28. 1 * 32 + 28 == 60) - # * `azh8qt5w7qeewkmxtv55khqxvdfs9zzradsvj7rcej9knpzdwjykcq8gv4v2dl705pjadhpsc967zhzdpuwn5qzjm0s4hqm2u0vuhhqq`: signature - # * `7vc09u`: Bech32 checksum + # * `uk0rl77nj30yxdy8j9vdx85fkpmdla2087ne0xh8nhedh8w27kyke0lp53ut353s06fv3qfegext0eh0ymjpf39tuven09sam30g4vgp`: signature + # * `fna3rh`: Bech32 checksum b11 = l1.rpc.decode( - 'lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqf' - 'qypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw5hydlzf03qdgm2hdq27cq' - 'v3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rsp' - 'fj9srp' + 'lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3' + 'zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxa' + 'tsyp3k7enxv4jsxqzpu9qrsgquk0rl77nj30yxdy8j9vdx85fkpmdla2087ne0xh8nhe' + 'dh8w27kyke0lp53ut353s06fv3qfegext0eh0ymjpf39tuven09sam30g4vgpfna3rh' ) assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(2500 * 10**11 // 1000000) @@ -875,9 +880,46 @@ def test_decode(node_factory): assert b11['expiry'] == 60 assert b11['payee'] == '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad' + # BOLT #11: + # > ### Please send 0.0025 BTC for a cup of nonsense (ナンセンス 1杯) to the same peer, within one minute + # > lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpu9qrsgqhtjpauu9ur7fw2thcl4y9vfvh4m9wlfyz2gem29g5ghe2aak2pm3ps8fdhtceqsaagty2vph7utlgj48u0ged6a337aewvraedendscp573dxr + # + # Breakdown: + # + # * `lnbc`: prefix, Lightning on Bitcoin mainnet + # * `2500u`: amount (2500 micro-bitcoin) + # * `1`: Bech32 separator + # * `pvjluez`: timestamp (1496314658) + # * `s`: payment secret... + # * `p`: payment hash... + # * `d`: short description + # * `pq`: `data_length` (`p` = 1, `q` = 0; 1 * 32 + 0 == 32) + # * `uwpc4curk03c9wlrswe78q4eyqc7d8d0`: 'ナンセンス 1杯' + # * `x`: expiry time + # * `qz`: `data_length` (`q` = 0, `z` = 2; 0 * 32 + 2 == 2) + # * `pu`: 60 seconds (`p` = 1, `u` = 28; 1 * 32 + 28 == 60) + # * `9`: features + # * `qr`: `data_length` (`q` = 0, `r` = 3; 0 * 32 + 3 == 3) + # * `sgq`: b100000100000000 + # * `htjpauu9ur7fw2thcl4y9vfvh4m9wlfyz2gem29g5ghe2aak2pm3ps8fdhtceqsaagty2vph7utlgj48u0ged6a337aewvraedendscp`: signature + # * `573dxr`: Bech32 checksum + b11 = l1.rpc.decode( + 'lnbc2500u1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3' + 'zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqd' + 'pquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpu9qrsgqhtjpauu9ur7fw2thcl4' + 'y9vfvh4m9wlfyz2gem29g5ghe2aak2pm3ps8fdhtceqsaagty2vph7utlgj48u0g' + 'ed6a337aewvraedendscp573dxr' + ) + assert b11['currency'] == 'bc' + assert b11['amount_msat'] == Millisatoshi(str(0.0025 * 10**11) + 'msat') + assert b11['created_at'] == 1496314658 + assert b11['payment_hash'] == '0001020304050607080900010203040506070809000102030405060708090102' + assert b11['expiry'] == 60 + assert b11['payee'] == '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad' + # BOLT #11: # > ### Now send $24 for an entire list of things (hashed) - # > lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqscc6gd6ql3jrc5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf4sefvf9sygkshp5zfem29trqq2yxxz7 + # > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs9qrsgq7ea976txfraylvgzuxs8kgcw23ezlrszfnh8r6qtfpr6cxga50aj6txm9rxrydzd06dfeawfk6swupvz4erwnyutnjq7x39ymw6j38gp7ynn44 # # Breakdown: # @@ -886,16 +928,21 @@ def test_decode(node_factory): # * `1`: Bech32 separator # * `pvjluez`: timestamp (1496314658) # * `p`: payment hash... + # * `s`: payment secret... # * `h`: tagged field: hash of description # * `p5`: `data_length` (`p` = 1, `5` = 20. 1 * 32 + 20 == 52) # * `8yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs`: SHA256 of 'One piece of chocolate cake, one icecream cone, one pickle, one slice of swiss cheese, one slice of salami, one lollypop, one piece of cherry pie, one sausage, one cupcake, and one slice of watermelon' - # * `vjfls3ljx9e93jkw0kw40yxn4pevgzflf83qh2852esjddv4xk4z70nehrdcxa4fk0t6hlcc6vrxywke6njenk7yzkzw0quqcwxphkcp`: signature - # * `vam37w`: Bech32 checksum + # * `9`: features + # * `qr`: `data_length` (`q` = 0, `r` = 3; 0 * 32 + 3 == 3) + # * `sgq`: b100000100000000 + # * `7ea976txfraylvgzuxs8kgcw23ezlrszfnh8r6qtfpr6cxga50aj6txm9rxrydzd06dfeawfk6swupvz4erwnyutnjq7x39ymw6j38gp`: signature + # * `7ynn44`: Bech32 checksum b11 = l1.rpc.decode( - 'lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqy' - 'pqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqscc6gd6ql3jr' - 'c5yzme8v4ntcewwz5cnw92tz0pc8qcuufvq7khhr8wpald05e92xw006sq94mg8v2ndf' - '4sefvf9sygkshp5zfem29trqq2yxxz7' + 'lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zy' + 'g3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp5' + '8yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqs9qrsgq7ea976' + 'txfraylvgzuxs8kgcw23ezlrszfnh8r6qtfpr6cxga50aj6txm9rxrydzd06dfea' + 'wfk6swupvz4erwnyutnjq7x39ymw6j38gp7ynn44' ) assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(str(20 * 10**11 // 1000) + 'msat') @@ -905,7 +952,7 @@ def test_decode(node_factory): assert b11['payee'] == '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad' # > ### The same, on testnet, with a fallback address mk2QpYatsKicvFVuTAQLBryyccRXMUaGHP - # > lntb20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfpp3x9et2e20v6pu37c5d9vax37wxq72un98kmzzhznpurw9sgl2v0nklu2g4d0keph5t7tj9tcqd8rexnd07ux4uv2cjvcqwaxgj7v4uwn5wmypjd5n69z2xm3xgksg28nwht7f6zspwp3f9t + # > lntb20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfpp3x9et2e20v6pu37c5d9vax37wxq72un989qrsgqdj545axuxtnfemtpwkc45hx9d2ft7x04mt8q7y6t0k2dge9e7h8kpy9p34ytyslj3yu569aalz2xdk8xkd7ltxqld94u8h2esmsmacgpghe9k8 # # Breakdown: # @@ -913,6 +960,7 @@ def test_decode(node_factory): # * `20m`: amount (20 milli-bitcoin) # * `1`: Bech32 separator # * `pvjluez`: timestamp (1496314658) + # * `s`: payment secret... # * `p`: payment hash... # * `f`: tagged field: fallback address # * `pp`: `data_length` (`p` = 1. 1 * 32 + 1 == 33) @@ -921,7 +969,12 @@ def test_decode(node_factory): # * `qh84fmvn2klvglsjxfy0vq2mz6t9kjfzlxfwgljj35w2kwa60qv49k7jlsgx43yhs9nuutllkhhnt090mmenuhp8ue33pv4klmrzlcqp`: signature # * `us2s2r`: Bech32 checksum b11 = l1.rpc.decode( - 'lntb20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfpp3x9et2e20v6pu37c5d9vax37wxq72un98kmzzhznpurw9sgl2v0nklu2g4d0keph5t7tj9tcqd8rexnd07ux4uv2cjvcqwaxgj7v4uwn5wmypjd5n69z2xm3xgksg28nwht7f6zspwp3f9t' + 'lntb20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3z' + 'yg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsp' + 'p5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfpp3x9et2' + 'e20v6pu37c5d9vax37wxq72un989qrsgqdj545axuxtnfemtpwkc45hx9d2ft7x' + '04mt8q7y6t0k2dge9e7h8kpy9p34ytyslj3yu569aalz2xdk8xkd7ltxqld94u8' + 'h2esmsmacgpghe9k8' ) assert b11['currency'] == 'tb' assert b11['amount_msat'] == Millisatoshi(20 * 10**11 // 1000) @@ -934,7 +987,7 @@ def test_decode(node_factory): assert b11['fallbacks'][0]['addr'] == 'mk2QpYatsKicvFVuTAQLBryyccRXMUaGHP' # > ### On mainnet, with fallback address 1RustyRX2oai4EYYDpQGWvEL62BBGqN9T with extra routing info to go via nodes 029e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255 then 039e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255 - # > lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsfpp3qjmp7lwpagxun9pygexvgpjdc4jdj85fr9yq20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqpqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqgqqqqq7qqzqj9n4evl6mr5aj9f58zp6fyjzup6ywn3x6sk8akg5v4tgn2q8g4fhx05wf6juaxu9760yp46454gpg5mtzgerlzezqcqvjnhjh8z3g2qqdhhwkj + # > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsfpp3qjmp7lwpagxun9pygexvgpjdc4jdj85fr9yq20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqpqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqgqqqqq7qqzq9qrsgqdfjcdk6w3ak5pca9hwfwfh63zrrz06wwfya0ydlzpgzxkn5xagsqz7x9j4jwe7yj7vaf2k9lqsdk45kts2fd0fkr28am0u4w95tt2nsq76cqw0 # # Breakdown: # @@ -942,6 +995,7 @@ def test_decode(node_factory): # * `20m`: amount (20 milli-bitcoin) # * `1`: Bech32 separator # * `pvjluez`: timestamp (1496314658) + # * `s`: payment secret... # * `p`: payment hash... # * `h`: tagged field: hash of description... # * `f`: tagged field: fallback address @@ -951,9 +1005,10 @@ def test_decode(node_factory): # * `r`: tagged field: route information # * `9y`: `data_length` (`9` = 5, `y` = 4. 5 * 32 + 4 = 164) # `q20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqqqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqqqqqqq7qqzq`: pubkey `029e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255`, `short_channel_id` 0102030405060708, `fee_base_msat` 1 millisatoshi, `fee_proportional_millionths` 20, `cltv_expiry_delta` 3. pubkey `039e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255`, `short_channel_id` 030405060708090a, `fee_base_msat` 2 millisatoshi, `fee_proportional_millionths` 30, `cltv_expiry_delta` 4. - # * `j9n4evl6mr5aj9f58zp6fyjzup6ywn3x6sk8akg5v4tgn2q8g4fhx05wf6juaxu9760yp46454gpg5mtzgerlzezqcqvjnhjh8z3g2qq`: signature - # * `dhhwkj`: Bech32 checksum - b11 = l1.rpc.decode('lnbc20m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsfpp3qjmp7lwpagxun9pygexvgpjdc4jdj85fr9yq20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqpqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqgqqqqq7qqzqj9n4evl6mr5aj9f58zp6fyjzup6ywn3x6sk8akg5v4tgn2q8g4fhx05wf6juaxu9760yp46454gpg5mtzgerlzezqcqvjnhjh8z3g2qqdhhwkj') + # * `9`: features... + # * `dfjcdk6w3ak5pca9hwfwfh63zrrz06wwfya0ydlzpgzxkn5xagsqz7x9j4jwe7yj7vaf2k9lqsdk45kts2fd0fkr28am0u4w95tt2nsq`: signature + # * `76cqw0`: Bech32 checksum + b11 = l1.rpc.decode('lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqsfpp3qjmp7lwpagxun9pygexvgpjdc4jdj85fr9yq20q82gphp2nflc7jtzrcazrra7wwgzxqc8u7754cdlpfrmccae92qgzqvzq2ps8pqqqqqqpqqqqq9qqqvpeuqafqxu92d8lr6fvg0r5gv0heeeqgcrqlnm6jhphu9y00rrhy4grqszsvpcgpy9qqqqqqgqqqqq7qqzq9qrsgqdfjcdk6w3ak5pca9hwfwfh63zrrz06wwfya0ydlzpgzxkn5xagsqz7x9j4jwe7yj7vaf2k9lqsdk45kts2fd0fkr28am0u4w95tt2nsq76cqw0') assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(20 * 10**11 // 1000) assert b11['created_at'] == 1496314658 @@ -980,7 +1035,7 @@ def test_decode(node_factory): assert b11['routes'][0][1]['cltv_expiry_delta'] == 4 # > ### On mainnet, with fallback (P2SH) address 3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX - # > lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppj3a24vwu6r8ejrss3axul8rxldph2q7z9kmrgvr7xlaqm47apw3d48zm203kzcq357a4ls9al2ea73r8jcceyjtya6fu5wzzpe50zrge6ulk4nvjcpxlekvmxl6qcs9j3tz0469gq5g658y + # > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppj3a24vwu6r8ejrss3axul8rxldph2q7z99qrsgqz6qsgww34xlatfj6e3sngrwfy3ytkt29d2qttr8qz2mnedfqysuqypgqex4haa2h8fx3wnypranf3pdwyluftwe680jjcfp438u82xqphf75ym # # Breakdown: # @@ -993,9 +1048,9 @@ def test_decode(node_factory): # * `pp`: `data_length` (`p` = 1. 1 * 32 + 1 == 33) # * `j3a24vwu6r8ejrss3axul8rxldph2q7z9`: `j` = 18, so P2SH address # * `h`: tagged field: hash of description... - # * `2jhz8j78lv2jynuzmz6g8ve53he7pheeype33zlja5azae957585uu7x59w0f2l3rugyva6zpu394y4rh093j6wxze0ldsvk757a9msq`: signature - # * `mf9swh`: Bech32 checksum - b11 = l1.rpc.decode('lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppj3a24vwu6r8ejrss3axul8rxldph2q7z9kmrgvr7xlaqm47apw3d48zm203kzcq357a4ls9al2ea73r8jcceyjtya6fu5wzzpe50zrge6ulk4nvjcpxlekvmxl6qcs9j3tz0469gq5g658y') + # * `z6qsgww34xlatfj6e3sngrwfy3ytkt29d2qttr8qz2mnedfqysuqypgqex4haa2h8fx3wnypranf3pdwyluftwe680jjcfp438u82xqp`: signature + # * `hf75ym`: Bech32 checksum + b11 = l1.rpc.decode('lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppj3a24vwu6r8ejrss3axul8rxldph2q7z99qrsgqz6qsgww34xlatfj6e3sngrwfy3ytkt29d2qttr8qz2mnedfqysuqypgqex4haa2h8fx3wnypranf3pdwyluftwe680jjcfp438u82xqphf75ym') assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(20 * 10**11 // 1000) assert b11['created_at'] == 1496314658 @@ -1007,7 +1062,7 @@ def test_decode(node_factory): assert b11['fallbacks'][0]['addr'] == '3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX' # > ### On mainnet, with fallback (P2WPKH) address bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 - # > lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppqw508d6qejxtdg4y5r3zarvary0c5xw7kepvrhrm9s57hejg0p662ur5j5cr03890fa7k2pypgttmh4897d3raaq85a293e9jpuqwl0rnfuwzam7yr8e690nd2ypcq9hlkdwdvycqa0qza8 + # > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppqw508d6qejxtdg4y5r3zarvary0c5xw7k9qrsgqt29a0wturnys2hhxpner2e3plp6jyj8qx7548zr2z7ptgjjc7hljm98xhjym0dg52sdrvqamxdezkmqg4gdrvwwnf0kv2jdfnl4xatsqmrnsse # # * `lnbc`: prefix, lightning on bitcoin mainnet # * `20m`: amount (20 milli-bitcoin) @@ -1019,9 +1074,9 @@ def test_decode(node_factory): # * `q`: 0, so witness version 0. # * `qw508d6qejxtdg4y5r3zarvary0c5xw7k`: 160 bits = P2WPKH. # * `h`: tagged field: hash of description... - # * `gw6tk8z0p0qdy9ulggx65lvfsg3nxxhqjxuf2fvmkhl9f4jc74gy44d5ua9us509prqz3e7vjxrftn3jnk7nrglvahxf7arye5llphgq`: signature - # * `qdtpa4`: Bech32 checksum - b11 = l1.rpc.decode('lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppqw508d6qejxtdg4y5r3zarvary0c5xw7kepvrhrm9s57hejg0p662ur5j5cr03890fa7k2pypgttmh4897d3raaq85a293e9jpuqwl0rnfuwzam7yr8e690nd2ypcq9hlkdwdvycqa0qza8') + # * `t29a0wturnys2hhxpner2e3plp6jyj8qx7548zr2z7ptgjjc7hljm98xhjym0dg52sdrvqamxdezkmqg4gdrvwwnf0kv2jdfnl4xatsq`: signature + # * `mrnsse`: Bech32 checksum + b11 = l1.rpc.decode('lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfppqw508d6qejxtdg4y5r3zarvary0c5xw7k9qrsgqt29a0wturnys2hhxpner2e3plp6jyj8qx7548zr2z7ptgjjc7hljm98xhjym0dg52sdrvqamxdezkmqg4gdrvwwnf0kv2jdfnl4xatsqmrnsse') assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(20 * 10**11 // 1000) assert b11['created_at'] == 1496314658 @@ -1033,7 +1088,7 @@ def test_decode(node_factory): assert b11['fallbacks'][0]['addr'] == 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4' # > ### On mainnet, with fallback (P2WSH) address bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3 - # > lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfp4qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q28j0v3rwgy9pvjnd48ee2pl8xrpxysd5g44td63g6xcjcu003j3qe8878hluqlvl3km8rm92f5stamd3jw763n3hck0ct7p8wwj463cql26ava + # > lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfp4qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q9qrsgq9vlvyj8cqvq6ggvpwd53jncp9nwc47xlrsnenq2zp70fq83qlgesn4u3uyf4tesfkkwwfg3qs54qe426hp3tz7z6sweqdjg05axsrjqp9yrrwc # # * `lnbc`: prefix, lightning on bitcoin mainnet # * `20m`: amount (20 milli-bitcoin) @@ -1045,9 +1100,9 @@ def test_decode(node_factory): # * `q`: 0, so witness version 0. # * `rp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q`: 260 bits = P2WSH. # * `h`: tagged field: hash of description... - # * `5yps56lmsvgcrf476flet6js02m93kgasews8q3jhtp7d6cqckmh70650maq4u65tk53ypszy77v9ng9h2z3q3eqhtc3ewgmmv2grasp`: signature - # * `akvd7y`: Bech32 checksum - b11 = l1.rpc.decode('lnbc20m1pvjluezhp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfp4qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q28j0v3rwgy9pvjnd48ee2pl8xrpxysd5g44td63g6xcjcu003j3qe8878hluqlvl3km8rm92f5stamd3jw763n3hck0ct7p8wwj463cql26ava') + # * `9vlvyj8cqvq6ggvpwd53jncp9nwc47xlrsnenq2zp70fq83qlgesn4u3uyf4tesfkkwwfg3qs54qe426hp3tz7z6sweqdjg05axsrjqp`: signature + # * `9yrrwc`: Bech32 checksum + b11 = l1.rpc.decode('lnbc20m1pvjluezsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygshp58yjmdan79s6qqdhdzgynm4zwqd5d7xmw5fk98klysy043l2ahrqspp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqfp4qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q9qrsgq9vlvyj8cqvq6ggvpwd53jncp9nwc47xlrsnenq2zp70fq83qlgesn4u3uyf4tesfkkwwfg3qs54qe426hp3tz7z6sweqdjg05axsrjqp9yrrwc') assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(20 * 10**11 // 1000) assert b11['created_at'] == 1496314658 @@ -1058,8 +1113,8 @@ def test_decode(node_factory): assert b11['fallbacks'][0]['type'] == 'P2WSH' assert b11['fallbacks'][0]['addr'] == 'bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3' - # > ### Please send $30 for coffee beans to the same peer, which supports features 1 and 9 - # > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9qzsze992adudgku8p05pstl6zh7av6rx2f297pv89gu5q93a0hf3g7lynl3xq56t23dpvah6u7y9qey9lccrdml3gaqwc6nxsl5ktzm464sq73t7cl + # > ### Please send $30 for coffee beans to the same peer, which supports features 8, 14 and 99, using secret 0x1111111111111111111111111111111111111111111111111111111111111111 + # > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqqsgq2a25dxl5hrntdtn6zvydt7d66hyzsyhqs4wdynavys42xgl6sgx9c4g7me86a27t07mdtfry458rtjr0v92cnmswpsjscgt2vcse3sgpz3uapa # # Breakdown: # @@ -1074,9 +1129,9 @@ def test_decode(node_factory): # * `9`: features # * `qz`: `data_length` (`q` = 0, `z` = 2; 0 * 32 + 2 == 2) # * `sz`: b1000000010 - # * `e992adudgku8p05pstl6zh7av6rx2f297pv89gu5q93a0hf3g7lynl3xq56t23dpvah6u7y9qey9lccrdml3gaqwc6nxsl5ktzm464sq`: signature - # * `73t7cl`: Bech32 checksum - b11 = l1.rpc.decode('lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9qzsze992adudgku8p05pstl6zh7av6rx2f297pv89gu5q93a0hf3g7lynl3xq56t23dpvah6u7y9qey9lccrdml3gaqwc6nxsl5ktzm464sq73t7cl') + # * `2a25dxl5hrntdtn6zvydt7d66hyzsyhqs4wdynavys42xgl6sgx9c4g7me86a27t07mdtfry458rtjr0v92cnmswpsjscgt2vcse3sgp`: signature + # * `z3uapa`: Bech32 checksum + b11 = l1.rpc.decode('lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqqsgq2a25dxl5hrntdtn6zvydt7d66hyzsyhqs4wdynavys42xgl6sgx9c4g7me86a27t07mdtfry458rtjr0v92cnmswpsjscgt2vcse3sgpz3uapa') assert b11['currency'] == 'bc' assert b11['amount_msat'] == Millisatoshi(25 * 10**11 // 1000) assert b11['created_at'] == 1496314658 @@ -1084,10 +1139,10 @@ def test_decode(node_factory): assert b11['description'] == 'coffee beans' assert b11['expiry'] == 3600 assert b11['payee'] == '03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad' - assert b11['features'] == '0202' + assert b11['features'] == '08000000000000000000004100' # > # Same, but using invalid unknown feature 100 - # > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9q4pqqqqqqqqqqqqqqqqqqszk3ed62snp73037h4py4gry05eltlp0uezm2w9ajnerhmxzhzhsu40g9mgyx5v3ad4aqwkmvyftzk4k9zenz90mhjcy9hcevc7r3lx2sphzfxz7 + # > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q4psqqqqqqqqqqqqqqqqsgqtqyx5vggfcsll4wu246hz02kp85x4katwsk9639we5n5yngc3yhqkm35jnjw4len8vrnqnf5ejh0mzj9n3vz2px97evektfm2l6wqccp3y7372 # # Breakdown: # @@ -1099,13 +1154,16 @@ def test_decode(node_factory): # * `d`: short description # * `q5`: `data_length` (`q` = 0, `5` = 20; 0 * 32 + 20 == 20) # * `vdhkven9v5sxyetpdees`: 'coffee beans' + # * `s`: payment secret + # * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) + # * `zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs`: 0x1111111111111111111111111111111111111111111111111111111111111111 # * `9`: features # * `q4`: `data_length` (`q` = 0, `4` = 21; 0 * 32 + 21 == 21) # * `pqqqqqqqqqqqqqqqqqqsz`: b00001...(90 zeroes)...1000000010 # * `k3ed62snp73037h4py4gry05eltlp0uezm2w9ajnerhmxzhzhsu40g9mgyx5v3ad4aqwkmvyftzk4k9zenz90mhjcy9hcevc7r3lx2sp`: signature # * `hzfxz7`: Bech32 checksum with pytest.raises(RpcError, match='unknown feature.*100'): - l1.rpc.decode('lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9q4pqqqqqqqqqqqqqqqqqqszk3ed62snp73037h4py4gry05eltlp0uezm2w9ajnerhmxzhzhsu40g9mgyx5v3ad4aqwkmvyftzk4k9zenz90mhjcy9hcevc7r3lx2sphzfxz7') + l1.rpc.decode('lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q4psqqqqqqqqqqqqqqqqsgqtqyx5vggfcsll4wu246hz02kp85x4katwsk9639we5n5yngc3yhqkm35jnjw4len8vrnqnf5ejh0mzj9n3vz2px97evektfm2l6wqccp3y7372') # Example of an invoice without a multiplier suffix to the amount. This # should then be interpreted as 7 BTC according to the spec: @@ -1114,7 +1172,7 @@ def test_decode(node_factory): # `multiplier` letter. The unit encoded here is the 'social' convention of # a payment unit -- in the case of Bitcoin the unit is 'bitcoin' NOT # satoshis. - b11 = "lnbcrt71p0g4u8upp5xn4k45tsp05akmn65s5k2063d5fyadhjse9770xz5sk7u4x6vcmqdqqcqzynxqrrssx94cf4p727jamncsvcd8m99n88k423ruzq4dxwevfatpp5gx2mksj2swshjlx4pe3j5w9yed5xjktrktzd3nc2a04kq8yu84l7twhwgpxjn3pw" + b11 = "lnbcrt71p5xyxdlsp5qz4jwtz5qarf2rl245hedz2lx6rt8l2mlzppm0hlngwmjj56w0vspp5rgnn0yma8x4pq4fmk3nptxglwn64qd9uw2txs32vc5zcq44lcptqdqqxqyjw5qcqp99qxpqysgqvrw0hwfrp63wrxxdwlezam6f2qlkpf8vgd30mecs8hh254sf9wkzyz3pjdtsxy0s4fntcau7aav8nvf8w9hyv36u5l9nudnekvdk27gp66ndw9" b11 = l1.rpc.decode(b11) sat_per_btc = 10**8 assert(b11['amount_msat'] == 7 * sat_per_btc * 1000) @@ -2903,7 +2961,7 @@ def test_pay_no_secret(node_factory, bitcoind): # Produced from old version (no secret!) inv_nosecret = 'lnbcrt1u1pwue4vapp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjsdqaw3jhxazlwpshjhmwda0hxetrwfjhgxq8pmnt9qqcqp9570xsjyykvssa6ty8fjth6f2y8h09myngad9utesttwjwclv95fz3lgd402f9e5yzpnxmkypg55rkvpg522gcz4ymsjl2w3m4jhw4jsp55m7tl' - with pytest.raises(RpcError, match=r"INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS.*'erring_index': 1"): + with pytest.raises(RpcError, match=r"Invalid bolt11: Missing required payment secret \(s field\)"): l1.rpc.pay(inv_nosecret) diff --git a/tests/test_runes.py b/tests/test_runes.py index 32202d8b6957..4c080a8bae39 100644 --- a/tests/test_runes.py +++ b/tests/test_runes.py @@ -822,7 +822,7 @@ def test_rune_bolt11_parse(node_factory): method='pay', params={'bolt11': inv}) # Node comparison failure - other_inv = 'lntb30m1pw2f2yspp5s59w4a0kjecw3zyexm7zur8l8n4scw674w8sftjhwec33km882gsdpa2pshjmt9de6zqun9w96k2um5ypmkjargypkh2mr5d9cxzun5ypeh2ursdae8gxqruyqvzddp68gup69uhnzwfj9cejuvf3xshrwde68qcrswf0d46kcarfwpshyaplw3skw0tdw4k8g6tsv9e8gu2etcvsym36pdjpz04wm9nn96f9ntc3t3h5r08pe9d62p3js5wt5rkurqnrl7zkj2fjpvl3rmn7wwazt80letwxlm22hngu8n88g7hsp542qpl' + other_inv = 'lnbcrt1u1pwuedm6pp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjsdqaw3jhxazlwpshjhmwda0hxetrwfjhgxq8pmnt9qqcqp9sp52au0npwmw4xxv2rfrat04kh9p3jlmklgavhfxqukx0l05pw5tccs9qypqsqa286dmt2xh3jy8cd8ndeyr845q8a7nhgjkerdqjns76jraux6j25ddx9f5k5r2ey0kk942x3uhaff66794kyjxxcd48uevf7p6ja53gqjj5ur7' with pytest.raises(RpcError, match='Not permitted: invoice parameter bolt11_node is not equal to ' + l1.info['id']): l1.rpc.checkrune(nodeid=l1.info['id'], rune=rune_node_l1, diff --git a/wire/extracted_peer_07_peer_storage.patch b/wire/extracted_peer_07_peer_storage.patch deleted file mode 100644 index 19e1b80f673b..000000000000 --- a/wire/extracted_peer_07_peer_storage.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- wire/peer_wire.csv 2022-07-18 13:49:29.079542016 +0530 -+++ - 2022-07-18 13:58:17.706696582 +0530 -@@ -249,7 +249,11 @@ - msgdata,pong,byteslen,u16, - msgdata,pong,ignored,byte,byteslen - msgtype,peer_storage,7 -+msgdata,peer_storage,len,u16, -+msgdata,peer_storage,blob,byte,len - msgtype,peer_storage_retrieval,9 -+msgdata,peer_storage_retrieval,len,u16, -+msgdata,peer_storage_retrieval,blob,byte,len - tlvtype,n1,tlv1,1 - tlvdata,n1,tlv1,amount_msat,tu64, - tlvtype,n1,tlv2,2 diff --git a/wire/extracted_peer_10_upgradable.patch b/wire/extracted_peer_10_upgradable.patch deleted file mode 100644 index dc4209c8b54b..000000000000 --- a/wire/extracted_peer_10_upgradable.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- wire/peer_wire.csv 2021-05-09 15:44:59.166135652 +0930 -+++ wire/peer_wire.csv.raw 2021-05-11 09:59:31.695459756 +0930 -@@ -244,8 +140,18 @@ - msgdata,channel_reestablish,next_revocation_number,u64, - msgdata,channel_reestablish,your_last_per_commitment_secret,byte,32 - msgdata,channel_reestablish,my_current_per_commitment_point,point, - tlvtype,channel_reestablish_tlvs,next_funding,0 - tlvdata,channel_reestablish_tlvs,next_funding,next_funding_txid,sha256, -+tlvtype,channel_reestablish_tlvs,next_funding,0 -+tlvdata,channel_reestablish_tlvs,next_funding,next_funding_txid,sha256, -+tlvtype,channel_reestablish_tlvs,next_to_send,1 -+tlvdata,channel_reestablish_tlvs,next_to_send,commitment_number,tu64, -+tlvtype,channel_reestablish_tlvs,desired_channel_type,3 -+tlvdata,channel_reestablish_tlvs,desired_channel_type,type,byte,... -+tlvtype,channel_reestablish_tlvs,current_channel_type,5 -+tlvdata,channel_reestablish_tlvs,current_channel_type,type,byte,... -+tlvtype,channel_reestablish_tlvs,upgradable_channel_type,7 -+tlvdata,channel_reestablish_tlvs,upgradable_channel_type,type,byte,... - msgtype,announcement_signatures,259 - msgdata,announcement_signatures,channel_id,channel_id, - msgdata,announcement_signatures,short_channel_id,short_channel_id, diff --git a/wire/extracted_peer_11_splice.patch b/wire/extracted_peer_11_splice.patch index 0036a5cbd887..13190f572f94 100644 --- a/wire/extracted_peer_11_splice.patch +++ b/wire/extracted_peer_11_splice.patch @@ -2,7 +2,7 @@ diff --git a/wire/peer_wire.csv b/wire/peer_wire.csv index 5b5803afc..41b57e85b 100644 --- a/wire/peer_wire.csv +++ b/wire/peer_wire.csv -@@ -206,6 +206,18 @@ subtypedata,lease_rates,channel_fee_max_base_msat,tu32, +@@ -206,6 +206,19 @@ subtypedata,lease_rates,channel_fee_max_base_msat,tu32, msgtype,stfu,2 msgdata,stfu,channel_id,channel_id, msgdata,stfu,initiator,u8, @@ -18,6 +18,7 @@ index 5b5803afc..41b57e85b 100644 +msgdata,splice_ack,funding_pubkey,point, +msgtype,splice_locked,77, +msgdata,splice_locked,channel_id,channel_id, ++msgdata,splice_locked,splice_txid,sha256, msgtype,shutdown,38 msgdata,shutdown,channel_id,channel_id, msgdata,shutdown,len,u16, @@ -28,7 +29,18 @@ index 5b5803afc..41b57e85b 100644 +msgdata,commitment_signed,splice_channel_id,commitment_signed_tlvs, +tlvtype,commitment_signed_tlvs,splice_info,0 +tlvdata,commitment_signed_tlvs,splice_info,batch_size,u16, -+tlvdata,commitment_signed_tlvs,splice_info,funding_txid,channel_id, ++tlvdata,commitment_signed_tlvs,splice_info,funding_txid,sha256, msgtype,revoke_and_ack,133 msgdata,revoke_and_ack,channel_id,channel_id, msgdata,revoke_and_ack,per_commitment_secret,byte,32 +@@ -319,6 +320,10 @@ msgdata,channel_reestablish,your_last_per_commitment_secret,byte,32 + msgdata,channel_reestablish,my_current_per_commitment_point,point, + tlvtype,channel_reestablish_tlvs,next_funding,0 + tlvdata,channel_reestablish_tlvs,next_funding,next_funding_txid,sha256, ++tlvtype,channel_reestablish_tlvs,your_last_funding_locked_txid,1 ++tlvdata,channel_reestablish_tlvs,your_last_funding_locked_txid,your_last_funding_locked_txid,sha256, ++tlvtype,channel_reestablish_tlvs,my_current_funding_locked_txid,3 ++tlvdata,channel_reestablish_tlvs,my_current_funding_locked_txid,my_current_funding_locked_txid,sha256, + msgtype,announcement_signatures,259 + msgdata,announcement_signatures,channel_id,channel_id, + msgdata,announcement_signatures,short_channel_id,short_channel_id, diff --git a/wire/peer_wire.csv b/wire/peer_wire.csv index b4b8230aff23..9abcb0e64308 100644 --- a/wire/peer_wire.csv +++ b/wire/peer_wire.csv @@ -24,11 +24,11 @@ msgtype,pong,19 msgdata,pong,byteslen,u16, msgdata,pong,ignored,byte,byteslen msgtype,peer_storage,7 -msgdata,peer_storage,len,u16, -msgdata,peer_storage,blob,byte,len +msgdata,peer_storage,length,u16, +msgdata,peer_storage,blob,byte,length msgtype,peer_storage_retrieval,9 -msgdata,peer_storage_retrieval,len,u16, -msgdata,peer_storage_retrieval,blob,byte,len +msgdata,peer_storage_retrieval,length,u16, +msgdata,peer_storage_retrieval,blob,byte,length tlvtype,n1,tlv1,1 tlvdata,n1,tlv1,amount_msat,tu64, tlvtype,n1,tlv2,2