Merge pull request #5248 from joostjager/concurrent-onion

htlcswitch: concurrent onion decoding
This commit is contained in:
Olaoluwa Osuntokun 2021-06-18 14:08:24 -07:00 committed by GitHub
commit 6f051fa5ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 21 deletions

2
go.mod

@ -39,7 +39,7 @@ require (
github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec
github.com/lightninglabs/neutrino v0.12.1 github.com/lightninglabs/neutrino v0.12.1
github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display
github.com/lightningnetwork/lightning-onion v1.0.2-0.20200501022730-3c8c8d0b89ea github.com/lightningnetwork/lightning-onion v1.0.2-0.20210520211913-522b799e65b1
github.com/lightningnetwork/lnd/cert v1.0.3 github.com/lightningnetwork/lnd/cert v1.0.3
github.com/lightningnetwork/lnd/clock v1.0.1 github.com/lightningnetwork/lnd/clock v1.0.1
github.com/lightningnetwork/lnd/healthcheck v1.0.0 github.com/lightningnetwork/lnd/healthcheck v1.0.0

4
go.sum

@ -213,8 +213,8 @@ github.com/lightninglabs/neutrino v0.12.1 h1:9umzk5kKNc/l3bAyak8ClSRP1qSulnjc6kp
github.com/lightninglabs/neutrino v0.12.1/go.mod h1:GlKninWpRBbL7b8G0oQ36/8downfnFwKsr0hbRA6E/E= github.com/lightninglabs/neutrino v0.12.1/go.mod h1:GlKninWpRBbL7b8G0oQ36/8downfnFwKsr0hbRA6E/E=
github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display h1:RZJ8H4ueU/aQ9pFtx5wqsuD3B/DezrewJeVwDKKYY8E= github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display h1:RZJ8H4ueU/aQ9pFtx5wqsuD3B/DezrewJeVwDKKYY8E=
github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display/go.mod h1:2oKOBU042GKFHrdbgGiKax4xVrFiZu51lhacUZQ9MnE= github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display/go.mod h1:2oKOBU042GKFHrdbgGiKax4xVrFiZu51lhacUZQ9MnE=
github.com/lightningnetwork/lightning-onion v1.0.2-0.20200501022730-3c8c8d0b89ea h1:oCj48NQ8u7Vz+MmzHqt0db6mxcFZo3Ho7M5gCJauY/k= github.com/lightningnetwork/lightning-onion v1.0.2-0.20210520211913-522b799e65b1 h1:h1BsjPzWea790mAXISoiT/qr0JRcixTCDNLmjsDThSw=
github.com/lightningnetwork/lightning-onion v1.0.2-0.20200501022730-3c8c8d0b89ea/go.mod h1:rigfi6Af/KqsF7Za0hOgcyq2PNH4AN70AaMRxcJkff4= github.com/lightningnetwork/lightning-onion v1.0.2-0.20210520211913-522b799e65b1/go.mod h1:rigfi6Af/KqsF7Za0hOgcyq2PNH4AN70AaMRxcJkff4=
github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 h1:sjOGyegMIhvgfq5oaue6Td+hxZuf3tDC8lAPrFldqFw= github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796 h1:sjOGyegMIhvgfq5oaue6Td+hxZuf3tDC8lAPrFldqFw=
github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796/go.mod h1:3p7ZTf9V1sNPI5H8P3NkTFF4LuwMdPl2DodF60qAKqY= github.com/ltcsuite/ltcd v0.0.0-20190101042124-f37f8bf35796/go.mod h1:3p7ZTf9V1sNPI5H8P3NkTFF4LuwMdPl2DodF60qAKqY=
github.com/ltcsuite/ltcutil v0.0.0-20181217130922-17f3b04680b6/go.mod h1:8Vg/LTOO0KYa/vlHWJ6XZAevPQThGH5sufO0Hrou/lA= github.com/ltcsuite/ltcutil v0.0.0-20181217130922-17f3b04680b6/go.mod h1:8Vg/LTOO0KYa/vlHWJ6XZAevPQThGH5sufO0Hrou/lA=

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"io" "io"
"sync"
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
sphinx "github.com/lightningnetwork/lightning-onion" sphinx "github.com/lightningnetwork/lightning-onion"
@ -251,9 +252,8 @@ func (p *OnionProcessor) DecodeHopIterators(id []byte,
tx := p.router.BeginTxn(id, batchSize) tx := p.router.BeginTxn(id, batchSize)
for i, req := range reqs { decode := func(seqNum uint16, onionPkt *sphinx.OnionPacket,
onionPkt := &onionPkts[i] req DecodeHopIteratorRequest) lnwire.FailCode {
resp := &resps[i]
err := onionPkt.Decode(req.OnionReader) err := onionPkt.Decode(req.OnionReader)
switch err { switch err {
@ -261,45 +261,55 @@ func (p *OnionProcessor) DecodeHopIterators(id []byte,
// success // success
case sphinx.ErrInvalidOnionVersion: case sphinx.ErrInvalidOnionVersion:
resp.FailCode = lnwire.CodeInvalidOnionVersion return lnwire.CodeInvalidOnionVersion
continue
case sphinx.ErrInvalidOnionKey: case sphinx.ErrInvalidOnionKey:
resp.FailCode = lnwire.CodeInvalidOnionKey return lnwire.CodeInvalidOnionKey
continue
default: default:
log.Errorf("unable to decode onion packet: %v", err) log.Errorf("unable to decode onion packet: %v", err)
resp.FailCode = lnwire.CodeInvalidOnionKey return lnwire.CodeInvalidOnionKey
continue
} }
err = tx.ProcessOnionPacket( err = tx.ProcessOnionPacket(
uint16(i), onionPkt, req.RHash, req.IncomingCltv, seqNum, onionPkt, req.RHash, req.IncomingCltv,
) )
switch err { switch err {
case nil: case nil:
// success // success
return lnwire.CodeNone
case sphinx.ErrInvalidOnionVersion: case sphinx.ErrInvalidOnionVersion:
resp.FailCode = lnwire.CodeInvalidOnionVersion return lnwire.CodeInvalidOnionVersion
continue
case sphinx.ErrInvalidOnionHMAC: case sphinx.ErrInvalidOnionHMAC:
resp.FailCode = lnwire.CodeInvalidOnionHmac return lnwire.CodeInvalidOnionHmac
continue
case sphinx.ErrInvalidOnionKey: case sphinx.ErrInvalidOnionKey:
resp.FailCode = lnwire.CodeInvalidOnionKey return lnwire.CodeInvalidOnionKey
continue
default: default:
log.Errorf("unable to process onion packet: %v", err) log.Errorf("unable to process onion packet: %v", err)
resp.FailCode = lnwire.CodeInvalidOnionKey return lnwire.CodeInvalidOnionKey
continue
} }
} }
// Execute cpu-heavy onion decoding in parallel.
var wg sync.WaitGroup
for i := range reqs {
wg.Add(1)
go func(seqNum uint16) {
defer wg.Done()
onionPkt := &onionPkts[seqNum]
resps[seqNum].FailCode = decode(
seqNum, onionPkt, reqs[seqNum],
)
}(uint16(i))
}
wg.Wait()
// With that batch created, we will now attempt to write the shared // With that batch created, we will now attempt to write the shared
// secrets to disk. This operation will returns the set of indices that // secrets to disk. This operation will returns the set of indices that
// were detected as replays, and the computed sphinx packets for all // were detected as replays, and the computed sphinx packets for all