mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
invoice: Support providing preimage when making invoice.
This commit is contained in:
committed by
Christian Decker
parent
5ff0d40fed
commit
eb42804fcc
@@ -150,7 +150,7 @@ class LightningRpc(UnixDomainSocketRpc):
|
|||||||
}
|
}
|
||||||
return self.call("listchannels", payload)
|
return self.call("listchannels", payload)
|
||||||
|
|
||||||
def invoice(self, msatoshi, label, description, expiry=None, fallbacks=None):
|
def invoice(self, msatoshi, label, description, expiry=None, fallbacks=None, preimage=None):
|
||||||
"""
|
"""
|
||||||
Create an invoice for {msatoshi} with {label} and {description} with
|
Create an invoice for {msatoshi} with {label} and {description} with
|
||||||
optional {expiry} seconds (default 1 hour)
|
optional {expiry} seconds (default 1 hour)
|
||||||
@@ -160,7 +160,8 @@ class LightningRpc(UnixDomainSocketRpc):
|
|||||||
"label": label,
|
"label": label,
|
||||||
"description": description,
|
"description": description,
|
||||||
"expiry": expiry,
|
"expiry": expiry,
|
||||||
"fallbacks": fallbacks
|
"fallbacks": fallbacks,
|
||||||
|
"preimage": preimage
|
||||||
}
|
}
|
||||||
return self.call("invoice", payload)
|
return self.call("invoice", payload)
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
.\" Title: lightning-invoice
|
.\" Title: lightning-invoice
|
||||||
.\" Author: [see the "AUTHOR" section]
|
.\" Author: [see the "AUTHOR" section]
|
||||||
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
|
||||||
.\" Date: 04/06/2018
|
.\" Date: 04/23/2018
|
||||||
.\" Manual: \ \&
|
.\" Manual: \ \&
|
||||||
.\" Source: \ \&
|
.\" Source: \ \&
|
||||||
.\" Language: English
|
.\" Language: English
|
||||||
.\"
|
.\"
|
||||||
.TH "LIGHTNING\-INVOICE" "7" "04/06/2018" "\ \&" "\ \&"
|
.TH "LIGHTNING\-INVOICE" "7" "04/23/2018" "\ \&" "\ \&"
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" * Define some portability stuff
|
.\" * Define some portability stuff
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
lightning-invoice \- Protocol for accepting payments\&.
|
lightning-invoice \- Protocol for accepting payments\&.
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.sp
|
.sp
|
||||||
\fBinvoice\fR \fImsatoshi\fR \fIlabel\fR \fIdescription\fR [\fIexpiry\fR] [\fIfallbacks\fR]
|
\fBinvoice\fR \fImsatoshi\fR \fIlabel\fR \fIdescription\fR [\fIexpiry\fR] [\fIfallbacks\fR] [\fIpreimage\fR]
|
||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
.sp
|
.sp
|
||||||
The \fBinvoice\fR RPC command creates the expectation of a payment of a given amount of milli\-satoshi: it returns a unique token which another lightning daemon can use to pay this invoice\&.
|
The \fBinvoice\fR RPC command creates the expectation of a payment of a given amount of milli\-satoshi: it returns a unique token which another lightning daemon can use to pay this invoice\&.
|
||||||
@@ -45,6 +45,8 @@ The \fIdescription\fR is a short description of purpose of payment, e\&.g\&. \fI
|
|||||||
The \fIexpiry\fR is optionally the number of seconds the invoice is valid for\&. If no value is provided the default of 3600 (1 Hour) is used\&.
|
The \fIexpiry\fR is optionally the number of seconds the invoice is valid for\&. If no value is provided the default of 3600 (1 Hour) is used\&.
|
||||||
.sp
|
.sp
|
||||||
The \fIfallbacks\fR array is one or more fallback addresses to include in the invoice (in order from most\-preferred to least): note that these arrays are not currently tracked to fulfill the invoice\&.
|
The \fIfallbacks\fR array is one or more fallback addresses to include in the invoice (in order from most\-preferred to least): note that these arrays are not currently tracked to fulfill the invoice\&.
|
||||||
|
.sp
|
||||||
|
The \fIpreimage\fR is a 64\-digit hex string to be used as payment preimage for the created invoice\&. By default, if unspecified, lightningd will generate a secure pseudorandom preimage seeded from an appropriate entropy source on your system\&. \fBIMPORTANT\fR: if you specify the \fIpreimage\fR, you are responsible, to ensure appropriate care for generating using a secure pseudorandom generator seeded with sufficient entropy, and keeping the preimage secret\&. This parameter is an advanced feature intended for use with cutting\-edge cryptographic protocols and should not be used unless explicitly needed\&.
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
.sp
|
.sp
|
||||||
On success, a hash is returned as \fIpayment_hash\fR to be given to the payer, and the \fIexpiry_time\fR as a UNIX timestamp\&. It also returns a BOLT11 invoice as \fIbolt11\fR to be given to the payer\&. On failure, an error is returned and no invoice is created\&. If the lightning process fails before responding, the caller should use lightning\-listinvoice(7) to query whether this invoice was created or not\&.
|
On success, a hash is returned as \fIpayment_hash\fR to be given to the payer, and the \fIexpiry_time\fR as a UNIX timestamp\&. It also returns a BOLT11 invoice as \fIbolt11\fR to be given to the payer\&. On failure, an error is returned and no invoice is created\&. If the lightning process fails before responding, the caller should use lightning\-listinvoice(7) to query whether this invoice was created or not\&.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ lightning-invoice - Protocol for accepting payments.
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
*invoice* 'msatoshi' 'label' 'description' ['expiry'] ['fallbacks']
|
*invoice* 'msatoshi' 'label' 'description' ['expiry'] ['fallbacks'] ['preimage']
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@@ -36,6 +36,18 @@ The 'fallbacks' array is one or more fallback addresses to include in
|
|||||||
the invoice (in order from most-preferred to least): note that these
|
the invoice (in order from most-preferred to least): note that these
|
||||||
arrays are not currently tracked to fulfill the invoice.
|
arrays are not currently tracked to fulfill the invoice.
|
||||||
|
|
||||||
|
The 'preimage' is a 64-digit hex string to be used as payment preimage
|
||||||
|
for the created invoice.
|
||||||
|
By default, if unspecified, lightningd will generate a secure
|
||||||
|
pseudorandom preimage seeded from an appropriate entropy source on
|
||||||
|
your system.
|
||||||
|
*IMPORTANT*: if you specify the 'preimage', you are responsible, to
|
||||||
|
ensure appropriate care for generating using a secure pseudorandom
|
||||||
|
generator seeded with sufficient entropy, and keeping the preimage
|
||||||
|
secret.
|
||||||
|
This parameter is an advanced feature intended for use with cutting-edge
|
||||||
|
cryptographic protocols and should not be used unless explicitly needed.
|
||||||
|
|
||||||
RETURN VALUE
|
RETURN VALUE
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|||||||
@@ -156,6 +156,7 @@ static void json_invoice(struct command *cmd,
|
|||||||
struct invoice invoice;
|
struct invoice invoice;
|
||||||
struct invoice_details details;
|
struct invoice_details details;
|
||||||
jsmntok_t *msatoshi, *label, *desctok, *exp, *fallback, *fallbacks;
|
jsmntok_t *msatoshi, *label, *desctok, *exp, *fallback, *fallbacks;
|
||||||
|
jsmntok_t *preimagetok;
|
||||||
u64 *msatoshi_val;
|
u64 *msatoshi_val;
|
||||||
const struct json_escaped *label_val, *desc;
|
const struct json_escaped *label_val, *desc;
|
||||||
const char *desc_val;
|
const char *desc_val;
|
||||||
@@ -174,6 +175,7 @@ static void json_invoice(struct command *cmd,
|
|||||||
"?expiry", &exp,
|
"?expiry", &exp,
|
||||||
"?fallback", &fallback,
|
"?fallback", &fallback,
|
||||||
"?fallbacks", &fallbacks,
|
"?fallbacks", &fallbacks,
|
||||||
|
"?preimage", &preimagetok,
|
||||||
NULL)) {
|
NULL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -281,8 +283,18 @@ static void json_invoice(struct command *cmd,
|
|||||||
struct preimage r;
|
struct preimage r;
|
||||||
struct sha256 rhash;
|
struct sha256 rhash;
|
||||||
|
|
||||||
/* Generate random secret preimage and hash. */
|
if (preimagetok) {
|
||||||
|
/* Get secret preimage from user. */
|
||||||
|
if (!hex_decode(buffer + preimagetok->start,
|
||||||
|
preimagetok->end - preimagetok->start,
|
||||||
|
r.r, sizeof(r.r))) {
|
||||||
|
command_fail(cmd, "preimage must be 64 hex digits");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
/* Generate random secret preimage. */
|
||||||
randombytes_buf(r.r, sizeof(r.r));
|
randombytes_buf(r.r, sizeof(r.r));
|
||||||
|
/* Generate preimage hash. */
|
||||||
sha256(&rhash, r.r, sizeof(r.r));
|
sha256(&rhash, r.r, sizeof(r.r));
|
||||||
|
|
||||||
/* Construct bolt11 string. */
|
/* Construct bolt11 string. */
|
||||||
|
|||||||
@@ -445,6 +445,23 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
assert len(l1.rpc.listinvoices('inv1')['invoices']) == 0
|
assert len(l1.rpc.listinvoices('inv1')['invoices']) == 0
|
||||||
assert len(l1.rpc.listinvoices('inv2')['invoices']) == 0
|
assert len(l1.rpc.listinvoices('inv2')['invoices']) == 0
|
||||||
|
|
||||||
|
def test_invoice_preimage(self):
|
||||||
|
"""Test explicit invoice 'preimage'.
|
||||||
|
"""
|
||||||
|
l1, l2 = self.connect()
|
||||||
|
self.fund_channel(l1, l2, 10**6)
|
||||||
|
|
||||||
|
# I promise the below number is randomly generated
|
||||||
|
invoice_preimage = "17b08f669513b7379728fc1abcea5eaf3448bc1eba55a68ca2cd1843409cdc04"
|
||||||
|
|
||||||
|
# Make invoice and pay it
|
||||||
|
inv = l2.rpc.invoice(msatoshi=123456, label="inv", description="?", preimage=invoice_preimage)
|
||||||
|
payment = l1.rpc.pay(inv['bolt11'])
|
||||||
|
|
||||||
|
# Check preimage was given.
|
||||||
|
payment_preimage = payment['payment_preimage']
|
||||||
|
assert invoice_preimage == payment_preimage
|
||||||
|
|
||||||
def test_invoice(self):
|
def test_invoice(self):
|
||||||
l1 = self.node_factory.get_node()
|
l1 = self.node_factory.get_node()
|
||||||
l2 = self.node_factory.get_node()
|
l2 = self.node_factory.get_node()
|
||||||
|
|||||||
Reference in New Issue
Block a user