È possibile una doppia cottura / approvazione utilizzando un unico nodo?
-
-
Sembra che ora siaimpossibileeseguireil doublebake usandoilbinario delnodotezos.Ho appenaprovato aeseguireil doublebake con 2nodi diversie ogniiniezione che arriva al secondoposto dà un [{"kind": "temporary","id": "failure","msg": "Fitnesstoo low"}].Looks like that is now impossible to double bake while using tezos-node binary. Just tried to double bake with 2 different nodes and every injection that comes in second place gives a [{"kind":"temporary","id":"failure","msg":"Fitness too low"}].
- 0
- 2019-04-17
- RoMarQ
-
1 risposta
- voti
-
- 2019-04-17
Ci sono alcuniproblemi qui.
Che cos'è la doppia cottura/approvazione?
Èimportante capire che lapenalità del raddoppio hapoco a chefare con l'iniezione. Il crimine è firmare due diversiblocchi o approvazioni,con hash diversi,allo stesso livello. L'iniezione è solo unmodoper scoprireiltuo crimine.
Puoiinserirein sicurezza un singolo blocco o approvazione,identificato dal suo hash,unnumero qualsiasi di voltein unnumero qualsiasi dinodi.
D'altraparte,potrestiesserepunitoper lefirme diblocchi o approvazioni chenon sonomai stateiniettate,ma soloinclusenell'operazione diprova.
Quindi,un avvertimento. Non dovrestifare affidamento sumeccanismi cheimpediscono la doppiainiezione. Dovrestiimpedire la doppiafirma,utilizzandofiligrane di alto livello,come l'appfornaio,sostenitore,firmatarioe Ledger. La doppiafirma èil crimine. Cercare dievitare la doppiainiezione significanonfarsiprendere.
Ora vediamo comeeseguire una doppia cottura ...
Formafisicatroppobassa
Innanzitutto,l'RPC/injection/block rifiutai blocchinonidonei. Perforzare l'inserimento diblocchinon adatti,puoifornireilparametro di query
force=true
,menzionatoin i documenti .Firme deterministiche
Con uno schema difirma deterministico (cometz1/ed25519,manongli altri),sefirmi due volte lo stessoblocco o lo stesso dato di approvazione,otterrai la stessafirma. Quindiilblocco/hash operativo risultante sarà lo stesso. Dato che è lo stessoblocco/op,non vi è alcun raddoppio.
Quindi,perprovocare una doppia cottura contz1,ènecessariomodificarei dati delbloccotrai dueblocchi,ades.modificareiltimestamp o le operazioni.
Esempio
Ecco unmodo relativamente sempliceper cuocere due voltein una sandbox:
# DANGER, DOUBLE BAKING, FOR SANDBOX tezos-client rpc get /chains/main/mempool/pending_operations | jq '.applied = []' > /tmp/empty_mempool.json tezos-client endorse for bootstrap1 tezos-client bake for bootstrap1 --mempool /tmp/empty_mempool.json # fix the path, for your TMP SANDBOX (!) client # DO NOT delete your real "blocks" file! rm /tmp/tezos-tmp-client.XXXXXXXX/blocks tezos-client bake for bootstrap1 --mempool /tmp/empty_mempool.json
Funzionaperché:
-
bake for
utilizzailtimestamp correnteperimpostazionepredefinita,quindi se aspettiamo unpo 'trai bake,iltimestampnei dati delblocco sarà diverso,risultandoin blocchi diversi (anche contz1.) - Ilnodo convalidailbloccoe l'accusatore lo riprende.
- Tuttavia,poiché abbiamoinserito un'approvazionemanonne abbiamonessuna,ilnodoignorailblocco. In questomodo èfacile ripetere la cottura,perché latesta sarà ancora al livelloprecedente.
- Infine,sovvertiamo laprotezione double-bake delfornaio,rimuovendoilfile di high watermark "blocchi".
There are a few issues here.
What is double baking/endorsement?
It is important to understand that the doubling penalty has little to do with injection. The crime is signing two different blocks or endorsements, with different hashes, at the same level. Injection is just one way for your crime to be discovered.
You can safely inject a single block or endorsement, identified by its hash, any number of times into any number of nodes.
On the other hand, you could be punished for signatures of blocks or endorsements which were never injected at all, only included in the evidence operation.
So, a warning. You should not rely on mechanisms which prevent double injection. You should prevent double signing, using level high watermarks, like the baker, endorser, signer, and Ledger app. Double signing is the crime. Trying to prevent double injection is trying not to get caught.
Now, let's see how to double bake...
Fitness too low
First, the /injection/block RPC rejects unfit blocks. To force injection of unfit blocks, you can supply the
force=true
query parameter, mentioned in the docs.Deterministic signatures
With a deterministic signature scheme (like tz1/ed25519, but not the others), if you sign the exact same block or endorsement data twice, you're going to get the same signature. Then the resulting block/op hash will be the same. Since it is the very same block/op, there is no doubling.
So, to cause double baking with tz1, you need to modify the block data between the two blocks, e.g. change the timestamp or operations.
Example
Here is one relatively easy way to double bake in a sandbox:
# DANGER, DOUBLE BAKING, FOR SANDBOX tezos-client rpc get /chains/main/mempool/pending_operations | jq '.applied = []' > /tmp/empty_mempool.json tezos-client endorse for bootstrap1 tezos-client bake for bootstrap1 --mempool /tmp/empty_mempool.json # fix the path, for your TMP SANDBOX (!) client # DO NOT delete your real "blocks" file! rm /tmp/tezos-tmp-client.XXXXXXXX/blocks tezos-client bake for bootstrap1 --mempool /tmp/empty_mempool.json
This works because:
bake for
uses the current timestamp by default, so if we wait a bit between bakes, the timestamp in the block data will be different, resulting in different blocks (even with tz1.)- The node validates the block, and the accuser picks up on it.
- However, because we injected an endorsement but baked with none, the node then ignores the block. This makes it easy to repeat the bake, because the head will still be at the previous level.
- Finally, we subvert the baker's double bake protection, by removing the "blocks" high watermark file.
-
Grazieper latua risposta!Thanks for your answer!
- 0
- 2019-04-18
- RoMarQ
-
Tom,saiperchégli accusatorinon rilevano circail 50% dei doppipanini,su zeronet a voltei miei doppipanininon vengono rilevati,adesempio,a volteilmio accusatore èin grado di rilevare lamia doppia cotturamentre altrinoea volteilmio accusatorenon rilevae gli altri lofanno. Questo è stato rilevato solo dalmio stesso accusatore: https://imgur.com/OTCv0uj Questoperché sto creando unmodulo accusatoreper lamia app di cotturae voglio assicurarmi chetuttofunzioni correttamente. Puòessere unproblema con "/monitor/valid_blocks" chenontiene traccia di ogniblocco valido come dovrebbe?Tom, do you know why the accusers don't detect like 50% of double bakings, on zeronet sometimes my double bakings aren't detected, for example, sometimes my accuser is able to detect my double baking while others don't and sometimes my accuser doesn't detect and others do. This one was only detected by my own accuser: https://imgur.com/OTCv0uj This is because I'm making an accuser module for my baking app and I want to make sure everything is working correctly. Can that be a problem with "/monitor/valid_blocks" that doesn't track every valid block as it should?
- 0
- 2019-04-22
- RoMarQ
-
@Seb Mondet hagià risposto. "Ingenerale la retepropagheràblocchi che"migliorano "l'idoneità. Quindi,seiltuoblocco cottonon è stato approvato,èimprobabile chegli accusatori lo vedanoe inietteranno l'accusa". "Nel complesso,le accusemirano apenalizzaregli attori davverofastidiosi,non soloi doppipanni accidentali chenon rallentano o danneggiano la rete". "(può ancora accadere chein circostanze unpo 'sfortunate,una doppia cottura accidentale venga accusata ovviamente)"@Seb Mondet already answered. "In general the network will propagate blocks that "improve" the fitness. So if your baked block has not been endorsed, accusers are not likely to see it and inject the accusation." "Overall the accusations are designed to penalize really annoying actors, not just accidental double-bakings that don't slow-down or hurt the network." "(it can still happen that in somewhat unlucky circumstances, an accidental double-baking gets accused of course)"
- 0
- 2019-04-22
- RoMarQ
Ilnodotezos ha qualchetipo diprotezione che rifiuta unblocco che ègià statoiniettato dall'essereiniettato dinuovo?
Stoprovando atestareilmiomodulo accusatore,manon riesco afare una doppia cottura.
Se lamia app hagiàinfornato quelblocco,quandoprovo ainiettarlo una seconda volta ottengo questo.
Esistegià un qualchetipo diprotezione suinodi che rifiuti le doppieiniezioni dello stessoblocco?
<"EDIT:"
Sembra che ora siaimpossibileeseguire una doppia cottura durante l'utilizzo delbinario tezos-node .Ho appenaprovato aeseguireil doublebake con 2nodi diversie ogniiniezione che arriva al secondoposto dà un
[{"kind":"temporary","id":"failure","msg":"Fitness too low"}]
.