Formato di chiave pubblica, firma e letterali key_hash
3 risposta
- voti
-
- 2019-02-15
Ci sono del codice Pythonperfarloin questobloge un commentopubblicato da Alain:
http://www.ocamlpro.com/2018/21/11/an-Introduction-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) Informazioni sulla chiavepubblicaed25519e su come èin byte:
Da [1] :
Le chiavi Ed25519iniziano la vita come un semebinario uniformemente casuale a 32byte (256bit) (adesempio l'output di SHA256 su uninput casuale). Il seme viene quindi sottoposto ad hashing utilizzando SHA512,che ottiene 64byte (512bit),che vengono quindi suddivisiin una "metà sinistra" (iprimi 32byte)e una "metà destra". Lametà sinistra vienemassaggiatain una curva25519 scalareprivata "a"impostandoe cancellando alcunibit di ordine alto/basso. Lapubkey vienegeneratamoltiplicando questo scalare segretoper "B" (ilgeneratore),che restituisce unelemento digruppo a 32byte/256bit "A".
Per convertirloin questoformato String devi dividerloin caratteri a 6bit secondo latrasformazione delformato Base64.
Inbase a questa domanda/risposta (vedere: [2] ),la chiavepubblica a 32byte/256bit dovrebbeessere di 51byte oin formato Base64 di 68 caratteri.
Iltuoesempio chiave sembra avere 54 caratteri,il che sembra strano,perchénon ènessuno deiprecedenti.
(L'homodificatoin slot di 5 x 10 + 1 x 4)
edpktieBMr R9Df3dqzZA JpDZBXb1h1 88fyrQyRJcm5RH2WpbvM VR8b
Questo rivela che Tezos ha una codifica diversa: Base58. Eramenzionatoneltuo link originale:
contratti,indirizzi,chiavie firme sono scritti come stringhe,nelle loro solite versioni codificate Base58 (leggibili) o comebytegrezzi (ottimizzati).
Per decodificare,c'era una chiamatapython
base58check.b58decode
nel contenuto del link di risposta dell'OCP FLF.2)firmae key_hash
anche lefirme sonobase58. (vedi 1)
Ho scoperto su
key_hash
che èil suotipo di datiin Tezos (uno deipochi)ed è usatoin questomodo:Possiamo combinare questitipi atomiciper crearetipi più complessi usandoi costruttori. Adesempio,la coppiaint stringa rappresenta una coppia di due valori,unnumerointeroe una stringa o la stringa dellafirma rappresenta un valore chepuòessere unafirma o una stringa,untimestamp dell'elenco unelenco ditimestampe map
key_hash
nat èiltipo dimappa associativatra l'hash di una chiavepubblicae unnumerointeropositivo.Altritipi:
timestamp: datenelmondo reale.
mutez: untipo specificopermanipolarei token.
parametro 'contratto: un contratto,coniltipo del suo codice.
indirizzo: unindirizzo di contrattonontipizzato.
operazione: un'operazioneinternaemessa da un contratto.
key: una chiave di crittografiapubblica.
key_hash: l'hash di una chiave di crittografiapubblica.
firma: unafirma crittografica.
3) Informazioni sullaformazione dell'hash delle chiavi:
Non hotrovato altro cheil suo utilizzoe ilfatto che sia untiponativoin Tezos.
Lemie fonti:
[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
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,questitipi accettano due diversiformati di dati (come dicitu): ottimizzatie leggibili. Le versioni leggibili sono le stringhe codificatebase58-check (edpk *,tz1 *,edsig *,KT1 *ecc.).
Le versioni ottimizzate sonobyteesadecimali conformi a unformato specificoin base altipo di dati,adesempio le chiavipubbliche sono 33 o 34byte: untag di 1byte seguito daibyte della chiavepubblica (32per le chiavied25519,33per le curve secp256k1e p-256). Puoi decodificare unedpk utilizzandoil seguentejavascript:
eztz.utility.buf2hex (eztz.utility.b58cdecode ("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b",eztz.pkrefix); Poiché sitratta di una chiaveed25519,anteponi untag di 0byte,ottenendo quanto seguein forma ottimizzata:
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
Puoi visualizzare ulterioriinformazioni suiprefissi qui e diversiformatipermoduli ottimizzati qui
Per quanto riguarda lafunzione di hashing,generiamo un hash di 20byte della chiavepubblica di 32/33byte. Puoi vedere come sifa coneztz qui
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
Secondo lagrammaticapresentenella specifica Michelson ,ci sono costanti stringaperi tipi
signature
,key
,key_hash
.Qual èilformatopreciso di queste stringhe? Inparticolare:key
edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b
.È una chiavepubblicaed25519 che è di 32byte.Comefaccio a convertire questa stringain byte?signature
ekey_hash
.key_hash
?Quali dati vengono sottoposti ad hashing?32byte della chiavepubblica?