Comment générer un faux saut de protocole valide?
-
-
Jepense que vouspourriez également simplementposer simplement la questionplusgénérale: "Comment leprotocoleest calculé" cariln'ajamais étéexpliquéicien détail.De là,vous devriez être capable d'essayer degénérer desprotocoles de vanité si vous le souhaitez;)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
-
Jepense qu'un "véritable" hachage deprotocole,comme `psddfki32cmj2qpjf43qv5gdwldpzb3t3bf6flkif5htvhnu7ap`estjuste l'encodage`b58_check` de la hachage du code source de certainsprotocoles économiques (comme le contenu de la répertoire `src/proto_003_psddfki3/lib_protocol/src`/https://gitlab.com/Tezos/Tezos/Tree/Mainnet`).Cependant,je pense qu'un "faux hash",comme `protoalphaalphalaalphaalphaalphalaalphalaalphaalphaddp3zk`,n'estpas le hachage de quelque chose.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 réponses
- votes
-
- 2019-06-21
Un "hachage deprotocole Tezos" comme
psqezzkwvmwy29kv6ojzhwdnz9fmmydjv3s7c496zmuagdyaf7E
est le codage debase58Check du hachage de certains code deprotocole.Le codage debase58Check de certaines donnéesest obtenu comme suit:
base58encode (préfixe + données + checksum)
où
préfixe
est une solution corrigée utiliséepouridentifier letype de données quenous sommes codés,DATA
est labycée quenous sommes codésetchecksum
Les 4 derniers octets deSHA256 (SHA256 (PREFIX + DATA))
(et+
est la concaténation suivante).pour un "vrai" hachage deprotocole,
data code>est le hachage Blake2b (sur 32 octets) du code deprotocoleet
Sumouule du a href="https://gitlab.com/tezos/tezos/blob/tmaster/src/lib_crypto/src/lib_crypto/base58.ml" rel="nofollownoreferrer">préfixe
est choisi detelle sorte que le codage debase58Check commence avec la lettrep
. Il s'avère que cepréfixeest"\ 002 \ 170"
("\ x02 \ xaa"
),reportez-vous aupréfixebase58
module .Un «faux» Hash deprotocoleesttel qu'ilne représentepas de code deprotocole,ilne s'agit que d'une chaîne debase58Check valide. Donc,
DATA
est lebYSTESTS videet ce quenous voulons,c'est detrouver lepréfixe BYTESTRing tel que le codage commencepar unpréfixe de cible significatif commeProtogenesisGenesisgenesisGenesSeRégénes
. À cettefin,le scriptpython B58_PREFIX.PY vient au 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,45L,174L,248L,179L,168L,190L,60L,105L,187L]
Nous l'invoquons avec lepréfixe cible souhaitéeet la longueur de la charge utile (ceciest
0
car la charge utileest vide). La liste représente lepréfixesouhaitée
. Enfin,nous devonsjuste coder cepréfixe:importerbase58 DEF TB (L): Retour B ''. Joindre (carte (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])) Imprimer (res)
quinous donne:
b'protogenesisgenesisgenesisgenesisgenesgenese3pwkfa '
.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
-
prendre
blake2b
hachage de données arbitraires. -
prépendez
\x02\xaa
et base58 l'encode avec checksum.
exempleen 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'
Commentgénérer unfaux hachage deprotocolefauxmais valide,comme
ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im
?