偽の有効なプロトコルハッシュを生成する方法は?
-
-
ここでは詳細に説明されていないため、「プロトコルハッシュはどのように計算されるか」というより一般的な質問をする方がよいと思います.そこから、必要に応じてバニティプロトコルハッシュの生成を試すことができるはずです;)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
-
`PsddFKi32cMJ2qPjf43Qv5GDWLDPZb3T3bF6fLKiF5HtvHNU7aP`のような「実際の」プロトコルハッシュは、いくつかの経済プロトコルのソースコードのハッシュの単なる`b58_check`エンコーディングだと思います(ディレクトリ `src/proto_003_PsddFKi3の内容のように://gitlab.com/tezos/tezos/tree/mainnet`).ただし、「ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK」のような「偽のハッシュ」は何かのハッシュではないと思います.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 回答
- 投票
-
- 2019-06-21
PsqEZzKWvmWY29kV6oJZhWDNz9FMmYDjV3S7c496zMuAGDYAF7e
のような「Tezosプロトコルハッシュ」は、一部のプロトコルコードのハッシュのBase58Checkエンコーディングです.一部のデータのBase58Checkエンコーディングは次のように取得されます.
base58encode(prefix + data + checksum)
ここで、
prefix
は、エンコードするデータのタイプを識別するために使用される固定バイト文字列、data
はエンコードするバイト文字列、checksum
はSHA256(SHA256(prefix + data))
の最後の4バイトです(+
はバイト文字列の連結です).「実際の」プロトコルハッシュの場合、
data
はプロトコルコードのBlake2Bハッシュ(32バイト)であり、prefix
はBase58Checkエンコーディングが開始するように選択されますP
の文字で.このプレフィックスは"\ 002 \ 170"
("\ x02 \ xaa"
)であることがわかります.Prefix
サブモジュールを参照してください. a href="https://gitlab.com/tezos/tezos/blob/master/src/lib_crypto/base58.ml" rel="nofollownoreferrer">Base58
モジュール.「偽の」プロトコルハッシュは、プロトコルコードを表さず、代わりに有効なBase58Check文字列です.したがって、
data
は空のバイト文字列であり、必要なのは、エンコードがProtoGenesisGenesisGenesisGenesisGenesisGenes
のような意味のあるターゲットプレフィックスで始まるようなバイト文字列prefix
を見つけることです.この目的のために、Pythonスクリプトb58_prefix.py がレスキュー:$ 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 、76L、45L、174L、248L、179L、168L、190L、60L、105L、187L]
目的のターゲットプレフィックスとペイロードの長さで呼び出します(ペイロードが空であるため、これは
0
です).このリストは、目的のプレフィックス
を表しています.最後に、このプレフィックスをエンコードする必要があります: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])) print(res)
これにより、
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
-
任意のデータの
blake2b
ハッシュを取得します. -
\x02\xaa
を追加し、base58でチェックサムを使用してエンコードします.
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'
ProtoGenesisGenesisGenesisGenesisGenesisGenesk612im
のような偽の有効なプロトコルハッシュを生成するにはどうすればよいですか?