1
0
mirror of https://github.com/lightning/bolts.git synced 2024-11-19 10:00:04 +01:00

BOLT-2 Edit

Some slightly larger scale revisions for BOLT-2, notably including a reorganization of the "open_channel" function with the introduction of two missing arguments.

Also, the addition of MSAT to the glossary in BOLT-0.
This commit is contained in:
Shannon Appelcline 2017-11-28 14:02:16 -08:00 committed by Rusty Russell
parent 5989128977
commit 0d8a1a20c4
2 changed files with 92 additions and 46 deletions

View File

@ -32,6 +32,8 @@ This is version 0.
* *Peers*: * *Peers*:
* *Nodes* wanting to transact Bitcoins with each other through a *channel*. * *Nodes* wanting to transact Bitcoins with each other through a *channel*.
* *MSAT*:
* A millisatoshi, often used as a field name.
* *Funding transaction*: * *Funding transaction*:
* An irreversible on-chain transaction that pays to both *peers* on a *channel*. * An irreversible on-chain transaction that pays to both *peers* on a *channel*.

View File

@ -49,7 +49,7 @@ for the funding transaction to enter the blockchain and reach the
specified depth (number of confirmations). After both sides have sent specified depth (number of confirmations). After both sides have sent
the `funding_locked` message, the channel is established and can begin the `funding_locked` message, the channel is established and can begin
normal operation. The `funding_locked` message includes information normal operation. The `funding_locked` message includes information
which will be used to construct channel authentication proofs. that will be used to construct channel authentication proofs.
+-------+ +-------+ +-------+ +-------+
@ -71,13 +71,14 @@ fails.
Note that multiple channels can operate in parallel, as all channel Note that multiple channels can operate in parallel, as all channel
messages are identified by either a `temporary_channel_id` (before the messages are identified by either a `temporary_channel_id` (before the
funding transaction is created) or `channel_id` (derived from the funding transaction is created) or a `channel_id` (derived from the
funding transaction). funding transaction).
### The `open_channel` Message ### The `open_channel` Message
This message contains information about a node and indicates its This message contains information about a node and indicates its
desire to set up a new channel. desire to set up a new channel. This is the first step toward creating
the funding transaction and both versions of the commitment transaction.
1. type: 32 (`open_channel`) 1. type: 32 (`open_channel`)
2. data: 2. data:
@ -102,25 +103,63 @@ desire to set up a new channel.
* [`2`:`shutdown_len`] (`option_upfront_shutdown_script`) * [`2`:`shutdown_len`] (`option_upfront_shutdown_script`)
* [`shutdown_len`: `shutdown_scriptpubkey`] (`option_upfront_shutdown_script`) * [`shutdown_len`: `shutdown_scriptpubkey`] (`option_upfront_shutdown_script`)
The `chain_hash` value denotes the exact blockchain the opened channel will
The `chain_hash` value denotes the exact blockchain that the opened channel will
reside within. This is usually the genesis hash of the respective blockchain. reside within. This is usually the genesis hash of the respective blockchain.
The existence of the `chain_hash` allows nodes to open channels The existence of the `chain_hash` allows nodes to open channels
across many distinct blockchains as well as have channels within multiple across many distinct blockchains as well as have channels within multiple
blockchains opened to the same peer (if it supports the target chains). blockchains opened to the same peer (if it supports the target chains).
The `temporary_channel_id` is used to identify this channel until the funding transaction is established. `funding_satoshis` is the amount the sender is putting into the channel. `dust_limit_satoshis` is the threshold below which outputs should not be generated for this node's commitment or HTLC transaction; i.e. HTLCs below this amount plus HTLC transaction fees are not enforceable on-chain. This reflects the reality that tiny outputs are not considered standard transactions and will not propagate through the Bitcoin network. The `temporary_channel_id` is used to identify this channel until the
funding transaction is established.
`max_htlc_value_in_flight_msat` is a cap on total value of outstanding HTLCs, which allows a node to limit its exposure to HTLCs; similarly, `max_accepted_htlcs` limits the number of outstanding HTLCs the other node can offer. `channel_reserve_satoshis` is the minimum amount that the other node is to keep as a direct payment. `htlc_minimum_msat` indicates the smallest value HTLC this node will accept. `funding_satoshis` is the amount the sender is putting into the
channel. `push_msat` is an amount of initial funds that the sender is
unconditionally giving to the receiver. `dust_limit_satoshis` is the
threshold below which outputs should not be generated for this node's
commitment or HTLC transactions (i.e. HTLCs below this amount plus
HTLC transaction fees are not enforceable on-chain). This reflects the
reality that tiny outputs are not considered standard transactions and
will not propagate through the Bitcoin network. `channel_reserve_satoshis`
is the minimum amount that the other node is to keep as a direct
payment. `htlc_minimum_msat` indicates the smallest value HTLC this
node will accept.
`feerate_per_kw` indicates the initial fee rate by 1000-weight (i.e. 1/4 the more normally-used 'fee rate per kilobyte') which this side will pay for commitment and HTLC transactions, as described in [BOLT #3](03-transactions.md#fee-calculation) (this can be adjusted later with an `update_fee` message). `to_self_delay` is the number of blocks that the other node's to-self outputs must be delayed, using `OP_CHECKSEQUENCEVERIFY` delays; this is how long it will have to wait in case of breakdown before redeeming its own funds. `max_htlc_value_in_flight_msat` is a cap on total value of outstanding
HTLCs, which allows a node to limit its exposure to HTLCs; similarly,
`max_accepted_htlcs` limits the number of outstanding HTLCs the other
node can offer.
`feerate_per_kw` indicates the initial fee rate by 1000-weight
(i.e. 1/4 the more normally-used 'fee rate per kilobyte') that this
side will pay for commitment and HTLC transactions, as described in
[BOLT #3](03-transactions.md#fee-calculation) (this can be adjusted
later with an `update_fee` message).
`to_self_delay` is the number of blocks that the other node's to-self
outputs must be delayed, using `OP_CHECKSEQUENCEVERIFY` delays; this
is how long it will have to wait in case of breakdown before redeeming
its own funds.
`funding_pubkey` is the public key in the 2-of-2 multisig script of
the funding transaction output.
The various `_basepoint` fields are used to [derive unique
keys](03-transactions.md#key-derivation) for each commitment
transaction. Varying these keys ensures that the transaction ID of
each commitment transaction is unpredictable to an external observer,
even if one commitment transaction is seen; this property is very
useful for preserving privacy when outsourcing penalty transactions to
third parties.
`first_per_commitment_point` is the per-commitment point to be used
for the first commitment transaction,
Only the least-significant bit of `channel_flags` is currently Only the least-significant bit of `channel_flags` is currently
defined: `announce_channel`. This indicates whether the initiator of the defined: `announce_channel`. This indicates whether the initiator of
funding flow wishes to advertise this channel publicly to the network, the funding flow wishes to advertise this channel publicly to the
as detailed within network, as detailed within [BOLT
[BOLT #7](https://github.com/lightningnetwork/lightning-rfc/blob/master/07-routing-gossip.md#bolt-7-p2p-node-and-channel-discovery). #7](https://github.com/lightningnetwork/lightning-rfc/blob/master/07-routing-gossip.md#bolt-7-p2p-node-and-channel-discovery).
The `funding_pubkey` is the public key in the 2-of-2 multisig script of the funding transaction output. The `revocation_basepoint` is combined with the revocation preimage for this commitment transaction to generate a unique revocation key for this commitment transaction. The `payment_basepoint`, `htlc_basepoint`, and `delayed_payment_basepoint` are similarly used to generate a series of keys for any payments to this node: `delayed_payment_basepoint` is used for payments encumbered by a delay. Varying these keys ensures that the transaction ID of each commitment transaction is unpredictable by an external observer, even if one commitment transaction is seen — this property is very useful for preserving privacy when outsourcing penalty transactions to third parties.
The `shutdown_scriptpubkey` allows the sending node to commit to where The `shutdown_scriptpubkey` allows the sending node to commit to where
funds will go on mutual close, which the remote node should enforce funds will go on mutual close, which the remote node should enforce
@ -139,9 +178,9 @@ The sending node:
- MUST set `first_per_commitment_point` to the per-commitment point to be used for the initial commitment transaction, derived as specified in [BOLT #3](03-transactions.md#per-commitment-secret-requirements). - MUST set `first_per_commitment_point` to the per-commitment point to be used for the initial commitment transaction, derived as specified in [BOLT #3](03-transactions.md#per-commitment-secret-requirements).
- MUST set undefined bits in `channel_flags` to 0. - MUST set undefined bits in `channel_flags` to 0.
- if both nodes advertised the `option_upfront_shutdown_script` feature: - if both nodes advertised the `option_upfront_shutdown_script` feature:
- MUST include either a valid `shutdown_scriptpubkey` as required by `shutdown` `scriptpubkey`, or a zero-length `shutdown_scriptpubkey`. - MUST include either a valid `shutdown_scriptpubkey` as required by `shutdown` `scriptpubkey`, or a zero-length `shutdown_scriptpubkey`.
- otherwise: - otherwise:
- MAY include a`shutdown_scriptpubkey`. - MAY include a`shutdown_scriptpubkey`.
The sending node SHOULD: The sending node SHOULD:
- set `to_self_delay` sufficient to ensure the sender can irreversibly spend a commitment transaction output, in case of misbehavior by the receiver. - set `to_self_delay` sufficient to ensure the sender can irreversibly spend a commitment transaction output, in case of misbehavior by the receiver.
@ -177,9 +216,9 @@ The receiving node MUST NOT:
#### Rationale #### Rationale
The *channel reserve* is specified by the peer's `channel_reserve_satoshis`: 1% of the channel total is suggested. Each side of a channel maintains this reserve so it always has something to lose, if it were to try to broadcast an old, revoked commitment transaction. Initially, this reserve may not be met, as only one side has funds; but the protocol ensures that progress is always toward it being met, and once met, it is maintained. The *channel reserve* is specified by the peer's `channel_reserve_satoshis`: 1% of the channel total is suggested. Each side of a channel maintains this reserve so it always has something to lose if it were to try to broadcast an old, revoked commitment transaction. Initially, this reserve may not be met, as only one side has funds; but the protocol ensures that there is always progress toward meeting this reserve, and once met, it is maintained.
The sender can unconditionally give initial funds to the receiver using a non-zero `push_msat` — this is one case where the normal reserve mechanism doesn't apply. However, like any other on-chain transaction, this payment is not certain until the funding transaction has been confirmed sufficiently (may not be double-spent) and may require a separate method to prove payment via on-chain confirmation. The sender can unconditionally give initial funds to the receiver using a non-zero `push_msat` — this is one case where the normal reserve mechanism doesn't apply. However, like any other on-chain transaction, this payment is not certain until the funding transaction has been confirmed sufficiently (with a danger of double-spend until that occurs) and may require a separate method to prove payment via on-chain confirmation.
The `feerate_per_kw` is generally only of concern to the sender (who pays the fees), but there is also the fee rate paid by HTLC transactions; thus, unreasonably large fee rates can also penalize the recipient. The `feerate_per_kw` is generally only of concern to the sender (who pays the fees), but there is also the fee rate paid by HTLC transactions; thus, unreasonably large fee rates can also penalize the recipient.
@ -194,7 +233,8 @@ protocol.
### The `accept_channel` Message ### The `accept_channel` Message
This message contains information about a node and indicates its This message contains information about a node and indicates its
acceptance of the new channel. acceptance of the new channel. This is the second step toward creating the
funding transaction and both versions of the commitment transaction.
1. type: 33 (`accept_channel`) 1. type: 33 (`accept_channel`)
2. data: 2. data:
@ -237,7 +277,7 @@ Other fields have the same requirements as their counterparts in `open_channel`.
This message describes the outpoint which the funder has created for This message describes the outpoint which the funder has created for
the initial commitment transactions. After receiving the peer's the initial commitment transactions. After receiving the peer's
signature, it will broadcast the funding transaction. signature via `funding_signed`, it will broadcast the funding transaction.
1. type: 34 (`funding_created`) 1. type: 34 (`funding_created`)
2. data: 2. data:
@ -252,7 +292,7 @@ The sender MUST set:
- `temporary_channel_id` the same as the `temporary_channel_id` in the `open_channel` message. - `temporary_channel_id` the same as the `temporary_channel_id` in the `open_channel` message.
- `funding_txid` to the transaction ID of a non-malleable transaction, - `funding_txid` to the transaction ID of a non-malleable transaction,
- and MUST NOT broadcast this transaction. - and MUST NOT broadcast this transaction.
- `funding_output_index` to the output number of that transaction which corresponds the funding transaction output, as defined in [BOLT #3](03-transactions.md#funding-transaction-output). - `funding_output_index` to the output number of that transaction that corresponds the funding transaction output, as defined in [BOLT #3](03-transactions.md#funding-transaction-output).
- `signature` to the valid signature using its `funding_pubkey` for the initial commitment transaction, as defined in [BOLT #3](03-transactions.md#commitment-transaction). - `signature` to the valid signature using its `funding_pubkey` for the initial commitment transaction, as defined in [BOLT #3](03-transactions.md#commitment-transaction).
The sender: The sender:
@ -272,7 +312,7 @@ A transaction with all Segregated Witness inputs is not malleable, hence the fun
### The `funding_signed` Message ### The `funding_signed` Message
This message gives the funder the signature it needs for the first This message gives the funder the signature it needs for the first
commitment transaction, so it can broadcast the signature knowing funds commitment transaction, so it can broadcast the signature knowing that funds
can be redeemed, if need be. can be redeemed, if need be.
This message introduces the `channel_id` to identify the channel. It's derived from the funding transaction by combining the `funding_txid` and the `funding_output_index`, using big-endian exclusive-OR (i.e. `funding_output_index` alters the last 2 bytes). This message introduces the `channel_id` to identify the channel. It's derived from the funding transaction by combining the `funding_txid` and the `funding_output_index`, using big-endian exclusive-OR (i.e. `funding_output_index` alters the last 2 bytes).
@ -410,8 +450,8 @@ propagate to miners.
The `option_upfront_shutdown_script` feature means that the node The `option_upfront_shutdown_script` feature means that the node
wanted to pre-commit to `shutdown_scriptpubkey` in case it was wanted to pre-commit to `shutdown_scriptpubkey` in case it was
compromised somehow. This is a weak commitment (a malevolent compromised somehow. This is a weak commitment (a malevolent
implementation tends to ignore specifications like this one!) but implementation tends to ignore specifications like this one!), but it
provides an incremental improvement in security by requiring cooperation provides an incremental improvement in security by requiring the cooperation
of the receiving node to change the `scriptpubkey`. of the receiving node to change the `scriptpubkey`.
The `shutdown` response requirement implies that the node sends `commitment_signed` to commit any outstanding changes before replying; however, it could theoretically reconnect instead, which would simply erase all outstanding uncommitted changes. The `shutdown` response requirement implies that the node sends `commitment_signed` to commit any outstanding changes before replying; however, it could theoretically reconnect instead, which would simply erase all outstanding uncommitted changes.
@ -509,9 +549,10 @@ Thus each update traverses through the following states:
2. In the receiver's latest commitment transaction, 2. In the receiver's latest commitment transaction,
3. ... and the receiver's previous commitment transaction has been revoked, 3. ... and the receiver's previous commitment transaction has been revoked,
and the HTLC is pending on the sender. and the HTLC is pending on the sender.
4. ... and in the sender's latest commitment transaction. 4. ... and in the sender's latest commitment transaction,
5. ... and the sender's previous commitment transaction has been revoked. 5. ... and the sender's previous commitment transaction has been revoked.
As the two nodes' updates are independent, the two commitment As the two nodes' updates are independent, the two commitment
transactions may be out of sync indefinitely. This is not concerning: transactions may be out of sync indefinitely. This is not concerning:
what matters is whether both sides have irrevocably committed to a what matters is whether both sides have irrevocably committed to a
@ -633,19 +674,20 @@ There are four values that need be derived:
1. The `cltv_expiry_delta` for channels, `3R+2G+2S`: if in doubt, a 1. The `cltv_expiry_delta` for channels, `3R+2G+2S`: if in doubt, a
`cltv_expiry_delta` of 12 is reasonable (R=2, G=1, S=2). `cltv_expiry_delta` of 12 is reasonable (R=2, G=1, S=2).
2. For sent HTLCs: the timeout deadline after which the channel has to be failed 2. The `cltv_expiry_delta` for sent HTLCs: the timeout deadline after which the channel has to be failed
and timed out on-chain. This is `G` blocks after the HTLC's and timed out on-chain. This is `G` blocks after the HTLC's
`cltv_expiry`: 1 block is reasonable. `cltv_expiry`: 1 block is reasonable.
3. For received HTLCs (with a preimage): the fulfillment deadline after which 3. The `cltv_expiry_delta` for received HTLCs (with a preimage): the fulfillment deadline after which
the channel has to be failed and the HTLC fulfilled on-chain before its the channel has to be failed and the HTLC fulfilled on-chain before its
`cltv_expiry`. See steps 4-7 above, which imply a deadline of `2R+G+S` `cltv_expiry`. See steps 4-7 above, which imply a deadline of `2R+G+S`
blocks before `cltv_expiry`: 7 blocks is reasonable. blocks before `cltv_expiry`: 7 blocks is reasonable.
4. The minimum `cltv_expiry` accepted for terminal payments: this 4. The minimum `cltv_expiry` accepted for terminal payments: the
is the same calculation as above. The default in worst case for the terminal node C is `2R+G+S` blocks (as, again, steps
1-3 above don't apply). The default in
[BOLT #11](11-payment-encoding.md) is 9, which is slightly more [BOLT #11](11-payment-encoding.md) is 9, which is slightly more
conservative than the 7 this calculation suggests. conservative than the 7 that this calculation suggests.
#### Requirements #### Requirements
@ -756,14 +798,10 @@ bootstrap phase of the network.
### Removing an HTLC: `update_fulfill_htlc`, `update_fail_htlc`, and `update_fail_malformed_htlc` ### Removing an HTLC: `update_fulfill_htlc`, `update_fail_htlc`, and `update_fail_malformed_htlc`
For simplicity, a node can only remove HTLCs added by the other node. For simplicity, a node can only remove HTLCs added by the other node.
There are three reasons for removing an HTLC: it has timed out, it has There are four reasons for removing an HTLC: the payment preimage is supplied,
failed to route, or the payment preimage is supplied. it has timed out, it has failed to route, or it is malformed.
The `reason` field is an opaque encrypted blob for the benefit of the To supply the preimage:
original HTLC initiator, as defined in [BOLT #4](04-onion-routing.md);
however, there's a special malformed failure variant for the case where
our peer couldn't parse it: in this case the current node encrypts
it into a `update_fail_htlc` for relaying.
1. type: 130 (`update_fulfill_htlc`) 1. type: 130 (`update_fulfill_htlc`)
2. data: 2. data:
@ -780,6 +818,12 @@ For a timed out or route-failed HTLC:
* [`2`:`len`] * [`2`:`len`]
* [`len`:`reason`] * [`len`:`reason`]
The `reason` field is an opaque encrypted blob for the benefit of the
original HTLC initiator, as defined in [BOLT #4](04-onion-routing.md);
however, there's a special malformed failure variant for the case where
our peer couldn't parse it: in this case the current node instead take action, encrypting
it into a `update_fail_htlc` for relaying.
For an unparsable HTLC: For an unparsable HTLC:
1. type: 135 (`update_fail_malformed_htlc`) 1. type: 135 (`update_fail_malformed_htlc`)
@ -825,10 +869,10 @@ A node that sends `update_fulfill_htlc`, before the sender, is also
committed to the HTLC and risks losing funds. committed to the HTLC and risks losing funds.
If the onion is malformed, the upstream node won't be able to extract If the onion is malformed, the upstream node won't be able to extract
a key to generate a response — hence, the special failure message which a key to generate a response — hence the special failure message, which
makes this node do it. makes this node do it.
The node can check that the SHA256 the upstream is complaining about The node can check that the SHA256 that the upstream is complaining about
does match the onion it sent, which may allow it to detect random bit does match the onion it sent, which may allow it to detect random bit
errors. However, without re-checking the actual encrypted packet sent, errors. However, without re-checking the actual encrypted packet sent,
it won't know whether the error was its own or the remote's; so it won't know whether the error was its own or the remote's; so
@ -850,11 +894,11 @@ sign the resulting transaction (as defined in [BOLT #3](03-transactions.md)), an
#### Requirements #### Requirements
A sending node: A sending node:
- MUST NOT send a `commitment_signed` message which does not include any - MUST NOT send a `commitment_signed` message that does not include any
updates. updates.
- MAY send a `commitment_signed` message which only - MAY send a `commitment_signed` message that only
alters the fee. alters the fee.
- MAY send a `commitment_signed` message which doesn't - MAY send a `commitment_signed` message that doesn't
change the commitment transaction aside from the new revocation hash change the commitment transaction aside from the new revocation hash
(due to dust, identical HTLC replacement, or insignificant or multiple (due to dust, identical HTLC replacement, or insignificant or multiple
fee changes). fee changes).
@ -988,10 +1032,10 @@ Reconnection introduces doubt as to what has been received, so there are
explicit acknowledgments at that point. explicit acknowledgments at that point.
This is fairly straightforward in the case of channel establishment This is fairly straightforward in the case of channel establishment
and close where messages have an explicit order, but during normal and close, where messages have an explicit order, but during normal
operation acknowledgments of updates are delayed until the operation, acknowledgments of updates are delayed until the
`commitment_signed` / `revoke_and_ack` exchange; so it cannot be assumed `commitment_signed` / `revoke_and_ack` exchange; so it cannot be assumed
the updates have been received. This also means that the receiving that the updates have been received. This also means that the receiving
node only needs to store updates upon receipt of `commitment_signed`. node only needs to store updates upon receipt of `commitment_signed`.
Note that messages described in [BOLT #7](07-routing-gossip.md) are Note that messages described in [BOLT #7](07-routing-gossip.md) are
@ -1133,7 +1177,7 @@ write to disk by the sender upon each transmission, whereas the scheme
here encourages a single persistent write to disk for each here encourages a single persistent write to disk for each
`commitment_signed` sent or received. `commitment_signed` sent or received.
A retransmittal of `revoke_and_ack` should never be asked for, after a A re-transmittal of `revoke_and_ack` should never be asked for, after a
`closing_signed` has been received; since that would imply a shutdown has been `closing_signed` has been received; since that would imply a shutdown has been
completed — which can only occur after the `revoke_and_ack` has been received completed — which can only occur after the `revoke_and_ack` has been received
by the remote node. by the remote node.
@ -1166,7 +1210,7 @@ total loss of funds — as the remote node can prove it knows the
revocation preimage. The error returned by the fallen-behind node revocation preimage. The error returned by the fallen-behind node
(or simply the invalid numbers in the `channel_reestablish` it has (or simply the invalid numbers in the `channel_reestablish` it has
sent) should make the other node drop its current commitment sent) should make the other node drop its current commitment
transaction to the chain. This will, at least, allow the fallen-behind node to recovery transaction to the chain. This will, at least, allow the fallen-behind node to recover
non-HTLC funds, if the `my_current_per_commitment_point` non-HTLC funds, if the `my_current_per_commitment_point`
is valid. However, this also means the fallen-behind node has revealed this is valid. However, this also means the fallen-behind node has revealed this
fact (though not provably: it could be lying), and the other node could use this to fact (though not provably: it could be lying), and the other node could use this to