프루닝(Pruning)이란 인공지능에서 검색 모델을 학습한 후 중요도가 낮거나 불필요한 노드를 제거하는 기술입니다. 그래프가 수많은 파라미터 값들을 가지고 있고 그래프의 엣지를 제거하는 모습이 가지치기와 유사해 붙여진 이름입니다. 프루닝(가지치기)를 통해 성능 저하를 최소화 하면서 정확도를 올릴 수 있습니다. 블록체인에서의 프루닝은 오래된 블록체인 내 데이터를 자동으로 삭제하여 네트워크 성능을 유지하면서 정확도를 올리는 기술입니다.
비트코인 프루닝
블록체인 공간 낭비
비트코인 내 노드들은 블록체인 사본을 보관하면서 네트워크에 필요한 여러가지 작업을 수행하고 있습니다. 만약 단일 실패점이 존재한다면 많은 공간이 낭비된다는 문제점이 있습니다. 불필요한 데이터의 축적은 네트워크 성능 저하로 이어졌고, 많은 사람들이 노드를 소유할 수 없게 되는 문제로 이어집니다.
실제로 비트코인 DB는 300GB가 넘습니다. 2009년 1월에 첫번째 트랜잭션이 시작된 이후로 단 한번도 작동이 중단된 적이 없습니다. 지금도 분단위로 성장하고 있는 비트코인 블록체인은 스토리지가 점점 커져가고 있습니다. 네트워크 성장과 동시에 제기되는 문제점이 바로 '블록체인 크기의 가속화된 성장'입니다.
Block File Pruning
과거에는 비트코인 레지스터리가 수십 MB밖에 되지 않았지만 현재는 수백 GB를 넘어서고 있습니다. 비트코인이 인기를 얻고 더 많은 거래가 일어날 수록 네트워크 레지스터리는 점점 더 커져가게 됩니다. bitcoin core 팀에서는 bitcoin core 0.11.0 version에 Block file pruning을 추가합니다. 비트코인 블록체인에서 참조할 가능성이 없는 불필요한 데이터를 삭제하면 비트코인 레지스터리는 약 10GB로 줄어들 것으로 추측됩니다.
Block File Pruning을 진행할 경우 비트코인 레지스터리 용량을 최적화 할 수 있게 됩니다. 작은 버전의 Full Blockchain을 실행할 수 있게 되고 최신 블록체인을 다운로드 할 때 오래된 불필요 데이터를 제거할 수 있습니다. prune mode의 지갑을 실행하면 오래된 체인 기록을 삭제하기 때문에 디스크 공간을 최소화 할 수 있습니다.
비트코인에서 Pruning이 가능한 이유는 블록을 실행/검증하는데 블록 내 트랜잭션 인 / 아웃풋만 사용하면 되기 때문입니다. 모든 트랜잭션을 저장하고 있지 않더라도 블록을 실행하고 검증할 수 있게 됩니다. 만약 풀 블록체인을 다운로드 하는 경우 유효성 검증을 마치고 최신 정보만 가지고 블록을 실행/검증할 수 있습니다. 최신 정보만 남은 블록체인은 풀 블록체인의 자식트리(머클트리)가 됩니다.
이더리움 프루닝
이더리움 프루닝
비트코인과 마찬가지로 이더리움에서도 프루닝을 진행합니다. 이더리움에서는 State Trie Pruning으로 통칭됩니다. State Trie Pruning은 Prefix Tree의 한 종류인 Modified Merkle Patricia Trie(MPT, 상태 전이 일반 머클 확장 페트리샤 트리)로 저장됩니다. 이더리움에서 상태라고 하면 Account의 상태를 의미합니다. 이 상태들이 모여 Global State를 구성하게 되고 Key~Value 쌍으로된 데이터 구조로 저장됩니다.
key : address = 32 byte Address : Account State
이더리움 또한 사용자가 증가하면서 어카운트가 늘어나고 수정 사항이 함께 늘어나면서 네트워크 성능이 느려지기 시작합니다. 이 때문에 머클트리를 도입해 기존 값을 변경하는 연산은 줄였지만 새로운 노드를 추가/삭제하는 작업은 여전히 머클 트리를 다시 계산해야 하는 과정이 필요했습니다.
Modified Merkle Patricia Trie
이 때문에 Modified Merkle Patricia Trie가 제안됩니다. MPT에서는 State Root Hash를 계산하기 위해 전체 브랜치를 볼 필요 없이 수정된 부분만 Hash해서 계산합니다. 빠른 속도로 Root Hash를 구해낼 수 있게 됩니다. 또한 MPT에서는 새로 추가되는 노드의 갯수를 최소화 하여 운영됩니다. 기존 노드를 재활용 할 수 있는 상황에서는 굳이 새로운 노드를 추가하지 않고 기존 것을 재활용합니다.
더 이상 필요없는 노드들은 바로 삭제가 안됩니다. 이더리움 블록에서는 Finality를 보장하지 않으며 기존 노드로 Retract 될 수 있기 때문입니다. 또한 Web3 API에서는 기존 State에 접근할 수 있기 때문에 사용될 가능성이 낮은 노드를 바로 삭제할 수 없습니다. 현재 이더리움 State 크기가 25GB지만, 과거 State까지 합치면 300GB를 넘어가게 됩니다. 무작정 남겨둘 수는 없는 문제입니다.
이더리움에서는 이 문제를 해결하기 위해 과거의 State를 127개로 제한합니다. 이 보다 더 과거의 State는 지워도 된다고 명시합니다. 하지만 127개 노드에서 접근 가능한 과거 노드를 찾아 지우는 일은 여전히 문제로 남아있습니다.
Pruning vs Garbage Collector
비탈릭 부테린이 제안한 State Tree Pruning은 메인넷에 적용되기에 문제점이 남아있습니다. 기존 프로그래밍에서 적용된 Garbage Collector 개념인 Automatic Memory Management는 휘발성 데이터를 대상으로 하지만 이더리움 프루닝은 Persistence 데이터를 다루게 됩니다. 만약 비정상적인 종료로 인해 State Trie에 문제가 생기면 복구할 방법이 없기 때문입니다.
이런 문제점들 때문에 Go-Ethereum에서는 굉장히 한정적인 방법으로 State Trie Pruning을 제공하고 있습니다. State Trie에 캐시를 제공하고 캐시에 저장된 노드에 대해서 Pruning을 진행하고 DB에 저장된 노드에 대해서는 Pruning을 진행하지 않습니다.
캐싱된 노드는 다음 한정된 조건에 한해 DB에 저장됩니다. 하기 조건을 만족하지 않는 경우 캐시에서 삭제된 노드는 DB에 저장되지 않습니다.
- 캐시 크기를 넘기는 경우
- 마지막으로 캐시된 노드가 DB에 저장된지 5분이 경과한 경우
- 서버가 정상적으로 종료된 경우
- 노드가 생성된 후 128 Block이 지난 경우
이더리움에서 위 조건에 만족하지 않아 삭제되는 노드는 많지 않습니다. 계속해서 State Trie Pruning을 구현하기 위해 노력하고 있습니다. 먼저 State Trie Pruninig이 구현되기 전 Fast Sync를 통해 동기화된 상태 까지의 Garbage Node를 제거 할 것을 권장하고 있습니다.
- 새 클라이언트를 띄움
- 기존 클라이언트에서 새 클라이언트로 Fast Sync를 받음
- 기존 클라이언트를 지움
'Blockchain' 카테고리의 다른 글
[Blockchain] 작업증명(PoW) vs 지분증명(PoS) vs 위임지분증명(DPoS) 차이점 (1) | 2022.07.04 |
---|---|
[Blockchain] 채굴(Mining)이란? (0) | 2022.07.04 |
[Blockchain] IPFS(InterPlanetary File System)란? (0) | 2022.06.29 |
[Blockchain] DHT(분산 해시 테이블)이란? (0) | 2022.06.29 |
[Blockchain] 해시 테이블(Hash Table)이란? (0) | 2022.06.29 |
댓글