mirror of
https://github.com/benjamin-wilson/public-pool.git
synced 2025-03-17 13:21:43 +01:00
parent
8075c83fe2
commit
f7303d73af
@ -63,4 +63,16 @@ To stop the setup use:
|
||||
|
||||
```
|
||||
docker compose -f docker-compose-mainnet.yml down
|
||||
```
|
||||
```
|
||||
|
||||
# Regtest
|
||||
|
||||
After running the `regtest` setup a couple of blocks need to be generated:
|
||||
|
||||
```bash
|
||||
# create wallet
|
||||
$ docker exec -it bitcoin-regtest /app/bin/bitcoin-cli -conf=/app/data/bitcoin.conf -regtest createwallet "regtestwallet"
|
||||
|
||||
# generate 101 blocks
|
||||
$ docker exec -it bitcoin-regtest /app/bin/bitcoin-cli -conf=/app/data/bitcoin.conf -regtest -generate 101
|
||||
```
|
||||
|
22
full-setup/bitcoin-regtest.conf
Normal file
22
full-setup/bitcoin-regtest.conf
Normal file
@ -0,0 +1,22 @@
|
||||
[main]
|
||||
[test]
|
||||
[signet]
|
||||
[regtest]
|
||||
# allow all IPs
|
||||
rpcallowip=0.0.0.0/0
|
||||
|
||||
# start RPC server
|
||||
server=1
|
||||
|
||||
# bind to 0.0.0.0
|
||||
rpcbind=0.0.0.0
|
||||
|
||||
# RPC Port 28332
|
||||
rpcport=28332
|
||||
|
||||
# RPC username and password
|
||||
rpcpassword=bitcoin
|
||||
rpcuser=bitcoin
|
||||
|
||||
# set pruning
|
||||
prune=550
|
44
full-setup/docker-compose-regtest.yml
Normal file
44
full-setup/docker-compose-regtest.yml
Normal file
@ -0,0 +1,44 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
bitcoin-regtest:
|
||||
container_name: bitcoin-regtest
|
||||
build:
|
||||
context: ./docker/bitcoin
|
||||
dockerfile: Dockerfile
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 30s
|
||||
networks:
|
||||
- bitcoin-regtest
|
||||
ports:
|
||||
- "127.0.0.1:28332:28332/tcp"
|
||||
- "0.0.0.0:28333:28333/tcp"
|
||||
command: >
|
||||
-printtoconsole
|
||||
-datadir=/app/data
|
||||
-regtest
|
||||
-blockversion=536870912
|
||||
volumes:
|
||||
- "./data/regtest/bitcoin:/app/data"
|
||||
- "./bitcoin-regtest.conf:/app/data/bitcoin.conf:ro"
|
||||
|
||||
public-pool-regtest:
|
||||
container_name: public-pool-regtest
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: Dockerfile
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 30s
|
||||
networks:
|
||||
- bitcoin-regtest
|
||||
ports:
|
||||
- "0.0.0.0:23333:23333/tcp"
|
||||
- "127.0.0.1:23334:23334/tcp"
|
||||
volumes:
|
||||
- "./data/regtest/public-pool:/public-pool/DB"
|
||||
- "./public-pool-regtest.env:/public-pool/.env:ro"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
|
||||
networks:
|
||||
bitcoin-regtest:
|
34
full-setup/public-pool-regtest.env
Normal file
34
full-setup/public-pool-regtest.env
Normal file
@ -0,0 +1,34 @@
|
||||
BITCOIN_RPC_URL=http://bitcoin-regtest
|
||||
BITCOIN_RPC_USER=bitcoin
|
||||
BITCOIN_RPC_PASSWORD=bitcoin
|
||||
BITCOIN_RPC_PORT=28332
|
||||
BITCOIN_RPC_TIMEOUT=10000
|
||||
|
||||
# Enable in bitcoin.conf with
|
||||
# zmqpubrawblock=tcp://*:3000
|
||||
# BITCOIN_ZMQ_HOST="tcp://192.168.1.100:3000"
|
||||
|
||||
API_PORT=23334
|
||||
STRATUM_PORT=23333
|
||||
|
||||
#optional telegram bot
|
||||
#TELEGRAM_BOT_TOKEN=
|
||||
|
||||
#optional discord bot
|
||||
#DISCORD_BOT_CLIENTID=
|
||||
#DISCORD_BOT_GUILD_ID=
|
||||
#DISCORD_BOT_CHANNEL_ID=
|
||||
|
||||
#optional
|
||||
DEV_FEE_ADDRESS=
|
||||
# mainnet | testnet
|
||||
NETWORK=regtest
|
||||
|
||||
API_SECURE=false
|
||||
|
||||
ENABLE_SOLO=true
|
||||
ENABLE_PROXY=false
|
||||
|
||||
BRAIINS_ACCESS_TOKEN=
|
||||
|
||||
PROXY_PORT=3333
|
@ -40,8 +40,19 @@ export class MiningJob {
|
||||
|
||||
// 39th byte onwards: Optional data with no consensus meaning
|
||||
const extra = Buffer.from('\\public-pool\\');
|
||||
|
||||
// Encode the block height
|
||||
// https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki
|
||||
this.coinbaseTransaction.ins[0].script = Buffer.concat([Buffer.from([jobTemplate.blockData.littleEndianBlockHeight.byteLength]), jobTemplate.blockData.littleEndianBlockHeight, extra, Buffer.alloc(8, 0)]);
|
||||
const blockHeightEncoded = bitcoinjs.script.number.encode(jobTemplate.blockData.height);
|
||||
|
||||
// Get the length of the block height encoding
|
||||
const blockHeightLengthByte = Buffer.from([blockHeightEncoded.length]);
|
||||
|
||||
// generate padding and take length of encode blockHeight into account
|
||||
const padding = Buffer.alloc(8 + (3 - blockHeightEncoded.length), 0)
|
||||
|
||||
// build the script
|
||||
this.coinbaseTransaction.ins[0].script = Buffer.concat([blockHeightLengthByte, blockHeightEncoded, extra, padding])
|
||||
|
||||
this.coinbaseTransaction.addOutput(bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, jobTemplate.block.witnessCommit])]), 0);
|
||||
|
||||
@ -196,4 +207,4 @@ export class MiningJob {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -392,9 +392,21 @@ export class StratumV1Client {
|
||||
];
|
||||
}
|
||||
|
||||
const networkConfig = this.configService.get('NETWORK');
|
||||
let network;
|
||||
|
||||
if (networkConfig === 'mainnet') {
|
||||
network = bitcoinjs.networks.bitcoin;
|
||||
} else if (networkConfig === 'testnet') {
|
||||
network = bitcoinjs.networks.testnet;
|
||||
} else if (networkConfig === 'regtest') {
|
||||
network = bitcoinjs.networks.regtest;
|
||||
} else {
|
||||
throw new Error('Invalid network configuration');
|
||||
}
|
||||
|
||||
const job = new MiningJob(
|
||||
this.configService.get('NETWORK') === 'mainnet' ? bitcoinjs.networks.bitcoin : bitcoinjs.networks.testnet,
|
||||
network,
|
||||
this.stratumV1JobsService.getNextId(),
|
||||
payoutInformation,
|
||||
jobTemplate
|
||||
|
@ -13,7 +13,6 @@ export interface IJobTemplate {
|
||||
merkle_branch: string[];
|
||||
blockData: {
|
||||
id: string,
|
||||
littleEndianBlockHeight: Buffer;
|
||||
coinbasevalue: number;
|
||||
networkDifficulty: number;
|
||||
height: number;
|
||||
@ -72,7 +71,6 @@ export class StratumV1JobsService {
|
||||
bits: parseInt(blockTemplate.bits, 16),
|
||||
prevHash: this.convertToLittleEndian(blockTemplate.previousblockhash),
|
||||
transactions: blockTemplate.transactions.map(t => bitcoinjs.Transaction.fromHex(t.data)),
|
||||
littleEndianBlockHeight: this.convertToLittleEndian(blockTemplate.height.toString(16).padStart(6, '0')),
|
||||
coinbasevalue: blockTemplate.coinbasevalue,
|
||||
timestamp: Math.floor(new Date().getTime() / 1000),
|
||||
networkDifficulty: this.calculateNetworkDifficulty(parseInt(blockTemplate.bits, 16)),
|
||||
@ -81,7 +79,7 @@ export class StratumV1JobsService {
|
||||
};
|
||||
}),
|
||||
filter(next => next != null),
|
||||
map(({ version, bits, prevHash, transactions, timestamp, littleEndianBlockHeight, coinbasevalue, networkDifficulty, clearJobs, height }) => {
|
||||
map(({ version, bits, prevHash, transactions, timestamp, coinbasevalue, networkDifficulty, clearJobs, height }) => {
|
||||
const block = new bitcoinjs.Block();
|
||||
|
||||
//create an empty coinbase tx
|
||||
@ -115,7 +113,6 @@ export class StratumV1JobsService {
|
||||
merkle_branch,
|
||||
blockData: {
|
||||
id,
|
||||
littleEndianBlockHeight,
|
||||
coinbasevalue,
|
||||
networkDifficulty,
|
||||
height,
|
||||
@ -176,4 +173,4 @@ export class StratumV1JobsService {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user