mirror of
https://github.com/ACINQ/eclair.git
synced 2025-03-12 19:01:39 +01:00
638 lines
32 KiB
Text
638 lines
32 KiB
Text
eclair {
|
|
datadir = ${user.home}"/.eclair"
|
|
|
|
chain = "mainnet" // "regtest" for regtest, "testnet" for testnet, "mainnet" for mainnet, "signet" for signet
|
|
|
|
server {
|
|
public-ips = [] // external ips, will be announced on the network
|
|
binding-ip = "0.0.0.0"
|
|
port = 9735
|
|
}
|
|
|
|
api {
|
|
enabled = false // disabled by default for security reasons
|
|
binding-ip = "127.0.0.1"
|
|
port = 8080
|
|
password = "" // password for basic auth, must be non empty if json-rpc api is enabled
|
|
}
|
|
|
|
bitcoind {
|
|
host = "localhost"
|
|
rpcport = 8332
|
|
auth = "password" // "password" for user/password authentication, "safecookie" for cookie authentication
|
|
cookie = ${user.home}"/.bitcoin/.cookie"
|
|
rpcuser = "foo"
|
|
rpcpassword = "bar"
|
|
// Name of the bitcoind wallet that should be used to fund channels.
|
|
// Once set you should NOT change it if your node has channels open, otherwise you may lose funds.
|
|
// NB: leave this field commented to automatically select the default loaded wallet.
|
|
// wallet = ""
|
|
zmqblock = "tcp://127.0.0.1:29000"
|
|
zmqtx = "tcp://127.0.0.1:29000"
|
|
// Batching requests saves bandwidth but may slightly degrade latency and reliability. It is useful for the watcher,
|
|
// which can generate a lot of requests to validate channels, iterate over blocks to find a spending tx, etc.
|
|
// You may want to disable this when bitcoin is running on a remote machine with an unreliable network.
|
|
batch-watcher-requests = true
|
|
// If some utxos are locked when eclair starts, it is likely because it was previously stopped in the middle of
|
|
// funding a transaction. The supported behaviors to handle this case are:
|
|
// - stop: eclair won't start until the corresponding utxos are unlocked by the node operator
|
|
// - unlock: eclair will automatically unlock the corresponding utxos
|
|
// - ignore: eclair will leave these utxos locked and start
|
|
startup-locked-utxos-behavior = "stop"
|
|
final-pubkey-refresh-delay = 3 seconds
|
|
// If true, eclair will poll bitcoind for 30 seconds at start-up before giving up.
|
|
wait-for-bitcoind-up = true
|
|
}
|
|
|
|
node-alias = "eclair"
|
|
node-color = "49daaa"
|
|
|
|
trampoline-payments-enable = false // TODO: @t-bast: once spec-ed this should use a global feature flag
|
|
// see https://github.com/lightningnetwork/lightning-rfc/blob/master/09-features.md
|
|
features {
|
|
// option_upfront_shutdown_script is not activated by default.
|
|
// If you activate it, eclair will ask bitcoin core for a wallet address whenever a new channel is created, and
|
|
// funds will be sent to that address when the channel is closed.
|
|
// You will not be able to change this address, which can be dangerous, especially for very long lived channels.
|
|
// Make sure you understand what it implies before you activate this feature.
|
|
option_upfront_shutdown_script = disabled
|
|
option_data_loss_protect = mandatory
|
|
gossip_queries = optional
|
|
gossip_queries_ex = optional
|
|
var_onion_optin = mandatory
|
|
option_static_remotekey = mandatory
|
|
payment_secret = mandatory
|
|
basic_mpp = optional
|
|
option_support_large_channel = optional
|
|
// NB: option_anchors_zero_fee_htlc_tx should always be preferred to option_anchor_outputs (it's safer).
|
|
// Do not enable option_anchor_outputs unless you really know what you're doing.
|
|
option_anchor_outputs = disabled
|
|
option_anchors_zero_fee_htlc_tx = optional
|
|
option_route_blinding = optional
|
|
option_shutdown_anysegwit = optional
|
|
option_dual_fund = optional
|
|
option_quiesce = optional
|
|
option_onion_messages = optional
|
|
option_channel_type = optional
|
|
option_scid_alias = optional
|
|
option_payment_metadata = optional
|
|
// By enabling option_zeroconf, you will be trusting your peer as fundee. You will lose funds if they double spend
|
|
// their funding tx. Eclair does not let you activate this feature by default, you have to activate it for every
|
|
// node that you trust using override-init-features (see below).
|
|
option_zeroconf = disabled
|
|
keysend = disabled
|
|
trampoline_payment_prototype = disabled
|
|
async_payment_prototype = disabled
|
|
}
|
|
// The following section lets you customize features for specific nodes.
|
|
// The overrides will be applied on top of the default features settings.
|
|
override-init-features = [ // optional per-node features
|
|
# {
|
|
# nodeid = "02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
# features { }
|
|
# }
|
|
]
|
|
sync-whitelist = [] // a list of public keys; if non-empty, we will only do the initial sync with those peers
|
|
|
|
channel {
|
|
channel-flags {
|
|
announce-channel = true
|
|
}
|
|
|
|
funding {
|
|
// Each RBF attempt adds more data that we need to store and process, so we want to limit our peers to a reasonable use of RBF.
|
|
remote-rbf-limits {
|
|
max-attempts = 5 // maximum number of RBF attempts our peer is allowed to make
|
|
attempt-delta-blocks = 6 // minimum number of blocks between RBF attempts
|
|
}
|
|
}
|
|
|
|
dust-limit-satoshis = 546
|
|
max-remote-dust-limit-satoshis = 600
|
|
htlc-minimum-msat = 1
|
|
// The following parameters apply to each HTLC direction (incoming or outgoing), which means that the maximum amount in flight will be at most twice what is set here.
|
|
// Note that our peer may use a lower value than ours, which would reduce the maximum amount in flight.
|
|
// The smallest value of max-htlc-value-in-flight-msat and max-htlc-value-in-flight-percent will be applied when opening channels.
|
|
// If for example you open a 60 mBTC channel, eclair will set max-htlc-value-in-flight to 27 mBTC.
|
|
max-htlc-value-in-flight-msat = 5000000000 // 50 mBTC
|
|
max-htlc-value-in-flight-percent = 45 // 45% of the channel capacity
|
|
max-accepted-htlcs = 30
|
|
|
|
reserve-to-funding-ratio = 0.01 // recommended by BOLT #2
|
|
max-reserve-to-funding-ratio = 0.05 // channel reserve can't be more than 5% of the funding amount (recommended: 1%)
|
|
min-public-funding-satoshis = 100000
|
|
min-private-funding-satoshis = 100000
|
|
require-confirmed-inputs-for-dual-funding = false // if true, only confirmed inputs will be accepted for channel dual funding
|
|
|
|
to-remote-delay-blocks = 720 // number of blocks that the other node's to-self outputs must be delayed (720 ~ 5 days)
|
|
max-to-local-delay-blocks = 2016 // maximum number of blocks that we are ready to accept for our own delayed outputs (2016 ~ 2 weeks)
|
|
mindepth-blocks = 3
|
|
expiry-delta-blocks = 144
|
|
max-expiry-delta-blocks = 2016 // we won't forward HTLCs with timeouts greater than this delta
|
|
// When we receive the preimage for an HTLC and want to fulfill it but the upstream peer stops responding, we want to
|
|
// avoid letting its HTLC-timeout transaction become enforceable on-chain (otherwise there is a race condition between
|
|
// our HTLC-success and their HTLC-timeout).
|
|
// We will close the channel when the HTLC-timeout will happen in less than this number.
|
|
// NB: this number effectively reduces the expiry-delta-blocks, so you may want to take that into account and increase
|
|
// expiry-delta-blocks.
|
|
fulfill-safety-before-timeout-blocks = 24
|
|
min-final-expiry-delta-blocks = 30 // Bolt 11 invoice's min_final_cltv_expiry; must be strictly greater than fulfill-safety-before-timeout-blocks
|
|
max-restart-watch-delay = 60 seconds // we add a random delay before watching funding transactions after restart
|
|
max-block-processing-delay = 30 seconds // we add a random delay before processing blocks, capped at this value, to prevent herd effect
|
|
max-tx-publish-retry-delay = 60 seconds // we add a random delay before retrying failed transaction publication
|
|
// When a channel has been spent while we were offline, we limit how many blocks in the past we scan, otherwise we
|
|
// may scan the entire blockchain (which is very costly). It doesn't make sense to scan too far in the past, as an
|
|
// attacker will already have swept the funds if we didn't detect a channel close that happened a long time ago.
|
|
max-channel-spent-rescan-blocks = 720
|
|
|
|
// The default strategy, when we encounter an unhandled exception or internal error, is to locally force-close the
|
|
// channel. Not only is there a delay before the channel balance gets refunded, but if the exception was due to some
|
|
// misconfiguration or bug in eclair that affects all channels, we risk force-closing all channels.
|
|
// This is why an alternative behavior is to simply log an error and stop the node. Note that if you don't closely
|
|
// monitor your node, there is a risk that your peers take advantage of the downtime to try and cheat by publishing a
|
|
// revoked commitment. Additionally, while there is no known way of triggering an internal error in eclair from the
|
|
// outside, there may very well be a bug that allows just that, which could be used as a way to remotely stop the node
|
|
// (with the default behavior, it would "only" cause a local force-close of the channel).
|
|
unhandled-exception-strategy = "local-close" // local-close or stop
|
|
|
|
revocation-timeout = 20 seconds // after sending a commit_sig, we will wait for at most that duration before disconnecting
|
|
|
|
channel-open-limits {
|
|
max-pending-channels-per-peer = 3 // maximum number of pending channels we will accept from a given peer
|
|
max-total-pending-channels-private-nodes = 99 // maximum number of pending channels we will accept from all private nodes
|
|
channel-opener-whitelist = [] // a list of public keys; we will ignore rate limits on pending channels from these peers
|
|
}
|
|
|
|
accept-incoming-static-remote-key-channels = false // whether we accept new incoming static_remote_key channels (which are obsolete, nodes should use anchor_output now)
|
|
|
|
quiescence-timeout = 1 minutes // maximum time we will stay quiescent (or wait to reach quiescence) before disconnecting
|
|
|
|
channel-update {
|
|
// Balance thresholds at which to update the maximum HTLC amount
|
|
// Must be in increasing order.
|
|
// Set balance-thresholds = [] to disable this feature.
|
|
balance-thresholds = [{
|
|
available-sat = 1000 // If our balance goes below this,
|
|
max-htlc-sat = 0 // set the maximum HTLC amount to this (or htlc-minimum-msat if it's higher).
|
|
},{
|
|
available-sat = 10000
|
|
max-htlc-sat = 1000
|
|
},{
|
|
available-sat = 100000
|
|
max-htlc-sat = 10000
|
|
},{
|
|
available-sat = 200000
|
|
max-htlc-sat = 100000
|
|
},{
|
|
available-sat = 400000
|
|
max-htlc-sat = 200000
|
|
},{
|
|
available-sat = 800000
|
|
max-htlc-sat = 400000
|
|
},{
|
|
available-sat = 1600000
|
|
max-htlc-sat = 800000
|
|
}]
|
|
|
|
min-time-between-updates = 1 hour // minimum time between channel updates because the balance changed
|
|
}
|
|
}
|
|
|
|
balance-check-interval = 1 hour
|
|
|
|
send {
|
|
// When sending a payment, if the cltv expiry used for the final node is very close to the current block height, it
|
|
// lets intermediate nodes figure out their position in the route. To protect against this, a random delta will be
|
|
// added to the current block height, which makes it look like there are more hops after the final node.
|
|
recipient-final-expiry {
|
|
min-delta = 150 // minimum value to add to the current block height
|
|
max-delta = 350 // maximum value to add to the current block height
|
|
}
|
|
}
|
|
|
|
relay {
|
|
fees {
|
|
// Fees for public channels
|
|
public-channels {
|
|
fee-base-msat = 1000
|
|
fee-proportional-millionths = 200 // fee charged per transferred satoshi in millionths of a satoshi (200 = 0.02%)
|
|
}
|
|
// Fees for private channels
|
|
private-channels {
|
|
fee-base-msat = 1000
|
|
fee-proportional-millionths = 100
|
|
}
|
|
// Minimum fees for trampoline relays
|
|
min-trampoline {
|
|
fee-base-msat = 1000
|
|
fee-proportional-millionths = 100
|
|
}
|
|
// Delay enforcement of channel fee updates
|
|
enforcement-delay = 10 minutes
|
|
}
|
|
|
|
async-payments {
|
|
// Maximum number of blocks to hold an async payment while waiting to receive a trigger from the receiver
|
|
hold-timeout-blocks = 1008
|
|
// Number of blocks before the incoming HTLC expires that an async payment must be triggered by the receiver
|
|
cancel-safety-before-timeout-blocks = 144
|
|
}
|
|
|
|
// We assign reputation to our peers to prioritize payments during congestion.
|
|
// The reputation is computed as fees paid divided by what should have been paid if all payments were successful.
|
|
peer-reputation {
|
|
// Set this parameter to false to disable the reputation algorithm and simply relay the incoming endorsement
|
|
// value, as described by https://github.com/lightning/blips/blob/master/blip-0004.md,
|
|
enabled = true
|
|
// Reputation decays with the following half life to emphasize recent behavior.
|
|
half-life = 15 days
|
|
// Payments that stay pending for longer than this get penalized.
|
|
max-relay-duration = 12 seconds
|
|
// Pending payments are counted as failed, and because they could potentially stay pending for a very long time,
|
|
// the following multiplier is applied. We want it to be as close as possible to the true cost of a worst case
|
|
// HTLC (max-cltv-delta / max-relay-duration, around 100000 with default parameters) while still being comparable
|
|
// to the number of HTLCs received per peer during twice the half life.
|
|
pending-multiplier = 200 // A pending payment counts as two hundred failed ones.
|
|
}
|
|
}
|
|
|
|
on-chain-fees {
|
|
min-feerate = 1 // minimum feerate in satoshis per byte
|
|
smoothing-window = 6 // 1 = no smoothing
|
|
|
|
default-feerates { // the following values are in satoshis per byte
|
|
minimum = 5
|
|
slow = 5
|
|
medium = 10
|
|
fast = 20
|
|
fastest = 30
|
|
}
|
|
|
|
// confirmation priority for each transaction type, can be slow/medium/fast
|
|
confirmation-priority {
|
|
funding = medium
|
|
closing = medium
|
|
}
|
|
|
|
feerate-tolerance {
|
|
ratio-low = 0.5 // will allow remote fee rates as low as half our local feerate when not using anchor outputs
|
|
ratio-high = 10.0 // will allow remote fee rates as high as 10 times our local feerate when not using anchor outputs
|
|
// when using anchor outputs, we only need to use a commitment feerate that allows the tx to propagate: we will use CPFP to speed up confirmation if needed.
|
|
// the following value is the maximum feerate we'll use for our commit tx (in sat/byte)
|
|
anchor-output-max-commit-feerate = 10
|
|
// the following section lets you configure your tolerance to dust outputs
|
|
dust-tolerance {
|
|
// dust htlcs cannot be claimed on-chain and will instead go to miners if the channel is force-closed
|
|
// a malicious peer may want to abuse that, so we limit the value of pending dust htlcs in a channel
|
|
// this value cannot be lowered too much if you plan to relay a lot of htlcs
|
|
max-exposure-satoshis = 50000
|
|
// when we receive an update_fee, it could increase our dust exposure and overflow max-exposure-satoshis
|
|
// this parameter should be set to true if you want to force-close the channel when that happens
|
|
close-on-update-fee-overflow = false
|
|
}
|
|
}
|
|
override-feerate-tolerance = [ // optional per-node feerate tolerance
|
|
# {
|
|
# nodeid = "02aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
# feerate-tolerance {
|
|
# ratio-low = 0.1
|
|
# ratio-high = 20.0
|
|
# anchor-output-max-commit-feerate = 10
|
|
# dust-tolerance {
|
|
# max-exposure-satoshis = 25000
|
|
# close-on-update-fee-overflow = true
|
|
# }
|
|
# }
|
|
# }
|
|
]
|
|
|
|
// when our utxos count is below this threshold, we will use more aggressive confirmation targets in force-close scenarios
|
|
safe-utxos-threshold = 10
|
|
|
|
// if false, the commitment transaction will not be fee-bumped when we have no htlcs to claim (used in force-close scenario)
|
|
// it can still be manually fee-bumped using the bumpforceclose RPC
|
|
// *do not change this unless you know what you are doing*
|
|
spend-anchor-without-htlcs = true
|
|
// maximum amount of fees we will pay to bump an anchor output when we have no HTLC at risk
|
|
anchor-without-htlcs-max-fee-satoshis = 10000
|
|
|
|
close-on-offline-feerate-mismatch = true // do not change this unless you know what you are doing
|
|
|
|
// the channel initiator will send an UpdateFee message if the difference between current commitment fee and actual
|
|
// current network fee is greater than this ratio.
|
|
update-fee-min-diff-ratio = 0.1
|
|
}
|
|
|
|
peer-connection {
|
|
auth-timeout = 15 seconds // will disconnect if connection authentication doesn't happen within that timeframe
|
|
init-timeout = 15 seconds // will disconnect if initialization doesn't happen within that timeframe
|
|
ping-interval = 30 seconds
|
|
ping-timeout = 20 seconds // will disconnect if peer takes longer than that to respond
|
|
ping-disconnect = true // disconnect if no answer to our pings
|
|
// When enabled, if we receive an incoming connection, we will echo the source IP address in our init message.
|
|
// This should be disabled if your node is behind a load balancer that doesn't preserve source IP addresses.
|
|
send-remote-address-init = true
|
|
max-no-channels = 250 // maximum number of incoming connections from peers that do not have any channels with us
|
|
}
|
|
|
|
auto-reconnect = true
|
|
initial-random-reconnect-delay = 5 seconds // we add a random delay before the first reconnection attempt, capped by this value
|
|
max-reconnect-interval = 1 hour // max interval between two reconnection attempts, after the exponential backoff period
|
|
|
|
invoice-expiry = 1 hour // default expiry for invoices generated by this node
|
|
multi-part-payment-expiry = 60 seconds // default expiry for receiving all parts of a multi-part payment
|
|
max-payment-attempts = 5
|
|
|
|
autoprobe-count = 0 // number of parallel tasks that send test payments to detect invalid channels
|
|
|
|
router {
|
|
watch-spent-window = 60 minutes // at startup watches on public channels will be put back within that window to reduce herd effect; must be > 0s
|
|
|
|
channel-exclude-duration = 60 seconds // when a temporary channel failure is returned, we exclude the channel from our payment routes for this duration
|
|
broadcast-interval = 60 seconds // see BOLT #7
|
|
init-timeout = 5 minutes
|
|
balance-estimate-half-life = 1 day // time after which the confidence of the balance estimate is halved
|
|
|
|
sync {
|
|
request-node-announcements = true // if true we will ask for node announcements when we receive channel ids that we don't know
|
|
channel-range-chunk-size = 1500 // max number of short_channel_ids (+ timestamps + checksums) in reply_channel_range *do not change this unless you know what you are doing*
|
|
channel-query-chunk-size = 100 // max number of short_channel_ids in query_short_channel_ids *do not change this unless you know what you are doing*
|
|
}
|
|
|
|
message-path-finding {
|
|
max-route-length = 6
|
|
ratios {
|
|
// The next three weights must sum to one.
|
|
base = 0.6 // when computing the weight for a channel, proportion that stays the same for all channels
|
|
channel-age = 0.1 // when computing the weight for a channel, consider its AGE in this proportion
|
|
channel-capacity = 0.3 // when computing the weight for a channel, consider its CAPACITY in this proportion
|
|
}
|
|
}
|
|
|
|
path-finding {
|
|
default {
|
|
randomize-route-selection = true // when computing a route for a payment we randomize the final selection
|
|
|
|
boundaries {
|
|
max-route-length = 6 // max route length for the 'first pass', if none is found then a second pass is made with no limit
|
|
max-cltv = 2016 // max acceptable cltv expiry for the payment (2016 ~ 2 weeks)
|
|
// the route must have a fee that's below max-fee-flat-sat OR below max-fee-proportional-percent / 100 * total-amount
|
|
max-fee-flat-sat = 21
|
|
max-fee-proportional-percent = 3 // that's 3%
|
|
}
|
|
|
|
use-ratios = true // if false, will use failure-cost
|
|
// channel 'weight' is computed with the following formula: (channelFee + hop-cost) * (ratio-base + cltvDelta * ratio-cltv + channelAge * ratio-channel-age + channelCapacity * ratio-channel-capacity)
|
|
// the following parameters can be used to ask the router to use heuristics to find i.e: 'cltv-optimized' routes, **the sum of the four ratios must be 1**
|
|
ratios {
|
|
base = 0.0
|
|
cltv = 0.05 // when computing the weight for a channel, consider its CLTV delta in this proportion
|
|
channel-age = 0.4 // when computing the weight for a channel, consider its AGE in this proportion
|
|
channel-capacity = 0.55 // when computing the weight for a channel, consider its CAPACITY in this proportion
|
|
}
|
|
|
|
hop-cost {
|
|
// virtual fee for additional hops: how much you are willing to pay to get one less hop in the payment path
|
|
fee-base-msat = 500
|
|
fee-proportional-millionths = 200
|
|
}
|
|
|
|
locked-funds-risk = 1e-8 // msat per msat locked per block. It should be your expected interest rate per block multiplied by the probability that something goes wrong and your funds stay locked.
|
|
// 1e-8 corresponds to an interest rate of ~5% per year (1e-6 per block) and a probability of 1% that the channel will fail and our funds will be locked.
|
|
|
|
// virtual fee for failed payments: how much you are willing to pay to get one less failed payment attempt
|
|
// ignored if use-ratio = true
|
|
failure-cost {
|
|
fee-base-msat = 2000
|
|
fee-proportional-millionths = 500
|
|
}
|
|
// Using a failure cost breaks Dijkstra (the path returned is no longer guaranteed to be shortest one), if
|
|
// that's a concern, you can penalize paths with a low success chance by using the logarithm of the probability
|
|
// of success. It satisfies Dijkstra's requirements and is a very good approximation for paths with a high
|
|
// probability of success, however is penalizes less the paths with a low probability of success.
|
|
use-log-probability = false
|
|
|
|
mpp {
|
|
min-amount-satoshis = 15000 // minimum amount sent via partial HTLCs
|
|
max-parts = 5 // maximum number of HTLCs sent per payment: increasing this value will impact performance
|
|
}
|
|
}
|
|
|
|
// The path-finding algo uses one or more sets of parameters named experiments. Each experiment has a percentage
|
|
// assigned, allowing AB-testing. By default, there is a single 'control' experiment with a percentage of 100 %.
|
|
//
|
|
// To enable AB-testing, you need to define experiments below. Note that:
|
|
// - each experiment must have a unique name, may override the default parameters, and must provide a percentage
|
|
// - the percentages for all experiments must sum to 100
|
|
// - experiments should be immutable; if you alter parameters of an experiment, you should also rename it
|
|
// - for a complete example, refer to the documentation.
|
|
experiments {
|
|
control = ${eclair.router.path-finding.default} {
|
|
percentage = 100 // 100% of the traffic use the default configuration
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
socks5 {
|
|
enabled = false
|
|
host = "127.0.0.1"
|
|
port = 9050
|
|
use-for-ipv4 = true
|
|
use-for-ipv6 = true
|
|
use-for-tor = true
|
|
use-for-watchdogs = true
|
|
use-for-dnshostnames = true
|
|
randomize-credentials = false // this allows tor stream isolation
|
|
}
|
|
|
|
tor {
|
|
enabled = false
|
|
auth = "password" // safecookie, password
|
|
password = "foobar" // used when auth=password
|
|
host = "127.0.0.1"
|
|
port = 9051
|
|
private-key-file = "tor.dat"
|
|
targets = [] // a list of address:port, for advanced use (e.g. to send traffic to front servers). See the tor man page for syntax details.
|
|
publish-onion-address = true
|
|
}
|
|
|
|
db {
|
|
driver = "sqlite" // sqlite, postgres, dual-sqlite-primary, dual-postgres-primary
|
|
postgres {
|
|
database = "eclair"
|
|
host = "localhost"
|
|
port = 5432
|
|
username = ""
|
|
password = ""
|
|
readonly-user = "" // if defined, this user will be granted read-only access to all tables in the database
|
|
reset-json-columns = false // in case of a json format change, this allows a full re-serialization of json data
|
|
pool {
|
|
max-size = 10 // recommended value = number_of_cpu_cores * 2
|
|
connection-timeout = 30 seconds
|
|
idle-timeout = 10 minutes
|
|
max-life-time = 30 minutes
|
|
}
|
|
lock-type = "lease" // lease or none (do not use none in production)
|
|
lease {
|
|
interval = 5 minutes // lease-interval must be greater than lease-renew-interval
|
|
renew-interval = 1 minute
|
|
lock-timeout = 5 seconds // timeout for the lock statement on the lease table
|
|
auto-release-at-shutdown = true // automatically release the lock when eclair is stopping
|
|
}
|
|
safety-checks {
|
|
// A set of basic checks on data to make sure we use the correct database
|
|
// Those checks are disabled by default because they would not pass on a fresh new node with
|
|
// zero channels. You should enable them when you already have channels, so that there is
|
|
// something to compare to, and the values should be specific to your setup, especially
|
|
// for local channels. If your operate a busy node, you can reduce max-age.local-channels
|
|
// and max-age.audit-relayed to just a few minutes, this will significantly improve the safety.
|
|
enabled = false
|
|
max-age {
|
|
local-channels = 15 minutes // last time a local channel was updated
|
|
network-nodes = 30 minutes // most recent public node announcement
|
|
audit-relayed = 1 hour // last time a payment was relayed
|
|
}
|
|
min-count {
|
|
local-channels = 10 // minimum number of local channels, this entirely depends on your setup
|
|
network-nodes = 3000 // minimum number of public nodes in the routing table
|
|
network-channels = 20000 // minimum number of public channels in the routing table
|
|
}
|
|
}
|
|
}
|
|
dual {
|
|
migrate-on-restart = false // migrate sqlite -> postgres on restart (only applies if sqlite is primary)
|
|
compare-on-restart = false // compare sqlite and postgres dbs on restart (only applies if sqlite is primary)
|
|
}
|
|
// During normal channel operation, we need to store information about past HTLCs to be able to punish our peer if
|
|
// they publish a revoked commitment. Once a channel closes or a splice transaction confirms, we can clean up past
|
|
// data (which reduces the size of our DB). Since there may be millions of rows to delete and we don't want to slow
|
|
// down the node, we delete those rows in batches at regular intervals.
|
|
revoked-htlc-info-cleaner {
|
|
// Number of rows to delete per batch: a higher value will clean up the DB faster, but may have a higher impact on performance.
|
|
batch-size = 50000
|
|
// Frequency at which batches of rows are deleted: a lower value will clean up the DB faster, but may have a higher impact on performance.
|
|
interval = 15 minutes
|
|
}
|
|
}
|
|
|
|
file-backup {
|
|
enabled = true // enable the automatic sqlite db backup; do not change this unless you know what you are doing
|
|
interval = 10 seconds // interval between two backups
|
|
target-file = "eclair.sqlite.bak" // name of the target backup file; will be placed under the chain directory
|
|
// override this with a script/exe that will be called everytime a new database backup has been created
|
|
# notify-script = "/absolute/path/to/script.sh"
|
|
}
|
|
|
|
blockchain-watchdog {
|
|
// all available blockchain watchdog sources
|
|
// you can remove items from this list to disable failing or non-needed sources
|
|
sources = [
|
|
"bitcoinheaders.net",
|
|
"blockcypher.com",
|
|
"blockstream.info",
|
|
"mempool.space"
|
|
]
|
|
// maximum lag of chain height observed by eclair to blockchain watchdog sources
|
|
missing-blocks-threshold = 7
|
|
}
|
|
|
|
onion-messages {
|
|
# Valid values are
|
|
# - channels-only: Only relay messages from peers with which we have a channel to peers with which we have a channel.
|
|
# - relay-all: Relay everything and create new connections if necessary
|
|
relay-policy = "channels-only"
|
|
# If you want to never relay onion messages (but still be able to send and receive them), you need to set
|
|
# features.option_onion_messages = disabled
|
|
|
|
# Transient connections opened to relay messages will be closed after this delay of inactivity
|
|
kill-transient-connection-after = 30 seconds
|
|
|
|
max-per-peer-per-second = 10
|
|
|
|
# Minimum number of hops before our node to hide it in the reply paths that we build
|
|
min-intermediate-hops = 6
|
|
|
|
# Consider a message to be lost if we haven't received a reply after that amount of time
|
|
reply-timeout = 15 seconds
|
|
|
|
# If we expect a reply but do not get one, retry until we reach this number of attempts
|
|
max-attempts = 3
|
|
}
|
|
|
|
purge-expired-invoices {
|
|
enabled = true // enable automatic purges of expired invoices from the database
|
|
interval = 24 hours // interval between expired invoice purges
|
|
}
|
|
}
|
|
|
|
akka {
|
|
io {
|
|
tcp {
|
|
# The maximum number of bytes delivered by a `Received` message. Before
|
|
# more data is read from the network the connection actor will try to
|
|
# do other work.
|
|
# The purpose of this setting is to impose a smaller limit than the
|
|
# configured receive buffer size. When using value 'unlimited' it will
|
|
# try to read all from the receive buffer.
|
|
# As per BOLT#8 lightning messages are at most 2 + 16 + 65535 + 16 = 65569bytes
|
|
# As a tradeoff to reduce the RAM consumption, in conjunction with tcp pull mode,
|
|
# the default value is chosen to allow for a decent number of messages to be prefetched.
|
|
max-received-message-size = 300000b
|
|
}
|
|
}
|
|
|
|
actor {
|
|
warn-about-java-serializer-usage = on
|
|
allow-java-serialization = off
|
|
|
|
serializers {
|
|
lightning = "fr.acinq.eclair.remote.LightningMessageSerializer"
|
|
eclair-internals = "fr.acinq.eclair.remote.EclairInternalsSerializer"
|
|
}
|
|
|
|
serialization-bindings {
|
|
"fr.acinq.eclair.wire.protocol.LightningMessage" = lightning
|
|
"fr.acinq.eclair.remote.EclairInternalsSerializer$RemoteTypes" = eclair-internals
|
|
}
|
|
}
|
|
|
|
remote.artery {
|
|
transport = "tcp" // switching to tls-tcp is highly recommended in a production environment
|
|
|
|
// We are using a simple setup (https://doc.akka.io/docs/akka/current/remoting-artery.html#remote-security):
|
|
// > Have a single set of keys and a single certificate for all nodes and disable hostname checking
|
|
// > - The single set of keys and the single certificate is distributed to all nodes. The certificate can be self-signed as it is distributed both as a certificate for authentication but also as the trusted certificate.
|
|
// > - If the keys/certificate are lost, someone else can connect to your cluster.
|
|
// > - Adding nodes to the cluster is simple as the key material can be deployed / distributed to the new node.
|
|
// Command line used to generate the self-signed certificate:
|
|
// keytool -genkeypair -v \
|
|
// -keystore akka-cluster-tls.jks \
|
|
// -dname "O=ACINQ, C=FR" \
|
|
// -keypass:env PW \
|
|
// -storepass:env PW \
|
|
// -keyalg RSA \
|
|
// -keysize 4096 \
|
|
// -validity 9999
|
|
ssl.config-ssl-engine {
|
|
key-store = ${eclair.datadir}"/akka-cluster-tls.jks"
|
|
trust-store = ${eclair.datadir}"/akka-cluster-tls.jks"
|
|
|
|
key-store-password = ${?AKKA_TLS_PASSWORD}
|
|
key-password = ${?AKKA_TLS_PASSWORD}
|
|
trust-store-password = ${?AKKA_TLS_PASSWORD}
|
|
|
|
protocol = "TLSv1.2"
|
|
|
|
enabled-algorithms = [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
|
|
}
|
|
}
|
|
|
|
cluster {
|
|
role {
|
|
backend.min-nr-of-members = 1
|
|
frontend.min-nr-of-members = 0
|
|
}
|
|
seed-nodes = ["akka://eclair-node@127.0.0.1:25520"]
|
|
}
|
|
}
|