Questo programma permette di generare diversi tipi di indirizzi Bitcoin in modo semplice e interattivo. L'output prodotto include chiavi private, chiavi pubbliche, indirizzi e formati WIF, e può essere salvato in file JSON.
Per la verifica della validità degli indirizzi, è stato utilizzato lo strumento esterno [SecretScan](https://secretscan.org/).
Attualmente il programma supporta i seguenti tipi di indirizzi:
- **P2PK (Pay-to-PubKey)**
- **P2PKH (Pay-to-PubKey-Hash)**
- **P2SH (Pay-to-Script-Hash, con supporto multisig)**
Ogni script è indipendente (`backend/p2pk.py`, `backend/p2pkh.py`, `backend/p2sh.py`, `backend/p2wpkh.py`, `backend/p2tr.py`) e implementa le regole specifiche del relativo standard Bitcoin.
- **Standard**: Formato originale di Bitcoin, definito nel whitepaper di Satoshi Nakamoto
- **Formato indirizzo**: Non ha un formato di indirizzo standard, usa direttamente la chiave pubblica
- **Script**: `<pubkey> OP_CHECKSIG`
- **Pro**: molto semplice, rappresenta direttamente la chiave pubblica, dimensioni di transazione minime
- **Contro**: obsoleto, non compatibile con la maggior parte dei wallet moderni. Espone la chiave pubblica subito alla blockchain, vulnerabile agli attacchi quantistici
- **Uso attuale**: Principalmente per coinbase transactions e casi molto specifici
### 2. P2PKH (Pay-to-PubKey-Hash)
- **Standard**: BIP-13 (Base58Check), formato legacy standard
- **Formato indirizzo**: Inizia con '1' (mainnet), 'm' o 'n' (testnet)
- **Codifica**: Base58Check con prefisso 0x00 (mainnet)
- **Pro**: è lo standard "legacy", molto diffuso, supportato da tutti i wallet ed exchange. Protezione contro attacchi quantistici (hash della chiave pubblica)
- **Contro**: gli indirizzi sono più lunghi e le fee di transazione sono più alte rispetto a quelli più moderni (SegWit), dimensioni di transazione maggiori
- **Formato indirizzo**: Inizia con '3' (mainnet), '2' (testnet/regtest)
- **Script**: `OP_HASH160 <script_hash> OP_EQUAL`
- **Codifica**: Base58Check con prefisso 0x05 (mainnet), 0xC4 (testnet/regtest)
- **Pro**: permette indirizzi basati su script arbitrari, ideale per multisig e contratti complessi. Supportato da tutti i wallet moderni. Maggiore flessibilità e funzionalità avanzate
- **Contro**: le fee sono leggermente più alte rispetto ai singoli indirizzi e richiede la rivelazione dello script al momento della spesa. Dimensioni di transazione maggiori per il redeem script
**Implementazione attuale: Multisig**
Attualmente il supporto P2SH è limitato agli script multisig, che rappresentano il caso d'uso più comune per P2SH.
**Opzioni disponibili per l'utente:**
- **Configurazione m-of-n**: l'utente può scegliere quante firme sono richieste (m) su un totale di chiavi (n)
- Esempi: 2-of-3, 3-of-5, 1-of-2, ecc.
- Limite: 1 ≤ m ≤ n ≤ 16
- **Rete**: mainnet, testnet, regtest
- **Chiavi compresse**: opzione per utilizzare chiavi pubbliche compresse (33 byte) o non compresse (65 byte)
- **Ordinamento BIP67**: le chiavi pubbliche vengono automaticamente ordinate per evitare malleabilità
**Funzionalità implementate:**
- Generazione automatica di n coppie di chiavi (privata/pubblica)
- Creazione del redeem script multisig
- Calcolo dell'hash160 del redeem script
- Generazione dell'indirizzo P2SH finale
- Output JSON strutturato con tutti i dati necessari
- Esportazione delle chiavi private in formato WIF
- Salvataggio completo in file JSON per backup e utilizzo futuro
- **Witness Program**: versione 0, 20 bytes (hash160 della chiave pubblica)
- **Pro**: riduce le fee grazie al formato SegWit (witness data separato), indirizzi più compatti, supportato da quasi tutti i wallet moderni, protezione contro transaction malleability
- **Contro**: non tutti i vecchi servizi accettano Bech32, richiede supporto SegWit
- **Witness Program**: versione 1, 32 bytes (tweaked public key)
- **Pro**: sono i più recenti, con maggiore privacy e flessibilità (supporta script complessi nascosti dietro un singolo indirizzo). Le fee sono basse, firme Schnorr più efficienti, aggregazione delle firme
- **Contro**: ancora relativamente nuovo, non supportato da tutti i servizi, complessità implementativa maggiore
### In sviluppo
- **P2SH (Pay-to-Script-Hash)**: permette indirizzi basati su script arbitrari, molto usato per multisig e contratti complessi.
- **P2WSH (Pay-to-Witness-Script-Hash)**: versione SegWit del P2SH, più efficiente e sicura.
Per eseguire l'app in modalità sviluppo è necessario avere l'ambiente virtuale Python attivo, altrimenti il backend non trova le dipendenze (es. `fastapi`).
1. Attiva il venv e installa i requisiti (se non l'hai già fatto):
La GUI desktop è unita (frontend + backend) tramite Electron. Il build va eseguito sulla stessa architettura del sistema target (ARM su Raspberry, x86_64 su PC).
1. Installa le dipendenze:
```bash
npm install
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
2. Build completo per l'architettura corrente:
```bash
npm run build
```
3. Oppure build esplicito per architettura:
```bash
npm run build:linux:arm64
npm run build:linux:x64
```
4. Trovi l'AppImage in `release/`.
Nota su x86_64: per eseguire l'AppImage serve FUSE v2 (`libfuse2`).
Nota: non è possibile creare un singolo eseguibile che funzioni sia su ARM che su x86_64. Servono build separate.