Service chain에서 생성되는 블록 TransactionsRoot 값 계산

안녕하세요, service chain에서 생성되는 블록의 transactionsRoot 값 계산을 하고싶은데 도저히 방법을 모르겠어서 질문 드립니다. merkle tree 공식도 대입해보고, ethereum 공식도 구글링해서 계산해 봤는데 block 정보 조회시 나오는 transactionsRoot 값과 다릅니다.

transactionsRoot 값을 계산하려면 정확히 어떤 공식을 따라가야할까요?

수동 계산이 가능하도록 도와주시면 정말 감사할 것 같습니다.

안녕하세요,

콘솔에서 klay.getParams() 출력값 확인해보시면 0,1,2 중 하나의 값을 가지게될텐데 아마 2의 값을 가질것으로 예상됩니다.

0일경우 (DeriveOrig): stack trie 구현체를 사용합니다 (이더리움과 같은 구현체)
1일경우 (DeriveSimple): merkle tree 구현체
2일경우 (DeriveConcat): 블럭내의 모든트랜잭션의 rlp를 이어붙인후 해시합니다.

출력값이 2인경우는 https://github.com/klaytn/klaytn/blob/dev/blockchain/types/derivesha/concat.go 의 구현을 참고해서 테스트해보시면 되구요, 만약 트랜잭션루트를 구하는 방식의 변경을 원하신다면 governnce.vote(governance.deriveshaimpl, <1 혹은 2>) 로 변경하시면되는데 epoch또한 디폴트값으로 2주로 설정되어있을 것으로 예상되기에, 제일 쉬운방법은 체인을 초기화하셔서 하는것이 좋아보입니다. genesis.json 파일의 deriveShaImpl 필드의 값을 2에서 다른값으로 변경하시고 다시 노드의 init 커멘트드로 초기화 할 수있습니다.

2개의 좋아요

친절한 답변 정말 감사드립니다!

콘솔에 klay.getParams()에 알려주신 명령어를 입력했을 때 0이 나온다면 말씀하신대로 이더리움과 같은 구현체를 사용하는 것 같습니다.

그럼 혹시 이렇게 0이 나왔을 때 참고할 수 있는 소스 코드나 툴을 추천해주실 수 있을까요?

제 나름대로 이더리움 stack trie를 구현해봤을 때 값이 다르게 나오는 것 같아서 도와주시면 너무너무 감사할 것 같습니다!

감사합니다 관리자님, 도움이 되길 바랍니다

https://github.com/klaytn/klaytn/blob/dev/blockchain/types/derivesha/orig.go 는 전반적인 템플릿이고, trie를 업데이트하는 구조는 https://github.com/klaytn/klaytn/blob/dev/storage/statedb/stacktrie.go 참고 하실 수 있습니다. 감사합니다.