공개 키, 서명 및 key_hash 리터럴 형식
3 대답
- 투표
-
- 2019-02-15
이 블로그에는이를위한 Python 코드와 Alain이 게시 한 댓글이 있습니다.
http ://www.ocamlpro.com/2018/11/21/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)ed25519 공개 키 정보 및 바이트 단위 :
<인용구>[1] 에서 :
Ed25519 키는 32 바이트 (256 비트) 균일 한 무작위 바이너리 시드 (예 : 임의 입력에 대한 SHA256의 출력)로 수명을 시작합니다. 그런 다음 시드는 SHA512를 사용하여 해시되어 64 바이트 (512 비트)를 얻은 다음 "왼쪽 절반"(처음 32 바이트)과 "오른쪽 절반"으로 분할됩니다. 왼쪽 절반은 몇 개의 상위/하위 비트를 설정하고 삭제하여 curve25519 전용 스칼라 "a"로 마사지됩니다.pubkey는이 비밀 스칼라에 "B"(생성자)를 곱하여 생성되며 32 바이트/256 비트 그룹 요소 "A"를 생성합니다.
이 문자열 형식으로 변환하려면 Base64 형식 변환에 따라 6 비트 문자로 분할해야합니다.
이 Q/A ( [2] 참조)를 기반으로 공개 32 바이트/256 비트 키는 51 바이트 또는 Base64 형식 68 자 여야합니다.
귀하의 주요 예는 54자인 것 같습니다. 위의 어느 것도 아니기 때문에 이상해 보입니다.
(5 x 10 + 1 x 4 슬롯으로 수정했습니다)
<인용구>edpktieBMr R9Df3dqzZA JpDZBXb1h1 88fyrQyRJcm5RH2WpbvM VR8b
이는 Tezos의 인코딩이 Base58이라는 것을 보여줍니다. 원래 링크에 언급 된 내용 :
<인용구>계약,주소,키 및 서명은 일반적인 Base58 인코딩 버전 (읽기 가능) 또는 원시 바이트 (최적화)로 문자열로 작성됩니다.
디코딩을 위해 FLF OCP의 응답 링크 콘텐츠에 파이썬 호출
base58check.b58decode
가있었습니다.2) 서명 및 key_hash
서명도base58입니다. (1 참조)
key_hash
가 Tezos에서 자체 데이터 유형 (몇 안되는 유형 중 하나)이고 다음과 같이 사용된다는 것을 발견했습니다.생성자를 사용하여 더 복잡한 유형을 빌드하기 위해 이러한 원자 유형을 결합 할 수 있습니다. 예를 들어 쌍int string은 두 값,정수 및 문자열의 쌍을 나타내거나 서명 문자열은 서명 또는 문자열 인 값을 나타내고,타임 스탬프 목록 타임 스탬프 목록,
key_hash <매핑/code>nat는 공개 키의 해시와 양의 정수 사이의 연관 맵 유형입니다.
기타 유형 :
<인용구>타임 스탬프 : 실제 날짜
mutez : 토큰 조작을위한 특정 유형
contract 'param : 코드 유형이있는 계약
주소 : 유형이 지정되지 않은 계약 주소
작업 : 계약에 의해 생성 된 내부 작업입니다.
키 : 공개 암호화 키입니다.
key_hash : 공개 암호화 키의 해시입니다.
서명 : 암호화 서명
3) 키 해시 형성 정보 :
나는 그것의 사용법과 그것이 Tezos에서 네이티브 유형이라는 사실 이상을 찾지 못했습니다.
내 출처 :
[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/해시 -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
Michelson에서 이러한 유형은 최적화되고 읽기 쉬운 두 가지 형식의 데이터를 허용합니다. 읽을 수있는 버전은base58 검사로 인코딩 된 문자열 (edpk *,tz1 *,edsig *,KT1 * 등)입니다.
최적화 된 버전은 데이터 유형에 따라 특정 형식을 준수하는 16 진수 바이트입니다. 예를 들어 공개 키는 33 또는 34 바이트입니다. 1 바이트 태그 뒤에 공개 키 바이트 (ed25519 키의 경우 32,33 secp256k1 및p-256 곡선의 경우). 다음 자바 스크립트를 사용하여edpk를 디코딩 할 수 있습니다.
eztz.utility.buf2hex(eztz.utility.b58cdecode("edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b", eztz.prefix.edpk));
이 키는ed25519이므로 0 바이트 태그를 앞에 추가하여 최적화 된 형식으로 다음을 제공합니다.
000a0813d070315836bab6e6f57244a291ba61832280fc3db7ad6d6f75920581b4
해싱 기능과 관련하여 32/33 바이트 공개 키의 20 바이트 해시를 생성합니다.eztz 여기 에서이 작업이 어떻게 수행되는지 확인할 수 있습니다.
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
Michelson 사양 에있는 문법에 따르면,
signature
,key
,key_hash
유형에 대한 문자열 상수가 있습니다.이 문자열의 정확한 형식은 무엇입니까? 구체적으로 :key
edpktieBMrR9Df3dqzZAJpDZBXb1h188fyrQyRJcm5RH2WpbvMVR8b
가 있다고 가정합니다.32 바이트 인ed25519 공개 키입니다.이 문자열을 바이트로 어떻게 변환합니까?signature
및key_hash
에 대한 동일한 질문입니다.key_hash
를 계산하는 데 어떤 해시 알고리즘이 사용 되나요?어떤 데이터가 해시됩니까?32 바이트의 공개 키?