용어집 / 노드와 소프트웨어
Assumeutxo
- Assumeutxo란 무엇입니까?
- Assumeutxo는 Bitcoin Core 노드가 코드에 고정된 블록 높이에서 캡처한 미사용 출력 집합의 스냅숏으로 시작한 뒤, 건너뛴 이력을 백그라운드에서 검증하도록 합니다.
스냅숏은 특정 블록 높이에서 사용 가능한 모든 코인을 나열하며, 그 해시는 소프트웨어와 함께 내려받는 것이 아니라 소프트웨어에 컴파일되어 있습니다. Bitcoin Core 28.0은 높이 840,000에 대한 메인넷 파라미터를 추가했습니다. 이 높이는 실제 네트워크에서 스냅숏을 로드할 수 있는 첫 번째 높이입니다. 전체 이력을 검증하기 훨씬 전에 지갑을 사용할 수 있게 되며, 그동안 노드는 건너뛴 블록을 뒤에서 조용히 검증합니다.
작동 방식
Assumeutxo는 하나의 노드를 두 개의 체인스테이트로 나누고 동시에 실행합니다.
스냅숏 파일을 loadtxoutset RPC에 넘깁니다. Bitcoin Core는 이를 로드할 두 번째 체인스테이트를 만들고, 내용을 읽고 검사하는 동안 원래 체인스테이트를 활성 상태로 유지합니다. 스냅숏 체인스테이트가 로드되고 검증되면 이것이 활성 체인스테이트가 되고, 데이터 디렉터리에 chainstate_snapshot이라는 디렉터리가 나타나며, 노드는 스냅숏의 기준 블록에서 네트워크 최신 블록을 향해 동기화를 시작합니다. 그 디렉터리 안에는 base_blockhash라는 작은 파일이 있어 스냅숏을 어느 블록에서 생성했는지 기록하므로, 이 구성은 재시작 후에도 유지됩니다.
해시가 신뢰의 전부입니다. Core 자체 문서는 스냅숏의 정식 출처가 없으며, 내려받은 스냅숏은 소스 코드에 하드코딩된 값과 대조해 검사한다고 밝히고 있습니다. 따라서 파일을 호스팅한 주체를 신뢰하는 것이 아닙니다. 이미 실행하기로 선택한 같은 릴리스를 신뢰하는 것이며, 컴파일된 값과 해시가 일치하지 않는 파일은 체인스테이트가 되기 전에 거부됩니다.
그 사이 원래 체인스테이트는 모든 규칙을 적용한 채 제네시스 블록에서 계속 나아갑니다. 스냅숏의 기준 블록에 도달하면 자체 미사용 출력 집합의 해시를 계산하여 그 결과를 컴파일된 파라미터와 비교합니다. 캐시는 더 필요한 체인에 배분됩니다. 스냅숏 체인은 최신 블록을 향해 달리는 동안 우선순위를 가지며, 이후에는 백그라운드 체인이 더 큰 몫을 받습니다. getchainstates RPC는 두 체인스테이트를 모두 보여줍니다.
정리는 즉시가 아니라 다음 재시작 때 이루어집니다. Core는 chainstate_snapshot의 이름을 chainstate로 바꾸고 백그라운드 데이터를 삭제하며, 그 시점부터 노드는 전통적인 방식으로 구축한 노드와 구별되지 않습니다. base_blockhash 파일은 어디에서 시작했는지에 대한 기록으로 남습니다.
비트코인을 구매할 때 이것이 중요한 이유
Assumeutxo는 대부분의 구매자가 자기 코인을 직접 검증하지 못하게 만드는 유일한 단점을 공략합니다.
이 사이트에서 리뷰한 지갑 41개 중 Bitcoin Core는 전체 체인을 직접 내려받아 검사하는 유일한 지갑이며, 그래서 이 사이트의 리뷰는 이 지갑에 4.7점을 주면서도 첫 번째 단점으로 첫 동기화가 전체 체인을 내려받아 검증하므로 몇 시간과 많은 디스크 공간이 든다는 점을 여전히 꼽고 있습니다. 바로 그 문장이 대부분의 사람이 시도조차 하지 않는 이유입니다. 스냅숏은 그 비용을 없애지 않고 옮깁니다. 몇 시간은 여전히 걸리지만, 지갑이 이미 작동한 뒤에 걸릴 뿐 그 전에 걸리지는 않습니다.
이것이 이득이 되는 순간은 출금입니다. 이 사이트에 등재된 거래소 63곳 중 한 곳에서 구매하고, 코인을 본인이 관리하는 키로 보낸 뒤, 도착했는지 알고 싶어집니다. 자기 노드가 없으면 물어볼 수 있는 두 당사자는 방금 코인을 보낸 거래소와 이제 본인의 주소를 알게 된 공개 블록 탐색기입니다. 자기 노드가 있으면 답은 본인의 기계가 수행한 연산에서 나옵니다.
또한 본격적인 구성을 시작하는 데 드는 비용도 바뀝니다. 마찬가지로 4.7점을 받은 이 사이트의 Sparrow 리뷰는 Bitcoin Core에 백엔드로 직접 연결하는 방식을 설명하는데, 그 조합은 예전에는 Sparrow가 대화할 대상이 생기기 전에 전체 동기화가 끝나기를 기다려야 한다는 뜻이었습니다. 스냅숏은 구성하는 하루를 쓸 수 있는 저녁으로 압축하며, 미뤄 둔 검증은 잠든 사이에 저절로 끝납니다.
실제 예시: dumptxoutset으로 스냅숏 생성하기
Assumeutxo 스냅숏을 생성하는 것은 이미 신뢰하는 노드에서 의도적으로 수행하는 작업이지, 어디선가 내려받아 오는 파일이 아닙니다.
dumptxoutset RPC가 이를 생성하며, 유형 "latest"를 쓰면 현재 최신 블록에서, 유형 "rollback"을 쓰면 최근 높이에서 생성합니다. 실행되는 대부분의 시간 동안 노드는 현실을 반영하지 않는 임시 상태에 놓여, 올바른 것으로 아는 블록을 무효로 표시하고, 그 상태 때문에 네트워크 활동이 꺼지고 모든 피어가 연결 해제됩니다. Core 문서는 하드웨어와 선택한 유형에 관계없이 덤프에 시간이 걸리므로 -rpcclienttimeout=0을 권장하고, 그동안 노드로 다른 작업을 하는 것을 권하지 않습니다.
사람들이 흔히 놓치는 두 가지 세부 사항이 있습니다. 스냅숏은 그 높이에 대한 해시가 이미 체인 파라미터에 등재되어 있을 때만 사용할 수 있으므로, 다른 높이를 고르면 그 코드를 수정하고 다시 컴파일해야 하며, "rollback" 유형은 스냅숏을 다시 생성해 비교함으로써 하드코딩된 해시를 확인하는 방법으로도 쓰입니다. 그리고 Bitcoin Core 28.0은 직렬화를 변경했습니다. 구 형식의 덤프는 더 이상 지원되지 않으며 loadtxoutset이 받아들이려면 28.0 이상의 노드에서 다시 만들어야 합니다.
Bitcoin Core 29.0은 관련 도구인 contrib/utxo-tools/utxo_to_sqlite.py를 추가했는데, 이는 압축 직렬화된 스냅숏을 SQLite3 데이터베이스로 변환합니다. 이는 노드 동기화와는 아무 관련이 없고 스냅숏이 실제로 무엇인지와 관련이 있습니다. 즉 특정 높이에서 누가 무엇을 소유하는지에 대한 완전하고 자족적인 그림이며, 이는 조회하기에 유용한 것으로 밝혀졌습니다.
Assumeutxo vs 초기 블록 다운로드
Assumeutxo는 초기 블록 다운로드를 대체하지 않고, 작업이 일어나는 순서를 바꿉니다.
스냅숏을 로드한 노드는 백그라운드 체인스테이트에서 제네시스 블록부터 완전한 초기 블록 다운로드를 여전히 수행하며, 이 체인스테이트는 스냅숏이 가정하게 해준 체인 구간의 전체 검증을 맡습니다. 영구적으로 건너뛰는 것은 없습니다. 스냅숏이 얻어 주는 것은 대기하는 동안 지갑이 쓸모없이 남지 않는다는 점입니다. 활성 체인스테이트가 이미 관심 있는 모든 주소의 현재 상태를 알고 있기 때문입니다. 제네시스 블록과 스냅숏 높이 사이의 구간은 검증된 것으로 조용히 계산되지 않고 가정 유효로 추적되며, 그래서 Core는 단일 체인스테이트의 플래그 하나 대신 두 개의 체인스테이트를 유지합니다. 스냅숏을 로드하고 백그라운드 동기화를 끝내지 않은 노드는 숨겨진 상태가 아니라 실제로 이름 붙은 상태에 있습니다.
Assumeutxo vs 프루닝 노드
Assumeutxo와 프루닝은 모두 노드가 감당해야 할 것을 줄이며, 서로 반대되는 것을 줄입니다.
프루닝은 검증 이후의 디스크에 관한 것입니다. 프루닝 노드는 모든 블록을 검사한 뒤 더 이상 필요 없는 원본 파일을 삭제합니다. Assumeutxo는 검증 이전의 시간에 관한 것입니다. 나중에라도 수행할 검사를 미룹니다. 둘은 함께 쓰일 수 있으며, Core는 이를 허용하기 위해 자체 규칙 하나를 완화합니다. -prune의 일반적인 하한은 550 MiB인데, 스냅숏을 로드하는 노드는 그 최솟값을 무시하고 대신 최소 1100 MiB를 사용합니다. 공간만이 유일한 항목은 아닙니다. 백그라운드 동기화가 실행되는 동안 체인스테이트 디렉터리가 일시적으로 두 개 존재하며, 각각 수 기가바이트이고 내려받은 스냅숏보다 커질 가능성이 큽니다.
인덱스에서 둘은 가장 크게 갈립니다. 인덱스는 스냅숏에서 얻는 것이 없습니다. 인덱스는 항상 제네시스 블록부터 구축을 시작하고 블록을 순서대로만 적용할 수 있으므로, 인덱스는 백그라운드 검증이 노드를 스냅숏 블록 너머로 진행시킨 뒤에야 최신 블록에 도달합니다. 프루닝은 이를 더 날카롭게 만듭니다. 프루닝을 지원하는 인덱스는 이미 인덱싱한 블록만 노드가 삭제하도록 허용하므로, 오래된 스냅숏은 인덱싱이 따라잡을 때까지 내려받았지만 인덱싱되지 않았고 삭제할 수도 없는 블록을 디스크에 쌓아 둡니다.