Good morning Subhra,
> Ok. But this is a worse situation where C pays money to D but bound to keep > its resource locked for a longer duration, unlike D not responding and C > being able to unlock after the elapse of lock time. It is exactly the griefing attack scenario: it is the lock time at D that is the problem. As such, it is not "worse", it is ***exactly*** the griefing attack scenario. C cannot unlock until 144 blocks, so D can delay its response for up to 143 blocks without any effect on its channels, this is *exactly* the griefing attack. Regards, ZmnSCPxj > > On Mon, Apr 13, 2020, 08:21 ZmnSCPxj <[email protected]> wrote: > > > Good morning Subhra, > > > > > Hello, > > > So based on what you have stated as possible scenario of griefing > > > attack, does delay in providing the preimage also counted as a form of > > > griefing in htlc? Like given the path A->B->C->D, what if C and D has a > > > lock time of 144 blocks and D responds after 142 block time elapses, > > > claiming the money locked with D? > > > > That ***is*** the griefing attack. > > > > Regards, > > ZmnSCPxj > > > > > > > > On Wed, Apr 1, 2020, 11:49 ZmnSCPxj via Lightning-dev > > > <[email protected]> wrote: > > > > > > > Introduction > > > > ============ > > > > > > > > Given the fact that contracts on offchain protocols need to be > > > > enforceable onchain as well, timelocks involved in multi-hop payments > > > > are measured in blocks. > > > > This is because the blockchain can only (third-party-verifiably) > > > > enforce timeouts in units of entire blocks. > > > > This leads to very long timeouts for payment delivery, thus multi-hop > > > > offchain payment attempts can be, deliberately or accidentally, be in a > > > > "pending" state up to the very large timeouts involved. > > > > > > > > Deliberately setting up a multi-hop payment such that it will be in a > > > > "pending" state for long periods of time is colloquially known as a > > > > "griefing attack". > > > > In this article, we assess various proposed solutions to mitigate the > > > > effects of griefing attacks, and propose a particular solution, > > > > proof-of-closure, as well, that requires significant changes to the > > > > update state machine. > > > > > > > > Digression: Why Grief? > > > > ====================== > > > > > > > > Before embarking on our investigation for solutions to the griefing > > > > problem, we should first wonder if griefing is, in fact, a problem. > > > > > > > > This brings up the question of: why would anybody grief at all? > > > > > > > > Humans, like cats and other less-sapient pieces of walking meat, often > > > > find enjoyment in causing the suffering of others for no immediate > > > > direct gain to themselves, as a public demonstration of dominance over > > > > those they make suffer (aka "shits and giggles", which, if executed > > > > correctly, can lead to eventual direct gains to themselves or their > > > > progeny or relatives or allies, but such details are often outside the > > > > ken of the very beings who execute such survival strategies: brains are > > > > pieces of meat that have been hacked to act as action-reaction engines, > > > > but are not sophisticated enough to execute as pure rationality engines > > > > at all times). > > > > Fortunately, in the Bitcoin world, only purely rational beings of pure > > > > selfishness can exist in the long run, thus we can neglect such > > > > motivations as mere noise. > > > > > > > > First, let us investigate *how* griefing attacks can be performed. > > > > > > > > * An intermediate node in a multi-hop attempt can delay forwarding or > > > > failing an incoming HTLC. > > > > * A final node in a payment attempt can delay claiming an incoming HTLC. > > > > > > > > Let us consider a purely rational intermediate node of pure selfishness: > > > > > > > > * If it forwards as soon as possible, it can earn fees, and also speed > > > > up the release of the HTLC-locked funds so that they can reuse those > > > > funds as liquidity for further payment attempts. > > > > * Thus, delaying an HTLC is not selfishly-rational for an intermediate > > > > node. > > > > > > > > Thus, for an intermediate node, it seems there is no selfishly-rational > > > > motivation to execute a griefing attack on an arbitrary payment attempt. > > > > We can then conclude that an intermediate that delays a payment would > > > > do so, not of its own rational self-interest, but as an accident, such > > > > as an unforeseen connectivity or power failure. > > > > > > > > However, things are different when we consider a non-arbitrary payment. > > > > Suppose a node were to make a payment attempt to itself, and > > > > deliberately delay claiming this self-payment. > > > > This lets any single node, *who happens to own large liquidity*, to > > > > lock up the liquidity of other nodes. > > > > > > > > The motivation to lock up the liquidity of other nodes is to *eliminate > > > > competition*. > > > > Suppose we have a network as below: > > > > > > > > A -- B -- C > > > > \ / > > > > \ / > > > > \ / > > > > E > > > > > > > > When A and C want to transact with one another, they may choose to > > > > route via either B or E. > > > > B and E are therefore competitors in the business of forwarding > > > > payments. > > > > > > > > But suppose E has much larger channels AE and CE than the channels of > > > > AB and CB. > > > > For example, suppose E has 100mBTC perfectly-balanced channels while B > > > > has only 10mBTC perfectly-balanced channels, as all things should be in > > > > simplified models of reality. > > > > E can then "take out the competition" by making a 5mBTC self-payment > > > > along E->A->B->C->E and a 5mBTC self-payment along E->C->B->A->E, then > > > > refusing to claim the payment, tying up all the liquidity of the > > > > channels of B. > > > > By doing so, it can ensure that A and C will always fail to pay via B, > > > > even if they wish to transact in amounts less than 5mBTC. > > > > E thereby eliminates B as a competitor. > > > > > > > > This demonstrates that griefing attacks will be motivated, such that > > > > such attacks will be performed by payers and payees *against > > > > intermediate nodes*. > > > > Intermediate nodes have no motivation to attack payers and payees > > > > (those are their potential customers in the business of forwarding > > > > payments, and attacking potential customers is bad business: such > > > > attacking intermediate nodes will be removed economically in the long > > > > run). > > > > However, payers and payees can become motivated to attack intermediate > > > > nodes, if the "payer" and "payee" are actually competitor intermediate > > > > nodes. > > > > > > > > (We can observe that this is always a possibility even outside of > > > > Lightning: a service or product provider has no incentive to attack its > > > > customers ("the customer is always right"), but have an incentive to > > > > *pretend* to be a customer of a competitor and attack them.) > > > > > > > > We will keep this fact in mind: active griefing attacks are attacks > > > > *on* intermediate nodes, not *by* intermediate nodes, because there is > > > > no economic incentive for intermediate nodes to attack their customers. > > > > > > > > Previous Proposed Solutions > > > > =========================== > > > > > > > > Time-Spent Reporting > > > > -------------------- > > > > > > > > At each channel along the route, the time spent by a node to handle its > > > > forwarding is recorded, and reported upstream in the route. > > > > > > > > Unfortunately, this solution protects payers from intermediate nodes > > > > and payees: it does not protect intermediate nodes from colluding > > > > payers and payees. > > > > Even if an intermediate node knows that a particular node is > > > > consistently slow via a previous time-spent report, it will not be > > > > able, with our current onion routing, determine if an onion packet it > > > > just received will or will not go through the known-slow node. > > > > Thus, an intermediate node would not be able to defend against distant > > > > payees that, with a colluding payer, will not claim a particular > > > > payment. > > > > > > > > As we have established, an active griefing atttack will never be > > > > deliberately performed by a selfishly-rational intermediate node. > > > > Thus, this solution protects against the wrong thing: it protects > > > > payers against slow/unreliable intermediate nodes, it does not protect > > > > intermediate nodes against malicious payer/payee collusions. > > > > It protects only against intermediate nodes that inadvertently go > > > > offline during forwarding, but such nodes will inevitably lose out on > > > > the forwarding market anyway, and will disappear in the long run. > > > > > > > > Up-Front Payment > > > > ---------------- > > > > > > > > Payers pay for an attempt, not just the successful completion of an > > > > attempt. > > > > > > > > A variation on this is that the payer (or payee) continuously pays as > > > > long as the payment is pending. > > > > Further variations include paying by other means, such as just locking > > > > funds or paying with proof-of-work. > > > > > > > > While it certainly erects economic barriers against payer/payee > > > > collusions attacking intermediate nodes, it *also* erects economic > > > > barriers against normal, non-malicious payments. > > > > > > > > We can consider that economic barriers against non-malicious, > > > > low-value, high-frequency payments ("micropayments") may be enough that > > > > such payments become infeasible if we impose up-front payment for mere > > > > attempts. > > > > Thus, while this solution is certainly something we can consider, we > > > > must be reluctant to use it due to its up-front, strict-evaluation > > > > behavior. > > > > > > > > Proof-Of-Closure > > > > ================ > > > > > > > > Observing the above, we want the properties for a "good" solution to > > > > griefing attacks to be: > > > > > > > > * It should protect intermediate nodes against payer/payee collusions. > > > > * It should only come into play upon detection of an attack. > > > > > > > > We now present proof-of-closure, which (we hope) has the above > > > > properties. > > > > > > > > We can consider instead a softer timeout, distinct from the HTLC > > > > block-based timeout. > > > > This softer timeout is measurable in fractions of a second, e.g. units > > > > of 0.1 seconds. > > > > > > > > Each node on the network advertises, in addition to a block-based > > > > `cltv_delta`, a `timeout_delta` in units of 0.1 seconds. > > > > Further, each invoice contains, in addition to a block-based > > > > `final_cltv`, a `final_timeout` in units of 0.1 seconds. > > > > > > > > Thus, there are two timeouts: > > > > > > > > * The current "hard" block-based timeout that is enforceable onchain. > > > > * A new "soft" sidereal-time-based timeout that is not onchain > > > > enforceable. > > > > > > > > The soft timeout, as mentioned, is not enforceable onchain. > > > > Instead, enforcement of the soft timeout *is* the act of putting the > > > > channel state onchain. > > > > > > > > Now, for the current "hard" block-based timeout, we already have a > > > > reaction. > > > > If the HTLC "hard" timeout is approaching: > > > > > > > > * Drop the channel onchain and enforce the hard timeout onchain to > > > > reclaim the funds in the HTLCs. > > > > * Wait for the onchain action to be deeply resolved (either timelock or > > > > hashlock branch is confirmed deeply) and report the result (success or > > > > fail) upstream. > > > > > > > > What happens if the "soft" timeout is violated? > > > > > > > > * Drop the channel onchain. > > > > * Report the channel closure upstream. > > > > > > > > The "hard" timeout is cancelled in any of these two conditions: > > > > > > > > * A success is reported via `update_fulfill_htlc`, OR, > > > > * A failure is reported via `update_fail_htlc` AND the HTLC is > > > > irrevocably removed from the latest commitments/state(s) of the channel. > > > > > > > > The "soft" timeout is cancelled in any of these three conditions, the > > > > first two of which are the same as above: > > > > > > > > * A success is reported via `update_fulfill_htlc`, OR, > > > > * A failure is reported via `update_fail_htlc` AND the HTLC is > > > > irrevocably removed from the latest commitments/state(s) of the > > > > channel, OR > > > > * A channel closure is reported. > > > > > > > > Let us fill this in more detail. > > > > > > > > Suppose we have a payment route A->B->C->E. > > > > > > > > Both the "hard" block timeouts and the "soft" second timeouts decrement > > > > monotonically at each hop. > > > > Thus, the payee E has the shortest "hard" and "soft" timeouts (as > > > > normal). > > > > > > > > * Suppose E then delays claiming the payment and violates the "soft" > > > > timeout. > > > > * C then drops the CE channel onchain. > > > > * C reports, before its own timeout (slightly larger than the timeout > > > > imposed on E), the closing of the channel CE, to B. > > > > * B validates this report, and if valid, propagates the report to A. > > > > * A validates this report, and if valid, accepts that the payment will > > > > be "stuck" for up to the hard timeout it imposed on B. > > > > > > > > C has to report back to B in order to prevent B from closing the BC > > > > channel, and B has to report back to A in order to prevent A from > > > > closing the AB channel. > > > > The decrementing seconds-unit timeouts are needed for each hop, for the > > > > same reason that decrementing block-unit timeouts are needed. > > > > > > > > Since E is motivated to attack intermediate nodes because it wants to > > > > redirect payment forwards through itself rather than its competitotrs, > > > > having one of its channels closed (which prevents it from being used > > > > for forwarding) is directly opposed to its end goal of getting more > > > > money, thus, we can believe the action of closing a channel involved in > > > > a griefing attack is sufficient disincentive. > > > > > > > > The major drawback is that enforcement of the soft timeout *is* a > > > > channel closure, which is generally a negative for the network. > > > > This is not a remote attack vector, since a node can only trigger this > > > > closure if it is able to stall the fulfillment or failure of an HTLC on > > > > a channel, which generally means the node triggering this closure can > > > > only do so for its own channels (or it is able to, via a separate > > > > mechanism, remotely crash a different node). > > > > > > > > Proving Channel Closes > > > > ---------------------- > > > > > > > > What C *really* needs to prove is that: > > > > > > > > * It is *willing* to close a channel due to a violation of the soft > > > > timeout. > > > > * The channel it is willing to close was, in fact, involved in the same > > > > payment attempt. > > > > > > > > With the above, B can believe that C was innocent of wrongdoing, > > > > because: > > > > > > > > * C would only be wiling to close a channel in case of a protocol > > > > violation, in this case, a violation of the soft timeout. > > > > * The channel it closed was closed because of this payment attempt, and > > > > not because of another payment attempt, or some other unrelated channel > > > > being unilaterally closed. > > > > > > > > First, what C needs to prove is *NOT*, in fact, actual channel closure: > > > > it needs to prove a *willingness* to close a channel. > > > > Thus, it does not require the channel to actually be *closed* yet, i.e. > > > > it does not have to wait for onchain activity that the channel closure > > > > is in a mempool and is confirmed deeply onchain etc etc. > > > > > > > > Thus, to prove a *willingness to close* rather than an actual close, C > > > > can provide the unilateral close of the channel CE. > > > > The act of unilaterally closing a channel is the publication of the > > > > transaction(s) making up the unilateral close. > > > > Thus, if C is *willing* to close the channel, it is willing to publish > > > > the transaction(s) involved, and thus, providing the unilateral close > > > > to B and further upstream, shows a willingness to close the channel. > > > > > > > > B then validates the provided proof-of-closure by checking that the > > > > unilateral close transaction is either onchain, in the mempool, or that > > > > it spends a TXO that is not currently spent by another transaction. > > > > In the case the unilateral close transaction is not confirmed and in > > > > the mempool, B can speed up its propagation on the Bitcoin layer by > > > > putting it in its own mempool as well --- after all, C is willing to > > > > close the channel to exonerate itself and punish the actual culprit, > > > > and B putting the unilateral close in its own mempool can only help C > > > > in what it is willing to do. > > > > > > > > Secondly, C needs to prove that the channel it is willing to close > > > > involves the payment attempt, and is not some other channel closure > > > > that it is attempting to use to fulfill its own soft timeout. > > > > Since the unilateral close transaction *is* the proof-of-closure, B > > > > (and A) can inspect the transaction outputs and see (with some > > > > additional data from C) that one of the outputs is to an HTLC that > > > > matches the payment hash. > > > > > > > > Thus, B (and A) can believe that the proof-of-closure proves that > > > > whoever is presenting it is free of wrongdoing, as whoever is actually > > > > causing the delay has been punished (by someone being willing to close > > > > a channel with the culprit), and that the proof-of-closure commits to > > > > this particular payment attempt and no other (because it commits to a > > > > particular payment hash). > > > > > > > > Further, if CE is closed by E dropping it onchain rather than C, C will > > > > still be able to fulfill its own soft timeout by taking the closing > > > > transaction from E, which should still contain the HTLC. > > > > Indeed, neither A nor B will particularly care (nor need to know) who > > > > dropped the channel onchain, or (for A) that the channel participants > > > > are C and E. > > > > > > > > Update State Shenanigans > > > > ------------------------ > > > > > > > > Bitcoin update mechanisms are complicated things, and it may be > > > > possible for an attacking payee E to fool around with the update state > > > > machine to make it difficult for C to report a willingness to close CE. > > > > > > > > In particular, I quote here the relevant passages from `lightning-rfc`, > > > > `02-peer-protocol.md`, which is an implementation of the Poon-Dryja > > > > update mechanism: > > > > > > > > > Thus each update traverses through the following states: > > > > > > > > > > 1. pending on the receiver > > > > > 2. in the receiver's latest commitment transaction > > > > > 3. ... and the receiver's previous commitment transaction has been > > > > > revoked, > > > > > and the update is pending on the sender > > > > > 4. ... and in the sender's latest commitment transaction > > > > > 5. ... and the sender's previous commitment transaction has been > > > > > revoked > > > > > > > > The payee E is the "receiver" in this context. > > > > > > > > In this case, once the update has reached step 2, then E has a > > > > commitment transaction that it can put onchain, that contains an HTLC > > > > it can claim. > > > > From this step onward, C cannot send a failure (i.e. it cannot send > > > > back an `update_fail_htlc`) back to B, because E could drop its latest > > > > commitment onchain and claim the HTLC onchain. > > > > > > > > However, until step 4, C does not have a unilateral close containing > > > > the HTLC, and thus cannot provide a proof-of-closure that contains an > > > > HTLC that refers to the payment. > > > > > > > > Thus, between steps 2 to 4, C cannot safely respond to its own soft > > > > timeout. > > > > C cannot respond with a failure, as E could then drop its latest > > > > commitment transaction onchain and claim the payment from C, and > > > > extract money from C that way. > > > > C also cannot respond with a proof-of-closure, as it does not have a > > > > transaction that it can use to provide this proof. > > > > > > > > The best that C can do would be to impose an even shorter timeout > > > > between steps 2 and 4 above, and to drop its current commitment > > > > transaction (which does not contain the HTLC yet and thus does not > > > > constitute a valid proof-of-closure) onchain. > > > > In between the time it drops the commitment transaction and its own > > > > incoming soft timeout, there is a chance, however small, that this > > > > transaction will be confirmed, and the channel will (with high > > > > probability) settle in a state where the HTLC is not instantiated, thus > > > > C can safely fail its incoming HTLC (not show a proof-of-closure, since > > > > that is not possible for C to do) without risk of loss, just prior to > > > > its own soft timeout. > > > > > > > > Of course, C is still at risk here: E could collude with miners via a > > > > side-channel fee offer to confirm its commitment transaction with the > > > > HTLC present, and ensure that C is liable for the HTLC value. > > > > > > > > With Decker-Russell-Osuntokun, we can remove this risk by requiring a > > > > ritual as follows: > > > > > > > > 1. C requests exclusive access to update their single shared state. > > > > * This can be done via a variety of sub-protocols, including a fair > > > > coin toss in case of near-simultaneous requests for exclusive locks on > > > > both sides. > > > > 2. C provides the details of the new HTLC to E. > > > > 3. C and E generate the new state transaction and exchange signatures > > > > for it. > > > > 4. C and E generate (without signing) the new update transaction. > > > > 5. E provides the signature (or share of signature, if MuSig) for the > > > > new update transaction to C. > > > > 6. C provides the signature for the new update transaction to E, which > > > > releases the exclusive lock on the shared state atomically with the > > > > finalization of the new update transaction. > > > > > > > > Prior to step 5, C can simply fail the incoming HTLC from B in case its > > > > own soft timeout is near. > > > > Even if E performs step 5 after C has already failed the incoming HTLC > > > > from B, C can simply not perform step 6 and drop the channel onchain > > > > with the previous update and state transactions. > > > > > > > > With Poon-Dryja, we will have to rearrange the order in which we > > > > perform things, effectively adding an extra communications turnaround > > > > between the participants. > > > > Specifically, the order would have to be revised to: > > > > > > > > > 1. pending on the sender > > > > > 2. in the sender's latest commitment transaction > > > > > 3. ... and the sender's previous commitment transaction has been > > > > > revoked, > > > > > and the update is pending on the receiver > > > > > 4. ... and in the receiver's latest commitment transaction > > > > > 5. ... and the receiver's previous commitment transaction has been > > > > > revoked > > > > > > > > This allows the sender (C in our context) to provide a proof-of-closure > > > > after step 2, and before step 2, C can safely return a failure with > > > > `update_fail_htlc` (and refuse to proceed beyond step 2, thus ensuring > > > > it can still use the previous commitment that still has no HTLC). > > > > > > > > Of course, this change will require redesigning the update state > > > > machine, increasing the number of communication turnarounds, and > > > > creating a subtle incompatbility when transitioning a payment from a > > > > hop that knows only the old update state machine to a hop that knows > > > > the new update state machine. > > > > > > > > Purely Falsified Proof-Of-Closure > > > > --------------------------------- > > > > > > > > Of course, the attacking node E might want to create a false > > > > proof-of-closure. > > > > E can do this by simulating a Lightning channel: lock an amount of > > > > funds in a 2-of-2 (where E controls both keys), then spend it in a set > > > > of transactions mimicking the unilateral close. > > > > > > > > We observe, however, that the overhead of simulating a Lightning > > > > channel is the same as the overhead of actually creating and closing a > > > > Lightning channel. > > > > Since the punishment of proof-of-closure is to force attackers to have > > > > their channels closed, we can consider that this simulation of a > > > > channel open and close is sufficient as well. > > > > > > > > Future-Proofing > > > > --------------- > > > > > > > > This sketch of proof-of-closure can be used for any update mechanism: > > > > > > > > * With Poon-Dryja, C can use its own commitment transaction as the > > > > proof-of-closure. > > > > * With Decker-Wattenhofer, C can give all the offchain transactions up > > > > to the last stage in the multi-stage decrementing-`nSequence` mechanism. > > > > * With Deckker-Russell-Osuntokun, C can give the latest update and > > > > state trnsaction. > > > > > > > > Basically, we expect that for now, and in the future, any update > > > > mechanism worth consideration will have a concept of "unilateral close" > > > > where a channel can be dropped onchain, using data that only one of the > > > > channel participants holds. > > > > > > > > Such a unilateral close will be a sequence of one or more valid > > > > transactions, terminating in a transaction containing an HTLC-like > > > > contract in one of its outputs. > > > > > > > > Thus, to validate the unilateral close, it is only required to validate > > > > all the transactions contained in the proof-of-closure, and see that > > > > the last transaction has an HTLC output. > > > > > > > > The limitations are thus: > > > > > > > > * The acceptable forms of HTLC would need to be agreed-upon by the > > > > entire network. > > > > * Implementations would need to be able to assess, in a > > > > Bitcoin-consensus-compatible way, whether a transaction is valid or not. > > > > > > > > Payment Decorrelation and Payment Points > > > > ---------------------------------------- > > > > > > > > Of course, having a single payment hash for the entire payment attempt > > > > is a privacy loss, which we intend to fix in the near future by using > > > > payment points, and adding a blinding scalar at each hop, aka. payment > > > > decorrelation. > > > > > > > > Thus, in the future, there will not be any HTLC, but instead a PTLC. > > > > Further, the payment point at each hop will be changed at each hop, in > > > > order to prevent decorrelation. > > > > > > > > Thus, C needs to provide proofs: > > > > > > > > * That an apparent singlesig on the unilateral close output is in fact > > > > a PTLC. > > > > C needs to provide: > > > > * A target point P. > > > > * A partial signature that would spend that singlesig for a > > > > particular sighash. > > > > * An adaptor signature which, with knowledge of the completed > > > > signature, adaptor signature, and sighash message, would have revealed > > > > the scalar behind P. > > > > * That the PTLC belongs to the same payment attempt as what B offered > > > > to C. > > > > C needs to provide: > > > > * The C-only blinding factor that is the difference between the > > > > payment point of the B-to-C PTLC and the C-to-E PTLC on the unilateral > > > > close. > > > > > > > > Then, when B needs to propagate the proof-of-closure back to A, B > > > > simply adds its own blinding factor to the reported blinding factor, in > > > > order to convince A that this is the same payment attempt. > > > > > > > > As we have brought up privacy, we observe that, when this mechanism > > > > triggers, there is a mild privacy loss, in that intermediate nodes now > > > > know some channel closure that is related to this payment, and can thus > > > > determine the exact path that the payment attempt went through, at > > > > least until the channel being closed. > > > > However, proof-of-closure is only propagated in case of violation of > > > > the soft timeout, so for normal non-malicious payments, > > > > proof-of-closure does not cause any privacy loss. > > > > _______________________________________________ > > > > Lightning-dev mailing list > > > > [email protected] > > > > https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev _______________________________________________ Lightning-dev mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/lightning-dev
