Format de la clé publique, de la signature et des littéraux key_hash
3 réponses
- votes
-
- 2019-02-15
Il y a un code Pythonpour lefaire dans cebloget un commentairepostépar Alain:
http://www.OCAMLPRO.com/2018/11/21/AN-INTRODUCTION-TO-TEZOS-RPCS-Signature-Operations/
There are some Python code to do that in this blog and a comment posted by Alain:
http://www.ocamlpro.com/2018/11/21/an-introduction-to-tezos-rpcs-signing-operations/
-
- 2019-02-16
1) Àpropos de la clépublique ED25519et commentilesten octets:
de [1] :
Lestouches ED25519 Démarrez la vie sousforme degrainesbinaires aléatoires de 32 octets (256bits) (parexemple,la sortie de SHA256 sur uneentrée aléatoire). Lagraineestensuite hachée à l'aide de SHA512,qui vous obtient 64 octets (512bits),quiestensuite diviséen une "moitiégauche" (lespremiers 32 octets)et une "moitié droite". Lamoitiégaucheestmassée dans un scalaireprivé de Curve25519 "A"en réglantet en éliminant quelquesbits de hautetempérature. Le Pubkeyestgénéréen multipliant ce scalaire secretpar "B" (legénérateur),qui donne un élément degroupe de 32 octets/256bits "A".
Pour le convertiren ceformat de chaîne,vous devez la diviseren caractères 6bits conformément à latransformation deformat BASE64.
Basé sur ce Q/A (voir: [2] ),latouchepublique 32 octets/256bits doit être de 51 octets ouen format BASE64 68 caractères.
Votreexemple clé semble avoir 54 caractères,ce qui semblebizarre,car cen'est rien de ce quiprécède.
(je l'aimodifié auxemplacements de 5 x 10 + 1 x 4)
EDPKTICEBMR R9DF3DQZZA JPDZBXB1H1 88FYRQYRJC M5RH2WPBVM VR8B
qui révèle que les Tezos ont un codage différent:base58. Cela a étémentionné dans votre lien d'origine:
Les contrats,les adresses,les cléset les signatures sont écrits comme des chaînes,dans leurs versionsencodées debase58 habituelles (lisibles) ou comme leurs octetsbruts (optimisés).
Pour décoder,il y avait un appel Python
base58check.b58decode
dans le contenu de la liaison de réponse de la réponse du FLF.2) Signatureet key_hash
Les signatures sont égalementbase58. (Voir 1)
J'aitrouvé sur
key_hash
qu'il s'agit de sonpropretype de données dans Tezos (l'une des rares)et ilest utilisé comme ceci:Nouspouvons combiner cestypes atomiquespour créer destypesplus complexes à l'aide de constructeurs. Parexemple,la chaîne Int représente unepaire de deux valeurs,unentieret une chaîne de chaîne,ou une chaîne de signature représente une valeur soit une signature,soit une chaîne,liste horodatage une liste detimbres horaireset de la carte
key_hash
NATest letype d'une carte associativeentre le hachage d'une clépubliqueet unentierpositif.Autrestypes:
TimeStamp: Dates dans lemonde réel.
MuteZ: untype spécifiquepourmanipuler desjetons.
Contrat 'Param: un contrat,avec letype de son code.
Adresse: une adresse contractuellenonessuyée.
Opération: une opérationinterne émisepar un contrat.
clé: une clé de cryptographiepublique.
Key_Hash: le hachage d'une clé de cryptographiepublique.
Signature: une signature cryptographique.
3) Àpropos de laformation de hachage de clé:
Jen'aipastrouvéplus que l'utilisation de celui-ciet lefait qu'il s'agisse d'untypenatif à Tezos.
mes sources: [1] https://blog.mozilla.org/warner/2011/11/29/ed25519-Keys/
[2] https://crypto.stackexchange.com/questions/44584/ed25519-ssh-public-key-is-always-80-Characters-long [3] https://hackernoon.com/Consultation Hash-In-Tezos-E4A59eeAeA5CD 1) About the ed25519 public key, and how it is in bytes:
From [1]:
Ed25519 keys start life as a 32-byte (256-bit) uniformly random binary seed (e.g. the output of SHA256 on some random input). The seed is then hashed using SHA512, which gets you 64 bytes (512 bits), which is then split into a “left half” (the first 32 bytes) and a “right half”. The left half is massaged into a curve25519 private scalar “a” by setting and clearing a few high/low-order bits. The pubkey is generated by multiplying this secret scalar by “B” (the generator), which yields a 32-byte/256-bit group element “A”.
To convert it to this String format you need to split it to 6 bit chars as per the Base64 format transformation.
Based on this Q/A (see: [2]), the public 32 bytes / 256 bit key should be 51 bytes or in Base64 format 68 characters.
Your key example seems to have 54 chars, which seems weird, because it is none of the above.
(I modified it to slots of 5 x 10 + 1 x 4)
edpktieBMr R9Df3dqzZA JpDZBXb1h1 88fyrQyRJc m5RH2WpbvM VR8b
That reveals Tezos have different encoding: Base58. That was mentioned in your original link:
contracts, addresses, keys and signatures are written as strings, in their usual Base58 encoded versions (readable), or as their raw bytes (optimized).
To decode, there was a python call
base58check.b58decode
in the FLF OCP's answer link content.2) signature and key_hash
signatures are also base58. (see 1)
I found about
key_hash
that it is its own datatype in Tezos (one of the few ones) and it is used like this:We can combine those atomic types to build more complex types using constructors. For instance pair int string represents a pair of two value, an integer, and a string, or signature string represents a value that is either a signature or a string, list timestamp a list of time-stamps, and map
key_hash
nat is the type of an associative map between the hash of a public key and a positive integer.Other types:
timestamp: Dates in the real world.
mutez: A specific type for manipulating tokens.
contract 'param: A contract, with the type of its code.
address: An untyped contract address.
operation: An internal operation emitted by a contract.
key: A public cryptography key.
key_hash: The hash of a public cryptography key.
signature: A cryptographic signature.
3) About key hash formation:
I did not found more than the usage of it and the fact it is a native type in Tezos.
My Sources:
[1] https://blog.mozilla.org/warner/2011/11/29/ed25519-keys/
[2] https://crypto.stackexchange.com/questions/44584/ed25519-ssh-public-key-is-always-80-characters-long
[3] https://hackernoon.com/hash-consing-in-tezos-e4a59eeea5cd
-
- 2019-02-16
à Michelson,cestypes acceptent deuxformats différents de données (comme vous lementionnez) - optimiséset lisibles. Les versions lisibles sont les chaînes codées debase58-cochées (EDPK *,TZ1 *,EDSIG *,KT1 *etc.).
Les versions optimisées sont des octets hexagonales qui sont conformes à unformat spécifiquebasé sur letype de données,parexemple destouchespubliques sont 33 ou 34 octets - une étiquette de 1 octet suivie de l'octets de clépublique (32pour les clés ED25519,33pour les courbes SECP256K1et P-256). Vouspouvez décoder un EDPKen utilisant le JavaScript suivant:
eztz.utility.buf2hex(eztz.utility.b58cdecode("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b", eztz.prefix.edpk));
Commeil s'agit d'une clé ED25519,vouspréparez une étiquette de 0 octet,vous donnant la suivante sousforme optimisée:
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
Vouspouvez voirplus sur lespréfixes ici et desformats différentspour desformes optimisées ici
En ce qui concerne lafonction de hachage,nousgénèverons un hachage de 20 octets de la clépublique 32/33 octets. Vouspouvez voir comment cela sefait aveceztz ici
In Michelson, those types accept two different formats of data (as you mention) - optimized and readable. The readable versions are the base58-check encoded strings (edpk*, tz1*, edsig*, KT1* etc).
The optimized versions are hex bytes that conform to a specific format based on the type of data, for example public keys are either 33 or 34 bytes - a 1 byte tag followed by the public key bytes (32 for ed25519 keys, 33 for secp256k1 and p-256 curves). You can decode a edpk using the following javascript:
eztz.utility.buf2hex(eztz.utility.b58cdecode("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b", eztz.prefix.edpk));
Since this is an ed25519 key, you prepend a 0 byte tag, giving you the following in optimized form:
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
You can view more about the prefixes here and different formats for optimized forms here
Regarding the hashing function, we generate a 20 byte hash of the 32/33 byte public key. You can see how this is done with eztz here
Selon lagrammaireprésente dans Spécification Michelson ,Ilexiste des constantes de chaînepourtypes
signature
,key
,key_hash
.Quelest leformatprécis de ces chaînes? Plusprécisément:key
edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b
.C'est une clépublique ED25519 qui correspond à 32 octets.Comment convertir cette chaîneen octets?signature
etkey_hash
.key_hash
?Quelles données sont hachées?32 octets de la clépublique?