bolt12: remove deprecated chains fields

We also move recurrence fields into a separate spec patch.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2021-11-30 13:36:05 +10:30
parent 163d3a16f4
commit 296437c655
9 changed files with 69 additions and 62 deletions

View File

@@ -8,11 +8,11 @@
#include <secp256k1_schnorrsig.h> #include <secp256k1_schnorrsig.h>
#include <time.h> #include <time.h>
bool bolt12_chains_match(const struct bitcoin_blkid *chains, /* If chains is NULL, max_num_chains is ignored */
static bool bolt12_chains_match(const struct bitcoin_blkid *chains,
size_t max_num_chains,
const struct chainparams *must_be_chain) const struct chainparams *must_be_chain)
{ {
size_t num_chains;
/* BOLT-offers #12: /* BOLT-offers #12:
* - if the chain for the invoice is not solely bitcoin: * - if the chain for the invoice is not solely bitcoin:
* - MUST specify `chains` the offer is valid for. * - MUST specify `chains` the offer is valid for.
@@ -27,13 +27,12 @@ bool bolt12_chains_match(const struct bitcoin_blkid *chains,
* - otherwise: * - otherwise:
* - MUST fail the request if `chain` is not a supported chain. * - MUST fail the request if `chain` is not a supported chain.
*/ */
num_chains = tal_count(chains); if (!chains) {
if (num_chains == 0) { max_num_chains = 1;
num_chains = 1;
chains = &chainparams_for_network("bitcoin")->genesis_blockhash; chains = &chainparams_for_network("bitcoin")->genesis_blockhash;
} }
for (size_t i = 0; i < num_chains; i++) { for (size_t i = 0; i < max_num_chains; i++) {
if (bitcoin_blkid_eq(&chains[i], if (bitcoin_blkid_eq(&chains[i],
&must_be_chain->genesis_blockhash)) &must_be_chain->genesis_blockhash))
return true; return true;
@@ -43,28 +42,20 @@ bool bolt12_chains_match(const struct bitcoin_blkid *chains,
} }
bool bolt12_chain_matches(const struct bitcoin_blkid *chain, bool bolt12_chain_matches(const struct bitcoin_blkid *chain,
const struct chainparams *must_be_chain, const struct chainparams *must_be_chain)
const struct bitcoin_blkid *deprecated_chains)
{ {
/* Obsolete: We used to put an array in here, but we only ever return bolt12_chains_match(chain, 1, must_be_chain);
* used a single value */
if (deprecated_apis && !chain)
chain = deprecated_chains;
if (!chain)
chain = &chainparams_for_network("bitcoin")->genesis_blockhash;
return bitcoin_blkid_eq(chain, &must_be_chain->genesis_blockhash);
} }
static char *check_features_and_chain(const tal_t *ctx, static char *check_features_and_chain(const tal_t *ctx,
const struct feature_set *our_features, const struct feature_set *our_features,
const struct chainparams *must_be_chain, const struct chainparams *must_be_chain,
const u8 *features, const u8 *features,
const struct bitcoin_blkid *chains) const struct bitcoin_blkid *chains,
size_t num_chains)
{ {
if (must_be_chain) { if (must_be_chain) {
if (!bolt12_chains_match(chains, must_be_chain)) if (!bolt12_chains_match(chains, num_chains, must_be_chain))
return tal_fmt(ctx, "wrong chain"); return tal_fmt(ctx, "wrong chain");
} }
@@ -190,7 +181,8 @@ struct tlv_offer *offer_decode(const tal_t *ctx,
*fail = check_features_and_chain(ctx, *fail = check_features_and_chain(ctx,
our_features, must_be_chain, our_features, must_be_chain,
offer->features, offer->features,
offer->chains); offer->chains,
tal_count(offer->chains));
if (*fail) if (*fail)
return tal_free(offer); return tal_free(offer);
@@ -242,9 +234,7 @@ struct tlv_invoice_request *invrequest_decode(const tal_t *ctx,
*fail = check_features_and_chain(ctx, *fail = check_features_and_chain(ctx,
our_features, must_be_chain, our_features, must_be_chain,
invrequest->features, invrequest->features,
invrequest->chain invrequest->chain, 1);
? invrequest->chain
: invrequest->chains);
if (*fail) if (*fail)
return tal_free(invrequest); return tal_free(invrequest);
@@ -283,8 +273,7 @@ struct tlv_invoice *invoice_decode_nosig(const tal_t *ctx,
*fail = check_features_and_chain(ctx, *fail = check_features_and_chain(ctx,
our_features, must_be_chain, our_features, must_be_chain,
invoice->features, invoice->features,
invoice->chain invoice->chain, 1);
? invoice->chain : invoice->chains);
if (*fail) if (*fail)
return tal_free(invoice); return tal_free(invoice);

View File

@@ -99,14 +99,9 @@ bool bolt12_check_signature(const struct tlv_field *fields,
const struct point32 *key, const struct point32 *key,
const struct bip340sig *sig); const struct bip340sig *sig);
/* Given a tal_arr of chains, does it contain this chain? */
bool bolt12_chains_match(const struct bitcoin_blkid *chains,
const struct chainparams *must_be_chain);
/* Given a single bolt12 chain, does it match? (NULL == bitcoin) */ /* Given a single bolt12 chain, does it match? (NULL == bitcoin) */
bool bolt12_chain_matches(const struct bitcoin_blkid *chain, bool bolt12_chain_matches(const struct bitcoin_blkid *chain,
const struct chainparams *must_be_chain, const struct chainparams *must_be_chain);
const struct bitcoin_blkid *deprecated_chains);
/* Given a basetime, when does period N start? */ /* Given a basetime, when does period N start? */
u64 offer_period_start(u64 basetime, size_t n, u64 offer_period_start(u64 basetime, size_t n,

View File

@@ -1383,10 +1383,6 @@ static struct command_result *json_fetchinvoice(struct command *cmd,
* - the bitcoin chain is implied as the first and only entry. * - the bitcoin chain is implied as the first and only entry.
*/ */
if (!streq(chainparams->network_name, "bitcoin")) { if (!streq(chainparams->network_name, "bitcoin")) {
if (deprecated_apis) {
invreq->chains = tal_arr(invreq, struct bitcoin_blkid, 1);
invreq->chains[0] = chainparams->genesis_blockhash;
}
invreq->chain = tal_dup(invreq, struct bitcoin_blkid, invreq->chain = tal_dup(invreq, struct bitcoin_blkid,
&chainparams->genesis_blockhash); &chainparams->genesis_blockhash);
} }
@@ -1780,10 +1776,6 @@ static struct command_result *json_sendinvoice(struct command *cmd,
* - the bitcoin chain is implied as the first and only entry. * - the bitcoin chain is implied as the first and only entry.
*/ */
if (!streq(chainparams->network_name, "bitcoin")) { if (!streq(chainparams->network_name, "bitcoin")) {
if (deprecated_apis) {
sent->inv->chains = tal_arr(sent->inv, struct bitcoin_blkid, 1);
sent->inv->chains[0] = chainparams->genesis_blockhash;
}
sent->inv->chain = tal_dup(sent->inv, struct bitcoin_blkid, sent->inv->chain = tal_dup(sent->inv, struct bitcoin_blkid,
&chainparams->genesis_blockhash); &chainparams->genesis_blockhash);
} }

View File

@@ -539,8 +539,6 @@ static void json_add_b12_invoice(struct json_stream *js,
{ {
bool valid = true; bool valid = true;
if (invoice->chains)
json_add_chains(js, invoice->chains);
if (invoice->chain) if (invoice->chain)
json_add_sha256(js, "chain", &invoice->chain->shad.sha); json_add_sha256(js, "chain", &invoice->chain->shad.sha);
if (invoice->offer_id) if (invoice->offer_id)
@@ -679,7 +677,7 @@ static void json_add_b12_invoice(struct json_stream *js,
if (invoice->fallbacks) if (invoice->fallbacks)
valid &= json_add_fallbacks(js, valid &= json_add_fallbacks(js,
invoice->chain ? invoice->chain : invoice->chains, invoice->chain,
invoice->fallbacks->fallbacks); invoice->fallbacks->fallbacks);
/* BOLT-offers #12: /* BOLT-offers #12:
@@ -726,8 +724,6 @@ static void json_add_invoice_request(struct json_stream *js,
{ {
bool valid = true; bool valid = true;
if (invreq->chains)
json_add_chains(js, invreq->chains);
if (invreq->chain) if (invreq->chain)
json_add_sha256(js, "chain", &invreq->chain->shad.sha); json_add_sha256(js, "chain", &invreq->chain->shad.sha);

View File

@@ -359,9 +359,9 @@ struct command_result *handle_invoice(struct command *cmd,
* - otherwise: * - otherwise:
* - MUST fail the request if `chain` is not a supported chain. * - MUST fail the request if `chain` is not a supported chain.
*/ */
if (!bolt12_chain_matches(inv->inv->chain, chainparams, inv->inv->chains)) { if (!bolt12_chain_matches(inv->inv->chain, chainparams)) {
return fail_inv(cmd, inv, return fail_inv(cmd, inv,
"Wrong chains %s", "Wrong chain %s",
tal_hex(tmpctx, inv->inv->chain)); tal_hex(tmpctx, inv->inv->chain));
} }

View File

@@ -754,10 +754,6 @@ static struct command_result *listoffers_done(struct command *cmd,
* - MUST specify `chains` the offer is valid for. * - MUST specify `chains` the offer is valid for.
*/ */
if (!streq(chainparams->network_name, "bitcoin")) { if (!streq(chainparams->network_name, "bitcoin")) {
if (deprecated_apis) {
ir->inv->chains = tal_arr(ir->inv, struct bitcoin_blkid, 1);
ir->inv->chains[0] = chainparams->genesis_blockhash;
}
ir->inv->chain = tal_dup(ir->inv, struct bitcoin_blkid, ir->inv->chain = tal_dup(ir->inv, struct bitcoin_blkid,
&chainparams->genesis_blockhash); &chainparams->genesis_blockhash);
} }
@@ -875,8 +871,7 @@ struct command_result *handle_invoice_request(struct command *cmd,
* - otherwise: * - otherwise:
* - MUST fail the request if `chain` is not a supported chain. * - MUST fail the request if `chain` is not a supported chain.
*/ */
if (!bolt12_chain_matches(ir->invreq->chain, chainparams, if (!bolt12_chain_matches(ir->invreq->chain, chainparams)) {
ir->invreq->chains)) {
return fail_invreq(cmd, ir, return fail_invreq(cmd, ir,
"Wrong chain %s", "Wrong chain %s",
tal_hex(tmpctx, ir->invreq->chain)); tal_hex(tmpctx, ir->invreq->chain));

View File

@@ -42,8 +42,6 @@ subtypedata,blinded_path,first_node_id,point,
subtypedata,blinded_path,blinding,point, subtypedata,blinded_path,blinding,point,
subtypedata,blinded_path,num_hops,byte, subtypedata,blinded_path,num_hops,byte,
subtypedata,blinded_path,path,onionmsg_path,num_hops subtypedata,blinded_path,path,onionmsg_path,num_hops
tlvtype,invoice_request,chains,2
tlvdata,invoice_request,chains,chains,chain_hash,...
tlvtype,invoice_request,chain,3 tlvtype,invoice_request,chain,3
tlvdata,invoice_request,chain,chain,chain_hash, tlvdata,invoice_request,chain,chain,chain_hash,
tlvtype,invoice_request,offer_id,4 tlvtype,invoice_request,offer_id,4
@@ -68,8 +66,6 @@ tlvtype,invoice_request,replace_invoice,56
tlvdata,invoice_request,replace_invoice,payment_hash,sha256, tlvdata,invoice_request,replace_invoice,payment_hash,sha256,
tlvtype,invoice_request,payer_signature,240 tlvtype,invoice_request,payer_signature,240
tlvdata,invoice_request,payer_signature,sig,bip340sig, tlvdata,invoice_request,payer_signature,sig,bip340sig,
tlvtype,invoice,chains,2
tlvdata,invoice,chains,chains,chain_hash,...
tlvtype,invoice,chain,3 tlvtype,invoice,chain,3
tlvdata,invoice,chain,chain,chain_hash, tlvdata,invoice,chain,chain,chain_hash,
tlvtype,invoice,offer_id,4 tlvtype,invoice,offer_id,4
1 tlvtype,offer,chains,2
42 subtypedata,blinded_path,blinding,point,
43 subtypedata,blinded_path,num_hops,byte,
44 subtypedata,blinded_path,path,onionmsg_path,num_hops
tlvtype,invoice_request,chains,2
tlvdata,invoice_request,chains,chains,chain_hash,...
45 tlvtype,invoice_request,chain,3
46 tlvdata,invoice_request,chain,chain,chain_hash,
47 tlvtype,invoice_request,offer_id,4
66 tlvdata,invoice_request,replace_invoice,payment_hash,sha256,
67 tlvtype,invoice_request,payer_signature,240
68 tlvdata,invoice_request,payer_signature,sig,bip340sig,
tlvtype,invoice,chains,2
tlvdata,invoice,chains,chains,chain_hash,...
69 tlvtype,invoice,chain,3
70 tlvdata,invoice,chain,chain,chain_hash,
71 tlvtype,invoice,offer_id,4

View File

@@ -42,8 +42,6 @@ subtypedata,blinded_path,first_node_id,point,
subtypedata,blinded_path,blinding,point, subtypedata,blinded_path,blinding,point,
subtypedata,blinded_path,num_hops,byte, subtypedata,blinded_path,num_hops,byte,
subtypedata,blinded_path,path,onionmsg_path,num_hops subtypedata,blinded_path,path,onionmsg_path,num_hops
tlvtype,invoice_request,chains,2
tlvdata,invoice_request,chains,chains,chain_hash,...
tlvtype,invoice_request,chain,3 tlvtype,invoice_request,chain,3
tlvdata,invoice_request,chain,chain,chain_hash, tlvdata,invoice_request,chain,chain,chain_hash,
tlvtype,invoice_request,offer_id,4 tlvtype,invoice_request,offer_id,4
@@ -68,8 +66,6 @@ tlvtype,invoice_request,replace_invoice,56
tlvdata,invoice_request,replace_invoice,payment_hash,sha256, tlvdata,invoice_request,replace_invoice,payment_hash,sha256,
tlvtype,invoice_request,payer_signature,240 tlvtype,invoice_request,payer_signature,240
tlvdata,invoice_request,payer_signature,sig,bip340sig, tlvdata,invoice_request,payer_signature,sig,bip340sig,
tlvtype,invoice,chains,2
tlvdata,invoice,chains,chains,chain_hash,...
tlvtype,invoice,chain,3 tlvtype,invoice,chain,3
tlvdata,invoice,chain,chain,chain_hash, tlvdata,invoice,chain,chain,chain_hash,
tlvtype,invoice,offer_id,4 tlvtype,invoice,offer_id,4
1 tlvtype,offer,chains,2
42 subtypedata,blinded_path,blinding,point,
43 subtypedata,blinded_path,num_hops,byte,
44 subtypedata,blinded_path,path,onionmsg_path,num_hops
tlvtype,invoice_request,chains,2
tlvdata,invoice_request,chains,chains,chain_hash,...
45 tlvtype,invoice_request,chain,3
46 tlvdata,invoice_request,chain,chain,chain_hash,
47 tlvtype,invoice_request,offer_id,4
66 tlvdata,invoice_request,replace_invoice,payment_hash,sha256,
67 tlvtype,invoice_request,payer_signature,240
68 tlvdata,invoice_request,payer_signature,sig,bip340sig,
tlvtype,invoice,chains,2
tlvdata,invoice,chains,chains,chain_hash,...
69 tlvtype,invoice,chain,3
70 tlvdata,invoice,chain,chain,chain_hash,
71 tlvtype,invoice,offer_id,4

View File

@@ -0,0 +1,48 @@
diff --git b/wire/bolt12_wire.csv a/wire/bolt12_wire.csv
index 726c3c0a1..a53ca3cdf 100644
--- b/wire/bolt12_wire.csv
+++ a/wire/bolt12_wire.csv
@@ -18,6 +18,18 @@ tlvtype,offer,quantity_min,22
tlvdata,offer,quantity_min,min,tu64,
tlvtype,offer,quantity_max,24
tlvdata,offer,quantity_max,max,tu64,
+tlvtype,offer,recurrence,26
+tlvdata,offer,recurrence,time_unit,byte,
+tlvdata,offer,recurrence,period,tu32,
+tlvtype,offer,recurrence_paywindow,64
+tlvdata,offer,recurrence_paywindow,seconds_before,u32,
+tlvdata,offer,recurrence_paywindow,proportional_amount,byte,
+tlvdata,offer,recurrence_paywindow,seconds_after,tu32,
+tlvtype,offer,recurrence_limit,66
+tlvdata,offer,recurrence_limit,max_period,tu32,
+tlvtype,offer,recurrence_base,28
+tlvdata,offer,recurrence_base,start_any_period,byte,
+tlvdata,offer,recurrence_base,basetime,tu64,
tlvtype,offer,node_id,30
tlvdata,offer,node_id,node_id,point32,
tlvtype,offer,send_invoice,54
@@ -40,6 +54,10 @@ tlvtype,invoice_request,features,12
tlvdata,invoice_request,features,features,byte,...
tlvtype,invoice_request,quantity,32
tlvdata,invoice_request,quantity,quantity,tu64,
+tlvtype,invoice_request,recurrence_counter,36
+tlvdata,invoice_request,recurrence_counter,counter,tu32,
+tlvtype,invoice_request,recurrence_start,68
+tlvdata,invoice_request,recurrence_start,period_offset,tu32,
tlvtype,invoice_request,payer_key,38
tlvdata,invoice_request,payer_key,key,point32,
tlvtype,invoice_request,payer_note,39
@@ -74,6 +94,13 @@ tlvtype,invoice,quantity,32
tlvdata,invoice,quantity,quantity,tu64,
tlvtype,invoice,refund_for,34
tlvdata,invoice,refund_for,refunded_payment_hash,sha256,
+tlvtype,invoice,recurrence_counter,36
+tlvdata,invoice,recurrence_counter,counter,tu32,
+tlvtype,invoice,send_invoice,54
+tlvtype,invoice,recurrence_start,68
+tlvdata,invoice,recurrence_start,period_offset,tu32,
+tlvtype,invoice,recurrence_basetime,64
+tlvdata,invoice,recurrence_basetime,basetime,tu64,
tlvtype,invoice,payer_key,38
tlvdata,invoice,payer_key,key,point32,
tlvtype,invoice,payer_note,39