04-onion-routing.md (134178B)
1 # BOLT #4: Onion Routing Protocol 2 3 ## Overview 4 5 This document describes the construction of an onion routed packet that is 6 used to route a payment from an _origin node_ to a _final node_. The packet 7 is routed through a number of intermediate nodes, called _hops_. 8 9 The routing schema is based on the [Sphinx][sphinx] construction and is 10 extended with a per-hop payload. 11 12 Intermediate nodes forwarding the message can verify the integrity of 13 the packet and can learn which node they should forward the 14 packet to. They cannot learn which other nodes, besides their 15 predecessor or successor, are part of the packet's route; nor can they learn 16 the length of the route or their position within it. The packet is 17 obfuscated at each hop, to ensure that a network-level attacker cannot 18 associate packets belonging to the same route (i.e. packets belonging 19 to the same route do not share any correlating information). Notice that this 20 does not preclude the possibility of packet association by an attacker 21 via traffic analysis. 22 23 The route is constructed by the origin node, which knows the public 24 keys of each intermediate node and of the final node. Knowing each node's public key 25 allows the origin node to create a shared secret (using ECDH) for each 26 intermediate node and for the final node. The shared secret is then 27 used to generate a _pseudo-random stream_ of bytes (which is used to obfuscate 28 the packet) and a number of _keys_ (which are used to encrypt the payload and 29 compute the HMACs). The HMACs are then in turn used to ensure the integrity of 30 the packet at each hop. 31 32 Each hop along the route only sees an ephemeral key for the origin node, in 33 order to hide the sender's identity. The ephemeral key is blinded by each 34 intermediate hop before forwarding to the next, making the onions unlinkable 35 along the route. 36 37 This specification describes _version 0_ of the packet format and routing 38 mechanism. 39 40 A node: 41 - upon receiving a higher version packet than it implements: 42 - MUST report a route failure to the origin node. 43 - MUST discard the packet. 44 45 # Table of Contents 46 47 * [Conventions](#conventions) 48 * [Key Generation](#key-generation) 49 * [Pseudo Random Byte Stream](#pseudo-random-byte-stream) 50 * [Packet Structure](#packet-structure) 51 * [Payload Format](#payload-format) 52 * [Basic Multi-Part Payments](#basic-multi-part-payments) 53 * [Route Blinding](#route-blinding) 54 * [Inside encrypted_recipient_data: encrypted_data_tlv](#Inside-encrypted_recipient_data-encrypted_data_tlv) 55 * [Accepting and Forwarding a Payment](#accepting-and-forwarding-a-payment) 56 * [Payload for the Last Node](#payload-for-the-last-node) 57 * [Non-strict Forwarding](#non-strict-forwarding) 58 * [Shared Secret](#shared-secret) 59 * [Blinding Ephemeral Onion Keys](#blinding-ephemeral-onion-keys) 60 * [Packet Construction](#packet-construction) 61 * [Onion Decryption](#onion-decryption) 62 * [Filler Generation](#filler-generation) 63 * [Returning Errors](#returning-errors) 64 * [Failure Messages](#failure-messages) 65 * [Receiving Failure Codes](#receiving-failure-codes) 66 * [Onion Messages](#onion-messages) 67 * [`max_htlc_cltv` Selection](#max_htlc_cltv-selection) 68 * [Test Vector](#test-vector) 69 * [Returning Errors](#returning-errors) 70 * [References](#references) 71 * [Authors](#authors) 72 73 # Conventions 74 75 There are a number of conventions adhered to throughout this document: 76 77 - HMAC: the integrity verification of the packet is based on Keyed-Hash 78 Message Authentication Code, as defined by the [FIPS 198 79 Standard][fips198]/[RFC 2104][RFC2104], and using a `SHA256` hashing 80 algorithm. 81 - Elliptic curve: for all computations involving elliptic curves, the Bitcoin 82 curve is used, as specified in [`secp256k1`][sec2] 83 - Pseudo-random stream: [`ChaCha20`][rfc8439] is used to generate a 84 pseudo-random byte stream. For its generation, a fixed 96-bit null-nonce 85 (`0x000000000000000000000000`) is used, along with a key derived from a shared 86 secret and with a `0x00`-byte stream of the desired output size as the 87 message. 88 - The terms _origin node_ and _final node_ refer to the initial packet sender 89 and the final packet recipient, respectively. 90 - The terms _hop_ and _node_ are sometimes used interchangeably, but a _hop_ 91 usually refers to an intermediate node in the route rather than an end node. 92 _origin node_ --> _hop_ --> ... --> _hop_ --> _final node_ 93 - The term _processing node_ refers to the specific node along the route that is 94 currently processing the forwarded packet. 95 - The term _peers_ refers only to hops that are direct neighbors (in the 96 overlay network): more specifically, _sending peers_ forward packets 97 to _receiving peers_. 98 - Each hop in the route has a variable length `hop_payload`. 99 - The variable length `hop_payload` is prefixed with a `bigsize` encoding 100 the length in bytes, excluding the prefix and the trailing HMAC. 101 102 # Key Generation 103 104 A number of encryption and verification keys are derived from the shared secret: 105 106 - _rho_: used as key when generating the pseudo-random byte stream that is used 107 to obfuscate the per-hop information 108 - _mu_: used during the HMAC generation 109 - _um_: used during error reporting 110 - _pad_: use to generate random filler bytes for the starting mix-header 111 packet 112 113 The key generation function takes a key-type (_rho_=`0x72686F`, _mu_=`0x6d75`, 114 _um_=`0x756d`, or _pad_=`0x706164`) and a 32-byte secret as inputs and returns 115 a 32-byte key. 116 117 Keys are generated by computing an HMAC (with `SHA256` as hashing algorithm) 118 using the appropriate key-type (i.e. _rho_, _mu_, _um_, or _pad_) as HMAC-key 119 and the 32-byte shared secret as the message. The resulting HMAC is then 120 returned as the key. 121 122 Notice that the key-type does not include a C-style `0x00`-termination-byte, 123 e.g. the length of the _rho_ key-type is 3 bytes, not 4. 124 125 # Pseudo Random Byte Stream 126 127 The pseudo-random byte stream is used to obfuscate the packet at each hop of the 128 path, so that each hop may only recover the address and HMAC of the next hop. 129 The pseudo-random byte stream is generated by encrypting (using `ChaCha20`) a 130 `0x00`-byte stream, of the required length, which is initialized with a key 131 derived from the shared secret and a 96-bit zero-nonce (`0x000000000000000000000000`). 132 133 The use of a fixed nonce is safe, since the keys are never reused. 134 135 # Packet Structure 136 137 The packet consists of four sections: 138 139 - a `version` byte 140 - a 33-byte compressed `secp256k1` `public_key`, used during the shared secret 141 generation 142 - a 1300-byte `hop_payloads` consisting of multiple, variable length, 143 `hop_payload` payloads 144 - a 32-byte `hmac`, used to verify the packet's integrity 145 146 The network format of the packet consists of the individual sections 147 serialized into one contiguous byte-stream and then transferred to the packet 148 recipient. Due to the fixed size of the packet, it need not be prefixed by its 149 length when transferred over a connection. 150 151 The overall structure of the packet is as follows: 152 153 1. type: `onion_packet` 154 2. data: 155 * [`byte`:`version`] 156 * [`point`:`public_key`] 157 * [`1300*byte`:`hop_payloads`] 158 * [`32*byte`:`hmac`] 159 160 For this specification (_version 0_), `version` has a constant value of `0x00`. 161 162 The `hop_payloads` field is a structure that holds obfuscated routing information, and associated HMAC. 163 It is 1300 bytes long and has the following structure: 164 165 1. type: `hop_payloads` 166 2. data: 167 * [`bigsize`:`length`] 168 * [`length*byte`:`payload`] 169 * [`32*byte`:`hmac`] 170 * ... 171 * `filler` 172 173 Where, the `length`, `payload`, and `hmac` are repeated for each hop; 174 and where, `filler` consists of obfuscated, deterministically-generated padding, as detailed in [Filler Generation](#filler-generation). 175 Additionally, `hop_payloads` is incrementally obfuscated at each hop. 176 177 Using the `payload` field, the origin node is able to specify the path and structure of the HTLCs forwarded at each hop. 178 As the `payload` is protected under the packet-wide HMAC, the information it contains is fully authenticated with each pair-wise relationship between the HTLC sender (origin node) and each hop in the path. 179 180 Using this end-to-end authentication, each hop is able to cross-check the HTLC 181 parameters with the `payload`'s specified values and to ensure that the 182 sending peer hasn't forwarded an ill-crafted HTLC. 183 184 Since no `payload` TLV value can ever be shorter than 2 bytes, `length` values of 0 and 1 are reserved. (`0` indicated a legacy format no longer supported, and `1` is reserved for future use). 185 186 ### `payload` format 187 188 This is formatted according to the Type-Length-Value format defined in [BOLT #1](01-messaging.md#type-length-value-format). 189 190 1. `tlv_stream`: `payload` 191 2. types: 192 1. type: 2 (`amt_to_forward`) 193 2. data: 194 * [`tu64`:`amt_to_forward`] 195 1. type: 4 (`outgoing_cltv_value`) 196 2. data: 197 * [`tu32`:`outgoing_cltv_value`] 198 1. type: 6 (`short_channel_id`) 199 2. data: 200 * [`short_channel_id`:`short_channel_id`] 201 1. type: 8 (`payment_data`) 202 2. data: 203 * [`32*byte`:`payment_secret`] 204 * [`tu64`:`total_msat`] 205 1. type: 10 (`encrypted_recipient_data`) 206 2. data: 207 * [`...*byte`:`encrypted_recipient_data`] 208 1. type: 12 (`current_path_key`) 209 2. data: 210 * [`point`:`path_key`] 211 1. type: 16 (`payment_metadata`) 212 2. data: 213 * [`...*byte`:`payment_metadata`] 214 1. type: 18 (`total_amount_msat`) 215 2. data: 216 * [`tu64`:`total_msat`] 217 218 `short_channel_id` is the ID of the outgoing channel used to route the 219 message; the receiving peer should operate the other end of this channel. 220 221 `amt_to_forward` is the amount, in millisatoshis, to forward to the 222 next receiving peer specified within the routing information, or for 223 the final destination. 224 225 For non-final nodes, this includes the origin node's computed _fee_ for the 226 receiving peer, calculated according to the receiving peer's advertised fee 227 schema (as described in [BOLT #7](07-routing-gossip.md#htlc-fees)). 228 229 `outgoing_cltv_value` is the CLTV value that the _outgoing_ HTLC 230 carrying the packet should have. Inclusion of this field allows a hop 231 to both authenticate the information specified by the origin node, and 232 the parameters of the HTLC forwarded, and ensure the origin node is 233 using the current `cltv_expiry_delta` value. 234 235 If the values don't correspond, this indicates that either a 236 forwarding node has tampered with the intended HTLC values or that the 237 origin node has an obsolete `cltv_expiry_delta` value. 238 239 The requirements ensure consistency in responding to an unexpected 240 `outgoing_cltv_value`, whether it is the final node or not, to avoid 241 leaking its position in the route. 242 243 ### Requirements 244 245 The creator of `encrypted_recipient_data` (usually, the recipient of payment): 246 247 - MUST create `encrypted_data_tlv` for each node in the blinded route (including itself). 248 - MUST include `encrypted_data_tlv.payment_relay` for each non-final node. 249 - MUST include exactly one of `encrypted_data_tlv.short_channel_id` or `encrypted_data_tlv.next_node_id` for each non-final node. 250 - MUST set `encrypted_data_tlv.payment_constraints` for each non-final node and MAY set it for the final node: 251 - `max_cltv_expiry` to the largest block height at which the route is allowed to be used, starting 252 from the final node's chosen `max_cltv_expiry` height at which the route should expire, adding 253 the final node's `min_final_cltv_expiry_delta` and then adding 254 `encrypted_data_tlv.payment_relay.cltv_expiry_delta` at each hop. 255 - `htlc_minimum_msat` to the largest minimum HTLC value the nodes will allow. 256 - If it sets `encrypted_data_tlv.allowed_features`: 257 - MUST set it to an empty array. 258 - MUST compute the total fees and CLTV delta of the route as follows and communicate them to the sender: 259 - `total_fee_base_msat(n+1) = (fee_base_msat(n+1) * 1000000 + total_fee_base_msat(n) * (1000000 + fee_proportional_millionths(n+1)) + 1000000 - 1) / 1000000` 260 - `total_fee_proportional_millionths(n+1) = ((total_fee_proportional_millionths(n) + fee_proportional_millionths(n+1)) * 1000000 + total_fee_proportional_millionths(n) * fee_proportional_millionths(n+1) + 1000000 - 1) / 1000000` 261 - `total_cltv_delta = cltv_delta(0) + cltv_delta(1) + ... + cltv_delta(n) + min_final_cltv_expiry_delta` 262 - MUST create the `encrypted_recipient_data` from the `encrypted_data_tlv` as required in [Route Blinding](#route-blinding). 263 264 The writer of the TLV `payload`: 265 266 - For every node inside a blinded route: 267 - MUST include the `encrypted_recipient_data` provided by the recipient 268 - For the first node in the blinded route: 269 - MUST include the `path_key` provided by the recipient in `current_path_key` 270 - If it is the final node: 271 - MUST include `amt_to_forward`, `outgoing_cltv_value` and `total_amount_msat`. 272 - The value set for `outgoing_cltv_value`: 273 - MUST use the current block height as a baseline value. 274 - if a [random offset](07-routing-gossip.md#recommendations-for-routing) was added to improve privacy: 275 - SHOULD add the offset to the baseline value. 276 - MUST NOT include any other tlv field. 277 - For every node outside of a blinded route: 278 - MUST include `amt_to_forward` and `outgoing_cltv_value`. 279 - For every non-final node: 280 - MUST include `short_channel_id` 281 - MUST NOT include `payment_data` 282 - For the final node: 283 - MUST NOT include `short_channel_id` 284 - if the recipient provided `payment_secret`: 285 - MUST include `payment_data` 286 - MUST set `payment_secret` to the one provided 287 - MUST set `total_msat` to the total amount it will send 288 - if the recipient provided `payment_metadata`: 289 - MUST include `payment_metadata` with every HTLC 290 - MUST not apply any limits to the size of `payment_metadata` except the limits implied by the fixed onion size 291 292 The reader: 293 294 - If `encrypted_recipient_data` is present: 295 - If `path_key` is set in the incoming `update_add_htlc`: 296 - MUST return an error if `current_path_key` is present. 297 - MUST use that `path_key` as `path_key` for decryption. 298 - Otherwise: 299 - MUST return an error if `current_path_key` is not present. 300 - MUST use that `current_path_key` as the `path_key` for decryption. 301 - SHOULD add a random delay before returning errors. 302 - MUST return an error if `encrypted_recipient_data` does not decrypt using the 303 `path_key` as described in [Route Blinding](#route-blinding). 304 - If `payment_constraints` is present: 305 - MUST return an error if: 306 - the expiry is greater than `encrypted_recipient_data.payment_constraints.max_cltv_expiry`. 307 - the amount is below `encrypted_recipient_data.payment_constraints.htlc_minimum_msat`. 308 - If `allowed_features` is missing: 309 - MUST process the message as if it were present and contained an empty array. 310 - MUST return an error if: 311 - `encrypted_recipient_data.allowed_features.features` contains an unknown feature bit (even if it is odd). 312 - `encrypted_recipient_data` contains both `short_channel_id` and `next_node_id`. 313 - the payment uses a feature not included in `encrypted_recipient_data.allowed_features.features`. 314 - If it is not the final node: 315 - MUST return an error if the payload contains other tlv fields than `encrypted_recipient_data` and `current_path_key`. 316 - MUST return an error if `encrypted_recipient_data` does not contain either `short_channel_id` or `next_node_id`. 317 - MUST return an error if `encrypted_recipient_data` does not contain `payment_relay`. 318 - MUST use values from `encrypted_recipient_data.payment_relay` to calculate `amt_to_forward` and `outgoing_cltv_value` as follows: 319 - `amt_to_forward = ((amount_msat - fee_base_msat) * 1000000 + 1000000 + fee_proportional_millionths - 1) / (1000000 + fee_proportional_millionths)` 320 - `outgoing_cltv_value = cltv_expiry - payment_relay.cltv_expiry_delta` 321 - If it is the final node: 322 - MUST return an error if the payload contains other tlv fields than `encrypted_recipient_data`, `current_path_key`, `amt_to_forward`, `outgoing_cltv_value` and `total_amount_msat`. 323 - MUST return an error if `amt_to_forward`, `outgoing_cltv_value` or `total_amount_msat` are not present. 324 - MUST return an error if `amt_to_forward` is below what it expects for the payment. 325 - MUST return an error if incoming `cltv_expiry` < `outgoing_cltv_value`. 326 - MUST return an error if incoming `cltv_expiry` < `current_block_height` + `min_final_cltv_expiry_delta`. 327 - Otherwise (it is not part of a blinded route): 328 - MUST return an error if `path_key` is set in the incoming `update_add_htlc` or `current_path_key` is present. 329 - MUST return an error if `amt_to_forward` or `outgoing_cltv_value` are not present. 330 - if it is not the final node: 331 - MUST return an error if: 332 - `short_channel_id` is not present, 333 - it cannot forward the HTLC to the peer indicated by the channel `short_channel_id`. 334 - incoming `amount_msat` - `fee` < `amt_to_forward` (where `fee` is the advertised fee as described in [BOLT #7](07-routing-gossip.md#htlc-fees)) 335 - `cltv_expiry` - `cltv_expiry_delta` < `outgoing_cltv_value` 336 - If it is the final node: 337 - MUST treat `total_msat` as if it were equal to `amt_to_forward` if it is not present. 338 - MUST return an error if: 339 - incoming `amount_msat` < `amt_to_forward`. 340 - incoming `cltv_expiry` < `outgoing_cltv_value`. 341 - incoming `cltv_expiry` < `current_block_height` + `min_final_cltv_expiry_delta`. 342 343 Additional requirements are specified [here](#basic-multi-part-payments) for 344 multi-part payments, and [here](#route-blinding) for blinded payments. 345 346 ### Basic Multi-Part Payments 347 348 An HTLC may be part of a larger "multi-part" payment: such 349 "base" atomic multipath payments will use the same `payment_hash` for 350 all paths. 351 352 Note that `amt_to_forward` is the amount for this HTLC only: a 353 `total_msat` field containing a greater value is a promise by the 354 ultimate sender that the rest of the payment will follow in succeeding 355 HTLCs; we call these outstanding HTLCs which have the same preimage, 356 an "HTLC set". 357 358 Note that there are two distinct tlv fields that can be used to transmit 359 `total_msat`. The last one, `total_amount_msat`, was introduced with 360 blinded paths for which the `payment_secret` doesn't make sense. 361 362 `payment_metadata` is to be included in every payment part, so that 363 invalid payment details can be detected as early as possible. 364 365 #### Requirements 366 367 The writer: 368 - if the invoice offers the `basic_mpp` feature: 369 - MAY send more than one HTLC to pay the invoice. 370 - MUST use the same `payment_hash` on all HTLCs in the set. 371 - SHOULD send all payments at approximately the same time. 372 - SHOULD try to use diverse paths to the recipient for each HTLC. 373 - SHOULD retry and/or re-divide HTLCs which fail. 374 - if the invoice specifies an `amount`: 375 - MUST set `total_msat` to at least that `amount`, and less 376 than or equal to twice `amount`. 377 - otherwise: 378 - MUST set `total_msat` to the amount it wishes to pay. 379 - MUST ensure that the total `amt_to_forward` of the HTLC set which arrives 380 at the payee is equal to or greater than `total_msat`. 381 - MUST NOT send another HTLC if the total `amt_to_forward` of the HTLC set 382 is already greater or equal to `total_msat`. 383 - MUST include `payment_secret`. 384 - otherwise: 385 - MUST set `total_msat` equal to `amt_to_forward`. 386 387 The final node: 388 - MUST fail the HTLC if dictated by Requirements under [Failure Messages](#failure-messages) 389 - Note: "amount paid" specified there is the `total_msat` field. 390 - if it does not support `basic_mpp`: 391 - MUST fail the HTLC if `total_msat` is not exactly equal to `amt_to_forward`. 392 - otherwise, if it supports `basic_mpp`: 393 - MUST add it to the HTLC set corresponding to that `payment_hash`. 394 - SHOULD fail the entire HTLC set if `total_msat` is not the same for 395 all HTLCs in the set. 396 - if the total `amt_to_forward` of this HTLC set is equal to or greater 397 than `total_msat`: 398 - SHOULD fulfill all HTLCs in the HTLC set 399 - otherwise, if the total `amt_to_forward` of this HTLC set is less than 400 `total_msat`: 401 - MUST NOT fulfill any HTLCs in the HTLC set 402 - MUST fail all HTLCs in the HTLC set after some reasonable timeout. 403 - SHOULD wait for at least 60 seconds after the initial HTLC. 404 - SHOULD use `mpp_timeout` for the failure message. 405 - MUST require `payment_secret` for all HTLCs in the set. 406 - if it fulfills any HTLCs in the HTLC set: 407 - MUST fulfill the entire HTLC set. 408 409 #### Rationale 410 411 If `basic_mpp` is present it causes a delay to allow other partial 412 payments to combine. The total amount must be sufficient for the 413 desired payment, just as it must be for single payments. But this must 414 be reasonably bounded to avoid a denial-of-service. 415 416 Because invoices do not necessarily specify an amount, and because 417 payers can add noise to the final amount, the total amount must be 418 sent explicitly. The requirements allow exceeding this slightly, as 419 it simplifies adding noise to the amount when splitting, as well as 420 scenarios in which the senders are genuinely independent (friends 421 splitting a bill, for example). 422 423 Because a node may need to pay more than its desired amount (due to the 424 `htlc_minimum_msat` value of channels in the desired path), nodes are allowed 425 to pay more than the `total_msat` they specified. Otherwise, nodes would be 426 constrained in which paths they can take when retrying payments along specific 427 paths. However, no individual HTLC may be for less than the difference between 428 the total paid and `total_msat`. 429 430 The restriction on sending an HTLC once the set is over the agreed total prevents the preimage being released before all 431 the partial payments have arrived: that would allow any intermediate 432 node to immediately claim any outstanding partial payments. 433 434 An implementation may choose not to fulfill an HTLC set which 435 otherwise meets the amount criterion (eg. some other failure, or 436 invoice timeout), however if it were to fulfill only some of them, 437 intermediary nodes could simply claim the remaining ones. 438 439 ## Route Blinding 440 441 1. subtype: `blinded_path` 442 2. data: 443 * [`sciddir_or_pubkey`:`first_node_id`] 444 * [`point`:`first_path_key`] 445 * [`byte`:`num_hops`] 446 * [`num_hops*blinded_path_hop`:`path`] 447 448 1. subtype: `blinded_path_hop` 449 2. data: 450 * [`point`:`blinded_node_id`] 451 * [`u16`:`enclen`] 452 * [`enclen*byte`:`encrypted_recipient_data`] 453 454 A blinded path consists of: 455 1. an initial introduction point (`first_node_id`) 456 2. an initial key to share a secret with the first node_id (`first_path_key`) 457 3. a series of tweaked node ids (`path.blinded_node_id`) 458 4. a series of binary blobs encrypted to the nodes (`path.encrypted_recipient_data`) 459 to tell them the next hop. 460 461 For example, Dave wants Alice to reach him via public node Bob then 462 Carol. He creates a chain of public keys ("path_keys") for Bob, Carol 463 and finally himself, so he can share a secret with each of them. These 464 keys are a simple chain, so each node can derive the next `path_key` without 465 having to be told explicitly. 466 467 From these shared secrets, Dave creates and encrypts three `encrypted_data_tlv`s: 468 1. encrypted_data_bob: For Bob to tell him to forward to Carol 469 2. encrypted_data_carol: For Carol to tell her to forward to him 470 3. encrypted_data_dave: For himself to indicate the path was used, and any metadata he wants. 471 472 To mask the node ids, he also derives three blinding factors from the 473 shared secrets, which turn Bob into Bob', Carol into Carol' and Dave 474 into Dave'. 475 476 So this is the `blinded_path` he hands to Alice. 477 478 1. `first_node_id`: Bob 479 2. `first_path_key`: the first path key for Bob 480 3. `path`: [Bob', encrypted_data_bob], [Carol', encrypted_data_carol], [Dave', encrypted_data_dave] 481 482 There are two different ways for Alice to construct an onion which gets to Bob (since he's probably not a direct peer of hers) which are described in the requirements below. 483 484 But after Bob the path is always the same: he will send Carol the `path_key` he derived, along with the onion. She will use the `path_key` to derive the tweak for the onion (which Alice encrypted for Carol' not Carol) so she can decrypt it, and also to derive the key to decrypt `encrypted_data_tlv` which will tell her to forward to Dave (and possibly additional restrictions Dave specified). 485 486 ### Requirements 487 488 Note that the creator of the blinded path (i.e. the recipient) is creating it for the sender to use to create an onion, and for the intermediate nodes to read the instructions, hence there are two reader sections here. 489 490 The writer of a `blinded_path`: 491 492 - MUST create a viable path to itself ($`N_r`$) i.e. $`N_0 \rightarrow N_1 \rightarrow ... \rightarrow N_r`$. 493 - MUST set `first_node_id` to $`N_0`$ 494 - MUST create a series of ECDH shared secrets for each node in the route using the following algorithm: 495 - $`e_0 \leftarrow \{0;1\}^{256}`$ ($`e_0`$ SHOULD be obtained via CSPRNG) 496 - $`E_0 = e_0 \cdot G`$ 497 - For every node in the route: 498 - let $`N_i = k_i * G`$ be the `node_id` ($`k_i`$ is $`N_i`$'s private key) 499 - $`ss_i = SHA256(e_i * N_i) = SHA256(k_i * E_i)`$ (ECDH shared secret known only by $`N_r`$ and $`N_i`$) 500 - $`rho_i = HMAC256(\text{"rho"}, ss_i)`$ (key used to encrypt `encrypted_recipient_data` for $`N_i`$ by $`N_r`$) 501 - $`e_{i+1} = SHA256(E_i || ss_i) * e_i`$ (ephemeral private path key, only known by $`N_r`$) 502 - $`E_{i+1} = SHA256(E_i || ss_i) * E_i`$ (`path_key`. NB: $`N_i`$ MUST NOT learn $`e_i`$) 503 - MUST set `first_path_key` to $`E_0`$ 504 - MUST create a series of blinded node IDs $`B_i`$ for each node using the following algorithm: 505 - $`B_i = HMAC256(\text{"blinded\_node\_id"}, ss_i) * N_i`$ (blinded `node_id` for $`N_i`$, private key known only by $`N_i`$) 506 - MUST set `blinded_node_id` for each `blinded_path_hop` in `path` to $`B_i`$ 507 - MAY replace $`E_{i+1}`$ with a different value, but if it does: 508 - MUST set `encrypted_data_tlv[i].next_path_key_override` to $`E_{i+1}`$ 509 - MAY store private data in `encrypted_data_tlv[r].path_id` to verify that the route is used in the right context and was created by them 510 - SHOULD add padding data to ensure all `encrypted_data_tlv[i]` have the same length 511 - MUST encrypt each `encrypted_data_tlv[i]` with ChaCha20-Poly1305 using the corresponding $`rho_i`$ key and an all-zero nonce to produce `encrypted_recipient_data[i]` 512 - MAY add additional "dummy" hops at the end of the path (which it will ignore on receipt) to obscure the path length. 513 514 The reader of the `blinded_path`: 515 - MUST prepend its own onion payloads to reach the `first_node_id` 516 - MUST include the corresponding `encrypted_recipient_data` in each onion payload within `path` 517 - For the first entry in `path`: 518 - if it is sending a payment: 519 - SHOULD create an unblinded onion payment to `first_node_id`, and include `first_path_key` as `current_path_key`. 520 - otherwise: 521 - MUST encrypt the first blinded path onion to the first `blinded_node_id`. 522 - MUST set `next_path_key_override` in the prior onion payload to `first_path_key`. 523 - For each successive entry in `path`: 524 - MUST encrypt the onion to the corresponding `blinded_node_id`. 525 526 The reader of the `encrypted_recipient_data`: 527 528 - MUST compute: 529 - $`ss_i = SHA256(k_i * E_i)`$ (standard ECDH) 530 - $`b_i = HMAC256(\text{"blinded\_node\_id"}, ss_i) * k_i`$ 531 - $`rho_i = HMAC256(\text{"rho"}, ss_i)`$ 532 - MUST decrypt the `encrypted_recipient_data` field using $`rho_i`$ as a key using ChaCha20-Poly1305 and an all-zero nonce key. 533 - If the `encrypted_recipient_data` field is missing, cannot be decrypted into an `encrypted_data_tlv` or contains unknown even fields: 534 - MUST return an error 535 - If the `encrypted_data_tlv` contains a `next_path_key_override`: 536 - MUST use it as the next `path_key`. 537 - Otherwise: 538 - MUST use $`E_{i+1} = SHA256(E_i || ss_i) * E_i`$ as the next `path_key` 539 - MUST forward the onion and include the next `path_key` in the lightning 540 message for the next node 541 - If it is the final recipient: 542 - MUST ignore the message if the `path_id` does not match the blinded route it 543 created for this purpose 544 545 ### Rationale 546 547 Route blinding is a lightweight technique to provide recipient anonymity. 548 It's more flexible than rendezvous routing because it simply replaces the public 549 keys of the nodes in the route with random public keys while letting senders 550 choose what data they put in the onion for each hop. Blinded routes are also 551 reusable in some cases (e.g. onion messages). 552 553 Each node in the blinded route needs to receive $`E_i`$ to be able to decrypt 554 the onion and the `encrypted_recipient_data` payload. 555 556 When concatenating two blinded routes generated by different nodes, the 557 last node of the first route needs to know the first `path_key` of the 558 second route: the `next_path_key_override` field must be used to transmit this 559 information. In theory this method could be used for payments (not just 560 onion messages), but we recommend using an unblinded path to reach the 561 `first_node_id` and using `current_path_key` there: this means that the 562 node can tell it is being used as an introductory point, but also does 563 not require blinded path support on the nodes to reach that point, and 564 gives meaningful errors on the unblinded part of the payment. 565 566 The final recipient must verify that the blinded route is used in the right 567 context (e.g. for a specific payment) and was created by them. Otherwise a 568 malicious sender could create different blinded routes to all the nodes that 569 they suspect could be the real recipient and try them until one accepts the 570 message. The recipient can protect against that by storing $`E_r`$ and the 571 context (e.g. a `payment_hash`), and verifying that they match when receiving 572 the onion. Otherwise, to avoid additional storage cost, it can put some private 573 context information in the `path_id` field (e.g. the `payment_preimage`) and 574 verify that when receiving the onion. Note that it's important to use private 575 information in that case, that senders cannot have access to. 576 577 Whenever the introduction point receives a failure from the blinded route, it 578 should add a random delay before forwarding the error. Failures are likely to 579 be probing attempts and message timing may help the attacker infer its distance 580 to the final recipient. 581 582 Note that nodes in the blinded route return failures through `update_fail_malformed_htlc` and therefore do not and can 583 not provide timing information via attribution data to the sender. 584 585 The `padding` field can be used to ensure that all `encrypted_recipient_data` have the 586 same length. It's particularly useful when adding dummy hops at the end of a 587 blinded route, to prevent the sender from figuring out which node is the final 588 recipient. 589 590 When route blinding is used for payments, the recipient specifies the fees and 591 expiry that blinded nodes should apply to the payment instead of letting the 592 sender configure them. The recipient also adds additional constraints to the 593 payments that can go through that route to protect against probing attacks that 594 would let malicious nodes unblind the identity of the blinded nodes. It should 595 set `payment_constraints.max_cltv_expiry` to restrict the lifetime of a blinded 596 route and reduce the risk that an intermediate node updates its fees and rejects 597 payments (which could be used to unblind nodes inside the route). 598 599 ### Inside `encrypted_recipient_data`: `encrypted_data_tlv` 600 601 The `encrypted_recipient_data` is a TLV stream, encrypted for a given blinded node, that 602 may contain the following TLV fields: 603 604 1. `tlv_stream`: `encrypted_data_tlv` 605 2. types: 606 1. type: 1 (`padding`) 607 2. data: 608 * [`...*byte`:`padding`] 609 1. type: 2 (`short_channel_id`) 610 2. data: 611 * [`short_channel_id`:`short_channel_id`] 612 1. type: 4 (`next_node_id`) 613 2. data: 614 * [`point`:`node_id`] 615 1. type: 6 (`path_id`) 616 2. data: 617 * [`...*byte`:`data`] 618 1. type: 8 (`next_path_key_override`) 619 2. data: 620 * [`point`:`path_key`] 621 1. type: 10 (`payment_relay`) 622 2. data: 623 * [`u16`:`cltv_expiry_delta`] 624 * [`u32`:`fee_proportional_millionths`] 625 * [`tu32`:`fee_base_msat`] 626 1. type: 12 (`payment_constraints`) 627 2. data: 628 * [`u32`:`max_cltv_expiry`] 629 * [`tu64`:`htlc_minimum_msat`] 630 1. type: 14 (`allowed_features`) 631 2. data: 632 * [`...*byte`:`features`] 633 634 #### Rationale 635 636 Encrypted recipient data is created by the final recipient to give to the 637 sender, containing instructions for the node on how to handle the message (it can also be created by the sender themselves: the node forwarding cannot tell). It's used 638 in both payment onions and onion messages onions. See [Route Blinding](#route-blinding). 639 640 641 # Accepting and Forwarding a Payment 642 643 Once a node has decoded the payload it either accepts the payment locally, or forwards it to the peer indicated as the next hop in the payload. 644 645 ## Non-strict Forwarding 646 647 A node MAY forward an HTLC along an outgoing channel other than the one 648 specified by `short_channel_id`, so long as the receiver has the same node 649 public key intended by `short_channel_id`. Thus, if `short_channel_id` connects 650 nodes A and B, the HTLC can be forwarded across any channel connecting A and B. 651 Failure to adhere will result in the receiver being unable to decrypt the next 652 hop in the onion packet. 653 654 ### Rationale 655 656 In the event that two peers have multiple channels, the downstream node will be 657 able to decrypt the next hop payload regardless of which channel the packet is 658 sent across. 659 660 Nodes implementing non-strict forwarding are able to make real-time assessments 661 of channel bandwidths with a particular peer, and use the channel that is 662 locally-optimal. 663 664 For example, if the channel specified by `short_channel_id` connecting A and B 665 does not have enough bandwidth at forwarding time, then A is able use a 666 different channel that does. This can reduce payment latency by preventing the 667 HTLC from failing due to bandwidth constraints across `short_channel_id`, only 668 to have the sender attempt the same route differing only in the channel between 669 A and B. 670 671 Non-strict forwarding allows nodes to make use of private channels connecting 672 them to the receiving node, even if the channel is not known in the public 673 channel graph. 674 675 ### Recommendation 676 677 Implementations using non-strict forwarding should consider applying the same 678 fee schedule to all channels with the same peer, as senders are likely to select 679 the channel which results in the lowest overall cost. Having distinct policies 680 may result in the forwarding node accepting fees based on the most optimal fee 681 schedule for the sender, even though they are providing aggregate bandwidth 682 across all channels with the same peer. 683 684 Alternatively, implementations may choose to apply non-strict forwarding only to 685 like-policy channels to ensure their expected fee revenue does not deviate by 686 using an alternate channel. 687 688 ## Payload for the Last Node 689 690 When building the route, the origin node MUST use a payload for 691 the final node with the following values: 692 693 * `payment_secret`: set to the payment secret specified by the recipient (e.g. 694 `payment_secret` from a [BOLT #11](11-payment-encoding.md) payment invoice) 695 * `outgoing_cltv_value`: set to the final expiry specified by the recipient (e.g. 696 `min_final_cltv_expiry_delta` from a [BOLT #11](11-payment-encoding.md) payment invoice) 697 * `amt_to_forward`: set to the final amount specified by the recipient (e.g. `amount` 698 from a [BOLT #11](11-payment-encoding.md) payment invoice) 699 700 This allows the final node to check these values and return errors if needed, 701 but it also eliminates the possibility of probing attacks by the second-to-last 702 node. Such attacks could, otherwise, attempt to discover if the receiving peer is the 703 last one by re-sending HTLCs with different amounts/expiries. 704 The final node will extract its onion payload from the HTLC it has received and 705 compare its values against those of the HTLC. See the 706 [Returning Errors](#returning-errors) section below for more details. 707 708 If not for the above, since it need not forward payments, the final node could 709 simply discard its payload. 710 711 # Shared Secret 712 713 The origin node establishes a shared secret with each hop along the route using 714 Elliptic-curve Diffie-Hellman between the sender's ephemeral key at that hop and 715 the hop's node ID key. The resulting curve point is serialized to the 716 compressed format and hashed using `SHA256`. The hash output is used 717 as the 32-byte shared secret. 718 719 Elliptic-curve Diffie-Hellman (ECDH) is an operation on an EC private key and 720 an EC public key that outputs a curve point. For this protocol, the ECDH 721 variant implemented in `libsecp256k1` is used, which is defined over the 722 `secp256k1` elliptic curve. During packet construction, the sender uses the 723 ephemeral private key and the hop's public key as inputs to ECDH, whereas 724 during packet forwarding, the hop uses the ephemeral public key and its own 725 node ID private key. Because of the properties of ECDH, they will both derive 726 the same value. 727 728 # Blinding Ephemeral Onion Keys 729 730 In order to ensure multiple hops along the route cannot be linked by the 731 ephemeral public keys they see, the key is blinded at each hop. The blinding is 732 done in a deterministic way that allows the sender to compute the 733 corresponding blinded private keys during packet construction. 734 735 The blinding of an EC public key is a single scalar multiplication of 736 the EC point representing the public key with a 32-byte blinding factor. Due to 737 the commutative property of scalar multiplication, the blinded private key is 738 the multiplicative product of the input's corresponding private key with the 739 same blinding factor. 740 741 The blinding factor itself is computed as a function of the ephemeral public key 742 and the 32-byte shared secret. Concretely, it is the `SHA256` hash value of the 743 concatenation of the public key serialized in its compressed format and the 744 shared secret. 745 746 # Packet Construction 747 748 In the following example, it's assumed that a _sending node_ (origin node), 749 `n_0`, wants to route a packet to a _receiving node_ (final node), `n_r`. 750 First, the sender computes a route `{n_0, n_1, ..., n_{r-1}, n_r}`, where `n_0` 751 is the sender itself and `n_r` is the final recipient. All nodes `n_i` and 752 `n_{i+1}` MUST be peers in the overlay network route. The sender then gathers the 753 public keys for `n_1` to `n_r` and generates a random 32-byte `sessionkey`. 754 Optionally, the sender may pass in _associated data_, i.e. data that the 755 packet commits to but that is not included in the packet itself. Associated 756 data will be included in the HMACs and must match the associated data provided 757 during integrity verification at each hop. 758 759 To construct the onion, the sender initializes the ephemeral private key for the 760 first hop `ek_1` to the `sessionkey` and derives from it the corresponding 761 ephemeral public key `epk_1` by multiplying with the `secp256k1` base point. For 762 each of the `k` hops along the route, the sender then iteratively computes the 763 shared secret `ss_k` and ephemeral key for the next hop `ek_{k+1}` as follows: 764 765 - The sender executes ECDH with the hop's public key and the ephemeral private 766 key to obtain a curve point, which is hashed using `SHA256` to produce the 767 shared secret `ss_k`. 768 - The blinding factor is the `SHA256` hash of the concatenation between the 769 ephemeral public key `epk_k` and the shared secret `ss_k`. 770 - The ephemeral private key for the next hop `ek_{k+1}` is computed by 771 multiplying the current ephemeral private key `ek_k` by the blinding factor. 772 - The ephemeral public key for the next hop `epk_{k+1}` is derived from the 773 ephemeral private key `ek_{k+1}` by multiplying with the base point. 774 775 Once the sender has all the required information above, it can construct the 776 packet. Constructing a packet routed over `r` hops requires `r` 32-byte 777 ephemeral public keys, `r` 32-byte shared secrets, `r` 32-byte blinding factors, 778 and `r` variable length `hop_payload` payloads. 779 The construction returns a single 1366-byte packet along with the first receiving peer's address. 780 781 The packet construction is performed in the reverse order of the route, i.e. 782 the last hop's operations are applied first. 783 784 The packet is initialized with 1300 _random_ bytes derived from a CSPRNG 785 (ChaCha20). The _pad_ key referenced above is used to extract additional random 786 bytes from a ChaCha20 stream, using it as a CSPRNG for this purpose. Once the 787 `paddingKey` has been obtained, ChaCha20 is used with an all zero nonce, to 788 generate 1300 random bytes. Those random bytes are then used as the starting 789 state of the mix-header to be created. 790 791 A filler is generated (see [Filler Generation](#filler-generation)) using the 792 shared secret. 793 794 For each hop in the route, in reverse order, the sender applies the 795 following operations: 796 797 - The _rho_-key and _mu_-key are generated using the hop's shared secret. 798 - `shift_size` is defined as the length of the `hop_payload` plus the bigsize encoding of the length and the length of that HMAC. Thus if the payload length is `l` then the `shift_size` is `1 + l + 32` for `l < 253`, otherwise `3 + l + 32` due to the bigsize encoding of `l`. 799 - The `hop_payload` field is right-shifted by `shift_size` bytes, discarding the last `shift_size` 800 bytes that exceed its 1300-byte size. 801 - The bigsize-serialized length, serialized `hop_payload` and `hmac` are copied into the following `shift_size` bytes. 802 - The _rho_-key is used to generate 1300 bytes of pseudo-random byte stream 803 which is then applied, with `XOR`, to the `hop_payloads` field. 804 - If this is the last hop, i.e. the first iteration, then the tail of the 805 `hop_payloads` field is overwritten with the routing information `filler`. 806 - The next HMAC is computed (with the _mu_-key as HMAC-key) over the 807 concatenated `hop_payloads` and associated data. 808 809 The resulting final HMAC value is the HMAC that will be used by the first 810 receiving peer in the route. 811 812 The packet generation returns a serialized packet that contains the `version` 813 byte, the ephemeral pubkey for the first hop, the HMAC for the first hop, and 814 the obfuscated `hop_payloads`. 815 816 The following Go code is an example implementation of the packet construction: 817 818 ```Go 819 func NewOnionPacket(paymentPath []*btcec.PublicKey, sessionKey *btcec.PrivateKey, 820 hopsData []HopData, assocData []byte) (*OnionPacket, error) { 821 822 numHops := len(paymentPath) 823 hopSharedSecrets := make([][sha256.Size]byte, numHops) 824 825 // Initialize ephemeral key for the first hop to the session key. 826 var ephemeralKey big.Int 827 ephemeralKey.Set(sessionKey.D) 828 829 for i := 0; i < numHops; i++ { 830 // Perform ECDH and hash the result. 831 ecdhResult := scalarMult(paymentPath[i], ephemeralKey) 832 hopSharedSecrets[i] = sha256.Sum256(ecdhResult.SerializeCompressed()) 833 834 // Derive ephemeral public key from private key. 835 ephemeralPrivKey := btcec.PrivKeyFromBytes(btcec.S256(), ephemeralKey.Bytes()) 836 ephemeralPubKey := ephemeralPrivKey.PubKey() 837 838 // Compute blinding factor. 839 sha := sha256.New() 840 sha.Write(ephemeralPubKey.SerializeCompressed()) 841 sha.Write(hopSharedSecrets[i]) 842 843 var blindingFactor big.Int 844 blindingFactor.SetBytes(sha.Sum(nil)) 845 846 // Blind ephemeral key for next hop. 847 ephemeralKey.Mul(&ephemeralKey, &blindingFactor) 848 ephemeralKey.Mod(&ephemeralKey, btcec.S256().Params().N) 849 } 850 851 // Generate the padding, called "filler strings" in the paper. 852 filler := generateHeaderPadding("rho", numHops, hopDataSize, hopSharedSecrets) 853 854 // Allocate and initialize fields to zero-filled slices 855 var mixHeader [routingInfoSize]byte 856 var nextHmac [hmacSize]byte 857 858 // Our starting packet needs to be filled out with random bytes, we 859 // generate some deterministically using the session private key. 860 paddingKey := generateKey("pad", sessionKey.Serialize()) 861 paddingBytes := generateCipherStream(paddingKey, routingInfoSize) 862 copy(mixHeader[:], paddingBytes) 863 864 // Compute the routing information for each hop along with a 865 // MAC of the routing information using the shared key for that hop. 866 for i := numHops - 1; i >= 0; i-- { 867 rhoKey := generateKey("rho", hopSharedSecrets[i]) 868 muKey := generateKey("mu", hopSharedSecrets[i]) 869 870 hopsData[i].HMAC = nextHmac 871 872 // Shift and obfuscate routing information 873 streamBytes := generateCipherStream(rhoKey, numStreamBytes) 874 875 rightShift(mixHeader[:], hopDataSize) 876 buf := &bytes.Buffer{} 877 hopsData[i].Encode(buf) 878 copy(mixHeader[:], buf.Bytes()) 879 xor(mixHeader[:], mixHeader[:], streamBytes[:routingInfoSize]) 880 881 // These need to be overwritten, so every node generates a correct padding 882 if i == numHops-1 { 883 copy(mixHeader[len(mixHeader)-len(filler):], filler) 884 } 885 886 packet := append(mixHeader[:], assocData...) 887 nextHmac = calcMac(muKey, packet) 888 } 889 890 packet := &OnionPacket{ 891 Version: 0x00, 892 EphemeralKey: sessionKey.PubKey(), 893 RoutingInfo: mixHeader, 894 HeaderMAC: nextHmac, 895 } 896 return packet, nil 897 } 898 ``` 899 900 # Onion Decryption 901 902 There are two kinds of `onion_packet` we use: 903 904 1. `onion_routing_packet` in `update_add_htlc` for payments, which contains a `payload` TLV (see [Adding an HTLC](02-peer-protocol.md#adding-an-htlc-update_add_htlc)) 905 2. `onion_message_packet` in `onion_message` for messages, which contains an `onionmsg_tlv` TLV (see [Onion Messages](#onion-messages)) 906 907 Those sections specify the `associated_data` to use, the `path_key` (if any), the extracted payload format and handling (including how to determine the next peer, if any), and how to handle errors. The processing itself is identical. 908 909 ## Requirements 910 911 A reader: 912 - if `version` is not 0: 913 - MUST abort processing the packet and fail. 914 - if `public_key` is not a valid pubkey: 915 - MUST abort processing the packet and fail. 916 - if the onion is for a payment: 917 - if `hmac` has previously been received: 918 - if the preimage is known: 919 - MAY immediately redeem the HTLC using the preimage. 920 - otherwise: 921 - MUST abort processing the packet and fail. 922 - if `path_key` is specified: 923 - Calculate the `blinding_ss` as ECDH(`path_key`, `node_privkey`). 924 - Either: 925 - Tweak `public_key` by multiplying by $`HMAC256(\text{"blinded\_node\_id"}, blinding\_ss)`$. 926 - or (equivalently): 927 - Tweak its own `node_privkey` below by multiplying by $`HMAC256(\text{"blinded\_node\_id"}, blinding\_ss)`$. 928 - Derive the shared secret `ss` as ECDH(`public_key`, `node_privkey`) (see [Shared Secret](#shared-secret)). 929 - Derive `mu` as $`HMAC256(\text{"mu"}, ss)`$ (see [Key Generation](#key-generation)). 930 - Derive the HMAC as $`HMAC256(mu, hop\_payloads || associated\_data)`$. 931 - MUST use a constant time comparison of the computed HMAC and `hmac`. 932 - If the computed HMAC and `hmac` differ: 933 - MUST abort processing the packet and fail. 934 - Derive `rho` as $`HMAC256(\text{"rho"}, ss)`$ (see [Key Generation](#key-generation)). 935 - Derive `bytestream` of twice the length of `hop_payloads` using `rho` (see [Pseudo Random Byte Stream](pseudo-random-byte-stream)). 936 - Set `unwrapped_payloads` to the XOR of `hop_payloads` and `bytestream`. 937 - Remove a `bigsize` from the front of `unwrapped_payloads` as `payload_length`. If that is malformed: 938 - MUST abort processing the packet and fail. 939 - If the `payload_length` is less than two: 940 - MUST abort processing the packet and fail. 941 - If there are fewer than `payload_length` bytes remaining in `unwrapped_payloads`: 942 - MUST abort processing the packet and fail. 943 - Remove `payload_length` bytes from the front of `unwrapped_payloads`, as the current `payload`. 944 - If there are fewer than 32 bytes remaining in `unwrapped_payloads`: 945 - MUST abort processing the packet and fail. 946 - Remove 32 bytes as `next_hmac` from the front of `unwrapped_payloads`. 947 - If `unwrapped_payloads` is smaller than `hop_payloads`: 948 - MUST abort processing the packet and fail. 949 - If `next_hmac` is not all-zero (not the final node): 950 - Derive `blinding_tweak` as $`SHA256(public\_key || ss)`$ (see [Blinding Ephemeral Onion Keys](#blinding-ephemeral-onion-keys)). 951 - SHOULD forward an onion to the next peer with: 952 - `version` set to 0. 953 - `public_key` set to the incoming `public_key` multiplied by `blinding_tweak`. 954 - `hop_payloads` set to the `unwrapped_payloads`, truncated to the incoming `hop_payloads` size. 955 - `hmac` set to `next_hmac`. 956 - If it cannot forward: 957 - MUST fail. 958 - Otherwise (all-zero `next_hmac`): 959 - This is the final destination of the onion. 960 961 ## Rationale 962 963 In the case where blinded paths are used, the sender did not actually encrypt this onion for our `node_id`, but for a tweaked version: we can derive the tweak used from `path_key` which is given alongside the onion. Then we either tweak our node private key the same way to decrypt the onion, or tweak to the onion ephemeral key which is mathematically equivalent. 964 965 # Filler Generation 966 967 Upon receiving a packet, the processing node extracts the information destined 968 for it from the route information and the per-hop payload. 969 The extraction is done by deobfuscating and left-shifting the field. 970 This would make the field shorter at each hop, allowing an attacker to deduce the 971 route length. For this reason, the field is pre-padded before forwarding. 972 Since the padding is part of the HMAC, the origin node will have to pre-generate an 973 identical padding (to that which each hop will generate) in order to compute the 974 HMACs correctly for each hop. 975 The filler is also used to pad the field-length, in the case that the selected 976 route is shorter than 1300 bytes. 977 978 Before deobfuscating the `hop_payloads`, the processing node pads it with 1300 979 `0x00`-bytes, such that the total length is `2*1300`. 980 It then generates the pseudo-random byte stream, of matching length, and applies 981 it with `XOR` to the `hop_payloads`. 982 This deobfuscates the information destined for it, while simultaneously 983 obfuscating the added `0x00`-bytes at the end. 984 985 In order to compute the correct HMAC, the origin node has to pre-generate the 986 `hop_payloads` for each hop, including the incrementally obfuscated padding added 987 by each hop. This incrementally obfuscated padding is referred to as the 988 `filler`. 989 990 The following example code shows how the filler is generated in Go: 991 992 ```Go 993 func generateFiller(key string, numHops int, hopSize int, sharedSecrets [][sharedSecretSize]byte) []byte { 994 fillerSize := uint((numMaxHops + 1) * hopSize) 995 filler := make([]byte, fillerSize) 996 997 // The last hop does not obfuscate, it's not forwarding anymore. 998 for i := 0; i < numHops-1; i++ { 999 1000 // Left-shift the field 1001 copy(filler[:], filler[hopSize:]) 1002 1003 // Zero-fill the last hop 1004 copy(filler[len(filler)-hopSize:], bytes.Repeat([]byte{0x00}, hopSize)) 1005 1006 // Generate pseudo-random byte stream 1007 streamKey := generateKey(key, sharedSecrets[i]) 1008 streamBytes := generateCipherStream(streamKey, fillerSize) 1009 1010 // Obfuscate 1011 xor(filler, filler, streamBytes) 1012 } 1013 1014 // Cut filler down to the correct length (numHops+1)*hopSize 1015 // bytes will be prepended by the packet generation. 1016 return filler[(numMaxHops-numHops+2)*hopSize:] 1017 } 1018 ``` 1019 1020 Note that this example implementation is for demonstration purposes only; the 1021 `filler` can be generated much more efficiently. 1022 The last hop need not obfuscate the `filler`, since it won't forward the packet 1023 any further and thus need not extract an HMAC either. 1024 1025 # Returning Errors 1026 1027 The onion routing protocol includes a mechanism for returning encrypted 1028 error messages to the origin node. 1029 The returned error messages may be failures reported by any hop, including the 1030 final node. 1031 The format of the forward packet is not usable for the return path, since no hop 1032 besides the origin has access to the information required for its generation. 1033 Note that these error messages are not reliable, as they are not placed on-chain 1034 due to the possibility of hop failure. 1035 1036 Intermediate hops store the shared secret from the forward path and reuse it to 1037 authenticate and obfuscate any corresponding return packet during each hop. 1038 In addition, each node locally stores data regarding its own sending peer in the 1039 route, so it knows where to return-forward any eventual return packets. 1040 1041 ## Erring node 1042 1043 The node generating the error message builds a _return packet_ 1044 consisting of the following fields: 1045 1046 1. data: 1047 * [`32*byte`:`hmac`] 1048 * [`u16`:`failure_len`] 1049 * [`failure_len*byte`:`failuremsg`] 1050 * [`u16`:`pad_len`] 1051 * [`pad_len*byte`:`pad`] 1052 1053 Where `hmac` is an HMAC authenticating the remainder of the packet, with a key 1054 generated using the above process, with key type `um`, `failuremsg` as defined 1055 below, and `pad` as the extra bytes used to conceal length. 1056 1057 The erring node then generates a new key, using the key type `ammag`. 1058 This key is then used to generate a pseudo-random stream, which is in turn 1059 applied to the packet using `XOR`. 1060 1061 Error handling for HTLCs with `path_key` is particularly fraught, 1062 since differences in implementations (or versions) may be leveraged to 1063 de-anonymize elements of the blinded path. Thus the decision turn every 1064 error into `invalid_onion_blinding` which will be converted to a normal 1065 onion error by the introduction point. 1066 1067 ### Initialization of `attribution_data` 1068 1069 For the layout of `attribution data`, see [Removing an HTLC: `update_fulfill_htlc`, `update_fail_htlc`, and 1070 `update_fail_malformed_htlc`](02-peer-protocol.md#removing-an-htlc-update_fulfill_htlc-update_fail_htlc-and-update_fail_malformed_htlc). 1071 1072 The `htlc_hold_times` field specifies the htlc hold time for each hop in units of 100 milliseconds. For example, a value 1073 of 3 represents 300 ms. Nodes along the path that lack accurate timing information may report a value of zero. 1074 1075 The erring node puts its hold time at the start of this array and zeroes out the rest. The size of the field is based on 1076 the maximum supported number of hops in a route (20). 1077 1078 The field `truncated_hmacs` contains truncated authentication codes series for each hop, with the same `um` key that is 1079 used for `hmac` in the return packet. Regular 32 byte HMACs are truncated to the first 4 bytes to save space. 1080 1081 In theory this truncation makes it possible for malicious nodes to guess the HMAC. However, game theory is against them 1082 because a wrong guess will get them penalized in future pathfinding. 1083 1084 The size of the field is based on the maximum number of hops in a route (20) and the truncated HMAC size (4 bytes). Each 1085 hop adds 20 HMACs, one for each possible position that the hop could be at in the path. This is necessary because only 1086 the sender knows the position of each hop in the path. 1087 1088 It is not required to store all 20 * 20 = 400 HMACs. The node in position 0 needs to store an HMAC for every one of the 1089 20 positions. For the node in position 1, the maximum remaining route length is only 19. For that position just 19 HMACs 1090 need to be kept, and so on. This makes for a total number of HMACs of 20+19+18+...+1 = 210 HMACs. 1091 1092 The layout of the `hmacs` field is shown below. The actual format is much longer, but for readability the format is 1093 described as if the maximum route length would be just three hops. 1094 1095 `hmac_0_2` | `hmac_0_1`| `hmac_0_0`| `hmac_1_1`| `hmac_1_0`| `hmac_2_0` 1096 1097 `hmac_x_y` is the hmac added by node `x` (counted from the node that is currently handling the failure message) assuming 1098 that this node is `y` hops away from the erring node. 1099 1100 Each HMAC is computed from the combination of the following elements, concatenated in the specified order. 1101 1102 * The return packet before applying the pseudo-random byte stream. 1103 1104 * The concatenation of the first `y+1` hold times in `htlc_hold_times`. For example, `hmac_0_2` would cover 1105 all three hold times. 1106 1107 * The concatenation of `y` downstream hmacs that correspond to downstream node positions relative to `x`. For example, 1108 `hmac_0_2` would cover `hmac_1_1` and `hmac_2_0`. 1109 1110 The erring node stores its 20 HMACs at the start of the array and zeroes out the rest. Strictly speaking the erring node 1111 would only need to add the single `hmac_0_0` here, because there is no downstream data to cover. However, for 1112 verification efficiency at the origin node, we still require all HMACs to be calculated. The redundant HMACs will cover 1113 portions of the zero-initialized data. 1114 1115 Finally a new key is generated, using the key type `ammagext`. This key is then used to generate a pseudo-random stream, 1116 which is in turn applied to the `attribution_data` field using `XOR`. 1117 1118 ### Requirements 1119 1120 The _erring node_: 1121 - MUST set `pad` such that the `failure_len` plus `pad_len` is at least 256. 1122 - SHOULD set `pad` such that the `failure_len` plus `pad_len` is equal to 1123 256. Deviating from this may cause older nodes to be unable to parse the 1124 return message. 1125 - if `option_attribution_data` is advertised: 1126 - if `path_key` is not set in the incoming `update_add_htlc`: 1127 - MUST initialize `attribution_data` and include it in `update_fail_htlc` 1128 1129 ## Intermediate nodes 1130 1131 ### Transformation of the return packet 1132 1133 Generate the node's `ammag` key, generate the pseudo-random byte streams, and apply the result to obfuscate the return 1134 packet. This is then stored as the `reason` field of the `update_htlc_fail` message. 1135 1136 This obfuscation step is identical to the obfuscation steps that the erring node carries out. 1137 1138 ### Transformation of `attribution_data` 1139 1140 * Shift all existing hold times to the right (4 bytes). 1141 1142 * Shift and prune all existing HMACs. 1143 1144 At each step backwards, one HMAC for every hop can be pruned. When HMACs for all 20 positions are present, and it 1145 turns out that there is another hop upstream, each existing HMAC that now corresponds to position 21 due to the 1146 preceding hop becomes obsolete. 1147 1148 For the simplified three-hop layout above, the shift/prune operation would apply a transformation that results in: 1149 1150 `-` | `-` | `-` | `hmac_0'_1` | `hmac_0'_0` | `hmac_1'_0` 1151 1152 The former `hmac_x'_y` now becomes `hmac_x+1_y`. The left-most HMAC for 1153 each hop is discarded. 1154 1155 ### Update of `attribution_data` 1156 1157 * Put the node's hold time at the start of `htlc_hold_times`. The shift operation above has opened up a slot for that. 1158 1159 * Calculate its own 20 truncated HMACs and put them at the start of `hmacs` in the 1160 newly opened slots. 1161 1162 * Generate the node's `ammagext` key, generate the pseudo-random byte stream, and apply the result to obfuscate the 1163 `attribution_data` field. This obfuscation step is identical to the obfuscation steps that the erring node carries out. 1164 1165 ### Requirements 1166 1167 - if `option_attribution_data` is advertised: 1168 - if `path_key` is not set in the incoming `update_add_htlc`: 1169 - if `attribution_data` is received from downstream: 1170 - MUST transform `attribution_data` as described above 1171 - otherwise: 1172 - MUST instantiate an all-zeroes `attribution_data` block 1173 - MUST update `attribution_data` as described above 1174 - all nodes: 1175 - MUST transform the return packet as described above. 1176 - MUST return-forward the `update_htlc_fail` message 1177 1178 ## Origin node 1179 1180 The origin node is able to detect that it's the intended final recipient of the return message, because of course, it 1181 was the originator of the corresponding forward packet. When an origin node receives an `update_htlc_fail` message 1182 matching a transfer it initiated (i.e. it cannot return-forward the error any further) it generates the `ammag`, 1183 `ammagext` and `um` keys for each hop in the route. 1184 1185 It then iteratively decrypts the message, using each hop's `ammag` and `ammagext` keys. At each hop, the following steps 1186 are carried out: 1187 1188 For origin nodes supporting `option_attribution_data`: 1189 1190 * Verify the HMAC in `attribution_data` that corresponds to the hop's position in the path using the hop's `um` key. If 1191 the HMAC is invalid, processing of the message can stop and the node should penalize this hop for future path selection. This is what 1192 makes the failure 'attributable'. 1193 1194 Because HMACs cover all data including HMACs added by downstream nodes, it is not possible for a malicious node to 1195 tamper with the message without revealing themselves. Blame is still only assignable to a pair of nodes though, 1196 because it is impossible to know whether sender or receiver modified the message. This is true for other failure cases 1197 in Lightning too. 1198 1199 When not every path node supports `option_attribution_data`, the origin node will still have attribution data up to the first node 1200 downstream without support. 1201 1202 * Record the reported htlc hold time for this hop. 1203 1204 The origin node can use this information to score nodes on latency. When a zero hold time is reported, the origin node 1205 should distribute any potential latency penalty across multiple nodes. This encourages path nodes to provide timing 1206 data to avoid being held responsible for the high latency of other nodes. 1207 1208 For all nodes: 1209 1210 * Compute the HMAC for the return packet, using the hop's `um` key. 1211 1212 * When the computed HMAC matches `hmac` in the return packet, the origin node will know that the current hop is the sender of 1213 the failure. They can then parse `failuremsg`. 1214 1215 The association between the forward and return packets is handled outside of this onion routing protocol, e.g. via 1216 association with an HTLC in a payment channel. 1217 1218 ### Requirements 1219 1220 The _origin node_: 1221 - once the return message has been decrypted: 1222 - SHOULD store a copy of the message. 1223 - SHOULD continue decrypting, until the loop has been repeated 27 times 1224 (maximum route length of tlv payload type). 1225 - SHOULD use constant `ammag` and `um` keys to obfuscate the route length. 1226 - When the failure source cannot be identified from the return packet AND `attribution_data` is present: 1227 - SHOULD use `attribution_data` to identify the failure source 1228 1229 ### Rationale 1230 1231 The requirements for the _origin node_ should help hide the payment sender. 1232 By continuing decrypting 27 times (dummy decryption cycles after the error is found) 1233 the erroring node cannot learn its relative position in the route by performing 1234 a timing analysis if the sender were to retry the same route multiple times. 1235 1236 ## Failure Messages 1237 1238 The failure message encapsulated in `failuremsg` has an identical format as 1239 a normal message: a 2-byte type `failure_code` followed by data applicable 1240 to that type. The message data is followed by an optional 1241 [TLV stream](01-messaging.md#type-length-value-format). 1242 1243 Below is a list of the currently supported `failure_code` 1244 values, followed by their use case requirements. 1245 1246 Notice that the `failure_code`s are not of the same type as other message types, 1247 defined in other BOLTs, as they are not sent directly on the transport layer 1248 but are instead wrapped inside return packets. 1249 The numeric values for the `failure_code` may therefore reuse values, that are 1250 also assigned to other message types, without any danger of causing collisions. 1251 1252 The top byte of `failure_code` can be read as a set of flags: 1253 * 0x8000 (BADONION): unparsable onion encrypted by sending peer 1254 * 0x4000 (PERM): permanent failure (otherwise transient) 1255 * 0x2000 (NODE): node failure (otherwise channel) 1256 * 0x1000 (UPDATE): channel forwarding parameter was violated 1257 1258 The following `failure_code`s are defined: 1259 1260 1. type: NODE|2 (`temporary_node_failure`) 1261 1262 General temporary failure of the processing node. 1263 1264 1. type: PERM|NODE|2 (`permanent_node_failure`) 1265 1266 General permanent failure of the processing node. 1267 1268 1. type: PERM|NODE|3 (`required_node_feature_missing`) 1269 1270 The processing node has a required feature which was not in this onion. 1271 1272 1. type: BADONION|PERM|4 (`invalid_onion_version`) 1273 2. data: 1274 * [`sha256`:`sha256_of_onion`] 1275 1276 The `version` byte was not understood by the processing node. 1277 1278 1. type: BADONION|PERM|5 (`invalid_onion_hmac`) 1279 2. data: 1280 * [`sha256`:`sha256_of_onion`] 1281 1282 The HMAC of the onion was incorrect when it reached the processing node. 1283 1284 1. type: BADONION|PERM|6 (`invalid_onion_key`) 1285 2. data: 1286 * [`sha256`:`sha256_of_onion`] 1287 1288 The ephemeral key was unparsable by the processing node. 1289 1290 1. type: UPDATE|7 (`temporary_channel_failure`) 1291 2. data: 1292 * [`u16`:`len`] 1293 * [`len*byte`:`channel_update`] 1294 1295 The channel from the processing node was unable to handle this HTLC, 1296 but may be able to handle it, or others, later. 1297 1298 1. type: PERM|8 (`permanent_channel_failure`) 1299 1300 The channel from the processing node is unable to handle any HTLCs. 1301 1302 1. type: PERM|9 (`required_channel_feature_missing`) 1303 1304 The channel from the processing node requires features not present in 1305 the onion. 1306 1307 1. type: PERM|10 (`unknown_next_peer`) 1308 1309 The onion specified a `short_channel_id` which doesn't match any 1310 leading from the processing node. 1311 1312 1. type: UPDATE|11 (`amount_below_minimum`) 1313 2. data: 1314 * [`u64`:`htlc_msat`] 1315 * [`u16`:`len`] 1316 * [`len*byte`:`channel_update`] 1317 1318 The HTLC amount was below the `htlc_minimum_msat` of the channel from 1319 the processing node. 1320 1321 1. type: UPDATE|12 (`fee_insufficient`) 1322 2. data: 1323 * [`u64`:`htlc_msat`] 1324 * [`u16`:`len`] 1325 * [`len*byte`:`channel_update`] 1326 1327 The fee amount was below that required by the channel from the 1328 processing node. 1329 1330 1. type: UPDATE|13 (`incorrect_cltv_expiry`) 1331 2. data: 1332 * [`u32`:`cltv_expiry`] 1333 * [`u16`:`len`] 1334 * [`len*byte`:`channel_update`] 1335 1336 The `cltv_expiry` does not comply with the `cltv_expiry_delta` required by 1337 the channel from the processing node: it does not satisfy the following 1338 requirement: 1339 1340 cltv_expiry - cltv_expiry_delta >= outgoing_cltv_value 1341 1342 1. type: UPDATE|14 (`expiry_too_soon`) 1343 2. data: 1344 * [`u16`:`len`] 1345 * [`len*byte`:`channel_update`] 1346 1347 The CLTV expiry is too close to the current block height for safe 1348 handling by the processing node. 1349 1350 1. type: PERM|15 (`incorrect_or_unknown_payment_details`) 1351 2. data: 1352 * [`u64`:`htlc_msat`] 1353 * [`u32`:`height`] 1354 1355 The `payment_hash` is unknown to the final node, the `payment_secret` doesn't 1356 match the `payment_hash`, the amount for that `payment_hash` is too low, 1357 the CLTV expiry of the htlc is too close to the current block height for safe 1358 handling or `payment_metadata` isn't present while it should be. 1359 1360 The `htlc_msat` parameter is superfluous, but left in for backwards 1361 compatibility. The value of `htlc_msat` is required to be at least the value 1362 specified in the final hop onion payload. It therefore does not have any 1363 substantial informative value to the sender (though may indicate the 1364 penultimate node took a lower fee than expected). A penultimate hop sending an 1365 amount or an expiry that is too low for the htlc is handled through 1366 `final_incorrect_cltv_expiry` and `final_incorrect_htlc_amount`. 1367 1368 The `height` parameter is set by the final node to the best known block height 1369 at the time of receiving the htlc. This can be used by the sender to distinguish 1370 between sending a payment with the wrong final CLTV expiry and an intermediate 1371 hop delaying the payment so that the receiver's invoice CLTV delta requirement 1372 is no longer met. 1373 1374 Note: Originally PERM|16 (`incorrect_payment_amount`) and 17 1375 (`final_expiry_too_soon`) were used to differentiate incorrect htlc parameters 1376 from unknown payment hash. Sadly, sending this response allows for probing 1377 attacks whereby a node which receives an HTLC for forwarding can check guesses 1378 as to its final destination by sending payments with the same hash but much 1379 lower values or expiry heights to potential destinations and check the response. 1380 Care must be taken by implementations to differentiate the previously 1381 non-permanent case for `final_expiry_too_soon` (17) from the other, permanent 1382 failures now represented by `incorrect_or_unknown_payment_details` (PERM|15). 1383 1384 1. type: 18 (`final_incorrect_cltv_expiry`) 1385 2. data: 1386 * [`u32`:`cltv_expiry`] 1387 1388 The CLTV expiry in the HTLC is less than the value in the onion. 1389 1390 1. type: 19 (`final_incorrect_htlc_amount`) 1391 2. data: 1392 * [`u64`:`incoming_htlc_amt`] 1393 1394 The amount in the HTLC is less than the value in the onion. 1395 1396 1. type: UPDATE|20 (`channel_disabled`) 1397 2. data: 1398 * [`u16`:`disabled_flags`] 1399 * [`u16`:`len`] 1400 * [`len*byte`:`channel_update`] 1401 1402 The channel from the processing node has been disabled. 1403 No flags for `disabled_flags` are currently defined, thus it is currently 1404 always two zero bytes. 1405 1406 1. type: 21 (`expiry_too_far`) 1407 1408 The CLTV expiry in the HTLC is too far in the future. 1409 1410 1. type: PERM|22 (`invalid_onion_payload`) 1411 2. data: 1412 * [`bigsize`:`type`] 1413 * [`u16`:`offset`] 1414 1415 The decrypted onion per-hop payload was not understood by the processing node 1416 or is incomplete. If the failure can be narrowed down to a specific tlv type in 1417 the payload, the erring node may include that `type` and its byte `offset` in 1418 the decrypted byte stream. 1419 1420 1. type: 23 (`mpp_timeout`) 1421 1422 The complete amount of the multi-part payment was not received within a 1423 reasonable time. 1424 1425 1. type: BADONION|PERM|24 (`invalid_onion_blinding`) 1426 2. data: 1427 * [`sha256`:`sha256_of_onion`] 1428 1429 An error occurred within the blinded path. 1430 1431 ### Requirements 1432 1433 An _erring node_: 1434 - if `path_key` is set in the incoming `update_add_htlc`: 1435 - MUST return an `invalid_onion_blinding` error. 1436 - if `current_path_key` is set in the onion payload and it is not the 1437 final node: 1438 - MUST return an `invalid_onion_blinding` error. 1439 - otherwise: 1440 - MUST select one of the above error codes when creating an error message. 1441 - MUST include the appropriate data for that particular error type. 1442 - if there is more than one error: 1443 - SHOULD select the first error it encounters from the list above. 1444 1445 An _erring node_ MAY: 1446 - if the per-hop payload in the onion is invalid (e.g. it is not a valid tlv stream) 1447 or is missing required information (e.g. the amount was not specified): 1448 - return an `invalid_onion_payload` error. 1449 - if an otherwise unspecified transient error occurs for the entire node: 1450 - return a `temporary_node_failure` error. 1451 - if an otherwise unspecified permanent error occurs for the entire node: 1452 - return a `permanent_node_failure` error. 1453 - if a node has requirements advertised in its `node_announcement` `features`, 1454 which were NOT included in the onion: 1455 - return a `required_node_feature_missing` error. 1456 1457 A _forwarding node_ MUST: 1458 - if `path_key` is set in the incoming `update_add_htlc`: 1459 - return an `invalid_onion_blinding` error. 1460 - if `current_path_key` is set in the onion payload and it is not the 1461 final node: 1462 - return an `invalid_onion_blinding` error. 1463 - otherwise: 1464 - select one of the above error codes when creating an error message. 1465 1466 A _forwarding node_ MAY, but a _final node_ MUST NOT: 1467 - if the onion `version` byte is unknown: 1468 - return an `invalid_onion_version` error. 1469 - if the onion HMAC is incorrect: 1470 - return an `invalid_onion_hmac` error. 1471 - if the ephemeral key in the onion is unparsable: 1472 - return an `invalid_onion_key` error. 1473 - if during forwarding to its receiving peer, an otherwise unspecified, 1474 transient error occurs in the outgoing channel (e.g. channel capacity reached, 1475 too many in-flight HTLCs, etc.): 1476 - return a `temporary_channel_failure` error. 1477 - if an otherwise unspecified, permanent error occurs during forwarding to its 1478 receiving peer (e.g. channel recently closed): 1479 - return a `permanent_channel_failure` error. 1480 - if the outgoing channel has requirements advertised in its 1481 `channel_announcement`'s `features`, which were NOT included in the onion: 1482 - return a `required_channel_feature_missing` error. 1483 - if the receiving peer specified by the onion is NOT known: 1484 - return an `unknown_next_peer` error. 1485 - if the HTLC amount is less than the currently specified minimum amount: 1486 - report the amount of the outgoing HTLC and the current channel setting for 1487 the outgoing channel. 1488 - return an `amount_below_minimum` error. 1489 - if the HTLC does NOT pay a sufficient fee: 1490 - report the amount of the incoming HTLC and the current channel setting for 1491 the outgoing channel. 1492 - return a `fee_insufficient` error. 1493 - if the incoming `cltv_expiry` minus the `outgoing_cltv_value` is below the 1494 `cltv_expiry_delta` for the outgoing channel: 1495 - report the `cltv_expiry` of the outgoing HTLC and the current channel setting for the outgoing 1496 channel. 1497 - return an `incorrect_cltv_expiry` error. 1498 - if the `cltv_expiry` is unreasonably near the present: 1499 - report the current channel setting for the outgoing channel. 1500 - return an `expiry_too_soon` error. 1501 - if the `cltv_expiry` is more than `max_htlc_cltv` in the future: 1502 - return an `expiry_too_far` error. 1503 - if the channel is disabled: 1504 - report the current channel setting for the outgoing channel. 1505 - return a `channel_disabled` error. 1506 1507 An _intermediate hop_ MUST NOT, but the _final node_: 1508 - if the payment hash has already been paid: 1509 - MAY treat the payment hash as unknown. 1510 - MAY succeed in accepting the HTLC. 1511 - if the `payment_secret` doesn't match the expected value for that `payment_hash`, 1512 or the `payment_secret` is required and is not present: 1513 - MUST fail the HTLC. 1514 - MUST return an `incorrect_or_unknown_payment_details` error. 1515 - if the amount paid is less than the amount expected: 1516 - MUST fail the HTLC. 1517 - MUST return an `incorrect_or_unknown_payment_details` error. 1518 - if the payment hash is unknown: 1519 - MUST fail the HTLC. 1520 - MUST return an `incorrect_or_unknown_payment_details` error. 1521 - if the amount paid is more than twice the amount expected: 1522 - SHOULD fail the HTLC. 1523 - SHOULD return an `incorrect_or_unknown_payment_details` error. 1524 - Note: this allows the origin node to reduce information leakage by 1525 altering the amount while not allowing for accidental gross overpayment. 1526 - if the `cltv_expiry` value is unreasonably near the present: 1527 - MUST fail the HTLC. 1528 - MUST return an `incorrect_or_unknown_payment_details` error. 1529 - if the `cltv_expiry` from the final node's HTLC is below `outgoing_cltv_value`: 1530 - MUST return `final_incorrect_cltv_expiry` error. 1531 - if `amount_msat` from the final node's HTLC is below `amt_to_forward`: 1532 - MUST return a `final_incorrect_htlc_amount` error. 1533 - if it returns a `channel_update`: 1534 - MUST set `short_channel_id` to the `short_channel_id` used by the incoming onion. 1535 1536 ### Rationale 1537 1538 In the case of multiple short_channel_id aliases, the `channel_update` 1539 `short_channel_id` should refer to the one the original sender is 1540 expecting, to both avoid confusion and to avoid leaking information 1541 about other aliases (or the real location of the channel UTXO). 1542 1543 The `channel_update` field used to be mandatory in messages whose `failure_code` 1544 includes the `UPDATE` flag. However, because nodes applying an update contained 1545 in the onion to their gossip data is a massive fingerprinting vulnerability, 1546 the `channel_update` field is no longer mandatory and nodes are expected to 1547 transition away from including it. Nodes which do not provide a 1548 `channel_update` are expected to set the `channel_update` `len` field to zero. 1549 1550 Some nodes may still use the `channel_update` for retries of the same payment, 1551 however. 1552 1553 ## Receiving Failure Codes 1554 1555 ### Requirements 1556 1557 The _origin node_: 1558 - MUST ignore any extra bytes in `failuremsg`. 1559 - if the _final node_ is returning the error: 1560 - if the PERM bit is set: 1561 - SHOULD fail the payment. 1562 - otherwise: 1563 - if the error code is understood and valid: 1564 - MAY retry the payment. In particular, `final_expiry_too_soon` can 1565 occur if the block height has changed since sending, and in this case 1566 `temporary_node_failure` could resolve within a few seconds. 1567 - otherwise, an _intermediate hop_ is returning the error: 1568 - if the NODE bit is set: 1569 - SHOULD remove all channels connected with the erring node from 1570 consideration. 1571 - if the PERM bit is NOT set: 1572 - SHOULD restore the channels as it receives new `channel_update`s from 1573 its peers. 1574 - otherwise: 1575 - if UPDATE is set, AND the `channel_update` is valid and more recent 1576 than the `channel_update` used to send the payment: 1577 - MAY consider the `channel_update` when calculating routes to retry 1578 the payment which failed 1579 - MUST NOT expose the `channel_update` to third-parties in any other 1580 context, including applying the `channel_update` to the local network 1581 graph, send the `channel_update` to peers as gossip, etc. 1582 - SHOULD then retry routing and sending the payment. 1583 - MAY use the data specified in the various failure types for debugging 1584 purposes. 1585 1586 # Hold times for successful payments 1587 1588 The `update_fulfill_htlc` message contains an optional `attribution_data` field, similar to the one used in the failure 1589 case described above. The only difference is that there is no failure message that is covered by the HMACs. With 1590 attribution data, the sender can obtain hold times as reported and committed to by each hop along the payment path. 1591 1592 # Onion Messages 1593 1594 Onion messages allow peers to use existing connections to query for 1595 invoices (see [BOLT 12](12-offer-encoding.md)). Like gossip messages, 1596 they are not associated with a particular local channel. Like HTLCs, 1597 they use [onion messages](#onion-messages) protocol for 1598 end-to-end encryption. 1599 1600 Onion messages use the same form as HTLC `onion_packet`, with a 1601 slightly more flexible format: instead of 1300 byte payloads, the 1602 payload length is implied by the total length (minus 66 bytes for the 1603 header and trailing bytes). The `onionmsg_payloads` themselves are the same 1604 as the `hop_payloads` format, except there is no "legacy" length: a 0 1605 `length` would mean an empty `onionmsg_payload`. 1606 1607 Onion messages are unreliable: in particular, they are designed to 1608 be cheap to process and require no storage to forward. As a result, 1609 there is no error returned from intermediary nodes. 1610 1611 For consistency, all onion messages use [Route Blinding](#route-blinding). 1612 1613 ## The `onion_message` Message 1614 1615 1. type: 513 (`onion_message`) (`option_onion_messages`) 1616 2. data: 1617 * [`point`:`path_key`] 1618 * [`u16`:`len`] 1619 * [`len*byte`:`onion_message_packet`] 1620 1621 1. type: `onion_message_packet` 1622 2. data: 1623 * [`byte`:`version`] 1624 * [`point`:`public_key`] 1625 * [`...*byte`:`onionmsg_payloads`] 1626 * [`32*byte`:`hmac`] 1627 1628 1. type: `onionmsg_payloads` 1629 2. data: 1630 * [`bigsize`:`length`] 1631 * [`length*u8`:`onionmsg_tlv`] 1632 * [`32*byte`:`hmac`] 1633 * ... 1634 * `filler` 1635 1636 The `onionmsg_tlv` itself is a TLV: an intermediate node expects an 1637 `encrypted_recipient_data` which it can decrypt into an `encrypted_data_tlv` 1638 using the `path_key` which it is handed along with the onion message. 1639 1640 Field numbers 64 and above are reserved for payloads for the final 1641 hop, though these are not explicitly refused by non-final hops (unless 1642 even, of course!). 1643 1644 1. `tlv_stream`: `onionmsg_tlv` 1645 2. types: 1646 1. type: 2 (`reply_path`) 1647 2. data: 1648 * [`blinded_path`:`path`] 1649 1. type: 4 (`encrypted_recipient_data`) 1650 2. data: 1651 * [`...*byte`:`encrypted_recipient_data`] 1652 1. type: 64 (`invoice_request`) 1653 2. data: 1654 * [`tlv_invoice_request`:`invreq`] 1655 1. type: 66 (`invoice`) 1656 2. data: 1657 * [`tlv_invoice`:`inv`] 1658 1. type: 68 (`invoice_error`) 1659 2. data: 1660 * [`tlv_invoice_error`:`inverr`] 1661 1662 #### Requirements 1663 1664 The creator of `encrypted_recipient_data` (usually, the recipient of the onion): 1665 1666 - MUST create the `encrypted_recipient_data` from the `encrypted_data_tlv` as required in [Route Blinding](#route-blinding). 1667 - MUST NOT include `payment_relay` or `payment_constraints` in any `encrypted_data_tlv` 1668 - MUST include either `next_node_id` or `short_channel_id` in the `encrypted_data_tlv` for each non-final node. 1669 1670 The writer: 1671 1672 - MUST set the `onion_message_packet` `version` to 0. 1673 - MUST construct the `onion_message_packet` `onionmsg_payloads` as detailed above using Sphinx. 1674 - MUST NOT use any `associated_data` in the Sphinx construction. 1675 - SHOULD set `onion_message_packet` `len` to 1366 or 32834. 1676 - SHOULD retry via a different path if it expects a response and doesn't receive one after a reasonable period. 1677 - For the non-final nodes' `onionmsg_tlv`: 1678 - MUST NOT set fields other than `encrypted_recipient_data`. 1679 - For the final node's `onionmsg_tlv`: 1680 - if the final node is permitted to reply: 1681 - MUST set `reply_path` `path_key` to the initial path key for the `first_node_id` 1682 - MUST set `reply_path` `first_node_id` to the unblinded node id of the first node in the reply path. 1683 - For every `reply_path` `path`: 1684 - MUST set `blinded_node_id` to the blinded node id to encrypt the onion hop for. 1685 - MUST set `encrypted_recipient_data` to a valid encrypted `encrypted_data_tlv` stream which meets the requirements of the `onionmsg_tlv` when used by the recipient. 1686 - MAY use `path_id` to contain a secret so it can recognize use of this `reply_path`. 1687 - otherwise: 1688 - MUST NOT set `reply_path`. 1689 1690 1691 The reader: 1692 1693 - SHOULD accept onion messages from peers without an established channel. 1694 - MAY rate-limit messages by dropping them. 1695 - MUST decrypt `onion_message_packet` using an empty `associated_data`, and `path_key`, as described in [Onion Decryption](04-onion-routing.md#onion-decryption) to extract an `onionmsg_tlv`. 1696 - If decryption fails, the result is not a valid `onionmsg_tlv`, or it contains unknown even types: 1697 - MUST ignore the message. 1698 - if `encrypted_data_tlv` contains `allowed_features`: 1699 - MUST ignore the message if: 1700 - `encrypted_data_tlv.allowed_features.features` contains an unknown feature bit (even if it is odd). 1701 - the message uses a feature not included in `encrypted_data_tlv.allowed_features.features`. 1702 - if it is not the final node according to the onion encryption: 1703 - if the `onionmsg_tlv` contains other tlv fields than `encrypted_recipient_data`: 1704 - MUST ignore the message. 1705 - if the `encrypted_data_tlv` contains `path_id`: 1706 - MUST ignore the message. 1707 - otherwise: 1708 - if `next_node_id` is present: 1709 - the *next peer* is the peer with that node id. 1710 - otherwise, if `short_channel_id` is present and corresponds to an announced short_channel_id or a local alias for a channel: 1711 - the *next peer* is the peer at the other end of that channel. 1712 - otherwise: 1713 - MUST ignore the message. 1714 - SHOULD forward the message using `onion_message` to the *next peer*. 1715 - if it forwards the message: 1716 - MUST set `path_key` in the forwarded `onion_message` to the next `path_key` as calculated in [Route Blinding](#route-blinding). 1717 - otherwise (it is the final node): 1718 - if `path_id` is set and corresponds to a path the reader has previously published in a `reply_path`: 1719 - if the onion message is not a reply to that previous onion: 1720 - MUST ignore the onion message 1721 - otherwise (unknown or unset `path_id`): 1722 - if the onion message is a reply to an onion message which contained a `path_id`: 1723 - MUST respond (or not respond) exactly as if it did not send the initial onion message. 1724 - if the `onionmsg_tlv` contains more than one payload field: 1725 - MUST ignore the message. 1726 - if it wants to send a reply: 1727 - MUST create an onion message using `reply_path`. 1728 - MUST send the reply via `onion_message` to the node indicated by 1729 the `first_node_id`, using `reply_path` `path_key` to send 1730 along `reply_path` `path`. 1731 1732 1733 #### Rationale 1734 1735 Care must be taken that replies are only accepted using the exact 1736 reply_path given, otherwise probing is possible. That means checking 1737 both ways: non-replies don't use the reply path, and replies always 1738 use the reply path. 1739 1740 The requirement to discard messages with `onionmsg_tlv` fields which 1741 are not strictly required ensures consistency between current and 1742 future implementations. Even odd fields can be a problem since they 1743 are parsed (and thus may be rejected!) by nodes which understand them, 1744 and ignored by those which don't. 1745 1746 All onion messages are blinded, even though this overhead is not 1747 always necessary (33 bytes here, the 16-byte MAC for each encrypted_data_tlv in 1748 the onion). This blinding allows nodes to use a path provided by 1749 others without knowing its contents. Using it universally simplifies 1750 implementations a little, and makes it more difficult to distinguish 1751 onion messages. 1752 1753 `len` allows larger messages to be sent than the standard 1300 bytes 1754 allowed for an HTLC onion, but this should be used sparingly as it 1755 reduces the anonymity set, hence the recommendation that it either looks 1756 like an HTLC onion, or if larger, be a fixed size. 1757 1758 Onion messages don't explicitly require a channel, but for 1759 spam-reduction a node may choose to ratelimit such peers, especially 1760 messages it is asked to forward. 1761 1762 ## `max_htlc_cltv` Selection 1763 1764 This `max_htlc_cltv` value is defined as 2016 blocks, based on historical value 1765 deployed by Lightning implementations. 1766 1767 # Test Vector 1768 1769 ## Returning Errors 1770 1771 The test vectors use the following parameters: 1772 1773 pubkey[0] = 0x02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619 1774 htlc_hold_time[0] = 1 1775 1776 pubkey[1] = 0x0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c 1777 htlc_hold_time[1] = 2 1778 1779 pubkey[2] = 0x027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007 1780 htlc_hold_time[2] = 3 1781 1782 pubkey[3] = 0x032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991 1783 htlc_hold_time[3] = 4 1784 1785 pubkey[4] = 0x02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145 1786 htlc_hold_time[4] = 5 1787 1788 nhops = 5 1789 sessionkey = 0x4141414141414141414141414141414141414141414141414141414141414141 1790 1791 failure_source = node 4 1792 failure_message = `incorrect_or_unknown_payment_details` 1793 htlc_msat = 100 1794 height = 800000 1795 tlv data 1796 type = 34001 1797 value = [128, 128, ..., 128] (300 bytes) 1798 1799 The following is an in-depth trace of an example of error message creation: 1800 1801 # creating error message 1802 encoded_failure_message = 400f0000000000000064000c3500fd84d1fd012c80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1803 shared_secret = b5756b9b542727dbafc6765a49488b023a725d631af688fc031217e90770c328 1804 payload = 0140400f0000000000000064000c3500fd84d1fd012c80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1805 um_key = 4da7f2923edce6c2d85987d1d9fa6d88023e6c3a9c3d20f07d3b10b61a78d646 1806 raw_error_packet = fda7e11974f78ca6cc456f2d17ae54463664696e93842548245dd2a2c513a6260140400f0000000000000064000c3500fd84d1fd012c80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1807 1808 # forwarding error packet 1809 shared_secret = b5756b9b542727dbafc6765a49488b023a725d631af688fc031217e90770c328 1810 ammag_key = 2f36bb8822e1f0d04c27b7d8bb7d7dd586e032a3218b8d414afbba6f169a4d68 1811 stream = e9c975b07c9a374ba64fd9be3aae955e917d34d1fa33f2e90f53bbf4394713c6a8c9b16ab5f12fd45edd73c1b0c8b33002df376801ff58aaa94000bf8a86f92620f343baef38a580102395ae3abf9128d1047a0736ff9b83d456740ebbb4aeb3aa9737f18fb4afb4aa074fb26c4d702f42968888550a3bded8c05247e045b866baef0499f079fdaeef6538f31d44deafffdfd3afa2fb4ca9082b8f1c465371a9894dd8c243fb4847e004f5256b3e90e2edde4c9fb3082ddfe4d1e734cacd96ef0706bf63c9984e22dc98851bcccd1c3494351feb458c9c6af41c0044bea3c47552b1d992ae542b17a2d0bba1a096c78d169034ecb55b6e3a7263c26017f033031228833c1daefc0dedb8cf7c3e37c9c37ebfe42f3225c326e8bcfd338804c145b16e34e4f5984bc119af09d471a61f39e9e389c4120cadabc5d9b7b1355a8ccef050ca8ad72f642fc26919927b347808bade4b1c321b08bc363f20745ba2f97f0ced2996a232f55ba28fe7dfa70a9ab0433a085388f25cce8d53de6a2fbd7546377d6ede9027ad173ba1f95767461a3689ef405ab608a21086165c64b02c1782b04a6dba2361a7784603069124e12f2f6dcb1ec7612a4fbf94c0e14631a2bef6190c3d5f35e0c4b32aa85201f449d830fd8f782ec758b0910428e3ec3ca1dba3b6c7d89f69e1ee1b9df3dfbbf6d361e1463886b38d52e8f43b73a3bd48c6f36f5897f514b93364a31d49d1d506340b1315883d425cb36f4ea553430d538fd6f3596d4afc518db2f317dd051abc0d4bfb0a7870c3db70f19fe78d6604bbf088fcb4613f54e67b038277fedcd9680eb97bdffc3be1ab2cbcbafd625b8a7ac34d8c190f98d3064ecd3b95b8895157c6a37f31ef4de094b2cb9dbf8ff1f419ba0ecacb1bb13df0253b826bec2ccca1e745dd3b3e7cc6277ce284d649e7b8285727735ff4ef6cca6c18e2714f4e2a1ac67b25213d3bb49763b3b94e7ebf72507b71fb2fe0329666477ee7cb7ebd6b88ad5add8b217188b1ca0fa13de1ec09cc674346875105be6e0e0d6c8928eb0df23c39a639e04e4aedf535c4e093f08b2c905a14f25c0c0fe47a5a1535ab9eae0d9d67bdd79de13a08d59ee05385c7ea4af1ad3248e61dd22f8990e9e99897d653dd7b1b1433a6d464ea9f74e377f2d8ce99ba7dbc753297644234d25ecb5bd528e2e2082824681299ac30c05354baaa9c3967d86d7c07736f87fc0f63e5036d47235d7ae12178ced3ae36ee5919c093a02579e4fc9edad2c446c656c790704bfc8e2c491a42500aa1d75c8d4921ce29b753f883e17c79b09ea324f1f32ddf1f3284cd70e847b09d90f6718c42e5c94484cc9cbb0df659d255630a3f5a27e7d5dd14fa6b974d1719aa98f01a20fb4b7b1c77b42d57fab3c724339d459ee4a1c6b5d3bd4e08624c786a257872acc9ad3ff62222f2265a658d9f2a007229a5293b67ec91c84c4b4407c228434bad8a815ca9b256c776bd2c9f 1812 error packet for node 4: 146e94a9086dbbed6a0ab6932d00c118a7195dbf69b7d7a12b0e6956fc54b5e0a989f165b5f12fd45edd73a5b0c48630ff5be69500d3d82a29c0803f0a0679a6a073c33a6fb8250090a3152eba3f11a85184fa87b67f1b0354d6f48e3b342e332a17b7710f342f342a87cf32eccdf0afc2160808d58abb5e5840d2c760c538e63a6f841970f97d2e6fe5b8739dc45e2f7f5f532f227bcc2988ab0f9cc6d3f12909cd5842c37bc8c7608475a5ebbe10626d5ecc1f3388ad5f645167b44a4d166f87863fe34918cea25c18059b4c4d9cb414b59f6bc50c1cea749c80c43e2344f5d23159122ed4ab9722503b212016470d9610b46c35dbeebaf2e342e09770b38392a803bc9d2e7c8d6d384ffcbeb74943fe3f64afb2a543a6683c7db3088441c531eeb4647518cb41992f8954f1269fb969630944928c2d2b45593731b5da0c4e70d04a0a57afe4af42e99912fbb4f8883a5ecb9cb29b883cb6bfa0f4db2279ff8c6d2b56a232f55ba28fe7dfa70a9ab0433a085388f25cce8d53de6a2fbd7546377d6ede9027ad173ba1f95767461a3689ef405ab608a21086165c64b02c1782b04a6dba2361a7784603069124e12f2f6dcb1ec7612a4fbf94c0e14631a2bef6190c3d5f35e0c4b32aa85201f449d830fd8f782ec758b0910428e3ec3ca1dba3b6c7d89f69e1ee1b9df3dfbbf6d361e1463886b38d52e8f43b73a3bd48c6f36f5897f514b93364a31d49d1d506340b1315883d425cb36f4ea553430d538fd6f3596d4afc518db2f317dd051abc0d4bfb0a7870c3db70f19fe78d6604bbf088fcb4613f54e67b038277fedcd9680eb97bdffc3be1ab2cbcbafd625b8a7ac34d8c190f98d3064ecd3b95b8895157c6a37f31ef4de094b2cb9dbf8ff1f419ba0ecacb1bb13df0253b826bec2ccca1e745dd3b3e7cc6277ce284d649e7b8285727735ff4ef6cca6c18e2714f4e2a1ac67b25213d3bb49763b3b94e7ebf72507b71fb2fe0329666477ee7cb7ebd6b88ad5add8b217188b1ca0fa13de1ec09cc674346875105be6e0e0d6c8928eb0df23c39a639e04e4aedf535c4e093f08b2c905a14f25c0c0fe47a5a1535ab9eae0d9d67bdd79de13a08d59ee05385c7ea4af1ad3248e61dd22f8990e9e99897d653dd7b1b1433a6d464ea9f74e377f2d8ce99ba7dbc753297644234d25ecb5bd528e2e2082824681299ac30c05354baaa9c3967d86d7c07736f87fc0f63e5036d47235d7ae12178ced3ae36ee5919c093a02579e4fc9edad2c446c656c790704bfc8e2c491a42500aa1d75c8d4921ce29b753f883e17c79b09ea324f1f32ddf1f3284cd70e847b09d90f6718c42e5c94484cc9cbb0df659d255630a3f5a27e7d5dd14fa6b974d1719aa98f01a20fb4b7b1c77b42d57fab3c724339d459ee4a1c6b5d3bd4e08624c786a257872acc9ad3ff62222f2265a658d9f2a007229a5293b67ec91c84c4b4407c228434bad8a815ca9b256c776bd2c9f 1813 attribution data for node 4: d77d0711b5f71d1d1be56bd88b3bb7ebc1792bb739ea7ebc1bc3b031b8bc2df3a50e25aeb99f47d7f7ab39e24187d3f4df9c4333463b053832ee9ac07274a5261b8b2a01fc09ce9ea7cd04d7b585dfb8cf5958e3f3f2a4365d1ec0df1d83c6a6221b5b7d1ff30156a2289a1d3ee559e7c7256bda444bb8e046f860e00b3a59a85e1e1a43de215fd5e6bf646a5deab97b1912c934e31b1cfd344764d6ca7e14ea7b3f2a951aba907c964c0f5d19a44e6d1d7279637321fa598adde927b3087d238f8b426ecde500d318617cdb7a56e6ce3520fc95be41a549973764e4dc483853ecc313947709f1b5199cb077d46e701fa633e11d3e13b03e9212c115ca6fa004b2f3dd912814693b705a561a06da54cdf603677a3abecdc22c7358c2de3cef771b366a568150aeecc86ad1990bb0f4e2865933b03ea0df87901bff467908273dc6cea31cbab0e2b8d398d10b001058c259ed221b7b55762f4c7e49c8c11a45a107b7a2c605c26dc5b0b10d719b1c844670102b2b6a36c43fe4753a78a483fc39166ae28420f112d50c10ee64ca69569a2f690712905236b7c2cb7ac8954f02922d2d918c56d42649261593c47b14b324a65038c3c5be8d3c403ce0c8f19299b1664bf077d7cf1636c4fb9685a8e58b7029fd0939fa07925a60bed339b23f973293598f595e75c8f9d455d7cebe4b5e23357c8bd47d66d6628b39427e37e0aecbabf46c11be6771f7136e108a143ae9bafba0fc47a51b6c7deef4cba54bae906398ee3162a41f2191ca386b628bde7e1dd63d1611aa01a95c456df337c763cb8c3a81a6013aa633739d8cd554c688102211725e6adad165adc1bcd429d020c51b4b25d2117e8bb27eb0cc7020f9070d4ad19ac31a76ebdf5f9246646aeadbfb9a3f1d75bd8237961e786302516a1a781780e8b73f58dc06f307e58bd0eb1d8f5c9111f01312974c1dc777a6a2d3834d8a2a40014e9818d0685cb3919f6b3b788ddc640b0ff9b1854d7098c7dd6f35196e902b26709640bc87935a3914869a807e8339281e9cedaaca99474c3e7bdd35050bb998ab4546f9900904e0e39135e861ff7862049269701081ebce32e4cca992c6967ff0fd239e38233eaf614af31e186635e9439ec5884d798f9174da6ff569d68ed5c092b78bd3f880f5e88a7a8ab36789e1b57b035fb6c32a6358f51f83e4e5f46220bcad072943df8bd9541a61b7dae8f30fa3dd5fb39b1fd9a0b8e802552b78d4ec306ecee15bfe6da14b29ba6d19ce5be4dd478bca74a52429cd5309d404655c3dec85c252 1814 1815 # forwarding error packet 1816 shared_secret = 21e13c2d7cfe7e18836df50872466117a295783ab8aab0e7ecc8c725503ad02d 1817 ammag_key = cd9ac0e09064f039fa43a31dea05f5fe5f6443d40a98be4071af4a9d704be5ad 1818 stream = 617ca1e4624bc3f04fece3aa5a2b615110f421ec62408d16c48ea6c1b7c33fe7084a2bd9d4652fc5068e5052bf6d0acae2176018a3d8c75f37842712913900263cff92f39f3c18aa1f4b20a93e70fc429af7b2b1967ca81a761d40582daf0eb49cef66e3d6fbca0218d3022d32e994b41c884a27c28685ef1eb14603ea80a204b2f2f474b6ad5e71c6389843e3611ebeafc62390b717ca53b3670a33c517ef28a659c251d648bf4c966a4ef187113ec9848bf110816061ca4f2f68e76ceb88bd6208376460b916fb2ddeb77a65e8f88b2e71a2cbf4ea4958041d71c17d05680c051c3676fb0dc8108e5d78fb1e2c44d79a202e9d14071d536371ad47c39a05159e8d6c41d17a1e858faaaf572623aa23a38ffc73a4114cb1ab1cd7f906c6bd4e21b29694f9830d12e8ad4b1ac320b3d5bfb4e534f02cefe9a983d66939581412acb1927eb93e8ed73145cddf24266bdcc95923ecb38c8c9c5f4465335b0f18bf9f2d03fa02d57f258db27983d94378bc796cbe7737180dd7e39a36e461ebcb7ec82b6dcdf9d3f209381f7b3a23e798c4f92e13b4bb972ee977e24f4b83bb59b577c210e1a612c2b035c8271d9bc1fb915776ac6560315b124465866830473aa238c35089cf2adb9c6e9f05ab113c1d0a4a18ba0cb9951b928c0358186532c36d4c3daa65657be141cc22e326f88e445e898893fd5f0a7dd231ee5bc972077b1e12a8e382b75d4b557e895a2adc757f2e451e33e0ae3fb54566ee09155da6ada818aa4a4a2546832a8ba22f0ef9ec6a1c78e03a7c29cb126bcaf81aea61cd8b07ab9f4e5e0ad0d9a3a0c66d2d0a00cc05884d183a68e816e76b75842d55895f5b91c5c1b9f7052763aae8a647aa0799214275b6e781f0816fc9ffb802a0101eb5a2de6b3375d3e3478f892b2de7f1900d8ca9bf188fcba89fc49d03c38fa2587a8ae119abfb295b15fa11cb188796bedc4fdfceef296e44fbfa7e84569cc6346389a421782e40a298e1e2b6f9cae3103c3f39d24541e4ab7b61dafe1a5f2fe936a59d87cccdaf7c226acc451ceec3e81bc4828b4925feeae3526d5e2bf93bd5f4fdc0e069010aea1ae7e0d480d438918598896b776bf08fea124f91b3a13414b56934857707902612fc97b0e5d02cbe6e5901ad304c7e8656390efccf3a1b22e18a2935181b78d5d2c89540ede8b0e6194d0d3945780bf577f622cb12deedbf8210eb1450c298b9ee19f3c7082aabc2bdbd3384f3539dc3766978567135549df0d48287735854a6098fa40a9e48eaa27e0d159beb65dd871e4c0b3fffa65f0375f0d3253f582193135ece60d5b9d8ba6739d87964e992cbec674b728d9eaaed595462c41d15fb497d4baa062368005d13fc99e1402563117a6c140c10363b05196a4cbb6b84ae807d62c748485c15e3316841e4a98c3aac81e3bc996b4baca77eac8cdbe99cc7c5ebeb85c907cefb4abe15cbe87fdc5dc2326019196235ac205934fcf8e3 1819 error packet for node 3: 7512354d6a26781d25e65539772ba049b7ed7c530bf75ab7ef80cf974b978a07a1c3dabc61940011585323f70fa98cfa1d4c868da30b1f751e44a72d9b3f79809c8c51c9f0843daa8fe83587844fedeacb7348362003b31922cbb4d6169b2087b6f8d192d9cfe5363254cd1fde24641bde9e422f170c3eb146f194c48a459ae2889d706dc654235fa9dd20307ea54091d09970bf956c067a3bcc05af03c41e01af949a131533778bf6ee3b546caf2eabe9d53d0fb2e8cc952b7e0f5326a69ed2e58e088729a1d85971c6b2e129a5643f3ac43da031e655b27081f10543262cf9d72d6f64d5d96387ac0d43da3e3a03da0c309af121dcf3e99192efa754eab6960c256ffd4c546208e292e0ab9894e3605db098dc16b40f17c320aa4a0e42fc8b105c22f08c9bc6537182c24e32062c6cd6d7ec7062a0c2c2ecdae1588c82185cdc61d874ee916a7873ac54cddf929354f307e870011704a0e9fbc5c7802d6140134028aca0e78a7e2f3d9e5c7e49e20c3a56b624bfea51196ec9e88e4e56be38ff56031369f45f1e03be826d44a182f270c153ee0d9f8cf9f1f4132f33974e37c7887d5b857365c873cb218cbf20d4be3abdb2a2011b14add0a5672e01e5845421cf6dd6faca1f2f443757aae575c53ab797c2227ecdab03882bbbf4599318cefafa72fa0c9a0f5a51d13c9d0e5d25bfcfb0154ed25895260a9df8743ac188714a3f16960e6e2ff663c08bffda41743d50960ea2f28cda0bc3bd4a180e297b5b41c700b674cb31d99c7f2a1445e121e772984abff2bbe3f42d757ceeda3d03fb1ffe710aecabda21d738b1f4620e757e57b123dbc3c4aa5d9617dfa72f4a12d788ca596af14bea583f502f16fdc13a5e739afb0715424af2767049f6b9aa107f69c5da0e85f6d8c5e46507e14616d5d0b797c3dea8b74a1b12d4e47ba7f57f09d515f6c7314543f78b5e85329d50c5f96ee2f55bbe0df742b4003b24ccbd4598a64413ee4807dc7f2a9c0b92424e4ae1b418a3cdf02ea4da5c3b12139348aa7022cc8272a3a1714ee3e4ae111cffd1bdfd62c503c80bdf27b2feaea0d5ab8fe00f9cec66e570b00fd24b4a2ed9a5f6384f148a4d6325110a41ca5659ebc5b98721d298a52819b6fb150f273383f1c5754d320be428941922da790e17f482989c365c078f7f3ae100965e1b38c052041165295157e1a7c5b7a57671b842d4d85a7d971323ad1f45e17a16c4656d889fc75c12fc3d8033f598306196e29571e414281c5da19c12605f48347ad5b4648e371757cbe1c40adb93052af1d6110cfbf611af5c8fc682b7e2ade3bfca8b5c7717d19fc9f97964ba6025aebbc91a6671e259949dcf40984342118de1f6b514a7786bd4f6598ffbe1604cef476b2a4cb1343db608aca09d1d38fc23e98ee9c65e7f6023a8d1e61fd4f34f753454bd8e858c8ad6be6403edc599c220e03ca917db765980ac781e758179cd93983e9c1e769e4241d47c 1820 attribution data for node 3: 1571e10db7f8aa9f8e7e99caaf9c892e106c817df1d8e3b7b0e39d1c48f631e473e17e205489dd7b3c634cac3be0825cbf01418cd46e83c24b8d9c207742db9a0f0e5bcd888086498159f08080ba7bf36dee297079eb841391ccd3096da76461e314863b6412efe0ffe228d51c6097db10d3edb2e50ea679820613bfe9db11ba02920ab4c1f2a79890d997f1fc022f3ab78f0029cc6de0c90be74d55f4a99bf77a50e20f8d076fe61776190a61d2f41c408871c0279309cba3b60fcdc7efc4a0e90b47cb4a418fc78f362ecc7f15ebbce9f854c09c7be300ebc1a40a69d4c7cb7a19779b6905e82bec221a709c1dab8cbdcde7b527aca3f54bde651aa9f3f2178829cee3f1c0b9292758a40cc63bd998fcd0d3ed4bdcaf1023267b8f8e44130a63ad15f76145936552381eabb6d684c0a3af6ba8efcf207cebaea5b7acdbb63f8e7221102409d10c23f0514dc9f4d0efb2264161a193a999a23e992632710580a0d320f676d367b9190721194514457761af05207cdab2b6328b1b3767eacb36a7ef4f7bd2e16762d13df188e0898b7410f62459458712a44bf594ae662fd89eb300abb6952ff8ad40164f2bcd7f86db5c7650b654b79046de55d51aa8061ce35f867a3e8f5bf98ad920be827101c64fb871d86e53a4b3c0455bfac5784168218aa72cbee86d9c750a9fa63c363a8b43d7bf4b2762516706a306f0aa3be1ec788b5e13f8b24837e53ac414f211e11c7a093cd9653dfa5fba4e377c79adfa5e841e2ddb6afc054fc715c05ddc6c8fc3e1ee3406e1ffceb2df77dc2f02652614d1bfcfaddebaa53ba919c7051034e2c7b7cfaabdf89f26e7f8e3f956d205dfab747ad0cb505b85b54a68439621b25832cbc2898919d0cd7c0a64cfd235388982dd4dd68240cb668f57e1d2619a656ed326f8c92357ee0d9acead3c20008bc5f04ca8059b55d77861c6d04dfc57cfba57315075acbe1451c96cf28e1e328e142890248d18f53b5d3513ce574dea7156cf596fdb3d909095ec287651f9cf1bcdc791c5938a5dd9b47e84c004d24ab3ae74492c7e8dcc1da15f65324be2672947ec82074cac8ce2b925bc555facbbf1b55d63ea6fbea6a785c97d4caf2e1dad9551b7f66c31caae5ebc7c0047e892f201308fcf452c588be0e63d89152113d87bf0dbd01603b4cdc7f0b724b0714a9851887a01f709408882e18230fe810b9fafa58a666654576d8eba3005f07221f55a6193815a672e5db56204053bc4286fa3db38250396309fd28011b5708a26a2d76c4a333b69b6bfd272fb 1821 1822 # forwarding error packet 1823 shared_secret = 3a6b412548762f0dbccce5c7ae7bb8147d1caf9b5471c34120b30bc9c04891cc 1824 ammag_key = 1bf08df8628d452141d56adfd1b25c1530d7921c23cecfc749ac03a9b694b0d3 1825 stream = 6149f48b5a7e8f3d6f5d870b7a698e204cf64452aab4484ff1dee671fe63fd4b5f1b78ee2047dfa61e3d576b149bedaf83058f85f06a3172a3223ad6c4732d96b32955da7d2feb4140e58d86fc0f2eb5d9d1878e6f8a7f65ab9212030e8e915573ebbd7f35e1a430890be7e67c3fb4bbf2def662fa625421e7b411c29ebe81ec67b77355596b05cc155755664e59c16e21410aabe53e80404a615f44ebb31b365ca77a6e91241667b26c6cad24fb2324cf64e8b9dd6e2ce65f1f098cfd1ef41ba2d4c7def0ff165a0e7c84e7597c40e3dffe97d417c144545a0e38ee33ebaae12cc0c14650e453d46bfc48c0514f354773435ee89b7b2810606eb73262c77a1d67f3633705178d79a1078c3a01b5fadc9651feb63603d19decd3a00c1f69af2dab2595931ca50d8280758b1cc91ba2dc43dbbc3d91bf25c08b46c2ecef7a32cec64d4b61ee3a629ef563afe058b71e71bcb69033948bc8728c5ebe65ec596e4f305b9fc159d53f723dfc95b57f3d51717f1c89af97a6d587e89e62efcc92198a1b2bd66e2d875505ea4046c04389f8cb0ee98f0af03af2652e2f3d9a9c48430f2891a4d9b16e7d18099e4a3dd334c24aba1e2450792c2f22092c170da549d43a440021e699bd6c20d8bbf1961100a01ebcce06a4609f5ad93066287acf68294cfa9ea7cea03a508983b134a9f0118b16409a61c06aaa95897d2067cb7cd59123f3e2ccf0e16091571d616c44818f118bb7835a679f5c0eea8cf1bd5479882b2c2a341ec26dbe5da87b3d37d66b1fbd176f71ab203a3b6eaf7f214d579e7d0e4a3e59089ebd26ba04a62403ae7a793516ec16d971d51c5c0107a917d1a70221e6de16edca7cb057c7d06902b5191f298aa4d478a0c3a6260c257eae504ebbf2b591688e6f3f77af770b6f566ae9868d2f26c12574d3bf9323af59f0fe0072ff94ae597c2aa6fbcbf0831989e02f9d3d1b9fd6dd97f509185d9ecbf272e38bd621ee94b97af8e1cd43853a8f6aa6e8372585c71bf88246d064ade524e1e0bd8496b620c4c2d3ae06b6b064c97536aaf8d515046229f72bee8aa398cd0cc21afd5449595016bef4c77cb1e2e9d31fe1ca3ffde06515e6a4331ccc84edf702e5777b10fc844faf17601a4be3235931f6feca4582a8d247c1d6e4773f8fb6de320cf902bbb1767192782dc550d8e266e727a2aa2a414b816d1826ea46af71701537193c22bbcc0123d7ff5a23b0aa8d7967f36fef27b14fe1866ff3ab215eb29e07af49e19174887d71da7e7fe1b7aa1b3c805c063e0fafedf125fa6c57e38cce33a3f7bb35fd8a9f0950de3c22e49743c05f40bc55f960b8a8b5e2fde4bb229f125538438de418cb318d13968532499118cb7dcaaf8b6d635ac4001273bdafd12c8ea0702fb2f0dac81dbaaf68c1c32266382b293fa3951cb952ed5c1bdc41750cdbc0bd62c51bb685616874e251f031a929c06faef5bfcb0857f815ae20620b823f0abecfb5 1826 error packet for node 2: 145bc1c63058f7204abbd2320d422e69fb1b3801a14312f81e5e29e6b5f4774cfed8a25241d3dfb7466e749c1b3261559e49090853612e07bd669dfb5f4c54162fa504138dabd6ebcf0db8017840c35f12a2cfb84f89cc7c8959a6d51815b1d2c5136cedec2e4106bb5f2af9a21bd0a02c40b44ded6e6a90a145850614fb1b0eef2a03389f3f2693bc8a755630fc81fff1d87a147052863a71ad5aebe8770537f333e07d841761ec448257f948540d8f26b1d5b66f86e073746106dfdbb86ac9475acf59d95ece037fba360670d924dce53aaa74262711e62a8fc9eb70cd8618fbedae22853d3053c7f10b1a6f75369d7f73c419baa7dbf9f1fc5895362dcc8b6bd60cca4943ef7143956c91992119bccbe1666a20b7de8a2ff30a46112b53a6bb79b763903ecbd1f1f74952fb1d8eb0950c504df31fe702679c23b463f82a921a2c931500ab08e686cffb2d87258d254fb17843959cccd265a57ba26c740f0f231bb76df932b50c12c10be90174b37d454a3f8b284c849e86578a6182c4a7b2e47dd57d44730a1be9fec4ad07287a397e28dce4fda57e9cdfdb2eb5afdf0d38ef19d982341d18d07a556bb16c1416f480a396f278373b8fd9897023a4ac506e65cf4c306377730f9c8ca63cf47565240b59c4861e52f1dab84d938e96fb31820064d534aca05fd3d2600834fe4caea98f2a748eb8f200af77bd9fbf46141952b9ddda66ef0ebea17ea1e7bb5bce65b6e71554c56dd0d4e14f4cf74c77a150776bf31e7419756c71e7421dc22efe9cf01de9e19fc8808d5b525431b944400db121a77994518d6025711cb25a18774068bba7faaa16d8f65c91bec8768848333156dcb4a08dfbbd9fef392da3e4de13d4d74e83a7d6e46cfe530ee7a6f711e2caf8ad5461ba8177b2ef0a518baf9058ff9156e6aa7b08d938bd8d1485a787809d7b4c8aed97be880708470cd2b2cdf8e2f13428cc4b04ef1f2acbc9562f3693b948d0aa94b0e6113cafa684f8e4a67dc431dfb835726874bef1de36f273f52ee694ec46b0700f77f8538067642a552968e866a72a3f2031ad116663ac17b172b446c5bc705b84777363a9a3fdc6443c07b2f4ef58858122168d4ebbaee920cefc312e1cea870ed6e15eec046ab2073bbf08b0a3366f55cfc6ad4681a12ab0946534e7b6f90ea8992d530ec3daa6b523b3cf03101c60cadd914f30dec932c1ef4341b5a8efac3c921e203574cfe0f1f83433fddb8ccfd273f7c3cab7bc27efe3bb61fdccd5146f1185364b9b621e7fb2b74b51f5ee6be72ab6ff46a6359dc2c855e61469724c1dbeb273df9d2e1c1fb74891239c0019dc12d5c7535f7238f963b761d7102b585372cf021b64c4fc85bfb3161e59d2e298bba44cfd34d6859d9dba9dc6271e5047d525468c814f2ae438474b0a977273036da1a2292f88fcfb89574a6bdca1185b40f8aa54026d5926725f99ef028da1be892e3586361efe15f4a148ff1bc9 1827 attribution data for node 2: 34e34397b8621ec2f2b54dbe6c14073e267324cd60b152bce76aec8729a6ddefb61bc263be4b57bd592aae604a32bea69afe6ef4a6b573c26b17d69381ec1fc9b5aa769d148f2f1f8b5377a73840bb6dc641f68e356323d766fff0aaca5039fe7fc27038195844951a97d5a5b26698a4ca1e9cd4bca1fcca0aac5fee91b18977d2ad0e399ba159733fc98f6e96898ebc39bf0028c9c81619233bab6fad0328aa183a635fac20437fa6e00e899b2527c3697a8ab7342e42d55a679b176ab76671fcd480a9894cb897fa6af0a45b917a162bed6c491972403185df7235502f7ada65769d1bfb12d29f10e25b0d3cc08bbf6de8481ac5c04df32b4533b4f764c2aefb7333202645a629fb16e4a208e9045dc36830759c852b31dd613d8b2b10bbead1ed4eb60c85e8a4517deba5ab53e39867c83c26802beee2ee545bdd713208751added5fc0eb2bc89a5aa2decb18ee37dac39f22a33b60cc1a369d24de9f3d2d8b63c039e248806de4e36a47c7a0aed30edd30c3d62debdf1ad82bf7aedd7edec413850d91c261e12beec7ad1586a9ad25b2db62c58ca17119d61dcc4f3e5c4520c42a8e384a45d8659b338b3a08f9e123a1d3781f5fc97564ccff2c1d97f06fa0150cfa1e20eacabefb0c339ec109336d207cc63d9170752fc58314c43e6d4a528fd0975afa85f3aa186ff1b6b8cb12c97ed4ace295b0ef5f075f0217665b8bb180246b87982d10f43c9866b22878106f5214e99188781180478b07764a5e12876ddcb709e0a0a8dd42cf004c695c6fc1669a6fd0e4a1ca54b024d0d80eac492a9e5036501f36fb25b72a054189294955830e43c18e55668337c8c6733abb09fc2d4ade18d5a853a2b82f7b4d77151a64985004f1d9218f2945b63c56fdebd1e96a2a7e49fa70acb4c39873947b83c191c10e9a8f40f60f3ad5a2be47145c22ea59ed3f5f4e61cb069e875fb67142d281d784bf925cc286eacc2c43e94d08da4924b83e58dbf2e43fa625bdd620eba6d9ce960ff17d14ed1f2dbee7d08eceb540fdc75ff06dabc767267658fad8ce99e2a3236e46d2deedcb51c3c6f81589357edebac9772a70b3d910d83cd1b9ce6534a011e9fa557b891a23b5d88afcc0d9856c6dabeab25eea55e9a248182229e4927f268fe5431672fcce52f434ca3d27d1a2136bae5770bb36920df12fbc01d0e8165610efa04794f414c1417f1d4059435c5385bfe2de83ce0e238d6fd2dbd3c0487c69843298577bfa480fe2a16ab2a0e4bc712cd8b5a14871cda61c993b6835303d9043d7689a 1828 1829 # forwarding error packet 1830 shared_secret = a6519e98832a0b179f62123b3567c106db99ee37bef036e783263602f3488fae 1831 ammag_key = 59ee5867c5c151daa31e36ee42530f429c433836286e63744f2020b980302564 1832 stream = 0f10c86f05968dd91188b998ee45dcddfbf89fe9a99aa6375c42ed5520a257e048456fe417c15219ce39d921555956ae2ff795177c63c819233f3bcb9b8b28e5ac6e33a3f9b87ca62dff43f4cc4a2755830a3b7e98c326b278e2bd31f4a9973ee99121c62873f5bfb2d159d3d48c5851e3b341f9f6634f51939188c3b9ff45feeb11160bb39ce3332168b8e744a92107db575ace7866e4b8f390f1edc4acd726ed106555900a0832575c3a7ad11bb1fe388ff32b99bcf2a0d0767a83cf293a220a983ad014d404bfa20022d8b369fe06f7ecc9c74751dcda0ff39d8bca74bf9956745ba4e5d299e0da8f68a9f660040beac03e795a046640cf8271307a8b64780b0588422f5a60ed7e36d60417562938b400802dac5f87f267204b6d5bcfd8a05b221ec294d883271b06ca709042ed5dbb64a7328d2796195eab4512994fb88919c73b3e5dd7bf68b2136d34cff39b3be266b71e004509bf975a240800bb8ae5eed248423a991ae80ef751b2d03b67fb93ffdd7969d5b500fe446a4ffb4cd04d0767a5d367ebd3f8f260f38ae1e9d9f9a7bd1a99ca1e10ee36bd241f06fc2b481c9b7450d9c9704204666807783264a0e93468e22db4dc4a7a4db2963ddf4366d08e225cf94848aac794bcecb7e850113e38cc3647a03a5dfaa3442b1bb58b1de7fa7f436feb4d7c23cbd2de6d55d4025fcd383cc9d49c0b130e2fd5a9097c216683c842f898a8a2159761cca9aa1c818194e3b7bea6da6652d5189f3b6b0ca1d5398b6d14e311d9c7f00399c29e94deb98496f4cd97c5d7d6a65cabc3791f60d728d6422a422c0cff5f7dfd4ce2d7e8d38dd71ae18763acc832c57275497f61b2620cca13cc64c0c48353f3817016f91448d6fc1cc451ee1f4a429e43292bbcd54fcd807e2c47675bac1781d9d81e9e6dc69028d428f5ee261750f626bcaf416a0e7badadf73fe1922207ae6c5209d16849e4a108f4a6f38694075f55177105ac4c2b97f6a474b94c03257d8d12b0196e2905d914b8c2213a1b9dc9608e1a2a1e03fe0820a813275de83be5e9734875787a9e006eb8574c23ddd49e2347d1ecfcedf3caa0a5dd45666368525b48ac14225d6422f82dbf59860ee4dc78e845d3c57668ce9b9e7a8d012491cef242078b458a956ad67c360fb6d8b86ab201d6217e49b55fa02a1dea2dbe88d0b08d30670d1b93c35cc5e41e088fccb267e41d6151cf8560496e1beeefe680744d9dabb383a4957466b4dc3e2bce7b135211da483d998a22fa687cc609641126c5dee3ed87291067916b5b065f40582163291d48e81ecd975d0d6fd52a31754f8ef15e43a560bd30ea5bf21915bd2e7007e607abbc6261edc8430cc7f789675b1fe83e807c5c475bd5178eba2fc40674706b0a68c6a428e5dec36e413e653c6db1178923ff87e2389a78bf9e93b713de4f4753f9f9d6a361369b609e1970c91ff9bd191c472e0bf2e8681412260ad0ef5855dc39f2084d45 1833 error packet for node 1: 1b4b09a935ce7af95b336baae307f2b400e3a7e808d9b4cf421cc4b3955620acb69dcdb656128dae8857adbd4e6b37fbb1be9c1f2f02e61e9e59a630c4c77cf383cb37b07413aa4de2f2fbf5b40ae40a91a8f4c6d74aeacef1bb1be4ecbc26ec2c824d2bc45db4b9098e732a769788f1cff3f5b41b0d25c132d40dc5ad045ef0043b15332ca3c5a09de2cdb17455a0f82a8f20da08346282823dab062cdbd2111e238528141d69de13de6d83994fbc711e3e269df63a12d3a4177c5c149150eb4dc2f589cd8acabcddba14dec3b0dada12d663b36176cd3c257c5460bab93981ad99f58660efa9b31d7e63b39915329695b3fa60e0a3bdb93e7e29a54ca6a8f360d3848866198f9c3da3ba958e7730847fe1e6478ce8597848d3412b4ae48b06e05ba9a104e648f6eaf183226b5f63ed2e68f77f7e38711b393766a6fab7921b03eba82b5d7cb78e34dc961948d6161eadd7cf5d95d9c56df2ff5faa6ccf85eacdc9ff2fc3abafe41c365a5bd14fd486d6b5e2f24199319e7813e02e798877ffe31a70ae2398d9e31b9e3727e6c1a3c0d995c67d37bb6e72e9660aaaa9232670f382add2edd468927e3303b6142672546997fe105583e7c5a3c4c2b599731308b5416e6c9a3f3ba55b181ad0439d3535356108b059f2cb8742eed7a58d4eba9fe79eaa77c34b12aff1abdaea93197aabd0e74cb271269ca464b3b06aef1d6573df5e1224179616036b368677f26479376681b772d3760e871d99efd34cca5cd6beca95190d967da820b21e5bec60082ea46d776b0517488c84f26d12873912d1f68fafd67bcf4c298e43cfa754959780682a2db0f75f95f0598c0d04fd014c50e4beb86a9e37d95f2bba7e5065ae052dc306555bca203d104c44a538b438c9762de299e1c4ad30d5b4a6460a76484661fc907682af202cd69b9a4473813b2fdc1142f1403a49b7e69a650b7cde9ff133997dcc6d43f049ecac5fce097a21e2bce49c810346426585e3a5a18569b4cddd5ff6bdec66d0b69fcbc5ab3b137b34cc8aefb8b850a764df0e685c81c326611d901c392a519866e132bbb73234f6a358ba284fbafb21aa3605cacbaf9d0c901390a98b7a7dac9d4f0b405f7291c88b2ff45874241c90ac6c5fc895a440453c344d3a365cb929f9c91b9e39cb98b142444aae03a6ae8284c77eb04b0a163813d4c21883df3c0f398f47bf127b5525f222107a2d8fe55289f0cfd3f4bbad6c5387b0594ef8a966afc9e804ccaf75fe39f35c6446f7ee076d433f2f8a44dba1515acc78e589fa8c71b0a006fe14feebd51d0e0aa4e51110d16759eee86192eee90b34432130f387e0ccd2ee71023f1f641cddb571c690107e08f592039fe36d81336a421e89378f351e633932a2f5f697d25b620ffb8e84bb6478e9bd229bf3b164b48d754ae97bd23f319e3c56b3bcdaaeb3bd7fc02ec02066b324cb72a09b6b43dec1097f49d69d3c138ce6f1a6402898baf7568c 1834 attribution data for node 1: 74a4ea61339463642a2182758871b2ea724f31f531aa98d80f1c3043febca41d5ee52e8b1e127e61719a0d078db8909748d57839e58424b91f063c4fbc8a221bef261140e66a9b596ca6d420a973ad54fef30646ae53ccf0855b61f291a81e0ec6dc0f6bf69f0ca0e5889b7e23f577ba67d2a7d6a2aa91264ab9b20630ed52f8ed56cc10a869807cd1a4c2cd802d8433fee5685d6a04edb0bff248a480b93b01904bed3bb31705d1ecb7332004290cc0cd9cc2f7907cf9db28eec02985301668f53fbc28c3e095c8f3a6cd8cab28e5e442fd9ba608b8b12e098731bbfda755393bd403c62289093b40390b2bae337fc87d2606ca028311d73a9ffbdffef56020c735ada30f54e577c6a9ec515ae2739290609503404b118d7494499ecf0457d75015bb60a16288a4959d74cf5ac5d8d6c113de39f748a418d2a7083b90c9c0a09a49149fd1f2d2cde4412e5aa2421eca6fd4f6fe6b2c362ff37d1a0608c931c7ca3b8fefcfd4c44ef9c38357a0767b14f83cb49bd1989fb3f8e2ab202ac98bd8439790764a40bf309ea2205c1632610956495720030a25dc7118e0c868fdfa78c3e9ecce58215579a0581b3bafdb7dbbe53be9e904567fdc0ce1236aab5d22f1ebc18997e3ea83d362d891e04c5785fd5238326f767bce499209f8db211a50e1402160486e98e7235cf397dbb9ae19fd9b79ef589c821c6f99f28be33452405a003b33f4540fe0a41dfcc286f4d7cc10b70552ba7850869abadcd4bb7f256823face853633d6e2a999ac9fcd259c71d08e266db5d744e1909a62c0db673745ad9585949d108ab96640d2bc27fb4acac7fa8b170a30055a5ede90e004df9a44bdc29aeb4a6bec1e85dde1de6aaf01c6a5d12405d0bec22f49026cb23264f8c04b8401d3c2ab6f2e109948b6193b3bec27adfe19fb8afb8a92364d6fc5b219e8737d583e7ff3a4bcb75d53edda3bf3f52896ac36d8a877ad9f296ea6c045603fc62ac4ae41272bde85ef7c3b3fd3538aacfd5b025fefbe277c2906821ecb20e6f75ea479fa3280f9100fb0089203455c56b6bc775e5c2f0f58c63edd63fa3eec0b40da4b276d0d41da2ec0ead865a98d12bc694e23d8eaadd2b4d0ee88e9570c88fb878930f492e036d27998d593e47763927ff7eb80b188864a3846dd2238f7f95f4090ed399ae95deaeb37abca1cf37c397cc12189affb42dca46b4ff6988eb8c060691d155302d448f50ff70a794d97c0408f8cee9385d6a71fa412e36edcb22dbf433db9db4779f27b682ee17fc05e70c8e794b9f7f6d1 1835 1836 # forwarding error packet 1837 shared_secret = 53eb63ea8a3fec3b3cd433b85cd62a4b145e1dda09391b348c4e1cd36a03ea66 1838 ammag_key = 3761ba4d3e726d8abb16cba5950ee976b84937b61b7ad09e741724d7dee12eb5 1839 stream = 3699fd352a948a05f604763c0bca2968d5eaca2b0118602e52e59121f050936c8dd90c24df7dc8cf8f1665e39a6c75e9e2c0900ea245c9ed3b0008148e0ae18bbfaea0c711d67eade980c6f5452e91a06b070bbde68b5494a92575c114660fb53cf04bf686e67ffa4a0f5ae41a59a39a8515cb686db553d25e71e7a97cc2febcac55df2711b6209c502b2f8827b13d3ad2f491c45a0cafe7b4d8d8810e805dee25d676ce92e0619b9c206f922132d806138713a8f69589c18c3fdc5acee41c1234b17ecab96b8c56a46787bba2c062468a13919afc18513835b472a79b2c35f9a91f38eb3b9e998b1000cc4a0dbd62ac1a5cc8102e373526d7e8f3c3a1b4bfb2f8a3947fe350cb89f73aa1bb054edfa9895c0fc971c2b5056dc8665902b51fced6dff80c4d247db977c15a710ce280fbd0ae3ca2a245b1c967aeb5a1a4a441c50bc9ceb33ca64b5ca93bd8b50060520f35a54a148a4112e8762f9d0b0f78a7f46a5f06c7a4b0845d020eb505c9e527aabab71009289a6919520d32af1f9f51ce4b3655c6f1aae1e26a16dc9aae55e9d4a6f91d4ba76e96fcb851161da3fc39d0d97ce30a5855c75ac2f613ff36a24801bcbd33f0ce4a3572b9a2fca21efb3b07897fc07ee71e8b1c0c6f8dbb7d2c4ed13f11249414fc94047d1a4a0be94d45db56af4c1a3bf39c9c5aa18209eaebb9e025f670d4c8cc1ee598c912db154eaa3d0c93cb3957e126c50486bf98c852ad326b5f80a19df6b2791f3d65b8586474f4c5dcb2aca0911d2257d1bb6a1e9fc1435be879e75d23290f9feb93ed40baaeca1c399fc91fb1da3e5f0f5d63e543a8d12fe6f7e654026d3a118ab58cb14bef9328d4af254215eb1f639828cc6405a3ab02d90bb70a798787a52c29b3a28fc67b0908563a65f08112abd4e9115cb01db09460c602aba3ddc375569dc3abe42c61c5ea7feb39ad8b05d8e2718e68806c0e1c34b0bc85492f985f8b3e76197a50d63982b780187078f5c59ebd814afaeffc7b2c6ee39d4f9c8c45fb5f685756c563f4b9d028fe7981b70752f5a31e44ba051ab40f3604c8596f1e95dc9b0911e7ede63d69b5eecd245fbecbcf233cf6eba842c0fec795a5adeab2100b1a1bc62c15046d48ec5709da4af64f59a2e552ddbbdcda1f543bb4b687e79f2253ff0cd9ba4e6bfae8e510e5147273d288fd4336dbd0b6617bf0ef71c0b4f1f9c1dc999c17ad32fe196b1e2b27baf4d59bba8e5193a9595bd786be00c32bae89c5dbed1e994fddffbec49d0e2d270bcc1068850e5d7e7652e274909b3cf5e3bc6bf64def0bbeac974a76d835e9a10bdd7896f27833232d907b7405260e3c986569bb8fdd65a55b020b91149f27bda9e63b4c2cc5370bcc81ef044a68c40c1b178e4265440334cc40f59ab5f82a022532805bfa659257c8d8ab9b4aef6abbd05de284c2eb165ef35737e3d387988c566f7b1ca0b1fc3e7b4ed991b77f23775e1c36a09a991384a33b78 1840 error packet for node 0: 2dd2f49c1f5af0fcad371d96e8cddbdcd5096dc309c1d4e110f955926506b3c03b44c192896f45610741c85ed4074212537e0c118d472ff3a559ae244acd9d783c65977765c5d4e00b723d00f12475aafaafff7b31c1be5a589e6e25f8da2959107206dd42bbcb43438129ce6cce2b6b4ae63edc76b876136ca5ea6cd1c6a04ca86eca143d15e53ccdc9e23953e49dc2f87bb11e5238cd6536e57387225b8fff3bf5f3e686fd08458ffe0211b87d64770db9353500af9b122828a006da754cf979738b4374e146ea79dd93656170b89c98c5f2299d6e9c0410c826c721950c780486cd6d5b7130380d7eaff994a8503a8fef3270ce94889fe996da66ed121741987010f785494415ca991b2e8b39ef2df6bde98efd2aec7d251b2772485194c8368451ad49c2354f9d30d95367bde316fec6cbdddc7dc0d25e99d3075e13d3de0822669861dafcd29de74eac48b64411987285491f98d78584d0c2a163b7221ea796f9e8671b2bb91e38ef5e18aaf32c6c02f2fb690358872a1ed28166172631a82c2568d23238017188ebbd48944a147f6cdb3690d5f88e51371cb70adf1fa02afe4ed8b581afc8bcc5104922843a55d52acde09bc9d2b71a663e178788280f3c3eae127d21b0b95777976b3eb17be40a702c244d0e5f833ff49dae6403ff44b131e66df8b88e33ab0a58e379f2c34bf5113c66b9ea8241fc7aa2b1fa53cf4ed3cdd91d407730c66fb039ef3a36d4050dde37d34e80bcfe02a48a6b14ae28227b1627b5ad07608a7763a531f2ffc96dff850e8c583461831b19feffc783bc1beab6301f647e9617d14c92c4b1d63f5147ccda56a35df8ca4806b8884c4aa3c3cc6a174fdc2232404822569c01aba686c1df5eecc059ba97e9688c8b16b70f0d24eacfdba15db1c71f72af1b2af85bd168f0b0800483f115eeccd9b02adf03bdd4a88eab03e43ce342877af2b61f9d3d85497cd1c6b96674f3d4f07f635bb26add1e36835e321d70263b1c04234e222124dad30ffb9f2a138e3ef453442df1af7e566890aedee568093aa922dd62db188aa8361c55503f8e2c2e6ba93de744b55c15260f15ec8e69bb01048ca1fa7bbbd26975bde80930a5b95054688a0ea73af0353cc84b997626a987cc06a517e18f91e02908829d4f4efc011b9867bd9bfe04c5f94e4b9261d30cc39982eb7b250f12aee2a4cce0484ff34eebba89bc6e35bd48d3968e4ca2d77527212017e202141900152f2fd8af0ac3aa456aae13276a13b9b9492a9a636e18244654b3245f07b20eb76b8e1cea8c55e5427f08a63a16b0a633af67c8e48ef8e53519041c9138176eb14b8782c6c2ee76146b8490b97978ee73cd0104e12f483be5a4af414404618e9f6633c55dda6f22252cb793d3d16fae4f0e1431434e7acc8fa2c009d4f6e345ade172313d558a4e61b4377e31b8ed4e28f7cd13a7fe3f72a409bc3bdabfe0ba47a6d861e21f64d2fac706dab18b3e546df4 1841 attribution data for node 0: 84986c936d26bfd3bb2d34d3ec62cfdb63e0032fdb3d9d75f3e5d456f73dffa7e35aab1db4f1bd3b98ff585caf004f656c51037a3f4e810d275f3f6aea0c8e3a125ebee5f374b6440bcb9bb2955ebf706f42be9999a62ed49c7a81fc73c0b4a16419fd6d334532f40bf179dd19afec21bd8519d5e6ebc3802501ef373bc378eee1f14a6fc5fab5b697c91ce31d5922199d1b0ad5ee12176aacafc7c81d54bc5b8fb7e63f3bfd40a3b6e21f985340cbd1c124c7f85f0369d1aa86ebc66def417107a7861131c8bcd73e8946f4fb54bfac87a2dc15bd7af642f32ae583646141e8875ef81ec9083d7e32d5f135131eab7a43803360434100ff67087762bbe3d6afe2034f5746b8c50e0c3c20dd62a4c174c38b1df7365dccebc7f24f19406649fbf48981448abe5c858bbd4bef6eb983ae7a23e9309fb33b5e7c0522554e88ca04b1d65fc190947dead8c0ccd32932976537d869b5ca53ed4945bccafab2a014ea4cbdc6b0250b25be66ba0afff2ff19c0058c68344fd1b9c472567147525b13b1bc27563e61310110935cf89fda0e34d0575e2389d57bdf2869398ca2965f64a6f04e1d1c2edf2082b97054264a47824dd1a9691c27902b39d57ae4a94dd6481954a9bd1b5cff4ab29ca221fa2bf9b28a362c9661206f896fc7cec563fb80aa5eaccb26c09fa4ef7a981e63028a9c4dac12f82ccb5bea090d56bbb1a4c431e315d9a169299224a8dbd099fb67ea61dfc604edf8a18ee742550b636836bb552dabb28820221bf8546331f32b0c143c1c89310c4fa2e1e0e895ce1a1eb0f43278fdb528131a3e32bfffe0c6de9006418f5309cba773ca38b6ad8507cc59445ccc0257506ebc16a4c01d4cd97e03fcf7a2049fea0db28447858f73b8e9fe98b391b136c9dc510288630a1f0af93b26a8891b857bfe4b818af99a1e011e6dbaa53982d29cf74ae7dffef45545279f19931708ed3eede5e82280eab908e8eb80abff3f1f023ab66869297b40da8496861dc455ac3abe1efa8a6f9e2c4eda48025d43a486a3f26f269743eaa30d6f0e1f48db6287751358a41f5b07aee0f098862e3493731fe2697acce734f004907c6f11eef189424fee52cd30ad708707eaf2e441f52bcf3d0c5440c1742458653c0c8a27b5ade784d9e09c8b47f1671901a29360e7e5e94946b9c75752a1a8d599d2a3e14ac81b84d42115cd688c8383a64fc6e7e1dc5568bb4837358ebe63207a4067af66b2027ad2ce8fb7ae3a452d40723a51fdf9f9c9913e8029a222cf81d12ad41e58860d75deb6de30ad 1842 1843 ## Returning success 1844 1845 A successful payment using the parameters above would result in the following attribution data values: 1846 1847 attribution data for node 4: 1848 d77d0711b5f71d1d1be56bd88b3bb7ebc1792bb739ea7ebc1bc3b031b8bc2df3a50e25aeb99f47d7f7ab39e24187d3f4df9c4333463b053832ee9ac07274a5261b8b2a01fc09ce9ea7cd04d7b585dfb83299fb6570d71f793c1fcac0ef498766952c8c6840efa02a567d558a3cf6822b12476324b9b9efa03e5f8f26f81fa93daac46cbf00c98e69b6747cf69caaa2a71b025bd18830c4c54cd08f598cfde6197b3f2a951aba907c964c0f5d19a44e6d1d7279637321fa598adde927b3087d238f8b426ecde500d318617cdb7a56e6ce3520fc95be41a549973764e4dc483853ecc313947709f1b5199cb077d46e701fa633e11d3e13b03e9212c115ca6fa004b2f3dd912814693b705a561a06da54cdf603677a3abecdc22c7358c2de3cef771b366a568150aeecc86ad1990bb0f4e2865933b03ea0df87901bff467908273dc6cea31cbab0e2b8d398d10b001058c259ed221b7b55762f4c7e49c8c11a45a107b7a2c605c26dc5b0b10d719b1c844670102b2b6a36c43fe4753a78a483fc39166ae28420f112d50c10ee64ca69569a2f690712905236b7c2cb7ac8954f02922d2d918c56d42649261593c47b14b324a65038c3c5be8d3c403ce0c8f19299b1664bf077d7cf1636c4fb9685a8e58b7029fd0939fa07925a60bed339b23f973293598f595e75c8f9d455d7cebe4b5e23357c8bd47d66d6628b39427e37e0aecbabf46c11be6771f7136e108a143ae9bafba0fc47a51b6c7deef4cba54bae906398ee3162a41f2191ca386b628bde7e1dd63d1611aa01a95c456df337c763cb8c3a81a6013aa633739d8cd554c688102211725e6adad165adc1bcd429d020c51b4b25d2117e8bb27eb0cc7020f9070d4ad19ac31a76ebdf5f9246646aeadbfb9a3f1d75bd8237961e786302516a1a781780e8b73f58dc06f307e58bd0eb1d8f5c9111f01312974c1dc777a6a2d3834d8a2a40014e9818d0685cb3919f6b3b788ddc640b0ff9b1854d7098c7dd6f35196e902b26709640bc87935a3914869a807e8339281e9cedaaca99474c3e7bdd35050bb998ab4546f9900904e0e39135e861ff7862049269701081ebce32e4cca992c6967ff0fd239e38233eaf614af31e186635e9439ec5884d798f9174da6ff569d68ed5c092b78bd3f880f5e88a7a8ab36789e1b57b035fb6c32a6358f51f83e4e5f46220bcad072943df8bd9541a61b7dae8f30fa3dd5fb39b1fd9a0b8e802552b78d4ec306ecee15bfe6da14b29ba6d19ce5be4dd478bca74a52429cd5309d404655c3dec85c252 1849 1850 attribution data for node 3: 1851 1571e10db7f8aa9f8e7e99caaf9c892e106c817df1d8e3b7b0e39d1c48f631e473e17e205489dd7b3c634cac3be0825cbf01418cd46e83c24b8d9c207742db9a0f0e5bcd888086498159f08080ba7bf3ea029c0b493227c4e75a90f70340d9e21f00979fc7e4fb2078477c1a457ba242ed54b313e590b13a2a13bfeed753dab133c78059f460075b2594b4c31c50f31076f8f1a0f7ad0530d0fadaf2d86e505ff9755940ec0665f9e5bc58cad6e523091f94d0bcd3c6c65ca1a5d401128dcc5e14f9108b32e660017c13de598bcf9d403710857cccb0fb9c2a81bfd66bc4552e1132afa3119203a4aaa1e8839c1dab8cbdcde7b527aca3f54bde651aa9f3f2178829cee3f1c0b9292758a40cc63bd998fcd0d3ed4bdcaf1023267b8f8e44130a63ad15f76145936552381eabb6d684c0a3af6ba8efcf207cebaea5b7acdbb63f8e7221102409d10c23f0514dc9f4d0efb2264161a193a999a23e992632710580a0d320f676d367b9190721194514457761af05207cdab2b6328b1b3767eacb36a7ef4f7bd2e16762d13df188e0898b7410f62459458712a44bf594ae662fd89eb300abb6952ff8ad40164f2bcd7f86db5c7650b654b79046de55d51aa8061ce35f867a3e8f5bf98ad920be827101c64fb871d86e53a4b3c0455bfac5784168218aa72cbee86d9c750a9fa63c363a8b43d7bf4b2762516706a306f0aa3be1ec788b5e13f8b24837e53ac414f211e11c7a093cd9653dfa5fba4e377c79adfa5e841e2ddb6afc054fc715c05ddc6c8fc3e1ee3406e1ffceb2df77dc2f02652614d1bfcfaddebaa53ba919c7051034e2c7b7cfaabdf89f26e7f8e3f956d205dfab747ad0cb505b85b54a68439621b25832cbc2898919d0cd7c0a64cfd235388982dd4dd68240cb668f57e1d2619a656ed326f8c92357ee0d9acead3c20008bc5f04ca8059b55d77861c6d04dfc57cfba57315075acbe1451c96cf28e1e328e142890248d18f53b5d3513ce574dea7156cf596fdb3d909095ec287651f9cf1bcdc791c5938a5dd9b47e84c004d24ab3ae74492c7e8dcc1da15f65324be2672947ec82074cac8ce2b925bc555facbbf1b55d63ea6fbea6a785c97d4caf2e1dad9551b7f66c31caae5ebc7c0047e892f201308fcf452c588be0e63d89152113d87bf0dbd01603b4cdc7f0b724b0714a9851887a01f709408882e18230fe810b9fafa58a666654576d8eba3005f07221f55a6193815a672e5db56204053bc4286fa3db38250396309fd28011b5708a26a2d76c4a333b69b6bfd272fb 1852 1853 attribution data for node 2: 1854 34e34397b8621ec2f2b54dbe6c14073e267324cd60b152bce76aec8729a6ddefb61bc263be4b57bd592aae604a32bea69afe6ef4a6b573c26b17d69381ec1fc9b5aa769d148f2f1f8b5377a73840bb6dffc324ded0d1c00dc0c99e3dbc13273b2f89510af6410b525dd8836208abbbaae12753ae2276fa0ca49950374f94e187bf65cefcdd9dd9142074edc4bd0052d0eb027cb1ab6182497f9a10f9fe800b3228e3c088dab60081c807b30a67313667ca8c9e77b38b161a037cae8e973038d0fc4a97ea215914c6c4e23baf6ac4f0fb1e7fcc8aac3f6303658dae1f91588b535eb678e2200f45383c2590a55dc181a09f2209da72f79ae6745992c803310d39f960e8ecf327aed706e4b3e2704eeb9b304dc0e0685f5dcd0389ec377bdba37610ad556a0e957a413a56339dd3c40817214bced5802beee2ee545bdd713208751added5fc0eb2bc89a5aa2decb18ee37dac39f22a33b60cc1a369d24de9f3d2d8b63c039e248806de4e36a47c7a0aed30edd30c3d62debdf1ad82bf7aedd7edec413850d91c261e12beec7ad1586a9ad25b2db62c58ca17119d61dcc4f3e5c4520c42a8e384a45d8659b338b3a08f9e123a1d3781f5fc97564ccff2c1d97f06fa0150cfa1e20eacabefb0c339ec109336d207cc63d9170752fc58314c43e6d4a528fd0975afa85f3aa186ff1b6b8cb12c97ed4ace295b0ef5f075f0217665b8bb180246b87982d10f43c9866b22878106f5214e99188781180478b07764a5e12876ddcb709e0a0a8dd42cf004c695c6fc1669a6fd0e4a1ca54b024d0d80eac492a9e5036501f36fb25b72a054189294955830e43c18e55668337c8c6733abb09fc2d4ade18d5a853a2b82f7b4d77151a64985004f1d9218f2945b63c56fdebd1e96a2a7e49fa70acb4c39873947b83c191c10e9a8f40f60f3ad5a2be47145c22ea59ed3f5f4e61cb069e875fb67142d281d784bf925cc286eacc2c43e94d08da4924b83e58dbf2e43fa625bdd620eba6d9ce960ff17d14ed1f2dbee7d08eceb540fdc75ff06dabc767267658fad8ce99e2a3236e46d2deedcb51c3c6f81589357edebac9772a70b3d910d83cd1b9ce6534a011e9fa557b891a23b5d88afcc0d9856c6dabeab25eea55e9a248182229e4927f268fe5431672fcce52f434ca3d27d1a2136bae5770bb36920df12fbc01d0e8165610efa04794f414c1417f1d4059435c5385bfe2de83ce0e238d6fd2dbd3c0487c69843298577bfa480fe2a16ab2a0e4bc712cd8b5a14871cda61c993b6835303d9043d7689a 1855 1856 attribution data for node 1: 1857 74a4ea61339463642a2182758871b2ea724f31f531aa98d80f1c3043febca41d5ee52e8b1e127e61719a0d078db8909748d57839e58424b91f063c4fbc8a221bef261140e66a9b596ca6d420a973ad5431adfa8280a7355462fe50d4cac15cdfbd7a535c4b72a0b6d7d8a64cff3f719ff9b8be28036826342dc3bf3781efc70063d1e6fc79dff86334ae0564a5ab87bd61f8446465ef6713f8c4ef9d0200ebb375f90ee115216b469af42de554622df222858d30d733af1c9223e327ae09d9126be8baee6dd59a112d83a57cc6e0252104c11bc11705d384220eedd72f1a29a0597d97967e28b2ad13ba28b3d8a53c3613c1bb49fe9700739969ef1f795034ef9e2e983af2d3bbd6c637fb12f2f7dfc3aee85e08711e9b604106e95d7a4974e5b047674a6015792dae5d913681d84f71edd415910582e5d86590df2ecfd561dc6e1cdb08d3e10901312326a45fb0498a177319389809c6ba07a76cfad621e07b9af097730e94df92fbd311b2cb5da32c80ab5f14971b6d40f8e2ab202ac98bd8439790764a40bf309ea2205c1632610956495720030a25dc7118e0c868fdfa78c3e9ecce58215579a0581b3bafdb7dbbe53be9e904567fdc0ce1236aab5d22f1ebc18997e3ea83d362d891e04c5785fd5238326f767bce499209f8db211a50e1402160486e98e7235cf397dbb9ae19fd9b79ef589c821c6f99f28be33452405a003b33f4540fe0a41dfcc286f4d7cc10b70552ba7850869abadcd4bb7f256823face853633d6e2a999ac9fcd259c71d08e266db5d744e1909a62c0db673745ad9585949d108ab96640d2bc27fb4acac7fa8b170a30055a5ede90e004df9a44bdc29aeb4a6bec1e85dde1de6aaf01c6a5d12405d0bec22f49026cb23264f8c04b8401d3c2ab6f2e109948b6193b3bec27adfe19fb8afb8a92364d6fc5b219e8737d583e7ff3a4bcb75d53edda3bf3f52896ac36d8a877ad9f296ea6c045603fc62ac4ae41272bde85ef7c3b3fd3538aacfd5b025fefbe277c2906821ecb20e6f75ea479fa3280f9100fb0089203455c56b6bc775e5c2f0f58c63edd63fa3eec0b40da4b276d0d41da2ec0ead865a98d12bc694e23d8eaadd2b4d0ee88e9570c88fb878930f492e036d27998d593e47763927ff7eb80b188864a3846dd2238f7f95f4090ed399ae95deaeb37abca1cf37c397cc12189affb42dca46b4ff6988eb8c060691d155302d448f50ff70a794d97c0408f8cee9385d6a71fa412e36edcb22dbf433db9db4779f27b682ee17fc05e70c8e794b9f7f6d1 1858 1859 attribution data for node 0: 1860 84986c936d26bfd3bb2d34d3ec62cfdb63e0032fdb3d9d75f3e5d456f73dffa7e35aab1db4f1bd3b98ff585caf004f656c51037a3f4e810d275f3f6aea0c8e3a125ebee5f374b6440bcb9bb2955ebf70c06d64090f9f6cf098200305f7f4305ba9e1350a0c3f7dab4ccf35b8399b9650d8e363bf83d3a0a09706433f0adae6562eb338b21ea6f21329b3775905e59187c325c9cbf589f5da5e915d9e5ad1d21aa1431f9bdc587185ed8b5d4928e697e67cc96bee6d5354e3764cede3f385588fa665310356b2b1e68f8bd30c75d395405614a40a587031ebd6ace60dfb7c6dd188b572bd8e3e9a47b06c2187b528c5ed35c32da5130a21cd881138a5fcac806858ce6c596d810a7492eb261bcc91cead1dae75075b950c2e81cecf7e5fdb2b51df005d285803201ce914dfbf3218383829a0caa8f15486dd801133f1ed7edec436730b0ec98f48732547927229ac80269fcdc5e4f4db264274e940178732b429f9f0e582c559f994a7cdfb76c93ffc39de91ff936316726cc561a6520d47b2cd487299a96322dadc463ef06127fc63902ff9cc4f265e2fbd9de3fa5e48b7b51aa0850580ef9f3b5ebb60c6c3216c5a75a93e82936113d9cad57ae4a94dd6481954a9bd1b5cff4ab29ca221fa2bf9b28a362c9661206f896fc7cec563fb80aa5eaccb26c09fa4ef7a981e63028a9c4dac12f82ccb5bea090d56bbb1a4c431e315d9a169299224a8dbd099fb67ea61dfc604edf8a18ee742550b636836bb552dabb28820221bf8546331f32b0c143c1c89310c4fa2e1e0e895ce1a1eb0f43278fdb528131a3e32bfffe0c6de9006418f5309cba773ca38b6ad8507cc59445ccc0257506ebc16a4c01d4cd97e03fcf7a2049fea0db28447858f73b8e9fe98b391b136c9dc510288630a1f0af93b26a8891b857bfe4b818af99a1e011e6dbaa53982d29cf74ae7dffef45545279f19931708ed3eede5e82280eab908e8eb80abff3f1f023ab66869297b40da8496861dc455ac3abe1efa8a6f9e2c4eda48025d43a486a3f26f269743eaa30d6f0e1f48db6287751358a41f5b07aee0f098862e3493731fe2697acce734f004907c6f11eef189424fee52cd30ad708707eaf2e441f52bcf3d0c5440c1742458653c0c8a27b5ade784d9e09c8b47f1671901a29360e7e5e94946b9c75752a1a8d599d2a3e14ac81b84d42115cd688c8383a64fc6e7e1dc5568bb4837358ebe63207a4067af66b2027ad2ce8fb7ae3a452d40723a51fdf9f9c9913e8029a222cf81d12ad41e58860d75deb6de30ad 1861 1862 # References 1863 1864 [sphinx]: http://www.cypherpunks.ca/~iang/pubs/Sphinx_Oakland09.pdf 1865 [RFC2104]: https://tools.ietf.org/html/rfc2104 1866 [fips198]: http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf 1867 [sec2]: http://www.secg.org/sec2-v2.pdf 1868 [rfc8439]: https://tools.ietf.org/html/rfc8439 1869 1870 # Authors 1871 1872 [ FIXME: ] 1873 1874  1875 <br> 1876 This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).