State Hash 두 요소가 하나만있는 경우의 subCacheMerkleRoots 계산

5122 단어 catapultBlockchainNEM

소개



이제 피하고 있던 것에 손을 대지 않으면

이번에는 요소가 하나만 있는 간단한 Patricia Tree에 대해 살펴보겠습니다.

Patricia Tree



subCacheMerkleRoots는 어디에서 오는가? 그 1에서는, subCacheMerkleRoots는 잔액이나 모자이크등의 스테이트를 나타내고 있다고 하는 것을 썼습니다.

예를 들어 모자이크의 경우 등록된 모자이크의 정보를 기반으로 해야 합니다. 그리고 그 정보를 바탕으로 Patricia Tree라는 구조를 만들고, 그 루트 해시가 모자이크의 subCacheMerkleRoots가 됩니다.

Patricia Tree에 대해서는 다음 기사가 도움이 될 것입니다.



계산해보기



요소가 하나만 있는 경우라는 제목이므로 모자이크가 하나만 등록된 상태를 준비합니다.

모자이크의 정보는 이런 느낌.

block-properties-file.properties
[mosaic>cat:currency]

divisibility = 6
duration = 0
supply = 8'999'999'998'000'000
isTransferable = true
isSupplyMutable = false

다음은 모자이크 ID 0x3692'FF95'2D89'DD45에서만 발행된 네메시스 블록의 다양한 상태 정보입니다.
           Height: 1
  Generation Hash: 5ABBD9F7894EE7E5D4C3CDA934245396AEFCD1CB0426F265AC81F4F3450AB6DD
Transactions Hash: 111461D150B90EBF58A87AB2FA2493DCB716F83E7EE584369820D6CA10DE5E52
    Receipts Hash: A207227B111F4242DE80FC87E722B86077931B483883EA65E06A24340176A047
       State Hash: BDCAF08330E29EBC7F18A1A9E6C7C60E4CFF99B100FC583FCDBAFA6F875F5DCF
--- Components (7) ---
 + 779F9E5BCEFB8267C084B14F8C2CB981683E6715BAFF4DC3B39BC133AFBEDD1B
 + 7BA3B37CDF34608C3B98BE572C7A743FEAC8B6909654AF21B8E0F4381EFD9164
 + 5D8EEAD5907130D297C322698F3D201A78D629CAC87487A0F4F890C1277B250C
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000

subCacheMerkleRoots의 3번째가 모자이크로, 0x3692'FF95'2D89'DD45 의 모자이크 정보로부터 Patricia Tree를 만들면
5D8EEAD5907130D297C322698F3D201A78D629CAC87487A0F4F890C1277B250C
도출할 수 있어야 합니다.

그럼, Patricia Tree의 요소가 되는 데이터는 어디에 있는가.

이것은 RocksDB에 저장되어있는 것 같습니다.

투석기를 움직일 때 사용할 수 있는 data 폴더가 있습니다.



이 안의 statedb의 MosaicCache 안을 봅니다.



이것은 RocksDB 파일이므로 소프트웨어로 볼 수 있습니다.

FastNoSQL 을 사용해 보았습니다.



key가 문자열화되어 있기 때문에 이해하기 어렵습니다만, 0x3692'FF95'2D89'DD45 의 모자이크 ID라고 생각합니다.

꺼내 보겠습니다.

key: 45dd892d95ff9236
value: 010045dd892d95ff923680fbdbca73f91f000100000000000000db06e6c3f6976324ba215d7d1f2d4c69d7353afe1d6050a606bc61eda13e1c3c01000000020000000000000006000000000000000000000000000000

value는 MosaicEntry라는 형태로 저장되어있는 것 같습니다.

가능한 한 분해해 보았습니다. 0x3692'FF95'2D89'DD45 의 정보와 일치한다고 생각합니다.
0100                ?
45dd892d95ff9236    id
80fbdbca73f91f00    supply
0100000000000000    height
db06e6c3f6976324ba215d7d1f2d4c69d7353afe1d6050a606bc61eda13e1c3c    pubkey
01000000            revision
0200000000000000    flag (Transferable)
0600000000000000    divisibility
0000000000000000    duration

여기에서 어떻게 State Hash를 계산하는지 여러가지 듣고 돌아본 결과, 다음과 같이 이해했습니다.



prefix에 대해서입니다만, key가 짝수 니블이고 leaf node의 경우, 0x20이 됩니다.

그리고 leaf node를 sha3하는 방법은 단순히 모두 연결하고 sha3하면 됩니다.

샤3

= 5D8EEAD5907130D297C322698F3D201A78D629CAC87487A0F4F890C1277B250C

subCacheMerkleRoots의 세 번째와 일치했습니다.

결론



subCacheMerkleRoots에 대해 요소가 하나만있는 경우 모자이크를 파생했습니다. Patricia Tree에 해시 정보 밖에 들어 있지 않기 때문에 스테이트의 저장 장소라고 하는 것보다는 스테이트에 변경이 있을 경우에 고속으로 처리를 할 수 있기 때문이라고 생각합니다. 또, 트리 구조를 사용하고 있기 때문에, 어느 시점에서 확실히 특정의 모자이크나 계정의 잔고가 존재한 것을 증명할 수 있다고 생각합니다.

시리즈



State Hash 1 subCacheMerkleRoots에서 stateHash 계산

State Hash 두 요소가 하나만있는 경우의 subCacheMerkleRoots 계산

State Hash 그 2추기

State Hash 그 3 요소가 2개의 경우의 Patricia Tree

좋은 웹페이지 즐겨찾기