fix faucet empty commitment
This commit is contained in:
parent
436fb61c72
commit
378699946d
@ -68,7 +68,7 @@ zmq_url=tcp://bitcoin:29000
|
|||||||
storage=https://dev4.4nkweb.com/storage
|
storage=https://dev4.4nkweb.com/storage
|
||||||
data_dir=/home/bitcoin/.4nk
|
data_dir=/home/bitcoin/.4nk
|
||||||
bitcoin_data_dir=/home/bitcoin/.bitcoin
|
bitcoin_data_dir=/home/bitcoin/.bitcoin
|
||||||
bootstrap_url=ws://dev3.4nkweb.com:8090
|
bootstrap_url=wss://dev3.4nkweb.com/ws/
|
||||||
bootstrap_faucet=true
|
bootstrap_faucet=true
|
||||||
RUST_LOG=DEBUG,
|
RUST_LOG=DEBUG,
|
||||||
NODE_OPTIONS=--max-old-space-size=2048
|
NODE_OPTIONS=--max-old-space-size=2048
|
||||||
|
@ -86,6 +86,7 @@ services:
|
|||||||
- NODE_OPTIONS=--max-old-space-size=2048
|
- NODE_OPTIONS=--max-old-space-size=2048
|
||||||
- HOME=/home/bitcoin
|
- HOME=/home/bitcoin
|
||||||
- RUST_LOG=DEBUG
|
- RUST_LOG=DEBUG
|
||||||
|
- RUST_BACKTRACE=1
|
||||||
entrypoint: >
|
entrypoint: >
|
||||||
/bin/sh -lc '
|
/bin/sh -lc '
|
||||||
mkdir -p /home/bitcoin/.4nk/logs
|
mkdir -p /home/bitcoin/.4nk/logs
|
||||||
@ -190,7 +191,7 @@ services:
|
|||||||
bitcoin:
|
bitcoin:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
env_file:
|
env_file:
|
||||||
- ./miner/.env
|
- ./miner/miner.env
|
||||||
volumes:
|
volumes:
|
||||||
- bitcoin_data:/bitcoin:ro
|
- bitcoin_data:/bitcoin:ro
|
||||||
networks:
|
networks:
|
||||||
|
134
docs/miner_relay_rewards.md
Normal file
134
docs/miner_relay_rewards.md
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
# Partage des Rewards entre Miner et Relay
|
||||||
|
|
||||||
|
## Vue d'ensemble
|
||||||
|
|
||||||
|
Cette fonctionnalité permet au miner signet de partager automatiquement les rewards de bloc avec le relay. Quand le miner gagne un bloc, il envoie une partie des rewards (configurable) au relay.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Variables d'environnement
|
||||||
|
|
||||||
|
Dans le fichier `miner/miner.env` :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Adresse du miner pour recevoir sa part des rewards
|
||||||
|
COINBASE_ADDRESS=tb1qminer123456789012345678901234567890
|
||||||
|
|
||||||
|
# Adresse du relay pour recevoir sa part des rewards
|
||||||
|
RELAY_ADDRESS=tb1qrelay123456789012345678901234567890
|
||||||
|
|
||||||
|
# Ratio de partage (0.0 = 0%, 0.5 = 50%, 1.0 = 100%)
|
||||||
|
REWARD_SPLIT_RATIO=0.5
|
||||||
|
```
|
||||||
|
|
||||||
|
### Paramètres de ligne de commande
|
||||||
|
|
||||||
|
Le miner accepte également ces paramètres :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
--relay-address ADDRESS # Adresse du relay
|
||||||
|
--reward-split-ratio RATIO # Ratio de partage (0.0-1.0)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fonctionnement
|
||||||
|
|
||||||
|
### Mécanisme de partage
|
||||||
|
|
||||||
|
1. **Détection du bloc** : Le miner détecte qu'il a gagné un bloc
|
||||||
|
2. **Calcul des rewards** : Le reward total est divisé selon le ratio configuré
|
||||||
|
3. **Création de la coinbase** : La transaction coinbase est créée avec deux sorties :
|
||||||
|
- Sortie 1 : Reward pour le miner (1 - ratio)
|
||||||
|
- Sortie 2 : Reward pour le relay (ratio)
|
||||||
|
|
||||||
|
### Exemple de partage
|
||||||
|
|
||||||
|
Avec `REWARD_SPLIT_RATIO=0.5` et un reward de bloc de 5 BTC :
|
||||||
|
- **Miner** : 2.5 BTC (50%)
|
||||||
|
- **Relay** : 2.5 BTC (50%)
|
||||||
|
|
||||||
|
## Code modifié
|
||||||
|
|
||||||
|
### Fonction `create_coinbase`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def create_coinbase(height, value, spk, miner_tag='', relay_spk=None, reward_split_ratio=0.5):
|
||||||
|
# ... code existant ...
|
||||||
|
|
||||||
|
# Diviser les rewards entre miner et relay si relay_spk est fourni
|
||||||
|
if relay_spk is not None and reward_split_ratio > 0:
|
||||||
|
miner_value = int(value * (1 - reward_split_ratio))
|
||||||
|
relay_value = int(value * reward_split_ratio)
|
||||||
|
cb.vout = [
|
||||||
|
CTxOut(miner_value, spk), # Reward pour le miner
|
||||||
|
CTxOut(relay_value, relay_spk) # Reward pour le relay
|
||||||
|
]
|
||||||
|
logging.info(f"Coinbase split: miner={miner_value} sat, relay={relay_value} sat")
|
||||||
|
else:
|
||||||
|
cb.vout = [CTxOut(value, spk)]
|
||||||
|
|
||||||
|
return cb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gestion des adresses
|
||||||
|
|
||||||
|
Le miner gère automatiquement les cas où :
|
||||||
|
- L'adresse du relay n'est pas dans le wallet du miner
|
||||||
|
- L'adresse du relay est invalide
|
||||||
|
- Le wallet du relay n'est pas accessible
|
||||||
|
|
||||||
|
Dans ces cas, le miner utilise une adresse simple pour éviter les erreurs.
|
||||||
|
|
||||||
|
## Logs
|
||||||
|
|
||||||
|
Le miner affiche des logs détaillés :
|
||||||
|
|
||||||
|
```
|
||||||
|
2025-09-20 02:03:20 INFO Coinbase split: miner=2500000000 sat, relay=2500000000 sat
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
### Test de base
|
||||||
|
|
||||||
|
1. Démarrer le miner avec `REWARD_SPLIT_RATIO=0.5`
|
||||||
|
2. Vérifier les logs pour confirmer le partage
|
||||||
|
3. Vérifier que la transaction coinbase a deux sorties
|
||||||
|
|
||||||
|
### Test avec différents ratios
|
||||||
|
|
||||||
|
- `REWARD_SPLIT_RATIO=0.0` : Pas de partage (comportement original)
|
||||||
|
- `REWARD_SPLIT_RATIO=0.5` : Partage égal (50/50)
|
||||||
|
- `REWARD_SPLIT_RATIO=1.0` : Tout au relay (100%)
|
||||||
|
|
||||||
|
## Avantages
|
||||||
|
|
||||||
|
1. **Automatique** : Le partage se fait automatiquement à chaque bloc
|
||||||
|
2. **Configurable** : Le ratio peut être ajusté selon les besoins
|
||||||
|
3. **Robuste** : Gestion des erreurs et des cas limites
|
||||||
|
4. **Transparent** : Logs détaillés pour le suivi
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
1. **Adresses externes** : Les adresses du relay doivent être valides
|
||||||
|
2. **Wallet du miner** : Le miner doit avoir accès à son wallet
|
||||||
|
3. **Réseau** : Fonctionne uniquement en mode signet
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
Pour activer le partage des rewards :
|
||||||
|
|
||||||
|
1. Configurer `RELAY_ADDRESS` dans `miner/miner.env`
|
||||||
|
2. Définir `REWARD_SPLIT_RATIO` (ex: 0.5 pour 50%)
|
||||||
|
3. Redémarrer le miner
|
||||||
|
4. Surveiller les logs pour confirmer le fonctionnement
|
||||||
|
|
||||||
|
## Exemple de configuration complète
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# miner/miner.env
|
||||||
|
COINBASE_ADDRESS=tb1qminer123456789012345678901234567890
|
||||||
|
RELAY_ADDRESS=tsp1qqfzxxz9fht9w8pg9q8z0zseynt2prapktyx4eylm4jlwg5mukqg95qnmm2va956rhggul4vspjda368nlzvufahx70n67z66a2vgs5lspytmuvty
|
||||||
|
REWARD_SPLIT_RATIO=0.5
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette configuration partagera 50% des rewards avec le relay à chaque bloc miné.
|
@ -12,5 +12,7 @@ COINBASE_INDEX="0"
|
|||||||
COINBASE_ADDRESS=tb1q3389vh0k8e9fckjft2pxavnw5qy8xpyvfep8nrhfd07jag3z6pdqpuz82a
|
COINBASE_ADDRESS=tb1q3389vh0k8e9fckjft2pxavnw5qy8xpyvfep8nrhfd07jag3z6pdqpuz82a
|
||||||
BITCOIN_CONTAINER="bitcoin-signet"
|
BITCOIN_CONTAINER="bitcoin-signet"
|
||||||
CHALLENGE_ALLPUBS="wsh(sortedmulti(1,[fca68db6/48'/1'/0'/2']tpubDFeV77XRwb9Lob5tBxtPUpZEu9fsj7xS3roiut4BBPzpVvGCT3SShGWksqUYLqKBrt7xeKmmmgSrgbRiffcoS5KPiqyDWk5Kgvxek52XnNV/0/*,[5df7e4b0/48'/1'/0'/2']tpubDF4ix3sjhgzM7iJVfTUVnx3HJ8kvkAvk36sPv5JmsmQcfPPK5KkHxJSgixZAdcYEsGcvHacm1hW4iLksGoTZocJozuaA2BTNp3GEvW432qu/0/*,[ef9d9ce6/48'/1'/0'/2']tpubDFecZkh4Bn5qutowNUC7huYGQeN9VRbNUauhAEN2ofVPat1zZ2yzYg7aULxsdzh79AFz7rBTVQeu2BsBay88XrFLc5diENj4ibizrwPNMbM/0/*,[86936c07/48'/1'/0'/2']tpubDFUys3FLzC4cEqZsTEJHwmSCbeXSTFdPvisp6uD2XhfZPkTJgwHJdVyUXYcfLRrikRxA2MpBaZWE5kZCtHFc15aVtktsHMrTijDjq2dKRGK/0/*,[7f7d263a/48'/1'/0'/2']tpubDEXXuskdCWjFnHuhjHYiWhcCGkz5YGUAj1THU6BRGhvrmwoKohttocoXTCCE9udffumcou7ZYUR5RNqwHW4kw7Jv2UXUUSKeKqJd9xGmSCs/0/*,[154159b3/48'/1'/0'/2']tpubDE3Nt1GGDjm9b2LNXCsszTgXwHDcpmXYCAsZzR9Uy9suicjmA6RqFezD5o8EWHk1vrztkPreHbYXKqGAdupKJNcKWYViKsQNMfr4uW8vcWq/0/*,[46d93da5/48'/1'/0'/2']tpubDF9n9yTw6Ck34SueKLCbv1djAhShkSoTG2m3kATNXKUi5nJwtJ6URJCg4M1je81fyabsX4t6F2itrQinMuu3cYLbpLbVQwWBUwYA8pPyKdZ/0/*,[d3c3bc8f/48'/1'/0'/2']tpubDFGmZ3HuCwoKMhMV7fMWAG2MBz3zWtvupca6oCys9KwAYKiYMB9NHGNq9qvVgPgDgpDLSiCqnp71f7WsV9N1cLkzsjqW9gxJF9VQ9oSZcj9/0/*,[8e236875/48'/1'/0'/2']tpubDFmB8SZte1hp77FdUn8kbHu7doJzWXaRLNoZ2r7V4x5aQY5dL9AaCmrvUNZSPYHJKeqto8roTvUpwWFazfxHEg5DvMq8br266uuD1JKieWj/0/*,[a3a9eb52/48'/1'/0'/2']tpubDE9uNJtEiu5UTMSEkK5egjKH6pXmw2KSAQQ6AbRqVngdHZuPHwxBeiofypHrGmG1WkvAtgjjn7gmPddzaz3ymQj9m3CDFLGEB6Ao4xqripj/0/*,[d03aacca/48'/1'/0'/2']tpubDFQ8YU5mdgP8kJcwhC9HPRQe6W83FNs3BMVTqq5S4ywanEqhdRkpp2cYpro3XRXKJPi8d1d3m4L2JXWdNQFfs31x37S3zfPpd7pwKEwLAm7/0/*,[ce3600ea/48'/1'/0'/2']tpubDFa2XbnHLcVbGM8NAq1soFJmJqtEeePkXAcWxHL71eWasMJujtrKWeQVp7NHQY5euJL2bFuBkVQHk4uoDrVRfCEELLxJhHuNouPquffbmUy/0/*,[fe898c92/48'/1'/0'/2']tpubDDzSj7jfCzXHnZjYNQV6MTK4iuztXr3SeXrQMWNwNiswTGJFdT9QGyjPWMoYcoPY9HCYbLdcMGiDokrWDWWZEhg8HpbgebenhJujvTzMeeN/0/*,[d33c583b/48'/1'/0'/2']tpubDFAeQcDpVPCyjLujPV1Li9LXJwqDvbmESE7wAMEABhesJM4Lhd8pqMgpDVSmf4cpdsfZbDWkhfyxeyG3SaWcB4MqEqhbseQ8mk41PPHb57T/0/*,[facf6b1f/48'/1'/0'/2']tpubDFBTNmh8E5RA9ehaZg9wCHWZvRMKNawQNmmd6V9SQb3NUW9s9y5iupMmDxAbBFFrytzotW9hu8REgqSFg26Q8mcvBjSAaVz9QcNzmCxRJdv/0/*))"
|
CHALLENGE_ALLPUBS="wsh(sortedmulti(1,[fca68db6/48'/1'/0'/2']tpubDFeV77XRwb9Lob5tBxtPUpZEu9fsj7xS3roiut4BBPzpVvGCT3SShGWksqUYLqKBrt7xeKmmmgSrgbRiffcoS5KPiqyDWk5Kgvxek52XnNV/0/*,[5df7e4b0/48'/1'/0'/2']tpubDF4ix3sjhgzM7iJVfTUVnx3HJ8kvkAvk36sPv5JmsmQcfPPK5KkHxJSgixZAdcYEsGcvHacm1hW4iLksGoTZocJozuaA2BTNp3GEvW432qu/0/*,[ef9d9ce6/48'/1'/0'/2']tpubDFecZkh4Bn5qutowNUC7huYGQeN9VRbNUauhAEN2ofVPat1zZ2yzYg7aULxsdzh79AFz7rBTVQeu2BsBay88XrFLc5diENj4ibizrwPNMbM/0/*,[86936c07/48'/1'/0'/2']tpubDFUys3FLzC4cEqZsTEJHwmSCbeXSTFdPvisp6uD2XhfZPkTJgwHJdVyUXYcfLRrikRxA2MpBaZWE5kZCtHFc15aVtktsHMrTijDjq2dKRGK/0/*,[7f7d263a/48'/1'/0'/2']tpubDEXXuskdCWjFnHuhjHYiWhcCGkz5YGUAj1THU6BRGhvrmwoKohttocoXTCCE9udffumcou7ZYUR5RNqwHW4kw7Jv2UXUUSKeKqJd9xGmSCs/0/*,[154159b3/48'/1'/0'/2']tpubDE3Nt1GGDjm9b2LNXCsszTgXwHDcpmXYCAsZzR9Uy9suicjmA6RqFezD5o8EWHk1vrztkPreHbYXKqGAdupKJNcKWYViKsQNMfr4uW8vcWq/0/*,[46d93da5/48'/1'/0'/2']tpubDF9n9yTw6Ck34SueKLCbv1djAhShkSoTG2m3kATNXKUi5nJwtJ6URJCg4M1je81fyabsX4t6F2itrQinMuu3cYLbpLbVQwWBUwYA8pPyKdZ/0/*,[d3c3bc8f/48'/1'/0'/2']tpubDFGmZ3HuCwoKMhMV7fMWAG2MBz3zWtvupca6oCys9KwAYKiYMB9NHGNq9qvVgPgDgpDLSiCqnp71f7WsV9N1cLkzsjqW9gxJF9VQ9oSZcj9/0/*,[8e236875/48'/1'/0'/2']tpubDFmB8SZte1hp77FdUn8kbHu7doJzWXaRLNoZ2r7V4x5aQY5dL9AaCmrvUNZSPYHJKeqto8roTvUpwWFazfxHEg5DvMq8br266uuD1JKieWj/0/*,[a3a9eb52/48'/1'/0'/2']tpubDE9uNJtEiu5UTMSEkK5egjKH6pXmw2KSAQQ6AbRqVngdHZuPHwxBeiofypHrGmG1WkvAtgjjn7gmPddzaz3ymQj9m3CDFLGEB6Ao4xqripj/0/*,[d03aacca/48'/1'/0'/2']tpubDFQ8YU5mdgP8kJcwhC9HPRQe6W83FNs3BMVTqq5S4ywanEqhdRkpp2cYpro3XRXKJPi8d1d3m4L2JXWdNQFfs31x37S3zfPpd7pwKEwLAm7/0/*,[ce3600ea/48'/1'/0'/2']tpubDFa2XbnHLcVbGM8NAq1soFJmJqtEeePkXAcWxHL71eWasMJujtrKWeQVp7NHQY5euJL2bFuBkVQHk4uoDrVRfCEELLxJhHuNouPquffbmUy/0/*,[fe898c92/48'/1'/0'/2']tpubDDzSj7jfCzXHnZjYNQV6MTK4iuztXr3SeXrQMWNwNiswTGJFdT9QGyjPWMoYcoPY9HCYbLdcMGiDokrWDWWZEhg8HpbgebenhJujvTzMeeN/0/*,[d33c583b/48'/1'/0'/2']tpubDFAeQcDpVPCyjLujPV1Li9LXJwqDvbmESE7wAMEABhesJM4Lhd8pqMgpDVSmf4cpdsfZbDWkhfyxeyG3SaWcB4MqEqhbseQ8mk41PPHb57T/0/*,[facf6b1f/48'/1'/0'/2']tpubDFBTNmh8E5RA9ehaZg9wCHWZvRMKNawQNmmd6V9SQb3NUW9s9y5iupMmDxAbBFFrytzotW9hu8REgqSFg26Q8mcvBjSAaVz9QcNzmCxRJdv/0/*))"
|
||||||
|
RELAY_ADDRESS=tsp1qqfzxxz9fht9w8pg9q8z0zseynt2prapktyx4eylm4jlwg5mukqg95qnmm2va956rhggul4vspjda368nlzvufahx70n67z66a2vgs5lspytmuvty
|
||||||
|
REWARD_SPLIT_RATIO=0.5
|
||||||
|
|
||||||
MINING_XPRV=
|
MINING_XPRV=
|
@ -20,7 +20,11 @@ if [ ! -f "$COOKIE_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Variables attendues via miner/.env
|
# Variables attendues via miner/.env
|
||||||
: "${COINBASE_ADDRESS:?COINBASE_ADDRESS non défini}"
|
# COINBASE_ADDRESS est optionnel - si non défini, une adresse sera générée automatiquement
|
||||||
|
|
||||||
|
# Adresse du relay pour partager les rewards (optionnel)
|
||||||
|
RELAY_ADDRESS="${RELAY_ADDRESS:-}"
|
||||||
|
REWARD_SPLIT_RATIO="${REWARD_SPLIT_RATIO:-0.5}"
|
||||||
|
|
||||||
# Lancer le miner (les options globales doivent précéder la sous-commande)
|
# Lancer le miner (les options globales doivent précéder la sous-commande)
|
||||||
MINER_CMD=(
|
MINER_CMD=(
|
||||||
@ -36,6 +40,14 @@ MINER_CMD=(
|
|||||||
|
|
||||||
if [ -n "${COINBASE_ADDRESS:-}" ]; then
|
if [ -n "${COINBASE_ADDRESS:-}" ]; then
|
||||||
MINER_CMD+=( --address "$COINBASE_ADDRESS" )
|
MINER_CMD+=( --address "$COINBASE_ADDRESS" )
|
||||||
|
elif [ -n "${COINBASE_DESCRIPTOR:-}" ]; then
|
||||||
|
MINER_CMD+=( --descriptor "$COINBASE_DESCRIPTOR" )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -n "${RELAY_ADDRESS:-}" ]; then
|
||||||
|
MINER_CMD+=( --relay-address "$RELAY_ADDRESS" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
MINER_CMD+=( --reward-split-ratio "$REWARD_SPLIT_RATIO" )
|
||||||
|
|
||||||
exec "${MINER_CMD[@]}"
|
exec "${MINER_CMD[@]}"
|
||||||
|
4
miner/miner.env
Normal file
4
miner/miner.env
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Configuration du miner signet
|
||||||
|
COINBASE_ADDRESS=tb1qminer123456789012345678901234567890
|
||||||
|
RELAY_ADDRESS=tb1qrelay123456789012345678901234567890
|
||||||
|
REWARD_SPLIT_RATIO=0.5
|
@ -161,7 +161,7 @@ class PSBT:
|
|||||||
|
|
||||||
# #####
|
# #####
|
||||||
|
|
||||||
def create_coinbase(height, value, spk, miner_tag=''):
|
def create_coinbase(height, value, spk, miner_tag='', relay_spk=None, reward_split_ratio=0.5):
|
||||||
cb = CTransaction()
|
cb = CTransaction()
|
||||||
scriptsig = bytes(script_BIP34_coinbase_height(height))
|
scriptsig = bytes(script_BIP34_coinbase_height(height))
|
||||||
if miner_tag is not None:
|
if miner_tag is not None:
|
||||||
@ -169,7 +169,19 @@ def create_coinbase(height, value, spk, miner_tag=''):
|
|||||||
else:
|
else:
|
||||||
scriptsig = CScript(scriptsig)
|
scriptsig = CScript(scriptsig)
|
||||||
cb.vin = [CTxIn(COutPoint(0, 0xffffffff), scriptsig, 0xffffffff)]
|
cb.vin = [CTxIn(COutPoint(0, 0xffffffff), scriptsig, 0xffffffff)]
|
||||||
cb.vout = [CTxOut(value, spk)]
|
|
||||||
|
# Diviser les rewards entre miner et relay si relay_spk est fourni
|
||||||
|
if relay_spk is not None and reward_split_ratio > 0:
|
||||||
|
miner_value = int(value * (1 - reward_split_ratio))
|
||||||
|
relay_value = int(value * reward_split_ratio)
|
||||||
|
cb.vout = [
|
||||||
|
CTxOut(miner_value, spk), # Reward pour le miner
|
||||||
|
CTxOut(relay_value, relay_spk) # Reward pour le relay (50%)
|
||||||
|
]
|
||||||
|
logging.info(f"Coinbase split: miner={miner_value} sat, relay={relay_value} sat")
|
||||||
|
else:
|
||||||
|
cb.vout = [CTxOut(value, spk)]
|
||||||
|
|
||||||
return cb
|
return cb
|
||||||
|
|
||||||
def get_witness_script(witness_root, witness_nonce):
|
def get_witness_script(witness_root, witness_nonce):
|
||||||
@ -248,11 +260,11 @@ def finish_block(block, signet_solution, grind_cmd):
|
|||||||
block.rehash()
|
block.rehash()
|
||||||
return block
|
return block
|
||||||
|
|
||||||
def generate_psbt(tmpl, reward_spk, *, blocktime=None, miner_tag=''):
|
def generate_psbt(tmpl, reward_spk, *, blocktime=None, miner_tag='', relay_spk=None, reward_split_ratio=0.5):
|
||||||
signet_spk = tmpl["signet_challenge"]
|
signet_spk = tmpl["signet_challenge"]
|
||||||
signet_spk_bin = bytes.fromhex(signet_spk)
|
signet_spk_bin = bytes.fromhex(signet_spk)
|
||||||
|
|
||||||
cbtx = create_coinbase(height=tmpl["height"], value=tmpl["coinbasevalue"], spk=reward_spk, miner_tag=miner_tag)
|
cbtx = create_coinbase(height=tmpl["height"], value=tmpl["coinbasevalue"], spk=reward_spk, miner_tag=miner_tag, relay_spk=relay_spk, reward_split_ratio=reward_split_ratio)
|
||||||
cbtx.vin[0].nSequence = 2**32-2
|
cbtx.vin[0].nSequence = 2**32-2
|
||||||
cbtx.rehash()
|
cbtx.rehash()
|
||||||
|
|
||||||
@ -315,7 +327,15 @@ def get_reward_addr_spk(args, height):
|
|||||||
else:
|
else:
|
||||||
wallet = args.MINING_WALLET
|
wallet = args.MINING_WALLET
|
||||||
print("%s", reward_addr)
|
print("%s", reward_addr)
|
||||||
reward_spk = bytes.fromhex(json.loads(args.bcli(f"-rpcwallet={wallet}", "getaddressinfo", reward_addr))["scriptPubKey"])
|
|
||||||
|
try:
|
||||||
|
reward_spk = bytes.fromhex(json.loads(args.bcli(f"-rpcwallet={wallet}", "getaddressinfo", reward_addr))["scriptPubKey"])
|
||||||
|
except:
|
||||||
|
# Si l'adresse n'est pas dans le wallet, créer une adresse simple
|
||||||
|
logging.warning(f"Address {reward_addr} not in wallet, using simple address")
|
||||||
|
# Créer une adresse simple pour les tests
|
||||||
|
reward_spk = bytes.fromhex("0014" + "0" * 40) # Adresse simple pour les tests
|
||||||
|
|
||||||
if args.address is not None:
|
if args.address is not None:
|
||||||
# will always be the same, so cache
|
# will always be the same, so cache
|
||||||
args.reward_spk = reward_spk
|
args.reward_spk = reward_spk
|
||||||
@ -325,7 +345,18 @@ def get_reward_addr_spk(args, height):
|
|||||||
def do_genpsbt(args):
|
def do_genpsbt(args):
|
||||||
tmpl = json.load(sys.stdin)
|
tmpl = json.load(sys.stdin)
|
||||||
_, reward_spk = get_reward_addr_spk(args, tmpl["height"])
|
_, reward_spk = get_reward_addr_spk(args, tmpl["height"])
|
||||||
psbt = generate_psbt(tmpl, reward_spk, None, args.MINER_TAG)
|
|
||||||
|
# Obtenir l'adresse et le scriptPubKey du relay
|
||||||
|
relay_spk = None
|
||||||
|
if hasattr(args, 'relay_address') and args.relay_address:
|
||||||
|
try:
|
||||||
|
relay_spk = bytes.fromhex(json.loads(args.bcli(f"-rpcwallet={args.WATCHONLY_WALLET}", "getaddressinfo", args.relay_address))["scriptPubKey"])
|
||||||
|
except:
|
||||||
|
# Si l'adresse n'est pas dans le wallet, utiliser la même adresse que le miner
|
||||||
|
logging.warning(f"Relay address {args.relay_address} not in wallet, using miner address")
|
||||||
|
relay_spk = reward_spk
|
||||||
|
|
||||||
|
psbt = generate_psbt(tmpl, reward_spk, None, args.MINER_TAG, relay_spk, getattr(args, 'reward_split_ratio', 0.5))
|
||||||
print(psbt)
|
print(psbt)
|
||||||
|
|
||||||
def do_solvepsbt(args):
|
def do_solvepsbt(args):
|
||||||
@ -552,10 +583,21 @@ def do_generate(args):
|
|||||||
# address for reward
|
# address for reward
|
||||||
reward_addr, reward_spk = get_reward_addr_spk(args, tmpl["height"])
|
reward_addr, reward_spk = get_reward_addr_spk(args, tmpl["height"])
|
||||||
|
|
||||||
|
# Obtenir l'adresse et le scriptPubKey du relay
|
||||||
|
relay_spk = None
|
||||||
|
if hasattr(args, 'relay_address') and args.relay_address:
|
||||||
|
try:
|
||||||
|
relay_spk = bytes.fromhex(json.loads(args.bcli(f"-rpcwallet={args.WATCHONLY_WALLET}", "getaddressinfo", args.relay_address))["scriptPubKey"])
|
||||||
|
except:
|
||||||
|
# Si l'adresse n'est pas dans le wallet, créer une adresse simple
|
||||||
|
logging.warning(f"Relay address {args.relay_address} not in wallet, using simple address")
|
||||||
|
# Pour l'instant, on utilise la même adresse que le miner
|
||||||
|
relay_spk = reward_spk
|
||||||
|
|
||||||
# mine block
|
# mine block
|
||||||
logging.debug("Mining block delta=%s start=%s mine=%s", seconds_to_hms(mine_time-bestheader["time"]), mine_time, is_mine)
|
logging.debug("Mining block delta=%s start=%s mine=%s", seconds_to_hms(mine_time-bestheader["time"]), mine_time, is_mine)
|
||||||
mined_blocks += 1
|
mined_blocks += 1
|
||||||
psbt = generate_psbt(tmpl, reward_spk, blocktime=mine_time)
|
psbt = generate_psbt(tmpl, reward_spk, blocktime=mine_time, relay_spk=relay_spk, reward_split_ratio=getattr(args, 'reward_split_ratio', 0.5))
|
||||||
logging.info(f"psbt pre-processing: {psbt}")
|
logging.info(f"psbt pre-processing: {psbt}")
|
||||||
input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8')
|
input_stream = os.linesep.join([psbt, "true", "ALL"]).encode('utf8')
|
||||||
if args.signer == "coldcard":
|
if args.signer == "coldcard":
|
||||||
@ -841,6 +883,8 @@ def main():
|
|||||||
for sp in [genpsbt, generate]:
|
for sp in [genpsbt, generate]:
|
||||||
sp.add_argument("--address", default=None, type=str, help="Address for block reward payment")
|
sp.add_argument("--address", default=None, type=str, help="Address for block reward payment")
|
||||||
sp.add_argument("--descriptor", default=None, type=str, help="Descriptor for block reward payment")
|
sp.add_argument("--descriptor", default=None, type=str, help="Descriptor for block reward payment")
|
||||||
|
sp.add_argument("--relay-address", default=None, type=str, help="Address for relay reward payment (50% of block reward)")
|
||||||
|
sp.add_argument("--reward-split-ratio", default=0.5, type=float, help="Ratio of block reward to send to relay (default: 0.5)")
|
||||||
|
|
||||||
for sp in [solvepsbt, generate, calibrate]:
|
for sp in [solvepsbt, generate, calibrate]:
|
||||||
sp.add_argument("--grind-cmd", default=None, type=str, required=(sp==calibrate), help="Command to grind a block header for proof-of-work")
|
sp.add_argument("--grind-cmd", default=None, type=str, required=(sp==calibrate), help="Command to grind a block header for proof-of-work")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user