common: add pico-BTC parsing test from proposed BOLT.

See-also: https://github.com/lightningnetwork/lightning-rfc/pull/699
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2020-02-03 10:59:28 +10:30 committed by Christian Decker
parent 7028493d01
commit d8e933aac7

View File

@ -5,6 +5,8 @@
#include "../features.c" #include "../features.c"
#include "../node_id.c" #include "../node_id.c"
#include "../hash_u5.c" #include "../hash_u5.c"
#include "../wire/fromwire.c"
#include "../wire/towire.c"
#include <ccan/err/err.h> #include <ccan/err/err.h>
#include <ccan/mem/mem.h> #include <ccan/mem/mem.h>
#include <ccan/str/hex/hex.h> #include <ccan/str/hex/hex.h>
@ -12,35 +14,12 @@
#include <wally_core.h> #include <wally_core.h>
/* AUTOGENERATED MOCKS START */ /* AUTOGENERATED MOCKS START */
/* Generated stub for fromwire_fail */ /* Generated stub for bigsize_get */
const void *fromwire_fail(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) size_t bigsize_get(const u8 *p UNNEEDED, size_t max UNNEEDED, bigsize_t *val UNNEEDED)
{ fprintf(stderr, "fromwire_fail called!\n"); abort(); } { fprintf(stderr, "bigsize_get called!\n"); abort(); }
/* Generated stub for fromwire_node_id */ /* Generated stub for bigsize_put */
void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct node_id *id UNNEEDED) size_t bigsize_put(u8 buf[BIGSIZE_MAX_LEN] UNNEEDED, bigsize_t v UNNEEDED)
{ fprintf(stderr, "fromwire_node_id called!\n"); abort(); } { fprintf(stderr, "bigsize_put called!\n"); abort(); }
/* Generated stub for fromwire_short_channel_id */
void fromwire_short_channel_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED,
struct short_channel_id *short_channel_id UNNEEDED)
{ fprintf(stderr, "fromwire_short_channel_id called!\n"); abort(); }
/* Generated stub for fromwire_u16 */
u16 fromwire_u16(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
{ fprintf(stderr, "fromwire_u16 called!\n"); abort(); }
/* Generated stub for fromwire_u32 */
u32 fromwire_u32(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
{ fprintf(stderr, "fromwire_u32 called!\n"); abort(); }
/* Generated stub for towire_node_id */
void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED)
{ fprintf(stderr, "towire_node_id called!\n"); abort(); }
/* Generated stub for towire_short_channel_id */
void towire_short_channel_id(u8 **pptr UNNEEDED,
const struct short_channel_id *short_channel_id UNNEEDED)
{ fprintf(stderr, "towire_short_channel_id called!\n"); abort(); }
/* Generated stub for towire_u16 */
void towire_u16(u8 **pptr UNNEEDED, u16 v UNNEEDED)
{ fprintf(stderr, "towire_u16 called!\n"); abort(); }
/* Generated stub for towire_u32 */
void towire_u32(u8 **pptr UNNEEDED, u32 v UNNEEDED)
{ fprintf(stderr, "towire_u32 called!\n"); abort(); }
/* Generated stub for type_to_string_ */ /* Generated stub for type_to_string_ */
const char *type_to_string_(const tal_t *ctx UNNEEDED, const char *typename UNNEEDED, const char *type_to_string_(const tal_t *ctx UNNEEDED, const char *typename UNNEEDED,
union printable_types u UNNEEDED) union printable_types u UNNEEDED)
@ -386,6 +365,64 @@ int main(void)
assert(!bolt11_decode(tmpctx, badstr, NULL, &fail)); assert(!bolt11_decode(tmpctx, badstr, NULL, &fail));
assert(streq(fail, "9: unknown feature bit 100")); assert(streq(fail, "9: unknown feature bit 100"));
/* BOLT-1fbccd30bb503203e4a255de67f9adb504563425 #11:
*
* > ### Please send 0.00967878534 BTC for a list of items within one week, amount in pico-BTC
* > lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j
*
* Breakdown:
*
* * `lnbc`: prefix, Lightning on bitcoin mainnet
* * `9678785340p`: amount (9678785340 pico-bitcoin = 967878534 milli satoshi)
* * `1`: Bech32 separator
* * `pwmna7l`: timestamp (1572468703)
* * `p`: payment hash.
* * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52)
* * `gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0s`: payment hash 462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f
* * `d`: short description
* * `8d`: `data_length` (`8` = 7, `d` = 13; 7 * 32 + 13 == 237)
* * `gfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khx`: 'Blockstream Store: 88.85 USD for Blockstream Ledger Nano S x 1, \"Back In My Day\" Sticker x 2, \"I Got Lightning Working\" Sticker x 2 and 1 more items'
* * `x`: expiry time
* * `qy`: `data_length` (`q` = 0, `y` = 2; 0 * 32 + 4 == 4)
* * `jw5q`: 604800 seconds (`j` = 18, `w` = 14, `5` = 20, `q` = 0; 18 * 32^3 + 14 * 32^2 + 20 * 32 + 0 == 604800)
* * `c`: `min_final_cltv_expiry`
* * `qp`: `data_length` (`q` = 0, `p` = 1; 0 * 32 + 1 == 1)
* * `2`: min_final_cltv_expiry = 10
* * `r`: tagged field: route information
* * `zj`: `data_length` (`z` = 2, `j` = 18; 2 * 32 + 18 == 82)
* * `q0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9q`:
* * pubkey: 03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7
* * short_channel_id: 589390x3312x1
* * fee_base_msat = 1000
* * fee_proportional_millionths = 2500
* * cltv_expiry_delta = 40
* * `n07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagp`: signature
* * `leym0j`: Bech32 checksum
*/
msatoshi = AMOUNT_MSAT(967878534);
b11 = new_bolt11(tmpctx, &msatoshi);
b11->chain = chainparams_for_network("bitcoin");
b11->timestamp = 1572468703;
b11->expiry = 604800;
b11->min_final_cltv_expiry = 10;
if (!hex_decode("462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f",
strlen("462264ede7e14047e9b249da94fefc47f41f7d02ee9b091815a5506bc8abf75f"),
&b11->payment_hash, sizeof(b11->payment_hash)))
abort();
b11->receiver_id = node;
b11->description = "Blockstream Store: 88.85 USD for Blockstream Ledger Nano S x 1, \"Back In My Day\" Sticker x 2, \"I Got Lightning Working\" Sticker x 2 and 1 more items";
b11->routes = tal_arr(tmpctx, struct route_info *, 1);
b11->routes[0] = tal(b11->routes, struct route_info);
if (!node_id_from_hexstr("03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7", strlen("03d06758583bb5154774a6eb221b1276c9e82d65bbaceca806d90e20c108f4b1c7"), &b11->routes[0]->pubkey))
abort();
if (!short_channel_id_from_str("589390x3312x1", strlen("589390x3312x1"),
&b11->routes[0]->short_channel_id))
abort();
b11->routes[0]->fee_base_msat = 1000;
b11->routes[0]->fee_proportional_millionths = 2500;
b11->routes[0]->cltv_expiry_delta = 40;
test_b11("lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j", b11, NULL);
/* FIXME: Test the others! */ /* FIXME: Test the others! */
wally_cleanup(0); wally_cleanup(0);
tal_free(tmpctx); tal_free(tmpctx);