Author

Topic: Lo strano caso dell'indirizzo con chiave privata 0 (Read 311 times)

legendary
Activity: 2380
Merit: 17063
Fully fledged Merit Cycler - Golden Feather 22-23
E niente,
questo è il genere di thread che mi fa capire quanto ancora poco sappia di bitcoin.
Conoscere nel dettaglio come è fatta una transazione bitcoin, avere un nodo bitcoin in casa, validarli le mie transazioni, etc.
Bitcoin è molto più che prezzo, supporti resistenze e whales, è indipendenza monetaria individuale, che richiede profonda conoscenza.
Tutto nella mia personalissima bucket list.
F1



legendary
Activity: 3836
Merit: 2050
Nessun block explorer potrà mai mostrare quella transazione come confermata, semplicemente perché nessun miner l'ha mai ritenuta valida inserendola in un blocco. Mi aspetterei che un qualsiasi client si accorgesse che non è valida, quindi scartandola dalla mempool e non facendola neanche vedere. Evidentemente non è così per blockchain.info, ma dal punto di vista della rete è un problema che riguarda un singolo nodo, quindi non rappresenta minimamente un pericolo per la blockchain e la rete stessa.

Sì, non rappresenta un pericolo per la blockchain.

Dal punto di vista della rete dei full node è un problema che riguarda un singolo nodo, dal punto di vista di coloro che utilizzano blockchain.info per ricavare delle informazioni un po' di fastidio lo dà.  Tra l'altro sarebbe utile capire perchè si comporta così: se per esempio tende a mantenere indefinitamente le tx in mempool finchè non sono confermate, potrebbe mantenere in memoria anche quelle transazioni formalmente corrette ma che per fee troppo basse non saranno mai confermate. Questo potrebbe forse creare problemi laddove colui che ha costruito la transazione (non usando il flag RBF) sta aspettando che i vari nodi la dimentichino per sostituirla con un'altra.

O ci potrebbero essere situazioni di potenziali double-spending qualora un servizio accettasse transazioni non confermate (per piccole cifre) basandosi sempre su blockchain.info.



sì capisco che qualcuno, conoscendo questo bug di blockchain.info, potrebbe aver cercato di sfruttarlo per commettere qualche scam, ma d'altra parte è risaputo che accettare una transazione che ha zero conferme rappresenta un rischio molto elevato: solo qualche newbie o qualcuno veramente incosciente potrebbe cascarci
legendary
Activity: 1948
Merit: 2097
Nessun block explorer potrà mai mostrare quella transazione come confermata, semplicemente perché nessun miner l'ha mai ritenuta valida inserendola in un blocco. Mi aspetterei che un qualsiasi client si accorgesse che non è valida, quindi scartandola dalla mempool e non facendola neanche vedere. Evidentemente non è così per blockchain.info, ma dal punto di vista della rete è un problema che riguarda un singolo nodo, quindi non rappresenta minimamente un pericolo per la blockchain e la rete stessa.

Sì, non rappresenta un pericolo per la blockchain.

Dal punto di vista della rete dei full node è un problema che riguarda un singolo nodo, dal punto di vista di coloro che utilizzano blockchain.info per ricavare delle informazioni un po' di fastidio lo dà.  Tra l'altro sarebbe utile capire perchè si comporta così: se per esempio tende a mantenere indefinitamente le tx in mempool finchè non sono confermate, potrebbe mantenere in memoria anche quelle transazioni formalmente corrette ma che per fee troppo basse non saranno mai confermate. Questo potrebbe forse creare problemi laddove colui che ha costruito la transazione (non usando il flag RBF) sta aspettando che i vari nodi la dimentichino per sostituirla con un'altra.

O ci potrebbero essere situazioni di potenziali double-spending qualora un servizio accettasse transazioni non confermate (per piccole cifre) basandosi sempre su blockchain.info.

legendary
Activity: 3836
Merit: 2050
Nessun block explorer potrà mai mostrare quella transazione come confermata, semplicemente perché nessun miner l'ha mai ritenuta valida inserendola in un blocco. Mi aspetterei che un qualsiasi client si accorgesse che non è valida, quindi scartandola dalla mempool e non facendola neanche vedere. Evidentemente non è così per blockchain.info, ma dal punto di vista della rete è un problema che riguarda un singolo nodo, quindi non rappresenta minimamente un pericolo per la blockchain e la rete stessa.
legendary
Activity: 1948
Merit: 2097
Perché è sempre stato poco serio come blockexplorer e anche come web-wallet (leggete qua https://bitcointalksearch.org/topic/reused-r-values-again-581411).

Sì, ma un conto è costruire un web wallet poco affidabile (che è grave, ma scriverne uno serio richiede una certa competenza), un conto è non riuscire neanche a leggere quali sono le transazioni presenti nei blocchi della blockchain.

A dir la verità blockchain.info non afferma che quella tx sia presente in qualche blocco, ma continua a tenerla in memoria pur essendo una tx non valida e mai confermata, generando confusione. 
legendary
Activity: 1778
Merit: 1043
#Free market
Quando il mio parser trova il totale di un indirizzo, per fare un controllo incrociato fa anche una query a blockchain.info.

Purtroppo per un errore nel MIO codice (...) nel caso di discrepanza non emette un messaggio di errore
(come dovrebbe fare) ma utilizza il saldo indicato da blockchain.info (e non quello calcolato dalla mia blockchain)
non mi ero mai accorto perche' e' la prima volta che mi capita, anzi mi ero addirittura dimenticato di questo controllo.

Poi quando ho visto questo strano saldo, sono andato a vedere su blockchain ed ho visto
che corrispondeva (per forza: era quello) mi sono preoccupato.

Perfetto, quindi rimarrebbe solo da capire com'è che blockchain.info mostra ancora una tx non confermata di più di 1 anno fa.

Per fortuna la blockchain invece è sempre corretta !  Smiley



Perché è sempre stato poco serio come blockexplorer e anche come web-wallet (leggete qua https://bitcointalksearch.org/topic/reused-r-values-again-581411).
legendary
Activity: 1948
Merit: 2097
Quando il mio parser trova il totale di un indirizzo, per fare un controllo incrociato fa anche una query a blockchain.info.

Purtroppo per un errore nel MIO codice (...) nel caso di discrepanza non emette un messaggio di errore
(come dovrebbe fare) ma utilizza il saldo indicato da blockchain.info (e non quello calcolato dalla mia blockchain)
non mi ero mai accorto perche' e' la prima volta che mi capita, anzi mi ero addirittura dimenticato di questo controllo.

Poi quando ho visto questo strano saldo, sono andato a vedere su blockchain ed ho visto
che corrispondeva (per forza: era quello) mi sono preoccupato.

Perfetto, quindi rimarrebbe solo da capire com'è che blockchain.info mostra ancora una tx non confermata di più di 1 anno fa.

Per fortuna la blockchain invece è sempre corretta !  Smiley

legendary
Activity: 3276
Merit: 2898
Ho trovato l'inghippo.

Quando il mio parser trova il totale di un indirizzo, per fare un controllo incrociato fa anche una query a blockchain.info.

Purtroppo per un errore nel MIO codice (...) nel caso di discrepanza non emette un messaggio di errore
(come dovrebbe fare) ma utilizza il saldo indicato da blockchain.info (e non quello calcolato dalla mia blockchain)
non mi ero mai accorto perche' e' la prima volta che mi capita, anzi mi ero addirittura dimenticato di questo controllo.

Poi quando ho visto questo strano saldo, sono andato a vedere su blockchain ed ho visto
che corrispondeva (per forza: era quello) mi sono preoccupato.

scusate errore mio (e di blockchain.info)

EDIT: sono molto piu' sollevato che sia un errore mio che qualche strano bug in bitcoin core Smiley

EDIT2: non fidatevi troppo di blockchain.info.
legendary
Activity: 3276
Merit: 2898

Non è che legge magari in qualche altra struttura derivata dalla blockchain?

La blockchain intesa come database dei blocchi non include per esempio il database degli utxo (chainstate), inoltre con l'opzione txindex si aggiungono ulteriori dati. Forse su questi dati derivati diversi client potrebbero essere in disaccordo...

No no il parser legge solo le strutture dei blocchi i blk*.dat per intenderci, non legge nessuna struttura aggiuntiva (indici o robe strane)

dammi un po' di tempo, faccio qualche indagine e cerco di darti dei dati oggettivi.

Non voglio dirti cose a caso.

legendary
Activity: 1948
Merit: 2097
il problema e' che faccio girare un blockparser che guarda SOLO la blockchain, non considera assolutamente la mempool, e alla fine il blockparser mi da il saldo dell'indirizzo incriminato come se la transazione fosse stata fatta.

Quindi qualcosa di strano in blockchain c'e', ma devo individuarlo.

Non è che legge magari in qualche altra struttura derivata dalla blockchain?

La blockchain intesa come database dei blocchi non include per esempio il database degli utxo (chainstate), inoltre con l'opzione txindex si aggiungono ulteriori dati. Forse su questi dati derivati diversi client potrebbero essere in disaccordo...
legendary
Activity: 3276
Merit: 2898


Pensandoci bene anche anche se alcuni client avessero erroneamente validato quella transazione, la blockchain è sempre una sola (quella è la sua funzione). Se un client avesse anche una sola transazione in più in un suo blocco, l'hash dell'header di quel blocco sarebbe diverso da quello degli altri client e quindi si troverebbe su un ramo completamente diverso rispetto al ramo principale (tutti i blocchi successivi avrebbero hash diversi).

Quindi non è proprio possibile che nella tua blockchain ci sia quella transazione.
La questione allora è: dove si trova questa tx nel tuo client, se non è in un blocco? Forse ha mantenuto nella mempool quella vecchia tx? Ma non lo hai mai riavviato dal 2017?

Cosa ti dà questo comando?





il problema e' che faccio girare un blockparser che guarda SOLO la blockchain, non considera assolutamente la mempool,
e alla fine il blockparser mi da il saldo dell'indirizzo incriminato come se la transazione fosse stata fatta.

Quindi qualcosa di strano in blockchain c'e', ma devo individuarlo.

Provo a fare una modifica al blockparser che mi evidenzi ogni transazione che conivolge quell'indirizzo.

Ci metto un po' ma credo di arrivarci.
legendary
Activity: 1948
Merit: 2097
allora debbo capire perche' il mio blockparser che legge dalla mia copia della blockchain
(gestita nello specifico da un bitcoin core 0.14.2) individua l'operazione come eseguita, quindi la transazione in qualche modo
esiste sulla mia blockchain...

faro' ulteriori indagini.

Pensandoci bene anche anche se alcuni client avessero erroneamente validato quella transazione, la blockchain è sempre una sola (quella è la sua funzione). Se un client avesse anche una sola transazione in più in un suo blocco, l'hash dell'header di quel blocco sarebbe diverso da quello degli altri client e quindi si troverebbe su un ramo completamente diverso rispetto al ramo principale (tutti i blocchi successivi avrebbero hash diversi).

Quindi non è proprio possibile che nella tua blockchain ci sia quella transazione.
La questione allora è: dove si trova questa tx nel tuo client, se non è in un blocco? Forse ha mantenuto nella mempool quella vecchia tx? Ma non lo hai mai riavviato dal 2017?

Cosa ti dà questo comando?



Code:
~$ ./bitcoin-cli getmempoolentry ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84

error code: -5
error message:
Transaction not in mempool
full member
Activity: 602
Merit: 144
Ho controllato anche su questi 4 explorer e di quella transazione non c' è traccia, infatti non esiste proprio.
Explorer1, Explorer2, Explorer3, Explorer4

Inoltre proseguendo la catena delle tx ho notato che i resti andavano all' inizio ad un indirizzo "normale" con 1-, mentre il penultimo indirizzo ha un resto che va presumibilmente ad un address di "natura" diversa dai precedenti.
legendary
Activity: 1948
Merit: 2097
mi sto facendo l'idea che acluni client hanno validato l'operazione ed alcuni no,
probabilmente sfruttando qualche sorta di bug. (forse introdotto
quando nel bitcoin core hanno cambiato la libreria crypto ?)

per ora sono supposizioni, spero di avere il tempo per fare ulteriori approfondimenti.


Può essere, ma non sarebbe molto rassicurante, di sicuro nella mia blockchain non c'è quella tx, se ci fosse dovrebbe essere stata immessa intorno al blocco 467000 (lo deduco dalla data del 24/5/2017), ma io appunto non la trovo nella mia blockchain locale usando questo piccolo script:

Code:
#! /bin/bash

###################################################################################
# Usage:
# ./trovatx.sh ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84
###################################################################################

bitcoincli="/home/arulbero/bitcoin-0.16.1/src/bitcoin/src/bitcoin-cli"

txid=$1
let i=465000 #START BLOCK
let lastblock=473000 #LAST BLOCK


while [ $i -le $lastblock ]; do
hash=$($bitcoincli getblockhash $i)
res=$($bitcoincli getblock $hash | grep $txid | sed 's/"//g' | tr -d '\n')

if [ "$res" != "" ]
then
echo "Txid $txid found in block $i !!!"
exit 1
fi
let i=i+1
done
echo "Txid $txid is not in the blockchain !!!"


Comunque anche se vai sul sito di blockchain.info https://www.blockchain.com/btc/tx/ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84 quella transazione è data come non confermata. Nello stesso momento se guardi è stata inviata anche la transazione successiva.

In pratica si tratta di più transazioni spedite contemporaneamente che tentano di spendere ciascuno l'output della precedente, ma nessuna di queste è confermata.
hero member
Activity: 784
Merit: 1416
In effetti sembra essere abbastanza strana come cosa, la transazione non è mai confermata ma sti ~3.7 BTC hanno fatto il giro di parecchi indirizzi. Nessuna delle transazioni è però infatti confermata.

Magri qualcuno ha cercato di sfruttare la cosa per qualche truffa?

Ho trovato una spiegazione qui:

https://bitcoin.stackexchange.com/questions/65969/invalid-public-key-was-spent-how-was-this-possible

Quote
That address cannot be spent from and any such transaction that spends from it is invalid. However this does not prevent improperly written software from thinking its private key is a valid private and and performing the elliptic curve operations on it. So thus the address was created and a transaction was created that appears valid. But when validating the transaction with proper software, such software rejects it.

This transaction appears on blockchain.info likely because their software is either improperly implemented or simply not validating (or fully validating) transactions. This isn't the first time that's happened though.
legendary
Activity: 3276
Merit: 2898
Non mi convince  modo strano con cui presenta la cosa
blockchain.info... la da come operazione non confermata,
ma in realta' viene viene propagata anche su transazioni successive.

Una transazione  non confermata dovrebbe essere ancora solo in mempool,
invece blockchain.info la da non confermata dal maggio 2017...

mi sto facendo l'idea che acluni client hanno validato l'operazione ed alcuni no,
probabilmente sfruttando qualche sorta di bug. (forse introdotto
quando nel bitcoin core hanno cambiato la libreria crypto ?)

per ora sono supposizioni, spero di avere il tempo per fare ulteriori approfondimenti.


legendary
Activity: 3276
Merit: 2898

La mia conclusione: la transazione ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84 non è inclusa nella blockchain, qualcuno ha tentato di forzare il meccanismo ma la transazione di fatto non è mai avvenuta.



allora debbo capire perche' il mio blockparser che legge dalla mia copia della blockchain
(gestita nello specifico da un bitcoin core 0.14.2) individua l'operazione come eseguita, quindi la transazione in qualche modo
esiste sulla mia blockchain...

faro' ulteriori indagini.
legendary
Activity: 1948
Merit: 2097
Guardando alla transazione ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84 che spende i bitcoin da quell'indirizzo sembrerebbe che effettivamente abbiano usato la chiave pubblica "00"

l'output di bitcoin-cli decoderawtransaction sul mio Bitcoin Core 0.16.1 :

Code:
{
  "txid": "ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84",
  "hash": "ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84",
  "version": 1,
  "size": 4665,
  "vsize": 4665,
  "locktime": 0,
  "vin": [
    {
      "txid": "c29b4529c43637c3c3cb86ff4d32980a055a8a58f8b0ff83abfac924bb7d5a53",
      "vout": 1,
      "scriptSig": {
        "asm": "3045022100d719a6b62c1069aca5889c071f6faf15e098a19da31ca0f91e53373da4e70b6102202081fbdf9d2bb46ea22368d51922fe0f5253094ae9bfa3d13eebd7ede366033c[ALL] 0",
        "hex": "483045022100d719a6b62c1069aca5889c071f6faf15e098a19da31ca0f91e53373da4e70b6102202081fbdf9d2bb46ea22368d51922fe0f5253094ae9bfa3d13eebd7ede366033c010100"
      },
      "sequence": 4294967295
    },
.........

Provando a decodificare lo scriptSig in formato hex byte per byte infatti ottengo:

Code:
483045022100d719a6b62c1069aca5889c071f6faf15e098a19da31ca0f91e53373da4e70b6102202081fbdf9d2bb46ea22368d51922fe0f5253094ae9bfa3d13eebd7ede366033c010100

48 --> pushdata
30 --> sequenza
45 --> lunghezza
02 --> intero
21 --> lunghezza
00
d7 19 a6 b6 2c 10 69 ac a5 88 9c 07 1f 6f af 15 e0 98 a1 9d a3 1c a0 f9 1e 53 37 3d a4 e7 0b 61 : r  della firma in formato der
02 --> intero
20 --> lunghezza
20 81 fb df 9d 2b b4 6e a2 23 68 d5 19 22 fe 0f 52 53 09 4a e9 bf a3 d1 3e eb d7 ed e3 66 03 3c : s della firma in formato der
01 --> SIGHASH_ALL
01 --> spazio occupato dalla chiave pubblica 1 byte!!!
00 --> chiave pubblica

Da notare che di solito la parte finale dovrebbe essere ben più lunga, tipo
Code:
01 --> SIGHASH_ALL
21 --> lunghezza della chiave pubblica
02 --> tipo di chiave pubblica
32 byte -> X della chiave pubblica


inoltre dall'indirizzo 17pfufCkqYKiE4MLL22u6HtkGzqAirE29J questi bitcoin sono gia' stati prelevati,
quindi con un'operazione IMPOSSIBILE sono stati prelevati dei bitcoin e a questo punto
questi bitcoin "impossibili" stanno propagandosi verso altri indirizzi!

Mi pare però che tutti i bitcoin spesi da 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh sono stati bloccati però nel passaggio successivo:
nell'indirizzo  17pfufCkqYKiE4MLL22u6HtkGzqAirE29

da lì infatti qualcuno ha tentato di spenderli ma senza successo --> link

In questo blockexplorer i bitcoin risultano ancora nell'indirizzo 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh  https://blockexplorer.com/address/1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh

La mia conclusione: la transazione ba8a7fb13a507a4987bfa267a6f12defc0d30216fdf6664cdc06cc4c8de71a84 non è inclusa nella blockchain, qualcuno ha tentato di forzare il meccanismo ma la transazione di fatto non è mai avvenuta.



legendary
Activity: 3276
Merit: 2898
Come forse sapete, il famoso indirizzo bitcoin 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh corrisponde alla chiave privata 0.

Il punto 0 NON e' considerato valido per le operazioni sulle curve ellittiche,
quindi qualsiasi somma versata su quell'indirizzo non e' piu' prelevabile,
ossia l'indirizzo 1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh  e' sempre stato giustamente
considerato un "burning address".

Con non poco stupore, oggi vedo questo

https://www.blockchain.com/btc/address/1FYMZEHnszCHKTBdFZ2DLrUuk3dGwYKQxh

sembra che verso maggio dello scorso anno, dall'indirizzo sia stato fatto un prelievo verso quest'altro indirizzo:

17pfufCkqYKiE4MLL22u6HtkGzqAirE29J

che blockchain.info  da' come non confermato.
Nelle mie blockchain, tutte sincronizzate da zero con bitcoin core versione 0.14
oppure 0.15 la transazione e' presente, quindi i miei client l'hanno validata.

inoltre dall'indirizzo

17pfufCkqYKiE4MLL22u6HtkGzqAirE29J questi bitcoin sono gia' stati prelevati,
quindi con un'operazione IMPOSSIBILE sono stati prelevati dei bitcoin e a questo punto
questi bitcoin "impossibili" stanno propagandosi verso altri indirizzi!

Insomma, a una prima analisi la cosa mi puzza molto ma molto brutta.

Spero che qualcuno mi trovi una spiagazione logica, che pero' non dovrebbe esistere....

Jump to: