2019-08-23 20:53:00 +02:00
---
id: configuration
2020-03-13 09:54:07 -05:00
title: Application Configuration
2019-08-23 20:53:00 +02:00
---
Bitcoin-S uses [HOCON ](https://github.com/lightbend/config/blob/master/HOCON.md )
to configure various parts of the application the library offers. HOCON is a
superset of JSON, that is, all valid JSON is valid HOCON.
All configuration for Bitcoin-S is under the `bitcoin-s` key.
If you have a file `application.conf` anywhere on your classpath when using
bitcoin-s, the values there take precedence over the ones found in our
`reference.conf` . We also look for the file `bitcoin-s.conf` in the current
Bitcoin-S data directory.
The resolved configuration gets parsed by
[`AppConfig` ](../../db-commons/src/main/scala/org/bitcoins/db/AppConfig.scala ).
`AppConfig` is an abstract class that's implemented by corresponding case
classes in the `wallet` , `chain` and `node` projects. Here's some examples of how to
construct a wallet configuration:
```scala mdoc:compile-only
import org.bitcoins.wallet.config.WalletAppConfig
import com.typesafe.config.ConfigFactory
import java.nio.file.Paths
import scala.util.Properties
2020-04-25 11:28:58 -05:00
import scala.concurrent.ExecutionContext.Implicits.global
2019-08-23 20:53:00 +02:00
// reads $HOME/.bitcoin-s/
2020-05-20 15:46:24 -05:00
val defaultConfig = WalletAppConfig.fromDefaultDatadir(false)
2019-08-23 20:53:00 +02:00
// reads a custom data directory
val customDirectory = Paths.get(Properties.userHome, "custom-bitcoin-s-directory")
2020-05-20 15:46:24 -05:00
val configFromCustomDatadir = WalletAppConfig(customDirectory, false)
2019-08-23 20:53:00 +02:00
// reads a custom data directory and overrides the network to be testnet3
val customOverride = ConfigFactory.parseString("bitcoin-s.network = testnet3")
2020-05-20 15:46:24 -05:00
val configFromCustomDirAndOverride = WalletAppConfig(customDirectory, false, customOverride)
2019-08-23 20:53:00 +02:00
```
You can pass as many `com.typesafe.config.Config` s as you'd like. If any
keys appear multiple times the last one encountered takes precedence.
## Internal configuration
Database connections are also configured by using HOCON. This is done in
[`db.conf` ](../../db-commons/src/main/resources/db.conf ). The options
exposed here are **not** intended to
be used by users of Bitcoin-S, and are internal only.
2020-01-27 07:04:53 -06:00
2020-03-04 09:40:50 -06:00
## Database Migrations
All of our modules that require databases now have database migrations. The tool we use for these migrations is
called [flyway ](https://flywaydb.org/ ). To find your projects migraitons, you need to look inside of the
`[project-name]/src/main/resources/[database-name]/migration/` . For example, the chain projects migrations live under
the path `chain/src/main/resources/chaindb/migration/V1__chain_db_baseline.sql` .
Migrations can be executed by calling the [`DbManagement.migrate()` ](https://github.com/bitcoin-s/bitcoin-s/blob/e387d075b0ff2e0a0fec15788fcb48e4ddc4d9d5/db-commons/src/main/scala/org/bitcoins/db/DbManagement.scala#L92 )
method. Migrations are applied by default on server startup, via the [`AppConfig.initialize()` ](https://github.com/bitcoin-s/bitcoin-s/blob/master/db-commons/src/main/scala/org/bitcoins/db/AppConfig.scala#L49 )
method.
These migrations are setup so that project's databases and migrations are independent of each other. Therefore if you
want to use the `bitcoin-s-chain` project, but not the `bitcoin-s-wallet` project, wallet migrations are not applied.
It should be noted if you are using a module as a library, you are responsible for configuring the database via
[slick's configuration ](https://scala-slick.org/doc/3.3.1/database.html#using-typesafe-config ) and calling
[`AppConfig.initialize()` ](https://github.com/bitcoin-s/bitcoin-s/blob/master/db-commons/src/main/scala/org/bitcoins/db/AppConfig.scala#L49 )
to ensure the entire module is initialized correctly.
2020-01-27 07:04:53 -06:00
## Example Configuration File
```$xslt
bitcoin-s {
datadir = ${HOME}/.bitcoin-s
network = regtest # regtest, testnet3, mainnet
logging {
2020-05-20 15:46:24 -05:00
# Ignore bitcoin-s logging config and use a logback config
logback = false
2020-01-27 07:04:53 -06:00
level = WARN # trace, debug, info, warn, error, off
# You can also tune specific module loggers.
# They each take the same levels as above.
# If they are commented out (as they are
# by default), `logging.level` gets used
# instead.
# The available loggers are:
# incoming and outgoing P2P messages
# p2p = info
# verification of block headers, merkle trees
# chain-verification = info
# generation of addresses, signing of TXs
# key-handling = info
# wallet operations not related to key management
# wallet = info
# HTTP RPC server
# http = info
# Database interactions
# database = info
# whether or not to write to the log file
disable-file = false
# whether or not to log to stdout
disable-console = false
}
node {
mode = neutrino # neutrino, spv
peers = [] # a list of peer addresses in form "hostname:portnumber"
# (e.g. "neutrino.testnet3.suredbits.com:18333")
# Port number is optional, the default value is 8333 for mainnet,
# 18333 for testnet and 18444 for regtest.
}
chain {
2020-07-31 10:43:04 -05:00
force-recalc-chainwork = false
2020-01-27 07:04:53 -06:00
neutrino {
filter-header-batch-size = 2000
2020-04-03 17:36:29 -05:00
filter-header-batch-size.regtest = 10
# You can set a network specific filter-header-batch-size
# by adding a trailing `.networkId` (main, test, regtest)
# It is recommended to keep the main and test batch size high
# to keep the sync time fast, however, for regtest it should be small
# so it does not exceed the chain size.
2020-01-27 07:04:53 -06:00
filter-batch-size = 100
}
}
# settings for wallet module
wallet {
defaultAccountType = legacy # legacy, segwit, nested-segwit
bloomFalsePositiveRate = 0.0001 # percentage
addressGapLimit = 20
discoveryBatchSize = 100
2020-04-08 16:51:17 -05:00
requiredConfirmations = 6
2020-04-10 14:19:39 -05:00
# How big the address queue size is before we throw an exception
# because of an overflow
addressQueueSize = 10
# How long we attempt to generate an address for
# before we timeout
addressQueueTimeout = 5 seconds
}
2020-05-04 19:09:32 -05:00
server {
# The port we bind our rpc server on
rpcport = 9999
}
2020-01-27 07:04:53 -06:00
}
akka {
loglevel = "OFF"
stdout-loglevel = "OFF"
http {
client {
# The time after which an idle connection will be automatically closed.
# Set to `infinite` to completely disable idle connection timeouts.
# some requests potentially take a long time, like generate and prune
idle-timeout = 5 minutes
}
}
actor {
debug {
# enable DEBUG logging of all AutoReceiveMessages (Kill, PoisonPill etc.)
autoreceive= off
# enable function of LoggingReceive, which is to log any received message at
# DEBUG level
receive = on
# enable DEBUG logging of unhandled messages
unhandled = off
# enable DEBUG logging of actor lifecycle changes
lifecycle = off
event-stream=off
}
}
}
2020-06-02 14:37:48 -07:00
```
2020-06-03 06:15:33 -05:00
## Database configuration
2020-06-02 14:37:48 -07:00
By default, bitcoin-s uses Sqlite to store its data.
It creates three Sqlite databases in `~/.bitcoin-s/${network}` : `chain.sqlite` for `chain` project,
`node.sqlite` for `node` project and `wallet.sqlite` the wallet. This is the default configuration,
it doesn't require additional changes in the config file.
`bitcoin-s` also supports PostgreSQL as a database backend. In order to use a
PostgreSQL database for all project you need to add following into your config file:
```$xslt
bitcoin-s {
common {
profile = "slick.jdbc.PostgresProfile$"
db {
url = "jdbc:postgresql://localhost:5432/database"
driver = "org.postgresql.Driver"
username = "user"
password = "topsecret"
}
}
}
```
Also you can use mix databases and drivers in one configuration. For example,
This configuration file enables Sqlite for `node` project (it's default, so its configuration
is omitted), and `walletdb` and `chaindb` PostgreSQL databases for `wallet` and `chain` projects:
```$xslt
bitcoin-s {
chain {
profile = "slick.jdbc.PostgresProfile$"
db {
url = "jdbc:postgresql://localhost:5432/chaindb"
driver = "org.postgresql.Driver"
username = "user"
password = "topsecret"
}
}
wallet {
profile = "slick.jdbc.PostgresProfile$"
db {
url = "jdbc:postgresql://localhost:5432/walletdb"
driver = "org.postgresql.Driver"
username = "user"
password = "topsecret"
}
}
}
2020-06-03 06:15:33 -05:00
```