Como o código de hash de blocos é gerado?
-
-
Umteste que vocêpodefazer é avaliar aspropriedades de distribuição da soma de verificaçãobase58,gerando um conjunto verdadeiramente aleatório debytes de carga útile passandoporissopara a soma de verificaçãobase58e,em seguida,faça atransformação que você sugere.Em seguida,execute umteste KSpara avaliar se a distribuição de dígitos éestatisticamente omesmo que oexperimental.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 respostas
- votos
-
- 2019-05-10
- .
- Tome uma representação debytes de um determinado cabeçalho debloco: http://mainnet-node.tzscan.io/chains/Main/blocos/cabeça/cabeçalho/cru . Oformato do cabeçalho dobloco é descritoem o docs .
- obter um hashblake2b (32bit) digere
- Prepare doisbytes '\ x01 \ x34' (eles são responsáveis pela letra "B"
- base58 o codifique com soma de verificação
Não há aleatoriedade.
O Bakerescolhe o cabeçalho dobloco. Umpadeiropodefacilmente construirmuitosblocos diferentese injetar apenas obloco com o hashmais desejado,manipulando suageração denúmeros "aleatórios". Porque umbloco de Tezos requer apenas umaprovafácil detrabalho,isso émaisfácil do queem Bitcoin ou Ethereum,onde o conselho "Não,vocênãopodegerarnúmeros aleatórios dessamaneira"foi dado há anos.
- 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.
-
Obrigado.Então apróximapergunta é,como é queesse cabeçalho debloco selecionado?Onde é afonte original de "pseudo-aleatoriedade" vindo?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
-
Como o cabeçalho dobloco éproduzido?O quefaz um cabeçalho debloco diferente do outro?How is the block header produced? What makes one block header different from the other?
- 0
- 2019-05-11
- luchonacho
-
Se você acha queprecisafazerperguntas de acompanhamento,edite suapergunta original (etítulo?) Para sermais claro.Issoparece responder àpergunta que vocêescreveu até agora.A resposta émuito credívelpor contaprópria semfontes "oficiais".Apenastente e veja que você realmente recebe o hashesperado.(Vocêfaz.)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 Eupercebi que apergunta originalnãofoi suficientepara osmeuspropósitos.Daí o acompanhamento.Eu atualizei opost.Além disso,embora oprocedimentofuncione,seriainteressante saber de onde vem.Porexemplo.Isso éescritonoblockchain?@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
-
Eutentei adaptar o aviso clássicopara Tezos.Nãotenho certeza se há quaisquer citações úteis sobre o hashblock.Em qualquer caso,os detalhesnão alteram a respostapara sua verdadeirapergunta:não.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,obrigadopor suas atualizações! Luchonacho,bloco de hash,defato,não deve ser usado comofonte de aleatoriedade,melhor olharpara oesquema Tezos usainternamentepara distribuição de direitos de cozimento.Estáno código,masespero que haja uma resposta aquiem breve :) 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 Obrigadopela atualização.Eufizminhaprópria análisee tenho uma conclusão diferente.Vejaminha resposta.Qualquerpensamento émais do quebem-vindo!@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
Parte 1 daminhaperguntafoi respondidapor Michael. E a segundaparte? Bem,eutive uma olhadanisso. O queeufiz é:
- Extraia a série completa de códigos de hash,dobloco 1para omais recente (muito longo).
- Extraia osnúmeros contidosem tais códigos de hash (i.e. Remover letras).
- analisar a "aleatoriedade" desta série denúmeros comtestespropositalmenteprojetados.
Ostestes sugerem que a hipótese da aleatoriedadenãopode ser rejeitadaem 5%. Curiosamente,a distribuição denúmeros émuito distorcida. Se alguma coisa,pode-seesperar que seja umpoucoparecido com uma distribuição uniforme (percebendo que o contrárionão é verdade,isto é,a distribuição uniformenãoimplica aleatoriedade). Eu aindaestoubatendonisso,mas umaprimeira olhada sugere que a sériepode ser aleatória.
O código Rpara reproduzir a análise acimaestá abaixo:
# 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)
-
Espera-se os hashespara _look_ uniformemente aleatório.Obaker debaunilhagerarápseudorandom wonces até que opow sejabem-sucedido.Assim,os hashesescolhidos devemparecer uniformemente aleatórios.Eu sugirogerar hashes debloco (falsos),escolhendo uniformemente uniformemente ao aleatórioe,em seguida,convertendoparabase58e conectando-os à sua análise.De qualquerforma,observe que ospadeirosnãotêmmotivosparamanipular o hash _today_,mas _could_facilmentefazerisso se você der ummotivo.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 lateral:não énecessário spamtzscan.Vocêpode obtermuitos hashes de uma só vez usando onó rpc/cadeias/main/blocks/com osparâmetros de consulta `Comprimento`e` cabeça`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 obrigadopelas sugestões.Em relação ao último,existe ummanual sobre como usar onó 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 qualquer determinadobloco da cadeia (porexemplo,este ).Seu código de hash é:
Euestou desenvolvendo umaferramenta que levaesse código de hashe produz umnúmero "aleatório"fora dele.Para alcançarmeu objetivo,precisoentender:
.- Qual é o algoritmo usadoparaproduzireste código?
- Como "aleatório" são as letrase númerosneste código?
Qualquer ajuda émais do quebem-vinda.