¿Cómo generar un hash de protocolo falso pero válido?
-
-
Creo quepodría simplemente hacer lapreguntamásgeneral: "¿cómo se calculael hash delprotocolo?"porquenunca se haexplicado aquíen detalle.Apartir de ahí,deberíapoderintentargenerar hashes deprotocolospersonalizados si lo desea;)i think you might as well simply ask the more general question: "how is the protocol hash computed" because it has never been explained here in detail. From there you should be able to try generate vanity protocols hashes if you like ;)
- 0
- 2019-02-23
- Ezy
-
Creo que un hash deprotocolo "real",como `PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP`es solo la codificación`b58_check` del hash del códigofuente de algúnprotocoloeconómico (comoel contenido del directorio `src/proto_prot`in://gitlab.com/tezos/tezos/tree/mainnet`).Sinembargo,creo que un "hashfalso",como `ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK`,noesel hash de algo.I think a "real" protocol hash, like `PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP` is just the `b58_check` encoding of the hash of the source code of some economic protocol (like the contents of the directory `src/proto_003_PsddFKi3/lib_protocol/src` in `https://gitlab.com/tezos/tezos/tree/mainnet`). However, I think a "fake hash", like `ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK`, is not the hash of something.
- 1
- 2019-02-25
- Eugen
-
2 respuestas
- votos
-
- 2019-06-21
Un "hash deprotocolo Tezos" como
PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e
es la codificación Base58Check del hash de algún código deprotocolo.La codificación Base58Check de algunos datos se obtiene de la siguientemanera:
base58encode (prefijo + datos + suma de comprobación)
donde
prefix
es una cadena debytesfija que se utilizaparaidentificareltipo de datos queestamos codificando,data
es la cadena debytes queestamos codificando ychecksum
son los últimos 4bytes deSHA256 (SHA256 (prefijo + datos))
(y+
es la concatenación de cadenas debytes).Para un hash deprotocolo "real",
data
esel hash Blake2B (en 32bytes) del código deprotocolo,yelprefix
seelige demodo que comience la codificación Base58Check con la letraP
. Resulta queesteprefijoes"\ 002 \ 170"
("\ x02 \ xaa"
),consulteel submóduloPrefix
del < un href="https://gitlab.com/tezos/tezos/blob/master/src/lib_crypto/base58.ml" rel="nofollownoreferrer">Base58
módulo .Un hash deprotocolo "falso"estal queno representaningún código deprotocolo,sino quees solo una cadena Base58Check válida. Entonces,
data
es la cadena debytes vacía,y lo que queremosesencontrar la cadena debytesprefix
demodo que la codificación comience con algúnprefijo de destino significativo comoProtoGenesisGenesisGenesisGenesisGenesisGenes
. Conestefin,el script de Python b58_prefix.py llega al rescate:$ scripts/b58_prefix.py ProtoGenesisGenesisGenesisGenesisGenesisGenes 0 51 78975543388164909405054148723984031781676975010405372310033317301022658928601531 [2L,170L,11L,205L,127L,252L,160L,63L,87L,227L,132L,83L,240L,87L,211L,3 48,232L,192L,192L,76L,45L,174L,248L,179L,168L,190L,60L,105L,187L]
Loinvocamos conelprefijo de destino deseado y la longitud de la carga útil (estoes
0
ya que la carga útilestá vacía). La lista representaelprefijo
deseado. Finalmente,solonecesitamos codificaresteprefijo:importarbase58 deftb (l): returnb ''.join (map (lambda x: x.to_bytes (1,'grande'),l)) res=base58.b58encode_check (tb ([2,170,11,205,127,252,160,63,87,227,132,83,240,211,232,76,48,36,3,192,83,87,68,139,76,45,174,248,179,168,190,60,105,187])) imprimir (res)
quenos da:
b'ProtoGenesisGenesisGenesisGenesisGenesisGenes3pWKfA '
.A "Tezos protocol hash" like
PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e
is the Base58Check encoding of the hash of some protocol code.The Base58Check encoding of some data is obtained as follows:
base58encode(prefix + data + checksum)
where
prefix
is some fixed bytestring used to identify the type of data we are encoding,data
is the bytestring we are encoding, andchecksum
are the last 4 bytes ofSHA256(SHA256(prefix+data))
(and+
is bytestring concatenation).For a "real" protocol hash,
data
is the Blake2B hash (on 32 bytes) of the protocol code, andprefix
is chosen such that the Base58Check encoding starts with the letterP
. It turns out that this prefix is"\002\170"
("\x02\xaa"
), see thePrefix
submodule of theBase58
module.A "fake" protocol hash is such that it does not represent any protocol code, instead it is just a valid Base58Check string. So
data
is the empty bytestring, and what we want is to find the bytestringprefix
such the encoding starts with some meaningful target prefix likeProtoGenesisGenesisGenesisGenesisGenesisGenes
. To this end the Python script b58_prefix.py comes to the rescue:$ scripts/b58_prefix.py ProtoGenesisGenesisGenesisGenesisGenesisGenes 0 51 78975543388164909405054148723984031781676975010405372310033317301022658928601531 [2L, 170L, 11L, 205L, 127L, 252L, 160L, 63L, 87L, 227L, 132L, 83L, 240L, 211L, 232L, 76L, 48L, 36L, 3L, 192L, 83L, 87L, 68L, 139L, 76L, 45L, 174L, 248L, 179L, 168L, 190L, 60L, 105L, 187L]
We invoke it with the desired target prefix and the length of the payload (this is
0
as the payload is empty). The list represents the desiredprefix
. Finally, we just need to encode this prefix:import base58 def tb(l): return b''.join(map(lambda x: x.to_bytes(1, 'big'), l)) res = base58.b58encode_check(tb([2, 170, 11, 205, 127, 252, 160, 63, 87, 227, 132, 83, 240, 211, 232, 76, 48, 36, 3, 192, 83, 87, 68, 139, 76, 45, 174, 248, 179, 168, 190, 60, 105, 187])) print(res)
which gives us:
b'ProtoGenesisGenesisGenesisGenesisGenesisGenes3pWKfA'
. -
- 2019-02-26
-
Tome
blake2b
hash de datos arbitrarios. -
Anteponer
\x02\xaa
y codificaren base58 con suma de comprobación.
Ejemploen Python:
from pytezos.encoding import base58_encode from pytezos.crypto import blake2b_32 base58_encode(blake2b_32('test').digest(), b'P') >>> b'PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e'
Take
blake2b
hash of arbitrary data.Prepend
\x02\xaa
and base58 encode it with checksum.
Example in Python:
from pytezos.encoding import base58_encode from pytezos.crypto import blake2b_32 base58_encode(blake2b_32('test').digest(), b'P') >>> b'PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e'
¿Cómopuedogenerar un hash deprotocolofalsopero válido,como
ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im
?