¿Cómo se genera el código hash de los bloques?
-
-
Unaprueba quepuede haceresevaluarprimero laspropiedades de distribución de la suma de comprobaciónbase58generando un conjunto verdaderamente aleatorio debytes de carga útil ypasandoesto a la suma de comprobaciónbase58 y luego realice latransformación que sugiera.Luego,realice unaprueba de KSparaevaluar si la distribución de dígitosesestadísticamente lamisma que laexperimental.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 respuestas
- votos
-
- 2019-05-10
- Tome una representaciónen bytes de unencabezado debloqueen particular: http://mainnet-node.tzscan.io/chains/main/blocks/head/header/raw . Elformato delencabezado delbloque se describeen el documentos .
- Obtenga un resumen de hash BLAKE2b (32bits)
- Anteponer dosbytes '\ x01 \ x34' (son responsables de la letra "B")
- Codifíqueloen Base58 con suma de comprobación
No hay aleatoriedad.
Elpanaderoeligeelencabezado delbloque. Unpanaderopuede construirfácilmentemuchosbloques diferentese inyectar soloelbloque conel hashmás deseado,manipulando sugeneración denúmeros 'aleatorios'. Debido a que unbloque de Tezos solo requiere unaprueba detrabajofácil,estoesmásfácil queen Bitcoin o Ethereum,dondeel consejo "no,no sepuedengenerarnúmeros aleatorios deesamanera" se ha dado durante años.
- 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.
-
Gracias.Entonces,la siguientepreguntaes,¿cómo se seleccionaeseencabezado debloque?¿De dóndeproviene lafuente original de "pseudoaleatoriedad"?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
-
¿Cómo seproduceelencabezado delbloque?¿Qué hace que unencabezado debloque sea diferente del otro?How is the block header produced? What makes one block header different from the other?
- 0
- 2019-05-11
- luchonacho
-
Si cree quenecesita hacerpreguntas de seguimiento,edite supregunta original (¿yeltítulo?) Para que seamás claro.Estoparece responder a lapregunta que haescrito hasta ahora.La respuestaesmuy creíblepor sí sola sinfuentes "oficiales".Pruébelo y compruebe queefectivamente obtieneel hashesperado.(Tú lo haces.)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
-
@Tom Me di cuenta de que lapregunta originalnoera suficienteparamispropósitos.De ahíel seguimiento.Actualicé lapublicación.Además,sibien elprocedimientofunciona,seríainteresante saber de dónde viene.P.ej.¿Estáestoescritoen la cadena debloques?@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
-
Intenté adaptar la advertencia clásica a Tezos.Noestoy seguro de si hay citas útiles sobreel hash debloque.En cualquier caso,los detallesno cambiarán la respuesta a supregunta real:no lo haga.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,¡graciasportus actualizaciones! luchonacho,el hash debloque de hechono debería usarse como unafuente de aleatoriedad,mejor observeelesquema que Tezos usainternamentepara la distribución de derechos de horneado.Estáen el código,peroespero que haya una respuesta aquípronto :) 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 Graciaspor la actualización.Hicemi propio análisis y llegué a una conclusión diferente.Mirami respuesta.¡Cualquierpensamientoesmás quebienvenido!@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
Michael respondió a laparte 1 demi pregunta. ¿Y la segundaparte? Bueno,acabo deecharle un vistazo. Lo que hicefue:
- extraer la serie completa de códigos hash,desdeelbloque 1 hastael último (MUY LARGO).
- extraer losnúmeros contenidosen dichos códigos hash (es decir,eliminar letras).
- analice la "aleatoriedad" deesta serie denúmeros conpruebas diseñadasexpresamente.
Laspruebas sugieren que la hipótesis de la aleatoriedadno sepuede rechazar al 5%. Curiosamente,la distribución denúmerosestámuy sesgada. Entodo caso,unopodríaesperar que separezca unpoco a una distribución uniforme (notando que lo contrarionoes cierto,es decir,la distribución uniformenoimplica aleatoriedad). Todavíaestoyinsistiendoen esto,pero unprimer vistazo sugiere que la seriepodría ser aleatoria.
El código Rpara reproducirel análisis anterior seencuentra a continuación:
# 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)
-
Seespera que los hashes se vean uniformemente aleatorios.Elpanadero de vainillageneraránonces POWpseudoaleatorios hasta queel POWtenga éxito.Por lotanto,los hasheselegidos deben verse uniformemente aleatorios.Sugierogenerar hashes debloques (falsos),elegir cadabit demanera uniforme al azar y luego convertirlos abase58 y conectarlos a su análisis.En cualquier caso,tengaen cuenta que lospanaderosnotienen ninguna razónparamanipularel hash _today_,pero _podrían_ hacerlofácilmente si les da una razón.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 almargen:noesnecesarioenviar spam atzscan.Puede obtenermuchos hashes de una vez usandoelnodo RPC/chains/main/blocks/con losparámetros de consulta `length` y` 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 Graciaspor las sugerencias.Respecto al último,¿existe algúnmanual sobre cómo utilizarelnodo 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
Considere cualquierbloque dado de la cadena (porejemplo,este ).Su código hashes:
Estoy desarrollando una herramienta quetomaeste código hash yproduce unnúmero "aleatorio".Para lograrmi objetivo,necesito comprender:
Cualquier ayudaesmás quebienvenida.