Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 20 additions & 18 deletions doc/deployment/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -201,22 +201,23 @@ Following these initial Gatekeeper configuration variables, the file contains MD

WARNING: Changes to these variables are likely to **break** the Docker Compose functionality.

| Variable | Default Value | Description |
|-----------------------------|---------------|----------------------------------------------------------------------------|
| # Bitcoin testnet4 mediator | | |
| `KC_TBTC_HOST` | `localhost` | Host name for the Bitcoin Testnet node |
| `KC_TBTC_CHAIN` | `TBTC` | MDIP registry name for the Bitcoin Testnet network |
| `KC_TBTC_NETWORK` | `testnet` | |
| `KC_TBTC_START_BLOCK` | `38000` | |
| `KC_TBTC_PORT` | `48332` | Bitcoin Testnet node RPC port |
| `KC_TBTC_USER` | `testnet4` | Bitcoin Testnet node RPC user |
| `KC_TBTC_PASS` | `testnet4` | Bitcoin Testnet node RPC password |
| `KC_TBTC_WALLET` | `mdip` | Name of the Bitcoin Testnet wallet to draw funds from for transaction fees |
| `KC_TBTC_IMPORT_INTERVAL` | `1` | MDIP Satoshi Mediator import loop wait interval (in minutes) |
| `KC_TBTC_EXPORT_INTERVAL` | `1` | MDIP Satoshi Mediator export loop wait interval (in minutes) |
| `KC_TBTC_FEE_MIN` | `0.00000200` | Bitcoin Testnet transaction minimum fee |
| `KC_TBTC_FEE_MAX` | `0.00000600` | Bitcoin Testnet transaction maximum fee |
| `KC_TBTC_FEE_INC` | `0` | |
| Variable | Default Value | Description |
|---------------------------------|---------------|----------------------------------------------------------------------------|
| # Bitcoin testnet4 mediator | | |
| `KC_TBTC_HOST` | `localhost` | Host name for the Bitcoin Testnet node |
| `KC_TBTC_CHAIN` | `TBTC` | MDIP registry name for the Bitcoin Testnet network |
| `KC_TBTC_NETWORK` | `testnet` | |
| `KC_TBTC_START_BLOCK` | `38000` | |
| `KC_TBTC_PORT` | `48332` | Bitcoin Testnet node RPC port |
| `KC_TBTC_USER` | `testnet4` | Bitcoin Testnet node RPC user |
| `KC_TBTC_PASS` | `testnet4` | Bitcoin Testnet node RPC password |
| `KC_TBTC_WALLET` | `mdip` | Name of the Bitcoin Testnet wallet to draw funds from for transaction fees |
| `KC_TBTC_IMPORT_INTERVAL` | `1` | MDIP Satoshi Mediator import loop wait interval (in minutes) |
| `KC_TBTC_EXPORT_INTERVAL` | `1` | MDIP Satoshi Mediator export loop wait interval (in minutes) |
| `KC_TBTC_FEE_BLOCK_TARGET` | `1` | Number of blocks to pass before Replace-By-Fee is used if enabled |
| `KC_TBTC_FEE_FALLBACK_SAT_BYTE` | `10` | Fallback Sat/Byte if estimatesmartfee does not have enough data |
| `KC_TBTC_FEE_MAX` | `0.00000600` | Bitcoin Testnet transaction maximum fee |
| `KC_TBTC_RBF_ENABLED` | false | Whether Replace-By-Fee is enabled |

### Customizing the docker-compose.yml services

Expand Down Expand Up @@ -322,9 +323,10 @@ In the example below, we use a generic bitcoin-code node configured to operate o
- KC_SAT_WALLET=${KC_TBTC_WALLET}
- KC_SAT_IMPORT_INTERVAL=${KC_TBTC_IMPORT_INTERVAL}
- KC_SAT_EXPORT_INTERVAL=${KC_TBTC_EXPORT_INTERVAL}
- KC_SAT_FEE_MIN=${KC_TBTC_FEE_MIN}
- KC_SAT_FEE_BLOCK_TARGET=${KC_TBTC_FEE_BLOCK_TARGET}
- KC_SAT_FEE_FALLBACK_SAT_BYTE=${KC_TBTC_FEE_FALLBACK_SAT_BYTE}
- KC_SAT_FEE_MAX=${KC_TBTC_FEE_MAX}
- KC_SAT_FEE_INC=${KC_TBTC_FEE_INC}
- KC_SAT_RBF_ENABLED=${KC_TBTC_RBF_ENABLED}
volumes:
- ./data:/app/satoshi/data
user: "${KC_UID}:${KC_GID}"
Expand Down
17 changes: 10 additions & 7 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,10 @@ services:
- KC_SAT_WALLET=${KC_TFTC_WALLET}
- KC_SAT_IMPORT_INTERVAL=${KC_TFTC_IMPORT_INTERVAL}
- KC_SAT_EXPORT_INTERVAL=${KC_TFTC_EXPORT_INTERVAL}
- KC_SAT_FEE_MIN=${KC_TFTC_FEE_MIN}
- KC_SAT_FEE_BLOCK_TARGET=${KC_TFTC_FEE_BLOCK_TARGET}
- KC_SAT_FEE_FALLBACK_SAT_BYTE=${KC_TFTC_FEE_FALLBACK_SAT_BYTE}
- KC_SAT_FEE_MAX=${KC_TFTC_FEE_MAX}
- KC_SAT_FEE_INC=${KC_TFTC_FEE_INC}
- KC_SAT_RBF_ENABLED=${KC_TFTC_RBF_ENABLED}
- KC_SAT_REIMPORT=${KC_TFTC_REIMPORT}
- KC_SAT_DB=${KC_TFTC_DB}
volumes:
Expand Down Expand Up @@ -162,9 +163,10 @@ services:
- KC_SAT_WALLET=${KC_TBTC_WALLET}
- KC_SAT_IMPORT_INTERVAL=${KC_TBTC_IMPORT_INTERVAL}
- KC_SAT_EXPORT_INTERVAL=${KC_TBTC_EXPORT_INTERVAL}
- KC_SAT_FEE_MIN=${KC_TBTC_FEE_MIN}
- KC_SAT_FEE_BLOCK_TARGET=${KC_TBTC_FEE_BLOCK_TARGET}
- KC_SAT_FEE_FALLBACK_SAT_BYTE=${KC_TBTC_FEE_FALLBACK_SAT_BYTE}
- KC_SAT_FEE_MAX=${KC_TBTC_FEE_MAX}
- KC_SAT_FEE_INC=${KC_TBTC_FEE_INC}
- KC_SAT_RBF_ENABLED=${KC_TBTC_RBF_ENABLED}
- KC_SAT_REIMPORT=${KC_TBTC_REIMPORT}
- KC_SAT_DB=${KC_TBTC_DB}
volumes:
Expand Down Expand Up @@ -203,9 +205,10 @@ services:
- KC_SAT_WALLET=${KC_SIGNET_WALLET}
- KC_SAT_IMPORT_INTERVAL=${KC_SIGNET_IMPORT_INTERVAL}
- KC_SAT_EXPORT_INTERVAL=${KC_SIGNET_EXPORT_INTERVAL}
- KC_SAT_FEE_MIN=${KC_SIGNET_FEE_MIN}
- KC_SAT_FEE_BLOCK_TARGET=${KC_SIGNET_FEE_BLOCK_TARGET}
- KC_SAT_FEE_FALLBACK_SAT_BYTE=${KC_SIGNET_FEE_FALLBACK_SAT_BYTE}
- KC_SAT_FEE_MAX=${KC_SIGNET_FEE_MAX}
- KC_SAT_FEE_INC=${KC_SIGNET_FEE_INC}
- KC_SAT_RBF_ENABLED=${KC_SIGNET_RBF_ENABLED}
- KC_SAT_REIMPORT=${KC_SIGNET_REIMPORT}
- KC_SAT_DB=${KC_SIGNET_DB}
volumes:
Expand Down Expand Up @@ -240,8 +243,8 @@ services:
- KC_SAT_FEE_BLOCK_TARGET=${KC_SIGNET_INS_FEE_BLOCK_TARGET}
- KC_SAT_FEE_FALLBACK_SAT_BYTE=${KC_SIGNET_INS_FEE_FALLBACK_SAT_BYTE}
- KC_SAT_FEE_MAX=${KC_SIGNET_INS_FEE_MAX}
- KC_SAT_REIMPORT=${KC_SIGNET_INS_REIMPORT}
- KC_SAT_RBF_ENABLED=${KC_SIGNET_INS_RBF_ENABLED}
- KC_SAT_REIMPORT=${KC_SIGNET_INS_REIMPORT}
- KC_SAT_DB=${KC_SIGNET_INS_DB}
volumes:
- ./data:/app/satoshi/data
Expand Down
23 changes: 13 additions & 10 deletions sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@ KC_TBTC_PASS=testnet4
KC_TBTC_WALLET=mdip
KC_TBTC_IMPORT_INTERVAL=1
KC_TBTC_EXPORT_INTERVAL=1
KC_TBTC_FEE_MIN=0.00000200
KC_TBTC_FEE_MAX=0.00000600
KC_TBTC_FEE_INC=0
KC_TBTC_FEE_BLOCK_TARGET=1
KC_TBTC_FEE_FALLBACK_SAT_BYTE=10
KC_TBTC_FEE_MAX=0.00200000
KC_TBTC_RBF_ENABLED=false
KC_TBTC_REIMPORT=true
KC_TBTC_DB=json

Expand All @@ -55,9 +56,10 @@ KC_TFTC_PASS=feathercoin
KC_TFTC_WALLET=mdip
KC_TFTC_IMPORT_INTERVAL=1
KC_TFTC_EXPORT_INTERVAL=1
KC_TFTC_FEE_MIN=0.00000300
KC_TFTC_FEE_MAX=0.00003000
KC_TFTC_FEE_INC=0
KC_TFTC_FEE_BLOCK_TARGET=1
KC_TFTC_FEE_FALLBACK_SAT_BYTE=10
KC_TFTC_FEE_MAX=0.00200000
KC_TFTC_RBF_ENABLED=false
KC_TFTC_REIMPORT=true
KC_TFTC_DB=json

Expand All @@ -70,9 +72,10 @@ KC_SIGNET_PASS=signet
KC_SIGNET_WALLET=mdip
KC_SIGNET_IMPORT_INTERVAL=1
KC_SIGNET_EXPORT_INTERVAL=1
KC_SIGNET_FEE_MIN=0.00000300
KC_SIGNET_FEE_BLOCK_TARGET=1
KC_SIGNET_FEE_FALLBACK_SAT_BYTE=10
KC_SIGNET_FEE_MAX=0.00003000
KC_SIGNET_FEE_INC=0
KC_SIGNET_RBF_ENABLED=false
KC_SIGNET_REIMPORT=true
KC_SIGNET_DB=json

Expand All @@ -86,10 +89,10 @@ KC_SIGNET_INS_WALLET=mdip
KC_SIGNET_INS_IMPORT_INTERVAL=1
KC_SIGNET_INS_EXPORT_INTERVAL=1
KC_SIGNET_INS_FEE_BLOCK_TARGET=1
KC_SIGNET_INS_FEE_MAX=0.00200000
KC_SIGNET_INS_FEE_FALLBACK_SAT_BYTE=10
KC_SIGNET_INS_REIMPORT=true
KC_SIGNET_INS_FEE_MAX=0.00200000
KC_SIGNET_INS_RBF_ENABLED=false
KC_SIGNET_INS_REIMPORT=true
KC_SIGNET_INS_DB=json

# IPFS mediator
Expand Down
31 changes: 31 additions & 0 deletions services/mediators/satoshi-inscription/src/db/abstract-db.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { MediatorDb, MediatorDbInterface } from '../types.js';

export default abstract class AbstractDB implements MediatorDbInterface {
private lock: Promise<void> = Promise.resolve();

abstract loadDb(): Promise<MediatorDb | null>;
abstract saveDb(db: MediatorDb): Promise<boolean>;

async updateDb(mutator: (db: MediatorDb) => void | Promise<void>): Promise<void> {
const run = async () => {
const db = (await this.loadDb()) ?? this.defaultDb();
await mutator(db);
await this.saveDb(db);
};
const chained = this.lock.then(run, run);
this.lock = chained.catch(() => {}); // keep chain alive on errors
return chained;
}

protected defaultDb(): MediatorDb {
return {
height: 0,
time: '',
blockCount: 0,
blocksScanned: 0,
blocksPending: 0,
txnsScanned: 0,
discovered: [],
};
}
}
10 changes: 7 additions & 3 deletions services/mediators/satoshi-inscription/src/db/jsonfile.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import fs from 'fs';
import { MediatorDb, MediatorDbInterface } from '../types.js';
import { MediatorDb } from '../types.js';
import AbstractDB from "./abstract-db.js";

export default class JsonFile implements MediatorDbInterface {
export default class JsonFile extends AbstractDB {
private readonly dataFolder: string;
private readonly fileName: string;

constructor(registry: string, dataFolder = 'data') {
super();
this.dataFolder = dataFolder;
this.fileName = `${dataFolder}/${registry}-mediator.json`;
}
Expand All @@ -15,7 +17,9 @@ export default class JsonFile implements MediatorDbInterface {
fs.mkdirSync(this.dataFolder, { recursive: true });
}

fs.writeFileSync(this.fileName, JSON.stringify(data, null, 4));
const tmp = this.fileName + '.tmp';
fs.writeFileSync(tmp, JSON.stringify(data, null, 4));
fs.renameSync(tmp, this.fileName);
return true;
}

Expand Down
6 changes: 4 additions & 2 deletions services/mediators/satoshi-inscription/src/db/mongo.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { MongoClient, Db, Collection } from 'mongodb';
import { MediatorDb, MediatorDbInterface } from '../types.js';
import { MediatorDb } from '../types.js';
import AbstractDB from "./abstract-db.js";

export default class JsonMongo implements MediatorDbInterface {
export default class JsonMongo extends AbstractDB {
private client: MongoClient;
private readonly dbName: string;
private readonly collectionName: string;
Expand All @@ -15,6 +16,7 @@ export default class JsonMongo implements MediatorDbInterface {
}

constructor(registry: string) {
super();
const url = process.env.KC_MONGODB_URL || 'mongodb://localhost:27017';
this.client = new MongoClient(url);
this.dbName = 'sat-mediator';
Expand Down
6 changes: 4 additions & 2 deletions services/mediators/satoshi-inscription/src/db/redis.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Redis } from 'ioredis'
import { MediatorDb, MediatorDbInterface } from '../types.js';
import { MediatorDb } from '../types.js';
import AbstractDB from "./abstract-db.js";

export default class JsonRedis implements MediatorDbInterface {
export default class JsonRedis extends AbstractDB {
private readonly url: string;
private readonly dbKey: string;
private redis?: Redis;
Expand All @@ -13,6 +14,7 @@ export default class JsonRedis implements MediatorDbInterface {
}

constructor(registry: string) {
super();
this.url = process.env.KC_REDIS_URL || 'redis://localhost:6379';
this.dbKey = `sat-mediator/${registry}`;
}
Expand Down
6 changes: 4 additions & 2 deletions services/mediators/satoshi-inscription/src/db/sqlite.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import sqlite3 from 'sqlite3';
import { open, Database } from 'sqlite';
import { MediatorDb, MediatorDbInterface } from '../types.js';
import { MediatorDb } from '../types.js';
import AbstractDB from "./abstract-db.js";

export default class JsonSQLite implements MediatorDbInterface {
export default class JsonSQLite extends AbstractDB {
private readonly fileName: string;
private db?: Database;

Expand All @@ -13,6 +14,7 @@ export default class JsonSQLite implements MediatorDbInterface {
}

constructor(registry: string, dataFolder = 'data') {
super();
this.fileName = `${dataFolder}/${registry}-mediator.db`;
}

Expand Down
Loading
Loading