ブロックのハッシュコードはどのように生成されますか?
-
-
実行できるテストの1つは、最初にペイロードバイトの真にランダムなセットを生成してbase58チェックサムの分散プロパティを評価し、これをbase58チェックサムに渡してから、提案した変換を実行することです.次に、KSテストを実行して、数字の分布が実験的なものと統計的に同じであるかどうかを評価します.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 回答
- 投票
-
- 2019-05-10
- 特定のブロックヘッダーのバイト表現を取得します. http://mainnet-node.tzscan.io/chains/main/blocks/head/header/raw .ブロックヘッダーの形式は、 で説明されています. ドキュメント.
- BLAKE2b(32ビット)ハッシュダイジェストを取得します
- 2バイトの '\ x01 \ x34'を追加します(「B」の文字を担当します)
- Base58はチェックサムでエンコードします
ランダム性はありません.
パン屋はブロックヘッダーを選択します.パン屋は、多くの異なるブロックを簡単に作成し、最も必要なハッシュを含むブロックのみを挿入して、「乱数」の生成を操作できます. Tezosブロックは簡単なプルーフオブワークしか必要としないため、「いいえ、その方法で乱数を生成することはできません」というアドバイスが何年も与えられてきたビットコインやイーサリアムよりも簡単です.
- 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.
-
ありがとう.次の質問は、そのブロックヘッダーはどのように選択されるのかということです.「疑似ランダム性」の元のソースはどこから来ていますか?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
-
ブロックヘッダーはどのように生成されますか?1つのブロックヘッダーが他のブロックヘッダーと異なる点は何ですか?How is the block header produced? What makes one block header different from the other?
- 0
- 2019-05-11
- luchonacho
-
フォローアップの質問をする必要があると思われる場合は、元の質問(およびタイトル?)を編集してより明確にしてください.これはあなたがこれまでに書いた質問に答えているようです.答えは、「公式の」情報源がなくても、それ自体で非常に信頼できます.試してみて、実際に期待されるハッシュが得られることを確認してください.(あなたがやる.)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 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
-
私は古典的な警告をテゾスに適応させようとしました.ブロックハッシュについて有用な引用があるかどうかはわかりません.いずれにせよ、詳細があなたの本当の質問への答えを変えることはありません:しないでください.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
-
@トム、アップデートしてくれてありがとう! luchonacho、ブロックハッシュは確かにランダム性のソースとして使用されるべきではありません.Tezosがベーキング権の配布のために内部的に使用するスキームをよく見てください.それはコードにありますが、すぐにここに答えがあることを願っています:) 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更新していただきありがとうございます.私は自分で分析を行い、別の結論を得ました.私の答えを見てください.どんな考えでも大歓迎です!@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
私の質問のパート1はマイケルによって答えられました.第二部はどうですか?さて、私はそれを見ただけです.私がしたことは:
- ブロック1から最新(非常に長い)までの一連のハッシュコード全体を抽出します.
- そのようなハッシュコードに含まれる数字を抽出します(つまり、文字を削除します).
- 意図的に設計されたテストを使用して、この一連の数値の「ランダム性」を分析します.
テストは、ランダム性仮説が5%で棄却できないことを示唆しています.興味深いことに、数の分布は非常に偏っています.どちらかといえば、それが一様分布にいくらか似ていると予想するかもしれません(逆は真実ではないことに注意してください.つまり、一様分布はランダム性を意味しません).私はまだこれにドキドキしていますが、一見するとシリーズがランダムである可能性があります.
上記の分析を再現するためのRコードは以下のとおりです.
# 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)
-
ハッシュは均一にランダムに見えると予想されます.バニラベイカーは、POWが成功するまで、疑似ランダムPOWナンスを生成します.したがって、選択したハッシュは均一にランダムに見えるはずです.(偽の)ブロックハッシュを生成し、各ビットをランダムに均一に選択してから、base58に変換し、それらを分析にプラグインすることをお勧めします.いずれにせよ、パン屋はハッシュを操作する理由が_今日_ありませんが、理由を説明すれば簡単に操作できることに注意してください.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
-
補足:tzscanをスパムする必要はありません.ノードRPC/chain/main/ブロック/と `length`および` 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
-
@トム提案をありがとう.最後のものに関して、ノード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
チェーンの特定のブロックを検討します(例:これ).そのハッシュコードは次のとおりです.
このハッシュコードを取得して、そこから「乱数」を生成するツールを開発しています.目標を達成するには、次のことを理解する必要があります.
どんな助けでも大歓迎です.