Formato de los literales de clave pública, firma y key_hash
3 respuestas
- votos
-
- 2019-02-15
Hay algo de código Pythonpara haceresoen esteblog y un comentariopublicadopor Alain:
http://www.ocamlpro.com/2018/11/21/una-introducción-a-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) Acerca de la clavepúblicaed25519 y cómoestáen bytes:
De [1] :
Las claves Ed25519 comienzan su vida como una semillabinaria uniformemente aleatoria de 32bytes (256bits) (porejemplo,la salida de SHA256en algunaentrada aleatoria). A continuación,se aplica un hash a la semillamediante SHA512,que le da 64bytes (512bits),que luego se divideen una "mitadizquierda" (losprimeros 32bytes) y una "mitad derecha". Lamitadizquierda semasajeaen unescalarprivado "a" de curve25519 configurando yborrando algunosbits de orden alto/bajo. La clavepública segeneramultiplicandoesteescalar secretopor "B" (elgenerador),lo que da como resultado unelemento degrupo de 32bytes/256bits "A".
Para convertirlo aesteformato de cadena,debe dividirloen caracteres de 6bits según latransformación delformato Base64.
Segúnesta Q/A (consulte: [2] ),la clavepública de 32bytes/256bits debe ser de 51bytes oen formato Base64 de 68 caracteres.
Suejemplo claveparecetener 54 caracteres,lo quepareceextraño,porquenoesninguno de los anteriores.
(Lomodifiqué a ranuras de 5 x 10 + 1 x 4)
edpktieBMr R9Df3dqzZA JpDZBXb1h1 88fyrQyRJcm5RH2WpbvM VR8b
Eso revela que los Tezostienen una codificación diferente: Base58. Eso semencionóen suenlace original:
Los contratos,direcciones,claves yfirmas seescriben como cadenas,en sus versiones habituales codificadasen Base58 (legibles) o comobytes sinprocesar (optimizados).
Para decodificar,había una llamada de Python
base58check.b58decode
en el contenido delenlace de respuesta de FLF OCP.2)firma y key_hash
Lasfirmastambién sonbase58. (ver 1)
Encontré sobre
key_hash
quees supropiotipo de datosen Tezos (uno de lospocos) y se usa así:Podemos combinaresostipos atómicospara construirtiposmás complejos usando constructores. Porejemplo,pairint string representa unpar de dos valores,unnúmeroentero y una cadena,o la cadena defirma representa un valor quees unafirma o una cadena,marca detiempo una lista demarcas detiempo ymapea
key_hash
nateseltipo demapa asociativoentreel hash de una clavepública y unenteropositivo.Otrostipos:
marca detiempo:fechasen elmundo real.
mutez: untipoespecíficoparamanipulartokens.
contract 'param: Un contrato,coneltipo de su código.
dirección: una dirección de contrato sinescribir.
operación: una operacióninternaemitidapor un contrato.
clave: una clave de criptografíapública.
key_hash:el hash de una clave de criptografíapública.
firma: unafirma criptográfica.
3) Acerca de laformación de claves hash:
Noencontrémás queel uso yel hecho de quees untiponativoen Tezos.
Misfuentes:
[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
En Michelson,esostipos aceptan dosformatos diferentes de datos (como ustedmenciona): optimizados y legibles. Las versiones legibles son las cadenas codificadasen base58-check (edpk *,tz1 *,edsig *,KT1 *,etc.).
Las versiones optimizadas sonbytes hexadecimales que se ajustan a unformatoespecíficobasadoen eltipo de datos,porejemplo,las clavespúblicas son 33 o 34bytes: unaetiqueta de 1byte seguida de losbytes de la clavepública (32para clavesed25519,33para curvas secp256k1 yp-256). Puede decodificar unedpk usandoel siguientejavascript:
eztz.utility.buf2hex(eztz.utility.b58cdecode("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b", eztz.prefix.edpk));
Como setrata de una claveed25519,antepone unaetiqueta de 0bytes,lo que leproporciona lo siguienteen forma optimizada:
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
Puede vermás sobre losprefijos aquí y diferentesformatosparaformularios optimizados aquí
Con respecto a lafunción hash,generamos un hash de 20bytes de la clavepública de 32/33bytes. Puede ver cómo se haceesto coneztz aquí
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
De acuerdo con lagramáticapresenteen especificación de Michelson ,hay constantes de cadenapara lostipos
signature
,key
,key_hash
.¿Cuáleselformatoexacto deestas cadenas? Específicamente:key
edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b
.Es una clavepúblicaed25519 quetiene 32bytes.¿Cómo conviertoesta cadena abytes?signature
ykey_hash
.key_hash
?¿Qué datostienen hash?32bytes de la clavepública?