Author

Topic: Wallet e double spending (Read 181 times)

member
Activity: 168
Merit: 47
8426 2618 9F5F C7BF 22BD E814 763A 57A1 AA19 E681
June 15, 2018, 06:58:58 AM
#10

Ok quindi una volta che la trx ha raggiunto tutti i nodi non è possibile fare doublespend corretto?

No, e' sempre possibile fare doublespend. Sempre!!!!! anche dopo che la transazione e' stata inclusa in un blocco. Ci sono innumerevoli modi per fare doublespend, modi a cui io non riesco nemmeno a pensare. L'esempio che ti ho fatto prima e' solo il modo piu' semplice e il primo che mi viene in mente, in un ambiente dove tutto e' perfetto e dove tutti i nodi sono onesti e collegati tra loro.

Nei bitcoin l'unica certeza che hai e' che la catena di blocchi con piu' hashpower vince. Ma in realtà non puoi nemmeno sapere qual'e' la catena di blocchi con piu' hashpower, sai solo quello che vedi, ma non e' detto che vedi tutto. Ci sono varie situazioni in cui la rete si potrebbe splittare o in cui i nodi sono disonesti. Tieni conto che non e' che hai un nodo=un utente. Un utente puo creare centinaia, migliaia, milioni di nodi. da un momento all'altro, e non puoi aspettarti che sia onesto.
Vai a leggere cosa si intende per Sybil Attack,  forse hai difficoltà a capire perche' non sai cos'e' un'attacco sybil.

Se un nodo ha una transazione nella sua mempool e un'altro nodo ha una transazione diversa che spende lo stesso utxo ma con output differenti, chi ha ragione? Entrambi. Non se ne esce. I nodi sono tutti uguali(decentralizzazione), quindi in caso di conflitto ci vuole un sistema in cui sia possibile decidere chi ha ragione. Quel sistema sono i blocchi. La transazione inclusa in un blocco e' quella buona.  
Ora facciamo finta che io trovo un blocco con dentro la mia transazione, e tu trovi un blocco con dentro la tua transazione, chi di noi ha ragione? Bisogna aspettare e vedere chi trova il blocco successivo se lo trova sulla mia catena ho ragione io e il tuo blocco diventa orfano, se lo trova sulla tua catena hai ragione tu e il mio blocco diventa orfano.
Un miner, o una pool, o un consorzio di piu' miner/pool con il 51% di hashpower, pero', potrebbe minare una terza catena, piu' lunga di quelle che conosciamo noi, e, per vari motivi(ad esempio uno split di rete, o selfish mining) noi potremmo non saperlo.
Nel momento in cui ci viene trasmessa la sua catena, questa e' piu' lunga(con piu' hashpower), di quelle che conosciamo noi, quindi i nostri nodi considereranno la sua catena come valida e scarteranno la catena che stavano seguendo fino a quel momento e le nostre tx finirebbero nel cestino.

Ok ma supponi che il sistema non concepisca le fee, ogni transazione viene comunque lavorata dal nodo in ordine di arrivo
In una rete mesh, con nodi che si collegano e scollegano,  nodi lenti nel validare e propagare, nodi disonesti, l'ordine di arrivo non e' prevedibile, e nemmeno corretto.
per poter provare a fare double spend ho il tempo solo di propagazione della trx ai nodi e non quel tempo piu il tempo di preparazione del blocco?
per te che sei un signor nessuno, con poche risorse tendenzialmente si, ma come ti ho detto prima ci sono mille modi per fregare una rete che si basa solo sull'ordine di arrivo. Ordine che poi in una rete decentralizzata, non ha, realmente, senso considerare.

e A invii a B 5000 satoshi e la transazione viene propagata

Il risultato appena riportato rimarrà valido e quindi c'è una possibilità di double spending finche la transazione non si sarà propagata su tutti i nodi o finche la transazione non è inclusa in un blocco?
Quote
dovrebbe essere così.
quale delle due opzioni?  Wink
nessuna delle due. Tendenzialmente la seconda, ovvero, dopo che la transazione viene inclusa in un blocco, hai la certezza che per rimuoverla e fare doublespend, debba essere fatto del lavoro, che richiede energia, risorse e soprattutto tempo

Corretto perchè ci sono questi meccanismi CPFP, ma supponi che il sistema sia all'inizio dove come ti dicevo prima le fee non ci sono tutte le trx vengono lavorate in ordine di arrivo al nodo, a quel punto B, anche se il suo wallet riporta il nuovo bilancio potrà spenderla solamente quando ci saranno le conferme ovvero inclusa in un blocco - 1 conferma, e per esserne certo max 6.
l'ordine lo stabilisce chi trova il blocco. Nemmeno dopo 6 conferme puoi esserne certo al 100% poi solo dedurre che sarebbe economicamente sconveniente fare il doublespend di una tx con 6 conferme, in quanto richiederebbe di trovare 7 blocchi, e quindi richiederebbe un sacco di lavoro con conseguente spesa di tempo ed energie.

Noooooo nn deprimerti, sono concetti non banali se uno ci ragiona in fondo e normale che ci siano delle incomprensioni Smiley
si, ma ci sono persone molto piu' competenti di me nell'insegnamento, e forse ti conviene pagare un insegnante che sappia fare un discorso con un filo logico.

Sapere come funzionano i bitcoin, e' molto molto diverso dal saperlo spiegare in modo che gli altri capiscano.
jr. member
Activity: 51
Merit: 1
June 15, 2018, 02:06:03 AM
#9
Ciao grazie ancora per le risposte


[quote ]
Se i nodi facessero il broadcast delle tx non valide, un attaccante potrebbe sfruttare questa cosa per flooddare(ddossare) la rete con miliardi di tx che fanno doublespend dello stesso utxo.
[/quote]
Ok quindi una volta che la trx ha raggiunto tutti i nodi non è possibile fare doublespend corretto?


e A invii a B 5000 satoshi e la transazione viene propagata

Il risultato appena riportato rimarrà valido e quindi c'è una possibilità di double spending finche la transazione non si sarà propagata su tutti i nodi o finche la transazione non è inclusa in un blocco?
Il dubbio è che finchè la trx non è confermata e quindi inclusa in un blocco, sicuramente B non potrà spendere quanto ricevuto, ma A potrà fare il furbo e provare a usare una somma già "teoricamente" spesa ma ancora non confermata?
Quote
questo e' sbagliato, B puo' spendere non appena vede la tx(tx1) ricevuta. Se la tx1  ha zero fee, B puo' spendere l'utxo non confermato facendo una nuova tx(tx2) e mettendo delle fee altissime in modo da convincere i miner ad includere nel blocco anche la tx1. Ovviamente B dovrebbe fare il broadcast sia della tx1 che della tx2, in modo da assicurarsi che la tx1 non vada in timeout e che i miner vedano entrambe le tx. E' quello che dicevo quando parlavo di CPFP.
Corretto perchè ci sono questi meccanismi CPFP, ma supponi che il sistema sia all'inizio dove come ti dicevo prima le fee non ci sono tutte le trx vengono lavorate in ordine di arrivo al nodo, a quel punto B, anche se il suo wallet riporta il nuovo bilancio potrà spenderla solamente quando ci saranno le conferme ovvero inclusa in un blocco - 1 conferma, e per esserne certo max 6.

Quote
Comincio a deprimermi, forse e' meglio se smetto di risponderti perche' mi sa che son proprio negato a spiegare le cose e ti creo solo piu' confusione.
Noooooo nn deprimerti, sono concetti non banali se uno ci ragiona in fondo e normale che ci siano delle incomprensioni Smiley
member
Activity: 168
Merit: 47
8426 2618 9F5F C7BF 22BD E814 763A 57A1 AA19 E681
June 14, 2018, 09:50:29 AM
#8
Ok, credevo che finche la transazione non venisse inclusa in un blocco e aggiunta alla blockchain, durante quel periodo, min 10 minuti,  si potesse procedere cmq con un double spend, mentre mi stai dicendo, se ho capito bene, che il periodo è solo quello di propagazione della transazione a tutti i nodi della rete, corretto?
Se i nodi facessero il broadcast delle tx non valide, un attaccante potrebbe sfruttare questa cosa per flooddare(ddossare) la rete con miliardi di tx che fanno doublespend dello stesso utxo.

Ad esempio se faccio una trx di 1 btc da A a B (supponiamo che i costi di fee siano a zero), A per poter spendere nuovamente 1 btc ha il temppo di propagazione della transazione a tutti i nodi della rete e non quel tempo piu il tempo di elaborazione del blocco dove questa transazione sarà inclusa.
NI se le fee sono zero, la tx probabilmente non sarà mai inclusa in un blocco. A puo' semplicemente aspettare che i nodi decidano che la tx vada in timeout(tempo a discrezione del singolo nodo, se non ricordo male sono circa 3 giorni) e quindi la cancellino dalla loro mempool.
Una volta che tutti i nodi si sono dimenticati della tx, A puo' fare doublespend dell'UTXO.
E' quello che ti dicevo anche prima quando parlavo dell'introduzione di RBF.

e A invii a B 5000 satoshi e la transazione viene propagata

Il risultato appena riportato rimarrà valido e quindi c'è una possibilità di double spending finche la transazione non si sarà propagata su tutti i nodi o finche la transazione non è inclusa in un blocco?
dovrebbe essere così.

Il dubbio è che finchè la trx non è confermata e quindi inclusa in un blocco, sicuramente B non potrà spendere quanto ricevuto, ma A potrà fare il furbo e provare a usare una somma già "teoricamente" spesa ma ancora non confermata?
questo e' sbagliato, B puo' spendere non appena vede la tx(tx1) ricevuta. Se la tx1  ha zero fee, B puo' spendere l'utxo non confermato facendo una nuova tx(tx2) e mettendo delle fee altissime in modo da convincere i miner ad includere nel blocco anche la tx1. Ovviamente B dovrebbe fare il broadcast sia della tx1 che della tx2, in modo da assicurarsi che la tx1 non vada in timeout e che i miner vedano entrambe le tx. E' quello che dicevo quando parlavo di CPFP.

Comincio a deprimermi, forse e' meglio se smetto di risponderti perche' mi sa che son proprio negato a spiegare le cose e ti creo solo piu' confusione.
jr. member
Activity: 51
Merit: 1
June 14, 2018, 08:35:36 AM
#7
Ciao grazie per la risposta

Quote
Lo stato pending non esiste, non capisco di cosa parli.
Pending è sinonimo di unconfirmed, cioè transazione che sono state inoltrate alla rete sono verificate a livello di SCRIPT ma non sono state ancora incluse in nessun blocco, cioè nessun miner le ha "considerate".

Quote
Ogni miner seleziona le transazioni che vuole dalla sua mempool, le ordina, e calcola il merkle root. Ma questo merkle root,e' personale, ogni miner lo calcola indipendentemente, e un miner con molta potenza di hash, spesso, ne calcola pure piu' di uno, in modo da parallelizzare la ricerca del blocco tra i vari asics. Quindi tu non lo sai se il miner sta realmente lavorando alla tua transazione. Non lo sa nessuno su che transazioni stanno lavorando i miner. E' una informazione inutile comunque.
Chiaro

Quote
Le connessioni fra i nodi della rete bitcoin, formano una rete mesh, quindi una informazione per raggiungere tutti i nodi ha bisogno di tempo, che si chiama tempo di propagazione, o ritardo di propagazione.
 
Le tecniche di doublespend degli UTXO consistono nello sfruttare i ritardi di propagazione delle tx(spesso pochi secondi o meno), nella rete.


Ok, credevo che finche la transazione non venisse inclusa in un blocco e aggiunta alla blockchain, durante quel periodo, min 10 minuti,  si potesse procedere cmq con un double spend, mentre mi stai dicendo, se ho capito bene, che il periodo è solo quello di propagazione della transazione a tutti i nodi della rete, corretto?

Ad esempio se faccio una trx di 1 btc da A a B (supponiamo che i costi di fee siano a zero), A per poter spendere nuovamente 1 btc ha il temppo di propagazione della transazione a tutti i nodi della rete e non quel tempo piu il tempo di elaborazione del blocco dove questa transazione sarà inclusa.
Cioè sempre nello stesso esempio supponiamo che il wallet di A recuperi questi UTXO:

Code:
{
    "unspent_outputs":[
        {
            "tx_age":"1322659106",
            "tx_hash":"e6452a2cb71aa864aaa959e647e7a4726a22e640560f199f79b56b5502114c37",
            "tx_index":"12790219",
            "tx_output_n":"0",
            "script":"76a914641ad5051edd97029a003fe9efb29359fcee409d88ac", (Hex encoded)
            "value":"5000661330"
        }
    ]
}

e A invii a B 5000 satoshi e la transazione viene propagata

Il risultato appena riportato rimarrà valido e quindi c'è una possibilità di double spending finche la transazione non si sarà propagata su tutti i nodi o finche la transazione non è inclusa in un blocco?

Il dubbio è che finchè la trx non è confermata e quindi inclusa in un blocco, sicuramente B non potrà spendere quanto ricevuto, ma A potrà fare il furbo e provare a usare una somma già "teoricamente" spesa ma ancora non confermata?

Spero di essere stato piu chiaro Smiley
member
Activity: 168
Merit: 47
8426 2618 9F5F C7BF 22BD E814 763A 57A1 AA19 E681
June 14, 2018, 07:47:48 AM
#6
Ciao grazie per la risposta, ora me la studio attentamente, conosco il funzionamento della trx e del resto pero il dubbio nasceva dal fatto che credevo che durante il periodo in cui la transazione è "lavorata" dal miner ma ancora non inclusa nel blocco o ancora meglio propagata a tutti i nodi, questi non conoscono l'effettivo stato quindi il wallet potrebbe spendere non facendo apposta - facendola apposta laddove ci sia intenzione da parte dello sviluppatore .-  lo stesso UTXO.
La mempool è diverso da pending credo perchè il pending è lo stato in cui la trx è stata considerata dal miner il mempool ancora no.
Non ero a conoscenza che se la transazione sta in mempool allora sia il wallet che i nodi rifiutassero ulteriori trx con input presi dalla UTXO giò in uso
Gli altri meccanismi descritti non ne ero a conoscenza adesso me li studio

Quindi in sostanza il wallet quando deve recuperare gli UTXO per creare dei nuovi input in una trx controlla parallelamente se gli stessi sono inclusi in qualche trx che attualmente è in pending o in mempool?

Fatico a comprendere questa domanda.
Lo stato pending non esiste, non capisco di cosa parli. Ogni miner seleziona le transazioni che vuole dalla sua mempool, le ordina, e calcola il merkle root. Ma questo merkle root,e' personale, ogni miner lo calcola indipendentemente, e un miner con molta potenza di hash, spesso, ne calcola pure piu' di uno, in modo da parallelizzare la ricerca del blocco tra i vari asics. Quindi tu non lo sai se il miner sta realmente lavorando alla tua transazione. Non lo sa nessuno su che transazioni stanno lavorando i miner. E' una informazione inutile comunque.

La mempool e' una cosa privata, ogni nodo ha la sua, ogni nodo decide indipendentemente quali transazioni inserire nella sua mempool. Ovviamente il nodo non ha nessun'interesse a tenere tx non valide, e, se e' "onesto", non vuole propagare tx non valide. Una tx che doublespende un UTXO non e' valida, quindi il nodo la rifiuta, e non la propaga.

Le connessioni fra i nodi della rete bitcoin, formano una rete mesh, quindi una informazione per raggiungere tutti i nodi ha bisogno di tempo, che si chiama tempo di propagazione, o ritardo di propagazione.
 
Le tecniche di doublespend degli UTXO consistono nello sfruttare i ritardi di propagazione delle tx(spesso pochi secondi o meno), nella rete.
jr. member
Activity: 51
Merit: 1
June 14, 2018, 02:11:22 AM
#5
Ciao grazie per la risposta, ora me la studio attentamente, conosco il funzionamento della trx e del resto pero il dubbio nasceva dal fatto che credevo che durante il periodo in cui la transazione è "lavorata" dal miner ma ancora non inclusa nel blocco o ancora meglio propagata a tutti i nodi, questi non conoscono l'effettivo stato quindi il wallet potrebbe spendere non facendo apposta - facendola apposta laddove ci sia intenzione da parte dello sviluppatore .-  lo stesso UTXO.
La mempool è diverso da pending credo perchè il pending è lo stato in cui la trx è stata considerata dal miner il mempool ancora no.
Non ero a conoscenza che se la transazione sta in mempool allora sia il wallet che i nodi rifiutassero ulteriori trx con input presi dalla UTXO giò in uso
Gli altri meccanismi descritti non ne ero a conoscenza adesso me li studio

Quindi in sostanza il wallet quando deve recuperare gli UTXO per creare dei nuovi input in una trx controlla parallelamente se gli stessi sono inclusi in qualche trx che attualmente è in pending o in mempool?
member
Activity: 168
Merit: 47
8426 2618 9F5F C7BF 22BD E814 763A 57A1 AA19 E681
June 13, 2018, 07:08:38 PM
#4
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.
jr. member
Activity: 51
Merit: 1
June 13, 2018, 03:17:07 PM
#3
il wallet lo previene, e così pure gli altri nodi a cui comunichi la tua transazione, la seconda viene rifiutata.

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?

Quote
Comunque i modi per farlo, volendo smanettare un po', ci sono sempre stati.


Si quello immaginavo, ma intendo in via teorica.

Quote
Per questo hanno aggiunto RBF(replace by fee), così e' possibile fare doublespend in maniera "legit" aumentando le fee. Cambiando il concetto di doublespend, delle transazioni non confermate, dall'essere un problema, all'essere una feature. Questo ovviamente ha creato un sacco di FUD generato dai vari oppositori di btc.

No qua mi sono perso lo ammetto, forse perchè devo cenare non ti segui Smiley
member
Activity: 168
Merit: 47
8426 2618 9F5F C7BF 22BD E814 763A 57A1 AA19 E681
June 13, 2018, 11:39:30 AM
#2
il wallet lo previene, e così pure gli altri nodi a cui comunichi la tua transazione, la seconda viene rifiutata. Comunque i modi per farlo, volendo smanettare un po', ci sono sempre stati.

Per questo hanno aggiunto RBF(replace by fee), così e' possibile fare doublespend in maniera "legit" aumentando le fee. Cambiando il concetto di doublespend, delle transazioni non confermate, dall'essere un problema, all'essere una feature. Questo ovviamente ha creato un sacco di FUD generato dai vari oppositori di btc.

jr. member
Activity: 51
Merit: 1
June 13, 2018, 10:31:41 AM
#1
Salve ragazzi,
in precedente post parlavo del double spending
https://bitcointalksearch.org/topic/struttura-blocco-4460741

ma secondo voi il wallet ha qualche meccanismo che blocca questo?

Nel senso se pago un caffe in BTC e poi vado dal macellaio e impiego meno di 10 minuti, il wallet riseleziona lo stesso UTXO oppure ha un meccanismo di prevenzione interna per cui permette ciò?

Grazie
Jump to: