2022-05-23 20:03:50 +02:00
# Mempool Backend
2022-01-03 03:47:04 +01:00
2022-06-11 17:05:53 +02:00
These instructions are mostly intended for developers.
2022-01-03 03:47:04 +01:00
2022-05-23 20:03:50 +02:00
If you choose to use these instructions for a production setup, be aware that you will still probably need to do additional configuration for your specific OS, environment, use-case, etc. We do our best here to provide a good starting point, but only proceed if you know what you're doing. Mempool does not provide support for custom setups.
2022-01-03 03:47:04 +01:00
2022-05-23 20:03:50 +02:00
See other ways to set up Mempool on [the main README ](/../../#installation-methods ).
2022-01-03 03:47:04 +01:00
2022-05-23 20:03:50 +02:00
Jump to a section in this doc:
- [Set Up the Backend ](#setup )
- [Development Tips ](#development-tips )
2022-01-19 05:03:43 +01:00
2022-05-23 20:03:50 +02:00
## Setup
### 1. Clone Mempool Repository
Get the latest Mempool code:
```
git clone https://github.com/mempool/mempool
cd mempool
2022-01-03 03:47:04 +01:00
```
2022-05-23 20:03:50 +02:00
Check out the latest release:
2022-01-03 03:47:04 +01:00
```
2022-05-23 20:03:50 +02:00
latestrelease=$(curl -s https://api.github.com/repos/mempool/mempool/releases/latest|grep tag_name|head -1|cut -d '"' -f4)
git checkout $latestrelease
```
### 2. Configure Bitcoin Core
Turn on `txindex` , enable RPC, and set RPC credentials in `bitcoin.conf` :
```
txindex=1
server=1
rpcuser=mempool
rpcpassword=mempool
```
### 3. Configure Electrum Server
[Pick an Electrum Server implementation ](https://mempool.space/docs/faq#address-lookup-issues ), configure it, and make sure it's synced.
**This step is optional.** You can run Mempool without configuring an Electrum Server for it, but address lookups will be disabled.
2022-05-26 23:57:48 +02:00
### 4. Configure MariaDB
_Mempool needs MariaDB v10.5 or later. If you already have MySQL installed, make sure to migrate any existing databases **before** installing MariaDB._
2022-05-23 20:03:50 +02:00
Get MariaDB from your operating system's package manager:
```
# Debian, Ubuntu, etc.
apt-get install mariadb-server mariadb-client
# macOS
brew install mariadb
mysql.server start
```
Create a database and grant privileges:
```
MariaDB [(none)]> drop database mempool;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> create database mempool;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on mempool.* to 'mempool'@'%' identified by 'mempool';
Query OK, 0 rows affected (0.00 sec)
```
### 5. Prepare Mempool Backend
#### Build
2022-01-19 05:03:43 +01:00
2022-06-09 23:39:07 +02:00
_Make sure to use Node.js 16.10 and npm 7._
2022-05-27 00:19:58 +02:00
2022-05-23 20:03:50 +02:00
Install dependencies with `npm` and build the backend:
```
cd backend
2022-06-09 23:39:07 +02:00
npm install
2022-05-23 20:03:50 +02:00
npm run build
```
#### Configure
In the backend folder, make a copy of the sample config file:
```
cp mempool-config.sample.json mempool-config.json
```
Edit `mempool-config.json` as needed.
In particular, make sure:
- the correct Bitcoin Core RPC credentials are specified in `CORE_RPC`
2022-05-27 04:13:37 +02:00
- the correct `BACKEND` is specified in `MEMPOOL` :
- "electrum" if you're using [romanz/electrs ](https://github.com/romanz/electrs ) or [cculianu/Fulcrum ](https://github.com/cculianu/Fulcrum )
- "esplora" if you're using [Blockstream/electrs ](https://github.com/Blockstream/electrs )
- "none" if you're not using any Electrum Server
2022-05-23 20:03:50 +02:00
### 6. Run Mempool Backend
Run the Mempool backend:
```
npm run start
2022-07-13 12:44:30 +02:00
```
You can also set env var `MEMPOOL_CONFIG_FILE` to specify a custom config file location:
```
MEMPOOL_CONFIG_FILE=/path/to/mempool-config.json npm run start
2022-05-23 20:03:50 +02:00
```
When it's running, you should see output like this:
```
Mempool updated in 0.189 seconds
Updating mempool
Mempool updated in 0.096 seconds
Updating mempool
Mempool updated in 0.099 seconds
Updating mempool
Calculated fee for transaction 1 / 10
Calculated fee for transaction 2 / 10
Calculated fee for transaction 3 / 10
Calculated fee for transaction 4 / 10
Calculated fee for transaction 5 / 10
Calculated fee for transaction 6 / 10
Calculated fee for transaction 7 / 10
Calculated fee for transaction 8 / 10
Calculated fee for transaction 9 / 10
Calculated fee for transaction 10 / 10
Mempool updated in 0.243 seconds
Updating mempool
```
### 7. Set Up Mempool Frontend
With the backend configured and running, proceed to set up the [Mempool frontend ](../frontend#manual-setup ).
## Development Tips
### Set Up Backend Watchers
The Mempool backend is static. TypeScript scripts are compiled into the `dist` folder and served through a Node.js web server.
As a result, for development purposes, you may find it helpful to set up backend watchers to avoid the manual shutdown/recompile/restart command-line cycle.
First, install `nodemon` and `ts-node` :
```
npm install -g ts-node nodemon
```
2022-01-19 05:03:43 +01:00
2022-05-23 20:03:50 +02:00
Then, run the watcher:
2022-01-19 05:03:43 +01:00
2022-01-03 03:47:04 +01:00
```
2022-01-20 09:20:02 +01:00
nodemon src/index.ts --ignore cache/ --ignore pools.json
2022-01-03 03:47:04 +01:00
```
2022-05-23 20:03:50 +02:00
`nodemon` should be in npm's global binary folder. If needed, you can determine where that is with `npm -g bin` .
2022-06-13 11:28:34 +02:00
2022-06-15 19:11:59 +02:00
### Useful Regtest Commands
2022-06-13 11:28:34 +02:00
2022-06-15 19:11:59 +02:00
Helpful link: https://gist.github.com/System-Glitch/cb4e87bf1ae3fec9925725bb3ebe223a
2022-06-13 11:28:34 +02:00
2022-06-15 19:11:59 +02:00
Run bitcoind on regtest:
2022-06-13 11:28:34 +02:00
```
bitcoind -regtest -rpcport=8332
```
2022-06-15 19:11:59 +02:00
Create a new wallet, if needed:
2022-06-13 11:28:34 +02:00
```
bitcoin-cli -regtest -rpcport=8332 createwallet test
```
2022-06-15 19:11:59 +02:00
Load wallet (this command may take a while if you have lot of UTXOs):
2022-06-13 11:28:34 +02:00
```
bitcoin-cli -regtest -rpcport=8332 loadwallet test
```
2022-06-15 19:11:59 +02:00
Get a new address:
2022-06-13 11:28:34 +02:00
```
address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress)
```
2022-06-15 19:11:59 +02:00
Mine blocks to the previously generated address. You need at least 101 blocks before you can spend. This will take some time to execute (~1 min):
2022-06-13 11:28:34 +02:00
```
bitcoin-cli -regtest -rpcport=8332 generatetoaddress 101 $address
```
2022-06-15 19:11:59 +02:00
Send 0.1 BTC at 5 sat/vB to another address:
2022-06-13 11:28:34 +02:00
```
./src/bitcoin-cli -named -regtest -rpcport=8332 sendtoaddress address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress) amount=0.1 fee_rate=5
```
2022-06-15 19:11:59 +02:00
See more example of `sendtoaddress` :
2022-06-13 11:28:34 +02:00
```
./src/bitcoin-cli sendtoaddress # will print the help
```
2022-06-15 19:11:59 +02:00
Mini script to generate transactions with random TX fee-rate (between 1 to 100 sat/vB). It's slow so don't expect to use this to test mempool spam, except if you let it run for a long time, or maybe with multiple regtest nodes connected to each other.
2022-06-13 11:28:34 +02:00
```
#!/bin/bash
address=$(./src/bitcoin-cli -regtest -rpcport=8332 getnewaddress)
for i in {1..1000000}
do
2022-06-15 19:11:59 +02:00
./src/bitcoin-cli -regtest -rpcport=8332 -named sendtoaddress address=$address amount=0.01 fee_rate=$(jot -r 1 1 100)
2022-06-13 11:28:34 +02:00
done
```
2022-06-15 19:11:59 +02:00
Generate block at regular interval (every 10 seconds in this example):
2022-06-13 11:28:34 +02:00
```
watch -n 10 "./src/bitcoin-cli -regtest -rpcport=8332 generatetoaddress 1 $address"
```