Formato de chave pública, assinatura e literais key_hash
3 respostas
- votos
-
- 2019-02-15
Há algum código Pythonparafazerissonestebloge um comentáriopostadopor Alain:
http://www.ocamlpro.com/2018/11/21/An-Introdução-para-Tezos-RPCS-Operações de assinatura/
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) Sobre a chavepública ED25519e comoestáem bytes:
.
de [1] :
ED25519 Chaves Inicie a vida como uma sementebinária uniforme de 32bytes (256bits) (porexemplo,a saída do SHA256em algumaentrada aleatória). A semente éentão hashed usando SHA512,que recebe 64bytes (512bits),que éentão divididaem uma "metadeesquerda" (osprimeiros 32bytes)e uma "metade direita". Ametadeesquerda émassageadaem um curva25519 Scalarprivado "A",definindoe limpando algunsbits de alta/baixa ordem. Opubkey égeradomultiplicandoesteescalar secretopor "B" (ogerador),queproduz umelemento degrupo de 32bytes/256bits "A".
Para convertê-loparaesteformato de string,vocêprecisa dividi-lopara 6bits caracteres conforme atransformação deformato Base64.
combasenesta Q/A (consulte: [2] ),a chavepública de 32bytes/256bits deve ser de 51bytes ounoformato Base64 68 caracteres.
Seuexemplo chavepareceter 54 caracteres,o quepareceestranho,porquenão énenhum dos acima.
(eumodifiquei-o a slots de 5 x 10 + 1 x 4)
.
edpktiebmr r9df3dqzzajpdzbxb1h1 88fyrqyrjcm5RH2WPBVM VR8B
Isso revela Tezostem codificação diferente:base58. Quefoimencionadono seu link original:
.
Contratos,endereços,chavese assinaturas sãoescritos como seqüências de caracteres,em suas versões codificadasbase58 habituais (legíveis),ou comobytesbrutos (otimizados).
Para decodificar,houve uma chamada Python
base58check.b58decode
no conteúdo de link de resposta do FLF OCP.2) Assinaturae Key_Hash
As assinaturastambém sãobase58. (veja 1)
Euencontrei sobre
key_hash
que é seuprópriotipo de dadosem Tezos (um dospoucos)e é usado assim:.
Podemos combinaressestipos atômicospara construirtiposmais complexos usando construtores. Porexemplo,a string do Pair Int representa umpar de dois valor,uminteiroe uma string ou string de assinatura representa um valor que seja uma assinatura ou uma string,lista Timestamp uma lista detime-selose mapa
key_hash
NAT é otipo de ummapa associativoentre o hash de uma chavepúblicae uminteiropositivo.Outrostipos:
.
Timestamp: datasnomundo real.
mutez: umtipoespecíficoparamanipulação detokens.
Contrato 'Param: um contrato,com otipo de seu código.
endereço: umendereço de contratonãoencaixado.
Operação: uma operaçãointernaemitidapor um contrato.
chave: uma chave de criptografiapública.
key_hash: o hash de uma chave de criptografiapública.
Assinatura: uma assinatura criptográfica.
3) Sobre aformação de hash key:
Eunãoencontreimais do que o uso delee ofato de que é umtiponativoem Tezos.
minhasfontes:
[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://hackeron.com/hash-consercing-in-tezos-e4a59eea5cd
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
Em Michelson,essestipos aceitam doisformatos diferentes de dados (conformemencionado) - otimizadoe legível. As versões legíveis são as cadeias codificadasbase58-cheque (EDPK *,TZ1 *,EDSIG *,KT1 *etc).
As versões otimizadas sãobytes hexestres queestãoem conformidade com umformatoespecífico combasenotipo de dados,porexemplo,as chavespúblicas são 33 ou 34bytes - umaetiqueta de 1byte seguida dosbytes da chavepública (32para asteclas ED25519para curvas secp256k1e p-256). Vocêpode decodificar um EDPK usando o seguintejavascript:
eztz.utility.buf2hex(eztz.utility.b58cdecode("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b", eztz.prefix.edpk));
Desde queesta é umatecla ED25519,vocêprepara umatag 0byte,dando-lhe o seguinteem formulário otimizado:
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
Vocêpode vermais sobre osprefixos aqui e diferentesformatosparaformulários otimizados aqui
Em relação àfunção de hash,nósgeramos um hash de 20bytes da chavepública 32/33. Vocêpode ver comoisso éfeito comeztz aqui
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 acordo com agramáticapresenteem especificaçãomichelson ,Há constantes de stringparatipos
signature
,key
,key_hash
.Qual é oformatopreciso dessas cordas? Especificamente:.- Suponha queeutenha umatecla
- mesmapergunta sobre
- Qual algoritmo HASH é usadopara calcular
key
edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b
.É uma chavepública ED25519 que é de 32bytes.Comofaçopara converteresta sequênciaparabytes?signature
ekey_hash
.key_hash
?Quais dados são hashed?32bytes da chavepública?