안녕하세요, 이더리움 코드보는 sigmoid입니다.
블로그 맨 앞에서 두번째 글인가.. 글인지 메모인지도 모를만큼 부끄럽게 적어뒀던 글이 있습니다. 아무것도 모르고 이더리움 코드를 볼때 LES를 먼저 열어봤던게 패착이 컷죠ㅎㅎ 시간이 지난 이제서야 LES를 다시 정리해볼수 있을것 같네요.
매번 헤더와 블록바디를 받고, 바디의 내용을 처리하여 헤더까지 검증하는 Full 클라이언트와 달리 라이트 클라이언트는 기본적으로 헤더만 받습니다. 그럼 헤더를 받았을때 내용이 위조되었는지 확인할수가 없습니다. 바디의 처리결과가 헤더에 제대로 들어갔는지 확인해야 하는데 바디를 안받으니까요. 그럼에도 불구하고 검증을 할수 있도록 한 프로토콜이 LES입니다.
검증하고 싶은 헤더가 있을때, on-demnad-request로 네트워크 상에 Proof를 요청하게 되어 있습니다. (여기서 Proof 는 결국 머클 패트리샤 트리입니다.) 먼저 ODR을 사용해서 Proof를 생성할수 있는 노드에게 요청을 보냅니다. 요청을 받은 노드는 요청자가 검증하고 싶은 내용이 들어 있는 머클-패트리샤 트리를 생성해서 반환해주게 됩니다. 머클 패트리샤 트리를 받은 피어는 해당 내용을 확인함으로서 이 헤더가 위조되었는지 아닌지 알수 있게 되는거죠.
한가지 재미있는건, geth구현체에서는 평소에 패트리샤 트리만 DB에 저장하고 있고, Proof가 요청되었을 경우에만 머클증명을 생성해서 내용을 전달하게 되어있습니다. 그때서야 머클 증명이 붙은 패트리샤 트리가 됩니다.
- 지인께서 트라이 관련 좋은 자료를 하나 알려주셔서 공유합니다. (thx jongbeen)
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&uact=8&ved=2ahUKEwiAxbPgxZ7eAhVFat4KHb-IAFUQFjAEegQIBRAC&url=https%3A%2F%2Fedcon.io%2Fassets%2Fppt%2F5.3%2F5.3pm%2FAlexey%2520AkhunovTurbo-Geth%2520Optimising%2520Ethereum%2520Client(s).pdf&usg=AOvVaw1SmtE1W8VWSzVwPN9vBch6