Come fa a prevenirlo, se ho solo un UTXO da 2 BTC e faccio una trx di 1 BTC al bar e prima che questa venga confermata (min 10 minuti) ne faccio una da 1.4 BTC al supermarket il wallet come me la impedisce?
Questa domanda mi fa capire che ti manca proprio capire come funzionano le transazioni, provo a spiegartelo:
Quando invii una tx, prendi una tx in ingresso UTXO e la spendi tutta. Quello che non spendi e' la fee per pagare il miner. Quindi
se tu hai un UTXO(A) da 2btc, devi spendere 2btc.
Se devi pagare un prodotto o servizio che vale 1.4btc, nella tx che fai ci saranno 2 output, uno da 1.4btc per pagare il prodotto, e uno da 0.5999btc che e' il resto che ti mandi ad un'altro indirizzo tuo. il restante 0.0001 e' la fee che paghi hai miner.
Quindi nel tuo wallet avrai un nuovo UTXO(B) da 0.5999.
Il tuo wallet ti impedisce di spendere nuovamente l'UTXO(A) vecchio da 2btc, e se cerchi di taroccare il wallet per spenderlo lo stesso, gli altri nodi della rete rifiuteranno la nuova tx, perche' considereranno l'output come già speso.
Cosa succede
se ad esempio metti poche fee:La tua tx che spende l'UTXO(A) non verra' mai confermata, e quindi rimarrà nella mempool per un certo tempo fino a quando gli altri nodi non decideranno di dimenticarsene. Fino a quando la tx che spende l'UTXO(A) rimane in mempool i nodi rifiuteranno tutte le transazioni successive che provano a spendere l'UTXO(A).
Il tuo nodo comunque continua a fare il broadcast della tx che spende l'UTXO(A), quindi se tieni il tuo nodo acceso, e non gli dici di dimenticarsi la tx che spende l'UTXO(A) questa rimarrà nella mempool a vita senza venire mai confermata e quindi bloccandoti il capitale.
Dire al wallet, e alla rete di dimenticarsi una tx inviata, non e' mai stata una operazione semplice, e il dover aspettare che tutti gli altri nodi della rete decidano di dimenticarsi della tua tx ha creato parecchi problemi agli utenti, soprattutto quando i blocchi hanno cominciato ad essere pieni, visto che c'e' stata una vera e propria corsa ad incrementare le fee.
Allora sono state introdotte due nuove tecniche per semplificare la situazione.
La prima tecnica si chiama CPFP(child pay for parent), ovvero tu, o la persona a cui mandi l'1.4btc, potete fare una nuova tx, utilizzando l'UTXO(B) mettendo delle fee talmente alte che spingano il miner ad includere in un blocco anche la tx vecchia, confermando quindi anche quella che spende l'UTXO(A).
La seconda tecnica si chiama RBF(replace by fee), e consiste nel marcare la tx che spende l'UTXO(A) come rimpiazzabile, quindi non definitiva, quel flag quindi dice agli altri nodi di accettare una nuova tx che spende l'UTXO(A) a patto che quella nuova abbia piu' fee di quella vecchia. In questo caso il nodo che riceve il doublespend si dimentica della tx vecchia e tiene solo la nuova.
Si quello immaginavo, ma intendo in via teorica.
il doublespend(fraudolento) puo' essere fatto solo sulle transazioni non confermate, che non sono state quindi inserite in nessun blocco, e di solito
e' fattibile solo se la tx non e' stata marcata con il tag replaceable che quindi viene considerata definitiva.
Devi convincere il destinatario ad erogare il servizio anche a fronte di una tx non confermata. Nessun destinatario accetterà mai di erogare un servizio a fronte di una tx non confermata marcata come replaceable, quindi non definitiva.
Per effettuare un doublespend(fraudolento) in linea teorica, ci sono vari modi, la maniera piu' semplice da capire, secondo me, e' utilizzare due nodi e si procede così:
Analizzi un attimo la rete per capire dove sta il destinatario e dove stanno i miner.
Con un nodo ti colleghi direttamente al nodo del destinatario, e solo a lui, e gli fai il broadcast di una tx dove lo paghi.
Contemporaneamente, con un secondo nodo, ti colleghi a piu' nodi possibile, possibilmente direttamente ai miner, e fai il broadcast di un'altra tx che spende lo stesso UTXO pero' metti come output solo un indirizzo controllato da te.
Il tuo obiettivo e' fare in modo che i miner vedano per prima la tx che ha come output solo il tuo indirizzo, includendo quella nel blocco e invalidando la tx con cui paghi il destinatario.