¿Cómo se calcula chain_id?
-
-
Posible duplicado de [¿Cómo codificoen base58el ID de la cadena usando Python?] (Https://tezos.stackexchange.com/questions/465/how-do-i-base58-encode-the-chain-id-using-python)Possible duplicate of [How do I base58 encode the chain ID using Python?](https://tezos.stackexchange.com/questions/465/how-do-i-base58-encode-the-chain-id-using-python)
- 3
- 2019-02-19
- Ezy
-
Las respuestasen la versión "usando Python" de lapregunta :(noparecen responder a lapreguntageneral ... Así queintentaré responder aesta.The answers in the "using Python" version of the question :( do not seem to answer the general question... So I will attempt to answer this one.
- 0
- 2019-02-27
- Tom
-
1 respuesta
- votos
-
- 2019-02-27
El
chain_id
se calcula apartir del hash delbloquegénesis de la siguientemanera.Primero,en pseudocódigo:
tezosB58CheckEncode ('Net', firstFourBytes ( blake2b (msg=tezosB58CheckDecode ('B',genesisBlockHash), tamaño=32)))
En detalle:
-
Tomeel hash delbloquegénesis. Porejemplo,en la redprincipal,estoes
"BLockGenesisGenesisGenesisGenesisGenesisf79b5d1CoW2"
. Base58Check-decodificar
el hash delbloque. Losbytes deprefijopara losbloques "B" son [1,52] (en decimal),comopuedes ver haciendogit grep B \ (
en tezos.git. Estonos da0x8fcf233671b6a04fcf679d2a381c2544ea6c1ea29ba6157776ed00b24c7ccd/código>.
-
Calculeel hash
BLAKE2B
(tamaño 32) de losbytes de hash delbloque. Obtenemos0x7a06a7709ff405d1791d856c52a3c55246e03ec913599b813ec2977398afb3be
. Tome solo losprimeros cuatrobytes,0x7a06a770
. Base58Check-encode
estos cuatrobytes conelprefijo "Net" [87,82,0] (git grep Net \ (
). Obtenemos < código> "NetXdQprcVkpaWU" .
Para una cadena deprueba de actualización deprotocolo,creo queelbloque 'génesis' seráelbloqueen la cadenaprincipal desde la cual sebifurcó la cadena deprueba.
Puedeencontrareste cálculo definidoen
lib_crypto/chain_id.ml
y luego se usa comoChain_id.of_block_hash
en varios lugares (porejemplo,lib_shell/state.ml
,lib_shell/chain_validator.ml
=" //gitlab.com/tezos/tezos/blob/e7612c5ffa46570cdcc612f7bcead771edc24283/src/lib_storage/context.ml#L454 "rel="nofollownoreferrer ">lib_storage/context.ml
).The
chain_id
is computed from the genesis block hash as follows.First, in pseudocode:
tezosB58CheckEncode('Net', firstFourBytes( blake2b(msg = tezosB58CheckDecode('B', genesisBlockHash), size = 32)))
In detail:
Take the genesis block hash. For example, in mainnet, this is
"BLockGenesisGenesisGenesisGenesisGenesisf79b5d1CoW2"
.Base58Check-decode
the block hash. The prefix bytes for blocks "B" are [1, 52] (in decimal), as you can see by doinggit grep B\(
in tezos.git. This gives us0x8fcf233671b6a04fcf679d2a381c2544ea6c1ea29ba6157776ed8424c7ccd00b
.Compute the
BLAKE2B
hash (size 32) of the block hash bytes. We get0x7a06a7709ff405d1791d856c52a3c55246e03ec913599b813ec2977398afb3be
. Take only the first four bytes,0x7a06a770
.Base58Check-encode
these four bytes with the "Net" prefix [87, 82, 0] (git grep Net\(
). We get"NetXdQprcVkpaWU"
.
For a protocol update test chain, I believe the 'genesis' block will be the block in the main chain from which the test chain was forked.
You can find this computation defined in
lib_crypto/chain_id.ml
and then used asChain_id.of_block_hash
in various places (e.g.lib_shell/state.ml
,lib_shell/chain_validator.ml
,lib_storage/context.ml
).-
¡graciasportu respuesta!¿Podríaproporcionar,siesposible,como referencia unafuenteparaestainformación?thanks for your answer! could you provide if possible for reference a source for this information ?
- 0
- 2019-03-01
- Ezy
El
GET /chains/<chain_id>/chain_id
de RPC devuelve:¿Cómo se calculaesteidentificador?