Comment le code de hachage de blocs est généré?
-
-
Untest que vouspouvezeffectuerest d'abord évaluer lespropriétés de distribution de la checksum Base58en générant unensemble vraiment aléatoire d'octets de charge utileet enpassant cela à labase de labase58,puisfaites latransformation que vous suggérez.Effectuezensuite untest KSpour évaluer si la répartition des chiffresest statistiquement lamême que celleexpérimentale.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 réponses
- votes
-
- 2019-05-10
- Prenez une représentation d'octets d'unbloc deblocparticulier: http://mainnet-node.tzscan.io/chains/Main/Blocs/Head/Header/RAW . Leformat de l'en-tête deblocest décrit dans Le Docs .
- Obtenez un digest de hachage de Blake2b (32bits)
- Prepend Deux octets '\ x01 \ x34' (ils sont responsables de la lettre "B")
- base58 le codez avec de la somme de contrôle
Iln'y apas de hasard.
Leboulanger choisit l'en-tête debloc. Unboulangerpeutfacilement construire denombreuxblocs différentset injecter uniquement lebloc avec le hachage leplus souhaité,manipuler votregénération denombres «aléatoire». Étant donné qu'unbloc Tezosnécessite unepreuve detravailfacile,c'estplusfacile que dans Bitcoin ouenthérum,où le conseil "Non,vousne pouvezpasgénérer denombres aléatoires de cettefaçon" a été donnée depuis des années.
- 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.
-
Merci.Laprochaine questionest donc,commentest sélectionnée cetteen-tête debloc?D'où vient la source originale de "pseudo-aléatoire"?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
-
Commentestproduite l'en-tête debloc?Qu'est-ce quifait unetête debloc différente de l'autre?How is the block header produced? What makes one block header different from the other?
- 0
- 2019-05-11
- luchonacho
-
Si vous sentez que vous avezbesoin de demander des questions de suivi,veuillez éditer votre questioninitiale (et votretitre?) Pour êtreplus clair.Cela semble répondre à la question que vous avez écritejusqu'àprésent.La réponseesttrès crédible àelle seule sans sources «officielles».Essayez-leet voyez que vous obtenezeffectivement obtenir le hachage attendu.(Tufais.)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
-
@Tomj'ai réalisé que la questioninitialen'apas suffipourmesbesoins.D'où le suivi.J'aimis àjour leposte.En outre,bien que laprocédurefonctionne,il seraitintéressant de savoir d'où vient.Parexemple.Est-ce écrit dans leblockchain?@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
-
J'aiessayé d'adapter l'avertissement classique à Tezos.Jene suispas sûr de savoir s'ilexiste des citations utiles sur le hachage debloc.Entout état de cause,les détailsne changerontpas la réponse à votre vraie question:ne lefaitespas.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,mercipour vosmises àjour! Lucharonacho,Block Hashne devraiten effetpas être utilisé comme source de hasard,ilestpréférable d'examiner le schéma Tezos utiliseen internepour la répartition des droits de cuisson.C'est dans le code,maisj'espère qu'il y aura une réponseicibientôt :) https://tezos.stackexchange.com/questions/1201/how-a-calculat-a-random-s@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 Mercipour lamise àjour.J'aifaitmapropre analyseet j'aieu une conclusion différente.Voirma réponse.Toutes lespensées sontplus que lesbienvenues!@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
Lapartie 1 dema question a été réponduepar Michael. Qu'enest-il de la deuxièmepartie? Ehbien,je viens de regarder ça. Ce quej'aifaitest:
- Extraire la série complète de codes de hachage,dubloc 1 au dernier (très long).
- extraire lesnombres contenus dans detels codes de hachage (c'est-à-dire supprimer des lettres).
- analyser le "aléatoire" de cette série denombres avec destests conçus à dessein.
Lestests suggèrent que l'hypothèse de hasardne peut être rejetée à 5%. Faitintéressant,la distribution de chiffresesttrès asymétrique. Si quelque chose,onpourrait s'attendre à ce qu'il ressemble unpeu à une distribution uniforme (remarquant que le contrairen'estpas vrai,c'est-à-dire une distribution uniformen'impliquepas aléatoire). Jefrappetoujours sur cela,mais unpremier regard suggère que la sériepourrait être aléatoire.
Le code Rpour reproduire l'analyse ci-dessusest ci-dessous:
# 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)
-
On s'attend à ce que les hachages soient uniformément aléatoires.Le Baker Vanillagénérera Pseudorandom Pow de PowCsjusqu'à ce que le POW réussisse.Ainsi,les hachages choisis devraient sembler uniformément aléatoires.Je suggère degénérer desblocages deblocs (faux),de choisir chaquebit uniformément au hasard,puis de la convertiren base58et de lesbrancher dans votre analyse.Entout état de cause,notez que lesboulangersn'ont aucune raison demanipuler le hash _today_,mais vous leferiezfacilement si vous leur donnez une raison.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
-
Note latérale: Iln'estpasnécessaire de spam Tzscan.Vouspouvez obtenirbeaucoup de hashesen unefois à l'aide dunœud RPC/chaînes/principaux/blocs/avec lesparamètres de requête `longueur`et` 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
-
@Tommercipour les suggestions.En ce qui concerne le dernier,existe-t-il unmanuel sur lamanière d'utiliser lenœud 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
Considérezn'importe quelbloc de la chaîne (parexemple Celui-ci ).Son code de hachageest:
Je développe un outil quiprend ce code de hachageet produit unnuméro "aléatoire" de celui-ci.Pour atteindremon objectif,j'aibesoin de comprendre:
Toute aideestplus que labienvenue.