Come generare un hash di protocollo falso ma valido?
-
-
Penso chepotresti ancheporre la domandapiùgenerale: "come viene calcolato l'hash delprotocollo"perchénon èmai stato spiegato quiin dettaglio.Da lì dovrestiesserein grado diprovare agenerare hash diprotocolli vanity,se lo desideri;)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
-
Penso che un hash diprotocollo "reale",come `PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP` sia semplicemente la codifica`b58_check` dell'hash del codice sorgente di qualcheprotocolloeconomico (comeil contenuto della directory `sr00Focol_Prot3`://gitlab.com/tezos/tezos/tree/mainnet`).Tuttavia,penso che un "hashfalso",come "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",non sia l'hash di qualcosa.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 risposta
- voti
-
- 2019-06-21
Un "hash delprotocollo Tezos" come
PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e
è la codifica Base58Check dell'hash di un codice diprotocollo.La codifica Base58Check di alcuni dati si ottiene come segue:
base58encode (prefisso + dati + checksum)
dove
prefix
è una stringa dibytefissa utilizzataperidentificareiltipo di dati che stiamo codificando,data
è la stringa dibyte che stiamo codificandoechecksum
sonogli ultimi 4byte diSHA256 (SHA256 (prefix + data))
(e+
è la concatenazione di stringhe dibyte).Per un hash diprotocollo "reale",
data
è l'hash Blake2B (su 32byte) del codice delprotocolloeprefix
è sceltoin modotale che la codifica Base58Checkinizi con la letteraP
. Risulta che questoprefisso è"\ 002 \ 170"
("\ x02 \ xaa"
),vedereil sottomoduloPrefix
del < a href="https://gitlab.com/tezos/tezos/blob/master/src/lib_crypto/base58.ml" rel="nofollownoreferrer">Base58
module .Un hash diprotocollo "falso" ètale danon rappresentare alcun codice diprotocollo,ma è solo una stringa Base58Check valida. Quindi
data
èilbytestring vuoto,e quello che vogliamo ètrovareilbytestringprefix
in modo che la codificainizi con unprefissotarget significativo comeProtoGenesisGenesisGenesisGenesisGenesisGenes
. Atalfine lo script Python b58_prefix.py arriva al salvataggio:$ scripts/b58_prefix.py ProtoGenesisGenesisGenesisGenesisGenesisGenes 0 51 78975543388164909405054148723984031781676975010405372310033317301022658928601531 [2L,170L,11L,205L,127L,252L,160L,63L,87L,227L,132L,83L,240L,211L,232L,83L,48L 36L,,76L,45L,174L,248L,179L,168L,190L,60L,105L,187L]
Loinvochiamo conilprefissotarget desideratoe la lunghezza delpayload (questo è
0
poichéilpayload è vuoto). L'elenco rappresentailprefisso
desiderato. Infine,dobbiamo solo codificare questoprefisso:importbase58 deftb (l): returnb ''.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])) stampa (ris)
che ci dà:
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
-
Prendi l'hash
blake2b
di dati arbitrari. -
Anteponi
\x02\xaa
e base58 codificalo con checksum.
Esempioin 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'
Comefaccio agenerare un hash diprotocollofalsoma valido,come
ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im
?