State Hash 1 subCacheMerkleRoots에서 stateHash 계산

6298 단어 catapultBlockchainNEM

소개



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

이번에는 subCacheMerkleRoots와 stateHash의 관계에 주목하겠습니다.

State Hash



catapult-service-bootstrap 등을 움직일 때, 표준 출력에 이런 것이 출력된다고 생각합니다.
           Height: 1
  Generation Hash: 5ABBD9F7894EE7E5D4C3CDA934245396AEFCD1CB0426F265AC81F4F3450AB6DD
Transactions Hash: 111461D150B90EBF58A87AB2FA2493DCB716F83E7EE584369820D6CA10DE5E52
    Receipts Hash: A207227B111F4242DE80FC87E722B86077931B483883EA65E06A24340176A047
       State Hash: BDCAF08330E29EBC7F18A1A9E6C7C60E4CFF99B100FC583FCDBAFA6F875F5DCF
--- Components (7) ---
 + 779F9E5BCEFB8267C084B14F8C2CB981683E6715BAFF4DC3B39BC133AFBEDD1B
 + 7BA3B37CDF34608C3B98BE572C7A743FEAC8B6909654AF21B8E0F4381EFD9164
 + 5D8EEAD5907130D297C322698F3D201A78D629CAC87487A0F4F890C1277B250C
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000
 + 0000000000000000000000000000000000000000000000000000000000000000

이것들은, 블록 체인의 상태 (스테이트)를 나타내는 값으로, Components (7) 의 값은 각각 다음과 같은 스테이트를 나타내고 있습니다.

Finally COW state roots in order:
* account state cache (balances)
* namespace cache
* 모자이크 캐시
* multisig cache
* hash lock cache
* secret lock cache
* property cache


그래서 이러한 값을 대표하는 것이 State Hash 입니다.

계산해보기



대표하고 있다고 뭐라고 하는 것입니다만, 우선 계산해 봅시다.

어떤 체인의 블록 번호 600000의 상태를 살펴 보겠습니다.



stateHash는5A4AB7830E7CE281252ED3CBADC5A7919A5DF82BA0766788186EC32308934B37
subCacheMerkleRoots는
0   "4401DAC79E1CDBB6903BED8F6CE5D6BB29DF9220D65D1093644968C61DCE5490"
1   "99DCAAB775F4D905A43446A54336A7C52C011D0B036D92E3DEA77A6B4806130D"
2   "30A245258080BA6825F4263AEF2146C2B899FE8891B5E528EFE4C861397FFB8C"
3   "3BD4B1669FAC87AF68A1DB54AE737A0227A3D0B85AECB3A0FF7240E228731715"
4   "0000000000000000000000000000000000000000000000000000000000000000"
5   "0000000000000000000000000000000000000000000000000000000000000000"
6   "A13E3FB1B22964DC32FE77DAB978617F3CB15B3930371D6D4477BE47C961AE47"

자, subCacheMerkleRoots 를 모두 문자열 결합하여 sha3 해 보겠습니다.

sha3(4401DAC79E1CDBB6903BED8F6CE5D6BB29DF9220D65D1093644968C61DCE549099DCAAB775F4D905A43446A54336A7C52C011D0B036D92E3DEA77A6B4806130D30A245258080BA6825F4263AEF2146C2B899FE8891B5E528EFE4C861397FFB8C3BD4B1669FAC87AF68A1DB54AE737A0227A3D0B85AECB3A0FF7240E22873171500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A13E3FB1B22964DC32FE77DAB978617F3CB15B3930371D6D4477BE47C961AE47)

결과는

5A4AB7830E7CE281252ED3CBADC5A7919A5DF82BA0766788186EC32308934B37
stateHash 와 일치합니다.

코드는 이런 느낌이 될까 생각합니다.
const jssha3 = require('js-sha3');
const payload = '4401DAC79E1CDBB6903BED8F6CE5D6BB29DF9220D65D1093644968C61DCE549099DCAAB775F4D905A43446A54336A7C52C011D0B036D92E3DEA77A6B4806130D30A245258080BA6825F4263AEF2146C2B899FE8891B5E528EFE4C861397FFB8C3BD4B1669FAC87AF68A1DB54AE737A0227A3D0B85AECB3A0FF7240E22873171500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A13E3FB1B22964DC32FE77DAB978617F3CB15B3930371D6D4477BE47C961AE47';
const hasher = jssha3.sha3_256.create();
const hash = hasher.update(Buffer.from(payload, 'hex')).hex().toUpperCase();
console.log(hash);

결론


subCacheMerkleRoots 의 sha3 를 취하면 stateHash 가 되었습니다. stateHash 로부터 subCacheMerkleRoots 는 도출할 수 없습니다만, subCacheMerkleRoots 하지만 1 바이트라도 변경되면, stateHash 의 값이 바뀝니다. 이렇게 하면 예를 들어 stateHash 에만 서명하거나 블록의 데이터로 캡처하여 subCacheMerkleRoots 가 다른 값으로 변경되는 것을 방지할 수 있습니다.

시리즈



State Hash 1 subCacheMerkleRoots에서 stateHash 계산

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

State Hash 그 2추기

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

좋은 웹페이지 즐겨찾기