Come viene generato il codice hash dei blocchi?
-
-
Untest chepuoifare èprima valutare leproprietà di distribuzione del checksum dibase58generando un set veramente casuale dibyte dipayloade passandolo al checksum dibase58,quindieseguire latrasformazione suggerita.Quindieseguire untest KSper valutare se la distribuzione delle cifre è statisticamente uguale a quella sperimentale.One test you can do is first assess the distribution properties of base58 checksum by generating a truly random set of payload bytes and passing this to base58 checksum and then do the transformation you suggest. Then perform a KS test to assess if the distribution of digits is statistically the same as the experimental one.
- 1
- 2019-05-17
- Ezy
-
2 risposta
- voti
-
- 2019-05-10
- Prendi una rappresentazionein byte di unaparticolareintestazione diblocco: http://mainnet-node.tzscan.io/chains/main/blocks/head/header/raw . Ilformato dell'intestazione delblocco è descrittoin documenti .
- Ottieni un hash digest BLAKE2b (32bit)
- Anteponi duebyte "\ x01 \ x34" (sono responsabili della lettera "B")
- Base58 codificalo con checksum
Non c'è casualità.
Ilpanettiere sceglie l'intestazione delblocco. Unpanettierepuòfacilmente costruiremoltiblocchi diversie iniettare soloilblocco con l'hashpiù desiderato,manipolando lagenerazione delnumero "casuale". Poiché unblocco Tezos richiede solo unafacileprova di lavoro,questo èpiùfacile chein Bitcoin o Ethereum,doveil consiglio "no,nonpuoigenerarenumeri casualiin questomodo" è stato datoper anni.
- Take a byte representation of a particular block header: http://mainnet-node.tzscan.io/chains/main/blocks/head/header/raw. The format of the block header is described in the docs.
- Get a BLAKE2b (32bit) hash digest of it
- Prepend two bytes '\x01\x34' (they are responsible for "B" letter)
- Base58 encode it with checksum
There is no randomness.
The baker chooses the block header. A baker can easily construct many different blocks and inject only the block with the most desired hash, manipulating your 'random' number generation. Because a Tezos block only requires an easy proof of work, this is easier than in Bitcoin or Ethereum, where the advice "no, you can't generate random numbers that way" has been given for years.
-
Grazie.Quindi la domanda successiva è: come viene selezionata l'intestazione delblocco?Da dove viene lafonte originale della "pseudo-casualità"?Thanks. So the next question is, how is that block header selected? Where is the original source of "pseudo-randomness" coming from?
- 0
- 2019-05-10
- luchonacho
-
Come vieneprodotta l'intestazione delblocco?Cosa rende un'intestazione diblocco diversa dall'altra?How is the block header produced? What makes one block header different from the other?
- 0
- 2019-05-11
- luchonacho
-
Se ritieni di doverporre domande difollow-up,modifica la domanda originale (eiltitolo?) Peresserepiù chiari.Questo sembra rispondere alla domanda che hai scrittofinora.La risposta èmolto credibile da sola senzafonti "ufficiali".Provaloe vedi che ottienieffettivamente l'hashprevisto.(Tufai.)If you feel you need to ask followup questions, please edit your original question (and title?) to be more clear. This seems to answer the question you wrote so far. The answer is very credible on its own without "official" sources. Just try it and see that you do indeed get the expected hash. (You do.)
- 1
- 2019-05-13
- Tom
-
@ Tommi sono reso conto che la domanda originalenonera sufficienteperi miei scopi.Da qui quello successivo.Ho aggiornatoilpost.Inoltre,sebbene laprocedurafunzioni,sarebbeinteressante sapere da doveproviene.Peresempio.è scrittonellablockchain?@Tom I realized the original question didn't suffice for my purposes. Hence the follow up one. I updated the post. Also, albeit the proceedure works, it would be interesting to know where it comes from. E.g. is this written in the blockchain?
- 0
- 2019-05-14
- luchonacho
-
Hoprovato ad adattareil classico avvertimento a Tezos.Non sono sicuro che ci siano citazioni utili sull'hash ablocchi.In ogni casoi dettaglinon cambieranno la risposta allatua vera domanda:nonfarlo.I tried to adapt the classic warning to Tezos. I'm not sure whether there are any useful citations about the block hash. In any case the details won't change the answer to your real question: don't.
- 0
- 2019-05-14
- Tom
-
@ Tom,grazieperi tuoi aggiornamenti! luchonacho,ilblock hashin effettinon dovrebbeessere usato comefonte di casualità,guardameglio lo schema che Tezos usainternamenteper la distribuzione dei diritti di cottura.Ènel codice,ma spero chepresto ci sarà una risposta qui :) https://tezos.stackexchange.com/questions/1201/how-to-calculate-a-random-seed@Tom, thanks for your updates! luchonacho, block hash indeed shouldn't be used as a source of randomness, better look at the scheme Tezos uses internally for baking rights distribution. It's in the code, but I hope there will be an answer here soon :) https://tezos.stackexchange.com/questions/1201/how-to-calculate-a-random-seed
- 0
- 2019-05-15
- Michael Zaikin
-
@MichaelZaikin Grazieper l'aggiornamento.Hofatto lamia analisie ho ottenuto una conclusione diversa.Vedi lamia risposta.Qualsiasipensiero èpiù chebenvenuto!@MichaelZaikin Thanks for the update. I made my own analysis, and got a different conclusion. See my answer. Any thoughts are more than welcome!
- 0
- 2019-05-16
- luchonacho
-
- 2019-05-16
Laparte 1 dellamia domanda ha ricevuto risposta da Michael. E la secondaparte? Beh,l'ho appena dato un'occhiata. Quello che hofatto è:
- estrae la serie completa di codici hash,dalblocco 1 all'ultimo (MOLTO LUNGO).
- estrarrei numeri contenutiin tali codici hash (ovvero rimuovere le lettere).
- analizzare la "casualità" di questa serie dinumeri contest appositamenteprogettati.
Itest suggeriscono che l'ipotesi di casualitànonpuòessere rifiutata al 5%. Èinteressantenotare che la distribuzione deinumeri èmolto distorta. Semmai,ci sipotrebbe aspettare che assomigliin qualchemodo a una distribuzione uniforme (notando cheil contrarionon è vero,cioè la distribuzione uniformenonimplica casualità). Ci sto ancora lavorando,ma unprimo sguardo suggerisce che la seriepotrebbeessere casuale.
Il codice Rper riprodurre l'analisiprecedente è di seguito:
# Initialise stuff remove(list = ls()) options(timeout = 1000000) # in case request times-out library(jsonlite) library(ggplot2) library(randtests) # Get maximum number of blocks last_block <- fromJSON("https://api6.tzscan.io//v3/head") N <- last_block$level blocks <- seq(1,N,by = 1) hashs <- vector(mode="character", length = N) # Download all hash codes (timer and print included, for analysis) VERY LONG start <- proc.time() for (i in 1:N) { url <- paste0("https://api6.tzscan.io//v3/block_hash_level/",i) hashs[i] <- fromJSON(url) print(i) } finish <- proc.time() - start # Remove letters n_hashs <- as.numeric(gsub("\\D+","", hashs, perl = TRUE)) df <- data.frame(value=n_hashs) names(df)[names(df) == "df.value....." ] <- "value" # Plot (definitively not a uniform distribution, for any level of zooming in) ggplot(df, aes(x=value)) + geom_histogram() # Randomness tests (indicating the number sequence is not random) bartels.rank.test(df$value) cox.stuart.test(df$value) difference.sign.test(df$value) rank.test(df$value) runs.test(df$value) turning.point.test(df$value)
Part 1 of my question was answered by Michael. What about the second part? Well, I just had a look at it. What I did is:
- extract the full series of hash codes, from block 1 to the latest (VERY LONG).
- extract the numbers contained in such hash codes (i.e. remove letters).
- analyse the "randomness" of this series of numbers with purposely designed tests.
The tests suggest that the randomness hypothesis cannot be rejected at the 5%. Interestingly, the distribution of numbers is very skewed. If anything, one might expect it to be somewhat resembling a uniform distribution (noticing that the contrary is not true, i.e. uniform distribution does not imply randomness). I'm still pounding on this, but a first look suggest that the series might be random.
The R code to reproduce the above analysis is below:
# Initialise stuff remove(list = ls()) options(timeout = 1000000) # in case request times-out library(jsonlite) library(ggplot2) library(randtests) # Get maximum number of blocks last_block <- fromJSON("https://api6.tzscan.io//v3/head") N <- last_block$level blocks <- seq(1,N,by = 1) hashs <- vector(mode="character", length = N) # Download all hash codes (timer and print included, for analysis) VERY LONG start <- proc.time() for (i in 1:N) { url <- paste0("https://api6.tzscan.io//v3/block_hash_level/",i) hashs[i] <- fromJSON(url) print(i) } finish <- proc.time() - start # Remove letters n_hashs <- as.numeric(gsub("\\D+","", hashs, perl = TRUE)) df <- data.frame(value=n_hashs) names(df)[names(df) == "df.value....." ] <- "value" # Plot (definitively not a uniform distribution, for any level of zooming in) ggplot(df, aes(x=value)) + geom_histogram() # Randomness tests (indicating the number sequence is not random) bartels.rank.test(df$value) cox.stuart.test(df$value) difference.sign.test(df$value) rank.test(df$value) runs.test(df$value) turning.point.test(df$value)
-
Ci si aspetta chegli hash _guardano_ uniformemente casuali.Ilpanettiere di vanigliagenererànonc POWpseudocasualifino a quandoil POW avrà successo.Quindigli hash scelti dovrebbero apparire uniformemente casuali.Suggerisco digenerare hash diblocco (fasulli),scegliere ognibit inmodo uniforme a casoe quindi convertirliin base58e inserirlinellatua analisi.In ogni caso,nota chei fornainon hannomotivo dimanipolare l'hash _today_,ma _potrebbero_farlofacilmente se dai loro una ragione.One expects the hashes to _look_ uniformly random. The vanilla baker will generate pseudorandom POW nonces until the POW succeeds. Thus the chosen hashes should look uniformly random. I suggest generating (bogus) block hashes, choosing each bit uniformly at random and then converting to base58, and plugging them into your analysis. In any case, note that bakers have no reason to manipulate the hash _today_, but _could_ easily do so if you give them a reason.
- 1
- 2019-05-16
- Tom
-
Nota amargine:non ènecessarioinviare spam atzscan.Puoi otteneremolti hashin una volta sola usandoilnodo RPC/chains/main/blocks/coni parametri di query `length`e` head`.Side note: it is not necessary to spam tzscan. You can get lots of hashes in one go using the node RPC /chains/main/blocks/ with the `length` and `head` query parameters.
- 0
- 2019-05-16
- Tom
-
@ Tom,grazieperi suggerimenti.Per quanto riguarda l'ultimo,esiste unmanuale su come utilizzareilnodo RPC?@Tom Thanks for the suggestions. Regarding the last one, is there a manual on how to use the node RPC?
- 0
- 2019-05-17
- luchonacho
Considera un determinatoblocco della catena (adesempio questo ).Il suo codice hash è:
Sto sviluppando uno strumento cheprende questo codice hashe neproduce unnumero "casuale".Per raggiungereilmio obiettivo,hobisogno di capire:
Qualsiasi aiuto èpiù chebenvenuto.