본문 바로가기

옥탑방주인/Hyperledger

Hyperledger Sawtooth - Address and Namespace Design (Sawtooth v1.0.2)

Address and Namespace Design



Overview


하이퍼릿저 소투스(Hyperledger sawtooth)는 Merkle Tree내에 데이터를 저장한다. 데이터는 leaf nodes에 저장되고, 각 노드는 70개의 hex characters(16비트)로 표현되고, 35바이트로 구성된 주소 체계를 사용하여 접근된다. 주소를 생성하는데 추천사항은 주소 인자를 만들 때 string 또는 strings의 hex-encoded된 해쉬 벨류(hash value)를 사용하는 것이다. 그러나, 주소의 인코딩(encoding of address)은 

namespace를 정의하는 transaction family에 달려 있으며 해시가 필요하지 않다. 해싱(Hashing)은 

결정적으로 고정 길이의 충돌하지 않는 바이트 배열을 생성하는 유용한 방법이다.



Address Components


주소(address)는 3바이트로 표현된 6개의 hex character(16진수)의 namespace prefix로 시작된다. 주소의 나머지 부분은 64개의 hex characters로 표현된 32바이트이고, 다양한 방법으로 계산될 수 있다.



주소는 결정적이어야합니다. 즉, 주소를 계산해야하는 모든 validator 또는 클라이언트는 매번 동일한 입력이 주어질 때마다 동일한 주소를 계산할 수 있어야합니다.



Namespace Prefix


Namespace Prefix 아래의 모든 데이터는 namespace를 정의하는 transaction family에 의해 결정되는 일관된 address 및 데이터 인코딩 / 직렬화(serialization) scheme를 따릅니다.


namespace prefix는 3바이트인 6개의 16진수 문자열(hex character)로 구성되어 있다. 예제 namespace prefix에서 prefix를 계산하기 위해 string형태의 transaction family namespace name을 활용하여 아래의 파이썬 코드로 표시하였다.


 prefix = hashlib.sha256("example_txn_family_namespace".encode('utf-8')).hexdigest()[:6]


그대신에, namespace prefix는 임의의 scheme을 사용할 수 있다. 현재 transaction family 구성은 '000000'의 prefix를 사용하고 있다.




Address Construction


나머지 주소(address)들 또는 나머지 32바이트들(64개의 16비트 문자들)은 deterministic 인코딩 포맷(encoding format)을 사용하여 계산해야 된다. namespace 내의 각 주소는 유일무이해야하며, namespace consumer는 결정적 방식(deterministic way)으로 충돌을 처리 할 수 ​​있어야합니다.


deterministic이 input에 따라 output값이 결정된다는 뜻인것 같은데. 같은 input에 대하여 같은 output이 행해진다... 예측가능한이라고 해석해야될지 흠... 좀 더 공부해봐야 될 것 같다.


address scheme은 transaction family의 요구조건에 따라 필요한만큼 간단하거나 복잡하게 설정할 수 있다. 



Simple Example - IntegerKey


IntegerKey Transaction family의 설명을 보려면 여기를 클릭해라.


transaction family prefix :


 hashlib.sha512('intkey'.encode('utf-8')).hexdigest()[0:6]


'1cf126'으로 변하게 하기위해


entry Name에 값을 저장하고, address는 아래처럼 계산된다.


 address = "1cf126" + hashlib.sha512('name'.encode('utf-8')).hexdigest()[-64:]


그런 다음 transaction이 처리(processed)되고 블록에 포함되는 validator로 transaction을 구성하여 보내면이 주소(address)에 값(value)을 저장할 수 있습니다.


이 주소는 data를 가져와서 사용할 수 있다.



More Complex Addressing Schemes


좀 더 복잡한 예를 들어 위젯의 여러 객체 유형(object type)에 대한 정보를 저장하는 가설적인(hypothetical) transaction family을 사용 해보자. 각 오브젝트 유형의 데이터는 고유한 오브젝트 ID의 key로 설정된다.


  • prefix = "my-transaction-family-namespace-example"
  • object-type = "widget-type"
  • unique-object-identifier = "unique-widget-identifier"

Address construction

코드 예제 :


 >>> hashlib.sha256("my-transaction-family-namespace-example".encode('utf-8')).hexdigest()[:6] + hashlib.sha256("widget-type".encode('utf-8')).hexdigest()[:4] + hashlib.sha256("unique-widget-identifier".encode('utf-8')).hexdigest()[:60]

'4ae1df0ad3ac05fdc7342c50d909d2331e296badb661416896f727131207db276a908e'