ncantu 970b06ee8f Fix: Automatic UTXO provisioning on each Bitcoin anchor transaction
**Motivations:**
- Fix insufficient UTXO amount error in anchor API
- Ensure continuous availability of usable UTXOs for anchor transactions
- Improve anchor transaction reliability and efficiency

**Root causes:**
- UTXO selection logic was too restrictive, rejecting UTXOs larger than needed
- No automatic provisioning of new usable UTXOs when existing ones were not suitable
- Algorithm prevented efficient use of available UTXOs

**Correctifs:**
- Refactored createAnchorTransaction() to provision 7 UTXOs of 2500 sats on each anchor
- Use single large UTXO to create 1 anchor output + 7 provisioning outputs + change
- Simplified UTXO selection: single large UTXO per transaction instead of multiple small ones
- Added UTXO provisioning logic in signet-dashboard
- Enhanced Bitcoin RPC methods in both api-anchorage and signet-dashboard
- Added documentation in fixKnowledge/api-anchorage-utxo-provisioning.md

**Evolutions:**
- Enhanced signet-dashboard with new pages (hash-list, utxo-list, join-signet, api-docs)
- Improved Bitcoin RPC client with better error handling and UTXO management
- Added cache files for hash and UTXO lists
- Updated api-faucet with improved server configuration
- Enhanced anchor count tracking

**Pages affectées:**
- api-anchorage/src/bitcoin-rpc.js: Complete refactor of createAnchorTransaction()
- api-anchorage/src/routes/anchor.js: Enhanced anchor route
- api-anchorage/src/server.js: Server configuration updates
- signet-dashboard/src/bitcoin-rpc.js: Added comprehensive Bitcoin RPC client
- signet-dashboard/src/server.js: Enhanced server with new routes
- signet-dashboard/public/: Added new HTML pages and updated app.js
- api-faucet/src/server.js: Server improvements
- api-faucet/README.md: Documentation updates
- fixKnowledge/api-anchorage-utxo-provisioning.md: New documentation
- anchor_count.txt, hash_list.txt, utxo_list.txt: Tracking files
2026-01-25 14:25:49 +01:00

429 lines
15 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rejoindre le Réseau Signet Custom - Bitcoin Ancrage</title>
<link rel="stylesheet" href="styles.css">
<script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js"></script>
<script>
// Vérifier que la bibliothèque QRCode est chargée
window.addEventListener('load', function() {
if (typeof QRCode === 'undefined') {
console.error('Bibliothèque QRCode non chargée');
} else {
console.log('Bibliothèque QRCode chargée');
}
});
</script>
<style>
.join-section {
margin-bottom: 40px;
}
.config-section {
background: var(--card-background);
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
}
.config-section h2 {
color: var(--primary-color);
margin-bottom: 20px;
font-size: 1.8em;
}
.config-code {
background: #1e1e1e;
color: #d4d4d4;
padding: 20px;
border-radius: 5px;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.6;
overflow-x: auto;
white-space: pre;
margin: 20px 0;
}
.copy-button {
background: var(--primary-color);
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 1em;
margin-top: 10px;
transition: background 0.3s;
}
.copy-button:hover {
background: #e0820d;
}
.copy-button:active {
transform: scale(0.98);
}
.payment-section {
background: var(--card-background);
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
text-align: center;
}
.payment-section h2 {
color: var(--primary-color);
margin-bottom: 20px;
font-size: 1.8em;
}
.payment-info {
margin: 20px 0;
}
.payment-amount {
font-size: 1.5em;
font-weight: bold;
color: var(--primary-color);
margin: 10px 0;
}
.payment-address {
font-family: 'Courier New', monospace;
background: #f5f5f5;
padding: 15px;
border-radius: 5px;
margin: 15px 0;
word-break: break-all;
font-size: 0.9em;
}
.qr-code-container {
margin: 30px 0;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
#qrcode {
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.wallet-section {
background: var(--card-background);
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
}
.wallet-section h2 {
color: var(--primary-color);
margin-bottom: 20px;
font-size: 1.8em;
}
.wallet-checkbox {
display: flex;
align-items: center;
margin: 20px 0;
padding: 15px;
background: #f5f5f5;
border-radius: 5px;
}
.wallet-checkbox input[type="checkbox"] {
width: 20px;
height: 20px;
margin-right: 15px;
cursor: pointer;
}
.wallet-checkbox label {
cursor: pointer;
font-size: 1.1em;
}
.info-box {
background: #e7f3ff;
border-left: 4px solid #2196F3;
padding: 15px;
margin: 20px 0;
border-radius: 5px;
}
.info-box p {
margin: 5px 0;
}
.success-message {
background: #d4edda;
border-left: 4px solid var(--success-color);
padding: 15px;
margin: 20px 0;
border-radius: 5px;
color: #155724;
display: none;
}
.back-link {
display: inline-block;
margin-bottom: 20px;
color: var(--primary-color);
text-decoration: none;
font-weight: bold;
}
.back-link:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<a href="/" class="back-link">← Retour au Dashboard</a>
<header>
<h1>Rejoindre le Réseau Signet Custom</h1>
<p class="subtitle">Configuration et accès au réseau Bitcoin Signet personnalisé</p>
</header>
<main>
<!-- Section Configuration -->
<section class="join-section">
<div class="config-section">
<h2>📋 Configuration bitcoin.conf</h2>
<p>Copiez cette configuration dans votre fichier <code>bitcoin.conf</code> pour rejoindre le réseau Signet custom :</p>
<div class="config-code" id="bitcoin-config">signet=1
txindex=1
blockfilterindex=1
peerblockfilters=1
coinstatsindex=1
dnsseed=0
persistmempool=1
uacomment=CustomSignet
[signet]
daemon=1
listen=1
server=1
discover=1
signetchallenge=5121028b8d4cea1b3d8582babc8405bc618fbbb281c0f64e6561aa85968251931cd0a651ae
rpcbind=0.0.0.0:38332
rpcallowip=0.0.0.0/0
whitelist=0.0.0.0/0
fallbackfee=0.0002
addnode=anchorage.certificator.4nkweb.com:38333</div>
<button class="copy-button" onclick="copyConfig()">📋 Copier la configuration</button>
<div class="info-box">
<p><strong>Note importante :</strong></p>
<p>• Remplacez <code>rpcuser</code> et <code>rpcpassword</code> par vos propres identifiants RPC</p>
<p>• Le port P2P par défaut est <code>38333</code></p>
<p>• Le port RPC par défaut est <code>38332</code></p>
<p>• L'adresse <code>anchorage.certificator.4nkweb.com:38333</code> est le nœud principal du réseau</p>
</div>
</div>
</section>
<!-- Section Paiement -->
<section class="join-section">
<div class="payment-section">
<h2>💳 Accès au Wallet de Mining</h2>
<p>Pour recevoir le wallet de mining et les clés nécessaires pour miner sur le réseau, effectuez un paiement de :</p>
<div class="payment-amount">0,0065 BTC</div>
<p>à l'adresse suivante :</p>
<div class="payment-address" id="payment-address">bc1qerauk5yhqytl6z93ckvwkylup8s0256uenzg9y</div>
<button class="copy-button" onclick="copyAddress()">📋 Copier l'adresse</button>
<div class="qr-code-container">
<div id="qrcode"></div>
</div>
<div class="wallet-checkbox">
<input type="checkbox" id="wallet-request" onchange="updatePaymentMessage()">
<label for="wallet-request">Je souhaite recevoir le wallet de mining après le paiement</label>
</div>
<div class="info-box" id="payment-info">
<p><strong>Instructions :</strong></p>
<p>1. Effectuez le paiement de 0,0065 BTC à l'adresse ci-dessus</p>
<p>2. Cochez la case ci-dessus si vous souhaitez recevoir le wallet de mining</p>
<p>3. Après confirmation du paiement, vous recevrez les informations nécessaires</p>
</div>
<div class="success-message" id="payment-success">
<p><strong>✅ Paiement reçu !</strong></p>
<p>Votre demande a été enregistrée. Vous recevrez le wallet de mining sous peu.</p>
</div>
</div>
</section>
<!-- Section Informations Supplémentaires -->
<section class="join-section">
<div class="wallet-section">
<h2> Informations Supplémentaires</h2>
<div class="info-box">
<p><strong>Qu'est-ce que le wallet de mining ?</strong></p>
<p>Le wallet de mining contient :</p>
<ul style="margin-left: 20px; margin-top: 10px;">
<li>La clé privée (PRIVKEY) nécessaire pour miner des blocs</li>
<li>Les paramètres de configuration pour le mining (NBITS, BLOCKPRODUCTIONDELAY)</li>
<li>Les instructions complètes pour configurer votre nœud en mode mining</li>
</ul>
</div>
<div class="info-box">
<p><strong>Que se passe-t-il après le paiement ?</strong></p>
<p>Une fois le paiement confirmé (généralement après 1 confirmation), vous recevrez par email :</p>
<ul style="margin-left: 20px; margin-top: 10px;">
<li>Les fichiers de configuration complets</li>
<li>La clé privée du signet (si vous avez coché la case)</li>
<li>Les instructions détaillées pour démarrer votre nœud</li>
</ul>
</div>
<div class="info-box">
<p><strong>Besoin d'aide ?</strong></p>
<p>Pour toute question, consultez la documentation complète dans le dépôt GitHub ou contactez l'équipe.</p>
</div>
</div>
</section>
</main>
<footer>
<p>Bitcoin Ancrage Dashboard - Équipe 4NK</p>
</footer>
</div>
<script>
const PAYMENT_ADDRESS = 'bc1qerauk5yhqytl6z93ckvwkylup8s0256uenzg9y';
const PAYMENT_AMOUNT = 0.0065;
// Générer le QR code au chargement de la page
function initQRCode() {
// Attendre que le DOM soit prêt et que la bibliothèque soit chargée
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', generateQRCode);
} else {
// Si le DOM est déjà chargé, attendre un peu pour la bibliothèque
setTimeout(generateQRCode, 100);
}
}
function generateQRCode() {
const qrElement = document.getElementById('qrcode');
if (!qrElement) {
console.error('Élément QR code non trouvé');
return;
}
// Vérifier que la bibliothèque QRCode est disponible
if (typeof QRCode === 'undefined') {
console.error('Bibliothèque QRCode non disponible, réessai...');
setTimeout(generateQRCode, 500);
return;
}
const paymentURI = `bitcoin:${PAYMENT_ADDRESS}?amount=${PAYMENT_AMOUNT}`;
// Vider l'élément avant de générer le QR code
qrElement.innerHTML = '';
// Utiliser toCanvas avec l'élément directement (QRCode créera le canvas)
QRCode.toCanvas(qrElement, paymentURI, {
width: 300,
margin: 2,
color: {
dark: '#000000',
light: '#FFFFFF'
}
}, (error) => {
if (error) {
console.error('Erreur lors de la génération du QR code:', error);
qrElement.innerHTML = '<p style="color: red; padding: 20px;">Erreur lors de la génération du QR code. Veuillez recharger la page.</p>';
} else {
console.log('QR code généré avec succès');
}
});
}
// Initialiser le QR code
initQRCode();
function copyConfig() {
const configText = document.getElementById('bitcoin-config')?.textContent || '';
navigator.clipboard.writeText(configText).then(() => {
const button = event?.target;
if (button) {
const originalText = button.textContent;
button.textContent = '✅ Copié !';
setTimeout(() => {
button.textContent = originalText;
}, 2000);
}
}).catch(err => {
console.error('Erreur lors de la copie:', err);
alert('Erreur lors de la copie. Veuillez sélectionner et copier manuellement.');
});
}
function copyAddress() {
navigator.clipboard.writeText(PAYMENT_ADDRESS).then(() => {
const button = event?.target;
if (button) {
const originalText = button.textContent;
button.textContent = '✅ Copié !';
setTimeout(() => {
button.textContent = originalText;
}, 2000);
}
}).catch(err => {
console.error('Erreur lors de la copie:', err);
alert('Erreur lors de la copie. Veuillez sélectionner et copier manuellement.');
});
}
function updatePaymentMessage() {
const checkbox = document.getElementById('wallet-request');
const paymentInfo = document.getElementById('payment-info');
if (checkbox && paymentInfo) {
if (checkbox.checked) {
paymentInfo.innerHTML = `
<p><strong>Instructions :</strong></p>
<p>1. Effectuez le paiement de 0,0065 BTC à l'adresse ci-dessus</p>
<p>2. ✅ Vous recevrez le wallet de mining après confirmation du paiement</p>
<p>3. Les informations vous seront envoyées par email</p>
`;
} else {
paymentInfo.innerHTML = `
<p><strong>Instructions :</strong></p>
<p>1. Effectuez le paiement de 0,0065 BTC à l'adresse ci-dessus</p>
<p>2. Cochez la case ci-dessus si vous souhaitez recevoir le wallet de mining</p>
<p>3. Après confirmation du paiement, vous recevrez les informations nécessaires</p>
`;
}
}
}
</script>
</body>
</html>