Format des öffentlichen Schlüssels, Signatur- und Key_Hash-Literalen
3 Antworten
- Stimmen
-
- 2019-02-15
Esgibt einen Python-Code,der diesin diesem Blog undeinen Kommentar von Alain veröffentlicht hat:
http://www.OcamlPro.com/2018/12/22/An-Einführung-to-tezos-rpcs-signing-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) Über den Public-Schlüssel ED25519 und wiein Bytesist:
von [1] :
ed25519 Tasten starten die Lebensdauer als 32-Byte (256-Bit)gleichmäßig zufällige Binärkerne (z. B. der Ausgang von SHA256 aneinem zufälligen Eingang). Der Saatgut wird dannmit SHA512gehabt,der 64 Bytes (512 Bit)erhält,das dannin eine "linke Hälfte" (dieersten 32 Bytes) undeine "rechte Hälfte" aufgeteilt wird. Die linke Hälfte wirdin einen Curve25519-Private-Skalar "A"einmassiert,indemerein paar Bitsmit hoher/niedriger Ordnung lindert. Der Pubkey wirderzeugt,indem diesergeheime Skalarmit "B" (dem Generator)multipliziert wird,derein 32-Byte/256-Bit-Gruppenelement "A"ergibt.
Umesin dieses String-Format zu konvertieren,müssen Siees auf 6 Bit-Zeichengemäß der Base64-Format-Transformation aufteilen.
basierend auf diesem q/a (siehe: [2] ) sollte der öffentliche 32 Bytes/256-Bit-Schlüssel 51 Bytes oderim Base64-Format 68-Zeichen sein.
Ihr Schlüsselbild scheint 54 Zeichen zu haben,was seltsamerscheint,daes sichnichts davon handelt.
(ichmodifiziertees an Slots von 5 x 10 + 1 x 4)
EDPKTIEBMR R9DF3DQZZA JPDZBXB1H1 88FYRQYRJC M5RH2WPBVM VR8B
Das zeigt Tezos unterschiedliche Kodierungen: Base58. Das wurdein Ihrem ursprünglichen Linkerwähnt:
Verträge,Adressen,Schlüssel und Signaturen werden als Saitenin ihren üblichen Base58-codierten Versionen (lesbar) oder als Rohbytes (optimiert)geschrieben.
zum Dekodieren,esgabeinen Python-Anruf
Base58Check.b58Decode
in der Answer-Link-Inhalte des FLF OCP.2) Signatur und Key_Hash
Signaturen sind auch Base58. (siehe 1)
Ich habe über
key_hash
gefunden,dassesein eigener Datentypin Tezosist (einer der wenigen) undes wird so verwendet:Wir können diese atomaren Typen kombinieren,um komplexere Typenmit Konstruktoren zuerstellen. Beispielsweise stellt Pair INT-Zeichenfolgeein Paar von zwei Wertes dar,eine ganze Zahl,eine Zeichenfolge,eine Zeichenfolge odereine Signaturzeichenfolge stellteinen Wert dar,derentwedereine Signatur odereine Zeichenfolge odereine Zeichenfolgeist,die Zeitstempeleine Liste der Zeitstempel und die Karte
key_hash
Natist der Typeiner assoziativen Karte zwischen dem Hasheines öffentlichen Schlüssels undeinerpositiven Ganzzahl.Andere Typen:
Zeitstempel: Terminein der realen Welt.
mutez:ein bestimmter Typ zum Manipulieren von Token.
Vertrag 'param:ein Vertragmit der Art des Codes.
Adresse:eine ungeschützte Vertragsadresse.
Bedienung: Eineinterne Operation,die vom Vertrag ausgewählt wird.
Schlüssel:ein öffentlicher Kryptographieschlüssel.
key_hash: der Hasheines öffentlichen Kryptographieschlüssels.
Signatur:eine kryptografische Signatur.
3) Über die Key-Hash-Formation:
Ichfandnichtmehr als die Verwendung davon und die Tatsache,dasses sich umeinen einheimischen Typin Tezos handelt.
meine Quellen: [1] https://blog.mozilla.org/warner/2011/11/29/15519-keys/
[2] https://crypto.steckexchange.com/questions/44584/ed25519-ssh-public-key-is-always-80-charactern-Long
[3] https://hackernoon.com/Hash-Consisting-in-tezos-E4A59EEEA5CD
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
In Michelson akzeptieren diese Typen zwei verschiedene Datenformate (wie Sieerwähnen) - optimiert und lesbar. Die lesbaren Versionen sind diebase58-Kontrollkodierungen (EDPK *,TZ1 *,EDSIG *,KT1 * usw.).
Die optimierten Versionen sind SEX-Bytes,dieeinem bestimmten Formatbasierend auf der Art der Datenentsprechen,beispielsweise sind öffentliche Tastenentweder 33 oder 34 Byte -ein 1-Byte-Tag,gefolgt von den öffentlichen Schlüssel Bytes (32für ED25519-Tasten,33für SECP256K1 und P-256 Kurven). Sie könnenein EDPKmit demfolgenden Javascript decodieren:
EZTZ.Utility.buf2Hex (eztz.Utility.b58cDecode ("EDPKTIEBMR5DF3DQZAJPDZBXB1H188FYRQYRJCM5RH2WPBVMVR8B",EZTZ.PREFIX.EDPK));
Da dieseine ED25519-Tasteist,legen Sieein 0-Byte-Tag vor,das Ihnenin optimierter Formfolgt:
000A0813D070315836BAB6E6F57244A291BA61832280FC3DB7AD6D6F75920581B4
Sie könnenmehr über die Präfixe anzeigen hier und verschiedene Formatefür optimierte Formulare hier
In Bezug auf die Hash-Funktiongenerieren wireinen 20 Byte-Hash des 32/33 Byte-Public-Schlüssels. Sie können sehen,wie diesmit EZTZgetan wird hier
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
nach Grammatikin michelsspezifikation ,Esgibt String-Konstantenfür Typen
Signature
,-Taste
,key_hash
.Wasist dasgenaue Format dieser Saiten? Speziell:.- Angenommen,ich habeeine
- Gleiche Frage zu
- Welcher Hash-Algorithmus wird zum Berechnen von
-Taste
EDPKTIEBMRR9DF3DQZAJPDZBXB1H188FYRQYRJCM5RH2WPBVMVR8B
.Esistein ED25519-öffentlicher Schlüssel,der 32 Bytesbeträgt.Wie konvertiereich diese Zeichenfolgein Bytes?Signature
undkey_hash
.key_hash
verwendet?Welche Daten sindgesehen?32 Bytes des öffentlichen Schlüssels?