무작위 시드를 계산하는 방법은 무엇입니까?
1 대답
- 투표
-
- 2019-05-16
다음 작업이 필요합니다.
-
blake2b
: 크기 32 -
concat
: 바이트 배열 연결
또한
zero_bytes
를 32 개의 0 바이트로 지정합니다.제 답변은 seed_storage를 기반으로합니다.ml 및 seed_repr.ml ,약간의 실험이 있습니다.
초기 시드
처음부터 시작하겠습니다.
초기preserved_cycles + 2=7 개의 종자는 다음과 같이 미리 결정되었습니다. 첫 번째 시드는 빈 메시지의 해시입니다.
seed [0]=blake2b ([])=0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8
나머지 6 개의 초기 시드는 각각 이전에서 계산됩니다.
seed [n]=blake2b (concat (seed [n-1],zero_bytes))
다음과 같은 초기 시드를 제공합니다.
<사전> <코드> | 사이클| 씨| | ------- + ----------------------------------------- -------------------------| | 0| 0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8| | 1| c8db55740733852aa18aa82e108e4475b1abcf3f1f077ac966e9cecca86612ec| | 2| 270da140de63850f631d09a95eab26dc39cc92f8feae73875c7cf9aaa3bf4cac| | 3| 97d50852c159ada8e9f107e98f693b059ba28336c723e6cd0f6353eb3c0cb415| | 4| 0c7ea5ee0b25b7105f934c6511756ec20abcf5c6eea4d45721c138c3e751469b| | 5| beb4d79b65faa3e902e73d031ad6466299f01aab517d303151a99605a259a11e| | 6| 5e695ae038c2bdc54706547fc743eb3564ca5a0b4b5d8e9de2ca4780157ca61e|다음주기의 시드
여기에서 공개 된nonce를 사용하여 이전 시드에서 다음 시드를 계산합니다.
seed [n]=seed [n-1] # '제로 논스'로 시작 : seed [n]=blake2b (concat (seed [n],zero_bytes)) # 그런 다음 공개 된nonce를 사용합니다. nonces_for [n]의nonce : 시드 [n]=blake2b (concat (seed [n],nonce))
넌 스는 감소 레벨 순서로 취해집니다.
예를 들어주기 7의 랜덤 시드를 계산하기 위해주기 0 과정에서 드러난nonce를 얻을 수 있습니다.
# 최고 수준은 ((n-5) * 4096) -1? # 경고,이것은 완전하지 않습니다. 아래를 참조하십시오. # 8191=((7-5) * 4096) -1 # 0=7-7 curl -s http ://localhost : 18732/chains/main/blocks/8191/context/raw/json/cycle/0/nonces? depth=1 \ | jq -r '. []| "\ (. [0]) \t \ (. [1])" '| 정렬 -rnk1| 컷 -f2
첫 번째 임시 값 (내림차순)은 "1ee95fe66b ..."이고 마지막 임시 값은 "d1012e79ab ..."이므로 다음을 계산합니다.
# seed=="5e695ae038c2bdc54706547fc743eb3564ca5a0b4b5d8e9de2ca4780157ca61e" # 0 임시 값 seed=blake2b (concat (seed,"0000000000000000000000000000000000000000000000000000000000000000")) # 시드=="9b7328e5393a466fc47ef16eb74121939b06e6ec4c17295eb25611f1b76d6a33" # 첫 번째 임시 값 시드=blake2b (concat (seed,"1ee95fe66bb3dc2a62195dd41a07a30835e63b91db395aa64150da3decc3be1c")) # 시드=="f9b94526a502a1d8e4042eba2deb682dd752627ea6e4472187ad1c1e465be0f4") # ... 다른 논스 ... # 시드=="469a48304fc415870289ac8bd875b04107381a2471a878a2a8da16e43dfc5880" # 마지막 임시 값 시드=blake2b (concat (seed,"d1012e79abc75ffc4228f69ace060e1003c8fff0aa9d58a2d78816713b72c278")) # 시드=="1bcd1d832aff2d72a8d16a9f9e5f994e177e29eac789138b019f0c4a30c4e5ec"
지금까지 좋음 :
$ curl http ://localhost : 18732/chains/main/blocks/24575/context/raw/json/cycle/7/random_seed "1bcd1d832aff2d72a8d16a9f9e5f994e177e29eac789138b019f0c4a30c4e5ec"
논스를 얻는 방법
하지만 계속 진행하면 문제가 발생합니다.
context/raw/json/cycle/& lt; cycle >/nonces
를 사용하여 공개 된nonce를 모두 얻는 것이 가능하지 않다고 생각합니다.nonce가 사이클 새벽에 공개되면 원시 컨텍스트 RPC를 통해 사용할 수있게되기 전에 사용 즉시 프로토콜에 의해 삭제 될 것이라고 생각합니다.첫 번째 문제는 레벨 200704에서 블록의 폭로 인 것 같습니다.
물론 Alt-shell을 만들면 자연스럽게nonce를 얻을 수 있고,저처럼 호기심 만 있다면 상관 없습니다.
We will need these operations:
blake2b
: size 32concat
: concatenation of byte arrays
Also, let
zero_bytes
be 32 zero bytes.My answer is based on seed_storage.ml and seed_repr.ml, with some experimentation.
Initial seeds
Let's start at the beginning.
The initial preserved_cycles+2 = 7 seeds were determined ahead of time, as follows. The first seed is the hash of the empty message:
seed[0] = blake2b([]) = 0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8
The remaining 6 initial seeds are each computed from the previous:
seed[n] = blake2b(concat(seed[n-1], zero_bytes))
This gives the following initial seeds:
| cycle | seed | |-------+------------------------------------------------------------------| | 0 | 0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8 | | 1 | c8db55740733852aa18aa82e108e4475b1abcf3f1f077ac966e9cecca86612ec | | 2 | 270da140de63850f631d09a95eab26dc39cc92f8feae73875c7cf9aaa3bf4cac | | 3 | 97d50852c159ada8e9f107e98f693b059ba28336c723e6cd0f6353eb3c0cb415 | | 4 | 0c7ea5ee0b25b7105f934c6511756ec20abcf5c6eea4d45721c138c3e751469b | | 5 | beb4d79b65faa3e902e73d031ad6466299f01aab517d303151a99605a259a11e | | 6 | 5e695ae038c2bdc54706547fc743eb3564ca5a0b4b5d8e9de2ca4780157ca61e |
The next cycle's seed
From here, we use the revealed nonces to compute the next seed from the previous seed:
seed[n] = seed[n-1] # start with a 'zero nonce': seed[n] = blake2b(concat(seed[n], zero_bytes)) # then use the revealed nonces: for nonce in nonces_for[n]: seed[n] = blake2b(concat(seed[n], nonce))
The nonces are taken in decreasing level order.
For example, to calculate the random seed for cycle 7, we can grab the nonces revealed over the course of cycle 0:
# The best level seems to be ((n-5)*4096)-1? # Warning, this is not complete, see below. # 8191 = ((7-5)*4096)-1 # 0 = 7-7 curl -s http://localhost:18732/chains/main/blocks/8191/context/raw/json/cycle/0/nonces?depth=1 \ | jq -r '.[] | "\(.[0])\t\(.[1])"' | sort -rnk1 | cut -f2
The first nonce (in decreasing level order) is "1ee95fe66b...", and the last is "d1012e79ab...", so we compute:
# seed == "5e695ae038c2bdc54706547fc743eb3564ca5a0b4b5d8e9de2ca4780157ca61e" # zero nonce seed = blake2b(concat(seed, "0000000000000000000000000000000000000000000000000000000000000000")) # seed == "9b7328e5393a466fc47ef16eb74121939b06e6ec4c17295eb25611f1b76d6a33" # first nonce seed = blake2b(concat(seed, "1ee95fe66bb3dc2a62195dd41a07a30835e63b91db395aa64150da3decc3be1c")) # seed == "f9b94526a502a1d8e4042eba2deb682dd752627ea6e4472187ad1c1e465be0f4") # ... the other nonces ... # seed == "469a48304fc415870289ac8bd875b04107381a2471a878a2a8da16e43dfc5880" # last nonce seed = blake2b(concat(seed, "d1012e79abc75ffc4228f69ace060e1003c8fff0aa9d58a2d78816713b72c278")) # seed == "1bcd1d832aff2d72a8d16a9f9e5f994e177e29eac789138b019f0c4a30c4e5ec"
So far so good:
$ curl http://localhost:18732/chains/main/blocks/24575/context/raw/json/cycle/7/random_seed "1bcd1d832aff2d72a8d16a9f9e5f994e177e29eac789138b019f0c4a30c4e5ec"
How to get the nonces?
However, if you keep going, you will run into a problem.
I don't believe it is possible to use
context/raw/json/cycle/<cycle>/nonces
to get all the revealed nonces. If a nonce is revealed just at cycle dawn, I believe it will be deleted by the protocol immediately upon use, before it is made available via the raw context RPC.The first problem seems to be the revelation in the block at level 200704.
Of course, if you are building an alt-shell, you will naturally acquire the nonces, and if, like me, you are just curious, this doesn't matter.
-
깔끔한 설명 감사합니다!여기에 오타를 만들었습니다.`seed [n]=blake2b (concat (seed [n-1],nonce))`-`concat (seed [n],nonce)`;) Btw,요점을 만들었습니다.임의의 시드를 생성하는 C #은 누군가 유용하다고 생각할 것입니다.https://gist.github.com/Groxan/c0f11a896bcf9a43e0fff9ba2e46223bNeat explanation, thanks! You made a typo here `seed[n] = blake2b(concat(seed[n-1], nonce))` - it should be `concat(seed[n], nonce)` ;) Btw, I created a gist on C# with generation of a random seed, maybe someone would find it useful. https://gist.github.com/Groxan/c0f11a896bcf9a43e0fff9ba2e46223b
- 1
- 2019-05-16
- Groxan
-
레벨 200704에서 블록의 계시에 관해서는 놀랐습니다.=) 마지막 임시 값을 추가 할 때까지 잘못된 시드를 얻으려고했습니다.슬프게도 문서에 설명되지 않은 함정이 너무 많습니다.As for the revelation in the block at level 200704 - it was a surprise for me =) I tried to get the seed an it was incorrect until I appended the last nonce. Sadly, there are so many pitfalls that are not described in the docs.
- 1
- 2019-05-16
- Groxan
-
고마워요,이것이 제가 명령형 의사 코드를 작성하려고 시도한 결과입니다.;)Whoops, thanks, that is what I get for trying to write imperative pseudocode. ;)
- 1
- 2019-05-16
- Tom
예를 들어,99주기에서 밝혀진 126/128 개의 논 스가 있습니다. /chains/main/blocks/409599/context/raw/json/cycle/98/nonces? depth=1
올바르게 이해하면이nonce를 사용하여 랜덤 시드를 계산할 수 있습니다.누구든지이 작업을 수행하는 방법을 설명 할 수 있습니까?