lnd/channeldb
Joost Jager d6d9ec6aa5
invoices: replay awareness
Previously the invoice registry wasn't aware of replayed htlcs. This was
dealt with by keeping the invoice accept/settle logic idempotent, so
that a replay wouldn't have an effect.

This mechanism has two limitations:

1. No accurate tracking of the total amount paid to an invoice. The total
amount couldn't just be increased with every htlc received, because it
could be a replay which would lead to counting the htlc amount multiple
times. Therefore the total amount was set to the amount of the first
htlc that was received, even though there may have been multiple htlcs
paying to the invoice.

2. Impossible to check htlc expiry consistently for hodl invoices. When
an htlc is new, its expiry needs to be checked against the invoice cltv
delta. But for a replay, that check must be skipped. The htlc was
accepted in time, the invoice was moved to the accepted state and a
replay some blocks later shouldn't lead to that htlc being cancelled.
Because the invoice registry couldn't recognize replays, it stopped
checking htlc expiry heights when the invoice reached the accepted
state. This prevents hold htlcs from being cancelled after a restart.
But unfortunately this also caused additional htlcs to be accepted on an
already accepted invoice without their expiry being checked.

In this commit, the invoice registry starts to persistently track htlcs
so that replays can be recognized. For replays, an htlc resolution
action is returned early. This fixes both limitations mentioned above.
2019-09-04 19:20:31 +02:00
..
addr_test.go channeldb/addr_test: add tests for invalid onion addresses 2019-01-17 14:16:15 +01:00
addr.go channeldb/addr: sanity check onion address length before writing to db 2019-01-17 14:16:15 +01:00
channel_cache_test.go channeldb/channel_cache: add channelCache w/ randomized eviction 2019-04-01 16:25:31 -07:00
channel_cache.go channeldb/channel_cache: add channelCache w/ randomized eviction 2019-04-01 16:25:31 -07:00
channel_test.go multi: move CsvDelay into ChannelConstraints 2019-01-11 16:58:15 -08:00
channel.go multi: fix linter errors 2019-08-07 10:53:10 +02:00
codec.go channeldb: add int64 to codec 2019-09-04 19:20:15 +02:00
db_test.go channeldb: ensure restored channels can't be mutated 2019-01-28 20:24:48 -08:00
db.go channeldb: add now function 2019-09-04 19:20:29 +02:00
doc.go channeldb: create new channeldb package, update lnwallet to use new API 2015-12-26 12:35:15 -06:00
error.go channeldb+routing: extend edge lookup methods with zombie index check 2019-03-27 13:06:57 -07:00
fees.go channeldb: create new channeldb package, update lnwallet to use new API 2015-12-26 12:35:15 -06:00
forwarding_log_test.go channeldb: add a set of initial tests for the ForwardingLog 2018-03-06 13:56:09 -05:00
forwarding_log.go multi: switch from bolt packge to bbolt package for all imports 2018-11-29 20:33:49 -08:00
forwarding_package_test.go multi: switch from bolt packge to bbolt package for all imports 2018-11-29 20:33:49 -08:00
forwarding_package.go multi: switch from bolt packge to bbolt package for all imports 2018-11-29 20:33:49 -08:00
graph_test.go Merge pull request #3197 from breez/optimize_prune_zombie_channels 2019-07-18 20:56:56 -07:00
graph.go Merge pull request #3197 from breez/optimize_prune_zombie_channels 2019-07-18 20:56:56 -07:00
invoice_test.go invoices: replay awareness 2019-09-04 19:20:31 +02:00
invoices.go invoices: replay awareness 2019-09-04 19:20:31 +02:00
legacy_serialization.go channeldb: move deprecated code to migration_09_legacy_serialization.go 2019-05-27 20:18:59 +02:00
log.go multi: init subsystem loggers via build pkg 2018-10-05 13:04:45 +09:00
meta_test.go channeldb test: add TestOutgoingPaymentsMigration 2019-05-27 20:18:57 +02:00
meta.go multi: switch from bolt packge to bbolt package for all imports 2018-11-29 20:33:49 -08:00
migration_09_legacy_serialization.go channeldb+invoices: add invoice htlcs 2019-09-04 19:20:17 +02:00
migration_10_route_tlv_records.go channeldb: update route.Hop serialization to include new EOB related fields 2019-08-22 18:53:04 -07:00
migration_11_invoices_test.go channeldb+invoices: add invoice htlcs 2019-09-04 19:20:17 +02:00
migration_11_invoices.go channeldb+invoices: add invoice htlcs 2019-09-04 19:20:17 +02:00
migrations_test.go channeldb: update route.Hop serialization to include new EOB related fields 2019-08-22 18:53:04 -07:00
migrations.go channeldb+invoices: add invoice htlcs 2019-09-04 19:20:17 +02:00
nodes_test.go channeldb: add DeleteLinkNode method 2018-07-17 17:35:25 -07:00
nodes.go channeldb: add new AddrsForNode method 2019-01-28 20:24:22 -08:00
options.go channeldb/options: add Options w/ functional modifiers 2019-04-01 16:33:13 -07:00
payment_control_test.go channeldb: update route.Hop serialization to include new EOB related fields 2019-08-22 18:53:04 -07:00
payment_control.go routing+routerrpc+channeldb: return route on invalid payment details 2019-07-04 09:27:16 +02:00
payments_test.go channeldb: properly compare payment attempts in serialization test 2019-08-23 12:50:25 -07:00
payments.go channeldb: update route.Hop serialization to include new EOB related fields 2019-08-22 18:53:04 -07:00
README.md build+multi: switch from bolt to bbolt 2018-03-10 19:01:13 -08:00
reject_cache_test.go channeldb/reject_cache: add rejectCache w/ randomized eviction 2019-04-01 16:25:31 -07:00
reject_cache.go channeldb/reject_cache: add rejectCache w/ randomized eviction 2019-04-01 16:25:31 -07:00
waitingproof_test.go channeldb: use raw pub keys and signatures directly in vertex/edge structs 2018-02-06 20:14:31 -08:00
waitingproof.go multi: switch from bolt packge to bbolt package for all imports 2018-11-29 20:33:49 -08:00
witness_cache_test.go channeldb+witness_beacon: use sha256 lookup+delete witness 2019-02-19 17:06:42 -08:00
witness_cache.go channeldb+witness_beacon: use sha256 lookup+delete witness 2019-02-19 17:06:42 -08:00

channeldb

Build Status MIT licensed GoDoc

The channeldb implements the persistent storage engine for lnd and generically a data storage layer for the required state within the Lightning Network. The backing storage engine is boltdb, an embedded pure-go key-value store based off of LMDB.

The package implements an object-oriented storage model with queries and mutations flowing through a particular object instance rather than the database itself. The storage implemented by the objects includes: open channels, past commitment revocation states, the channel graph which includes authenticated node and channel announcements, outgoing payments, and invoices

Installation and Updating

$ go get -u github.com/lightningnetwork/lnd/channeldb