Como gerar um hash falso, mas válido de protocolo?
-
-
Eu acho que vocêtambémpode simplesmenteperguntar amaisperguntageral: "Como oprotocolo é calculado"porquenuncafoiexplicado aquiem detalhes.De lá você deve ser capaz detentargerar hashes deprotocolos de vaidade se quiser;)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
-
Eu acho que umprotocolo de "real" hash,como "psddfki32cmj2qpjf43qv5gdwldpzb3t3bf6flkif5htvhnu7ap" é apenas a codificação "B58_Check" do hash do código-fonte de algumprotocoloeconômico (como o conteúdo do diretório "src/proto_003_psddfki3/lib_protocoll/src"em "https".://gitlab.com/tezos/tezos/tree/mainnet`).Noentanto,acho que um "falso hash",como «protoalfaalpalfalpalfalpalfalpalfaalpalfaalpalfaddp3zk`,não é o hash de alguma coisa.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 respostas
- votos
-
- 2019-06-21
um "protocolo de Tezos Hash" como
psqezzkwvmwy29kv6ojzhwdnz9fmmydjv3s7c496zmuagdyaf7e
é a codificaçãobase58Check do hash de algum código deprotocolo.A codificaçãobase58Check de alguns dados é obtida da seguinteforma:
Base58enCode (prefix + data + shecksum)
Onde
Prefixo
é algumbyteStringfixo usadoparaidentificar otipo de dados queestamos codificando,dados
é obytestring queestamos codificandoesoma de verificação
são os últimos 4bytes desha256 (SHA256 (Data Prefix + Data)) (e
+
estábytestring concatenation).Para um hash "real" deprotocolo,
.dados
é o hash Blake2B (em 32bytes) do código deprotocoloeprefixo
éescolhido detalmodo que a codificaçãobase58Check começa com a letrap
. Acontece queesteprefixo é"\ 002 \ 170"
("\ x02 \ xaa"
),consulte o submóduloprefixo
do < um href="https://gitlab.com/tezos/tezos/blob/master/src/lib_crypto/base58.ml" rel="nofollownoreferer">base58
módulo .Um hash "falsificado" de hash étal quenão representanenhum código deprotocolo,em vez disso,é apenas uma seqüência válida debase58Check. Assim,
Dados é obytestring vazio,e o que queremos éencontrar oprefixo bytestring
Tal a codificação começa com algumprefixo de destino significativo comoprotogenesisenesisenesisenesiseneseseses
. Paraestefim o scriptpython b58_prefix.py chega ao Resgate:$ Scripts/B58_Prefix.py ProtogenesisEnsisEsisEnesisGenes 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]
Invoquemos com oprefixo de destino desejadoe o comprimento da carga útil (isto é
0
como a carga útilestá vazia). A lista representa oprefixo . Finalmente,sóprecisamos codificaresteprefixo:Base de Importação58 deftb (l): Retornar B ''. Junte (Mapa (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]))) Imprimir (res)
O quenos dá:
B'ProtogênesisEnesiãoGenesiãoGeneseses3pwkfa '
.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 dados arbitrários. -
Prepare
\x02\xaa
e base58 codifique-o com soma de verificação.
Exemploem 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'
Comofaçoparagerar um hashfalso,mas válido,como
ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im
?