19. 컴퓨터들도 라인을 잘 타야 살아남는다
시스템의 개별 노드가 유지하고 있는 트랜잭션 이력이 서로 달라 충돌이 생길때 문제를 어떻게 해결할지 알아본다.
목표
네트워크 내 모든 노드가 명확한 단일 트랜잭션 이력만 유지하도록 하여 어느 노드가 소유권 확인 요청을 처리하든 항상 동일한 결과가 산출되도록 한다.
해결해야 할 과제
블록체인-알고리즘에는 중앙 통제 장치가 없기 때문에 개별 노드의 수신함에 도착한 새 블록이 그 노드가 무슨 일을 해야 할지 알려준다. 각 노드는 어떤 메시지가 도착했냐에 따라 작업을 전환하는데 같은 시간에 모든 노드의 작업 전환이 동시에 발생하는 것이 아니므로 개별 노드의 작업 상태에 중첩이 생길 수 있다. 이처럼 메시지 전달 과정에서 문제가 발생했을 때 명확한 단일 트랜잭션 이력을 식별하는 방법을 찾아야 한다.
아이디어
모든 노드가 단일 버전의 트랜잭션 이력을 선택한다.
집단적 의사결정 문제에서 동의나 합의에 이르는 과정을 분산 합의
라 부르는데 집단적 의사결정 상황은 다음의 네 가지를 충족한다.
- 모든 노드는 네트워크, 블록체인-데이터-구조의 개별 복사본을 유지하는 노드들, 노드들의 행동을 통제하는 블록체인-알고리즘으로 구성된 동일한 환경에서 작동한다.
- 집단적 의사결정 문제는 단일 트랜잭션 이력을 선택하는 것이다.
- 모든 노드는 수입을 최대화하기 위해 블록체인-데이터-구조에 유효한 새 블록을 추가하고 보상을 받으려 노력한다.
- 모든 노드는 목표 달성을 위해 자신이 생성한 새 블록을 피어들에게 보내 검사받고 인정받으려 한다. 그 결과 각 노드는 집단적으로 유지되는 블록체인-데이터-구조 환경에 개별적인 흔적을 남기게 된다.
- 환경 변화에 기반한 동일한 기준을 사용해 의사결정 문제를 평가한다. 여기서 기준은 각 트랜잭션 이력을 생성하기 위해 사용한 계산 노력의 누적 총합이고, 둘 이상의 상충된 트랜잭션에서 조작된 데이터를 분별하기 위한 기준으로 활용된다.
작동원리
계산 노력을 판단하는 기준
가장-긴-체인 기준
새 블록을 만들어 기존 체인을 확장하려고 할 때, 어떤 노드는 해시 퍼즐을 해결하여 새 블록을 피어들에게 전송하여 블록-체인-데이터 구조를 형성할 것이다. 그리고 이렇게 가장 최근 추가된 새 블록을 이전 노드로 만드는 또다른 새 블록을 만들기 위해 노력하게 될텐데 이는 곧 세 개의 블록으로 구성된 오직 한 가지 버전의 블록체인-데이터-구조만 존재한다는 것이다. 단 네트워크 상의 문제로 인해 새 노드를 전달받지 못하는 상황에서 전달받지 못한 노드 중 하나가 해시 퍼즐을 해결하여 다른 피어들에게 해시값을 전송하게 되면 대다수의 피어들이 2개의 블록을 수신하게 된다. 이런 경우 상단에 두 개의 가지가 뻗어있는 블록체인-데이터-구조를 유지하게 되는데, 체인의 길이가 같다면 각 노드는 어느 쪽 가지를 확장할 지 임의로 정한다. 그런데 이때도 앞서 말한 두 개의 블록을 수신하게 되는 상황이 발생할 수 있다. 결국 가장-긴-체인 기준을 적용하면 대다수의 노드 그리고 궁극적으로 시스템의 모든 노드가 소유권의 명확화와 관련된 요청에 대해 이 체인을 사용하게 되고, 블록체인-데이터-구조는 일직선으로 이어진 체인이 아니라 트리나 원주형 선인장처럼 생긴 구조를 가지게 된다.
가장-무거운-체인 기준
가장 많은 블록을 가지고 있는 경로가 가장 많은 계산 노력을 소모한 것이라는 가정 하에 가장-긴-체인 기준에 대해 살펴보았다. 그런데 난이도가 블록마다 다를 때 가장 긴 경로가 반드시 가장 많은 계산 노력을 소모했다는 보장이 없다. 각 경로별로 실제로 사용된 계산 노력을 측정하려면 각 블록 헤더의 난이도를 모두 더하면 된다. 이렇게 계산해보면 가장-긴-체인이 반드시 가장 많은 계산 노력을 소모한 것은 아니라는 사실을 알 수 있고, 이 때문에 동적으로 난이도를 결정하는 블록체인은 가장-무거운-체인 기준으로 가장 무거운 체인을 가진 트랜잭션 데이터 이력을 선택하다.
선택받지 못한 체인은 어떻게 될까?
특정 체인을 선택하면 다음의 결과가 나온다.
고아 블록
보상 회수
소유권 명확화
트랜잭션 재처리
공통 몸통의 성장
궁극적 일관성
조작에 대한 견고성
1. 고아 블록
권위 체인이 선정되면, 트리-모양 데이터 구조 내 권위 체인 경로에 속하지 않은 블록은 모두 버려진다.
2. 보상 회수
고아 블록은 권위 체인에 기여하지 않으므로 소유권 명확화에 아무 쓸모가 없고, 고아 블록을 생성하고 제출해서 보상을 받았던 노드들로부터 보상을 회수한다.
3. 소유권 명확화
권위 체인에 속한 트랜잭션들만 실제로 발생한 것으로 인정받아 소유권 명확화에 사용된다.
4. 트랜잭션 제자리
고아 블록에 소속돼 버려진 트랜잭션 데이터는 노드의 수신함에 넣어져 재처리된 후 블록체인-데이터-구조에 다시 추가되어 선택된 트랜잭션 이력의 일부가 될 기회를 한 번 더 부여받는다.
5. 공통 몸통의 성장
트랜잭션 이력의 상충되는 버전은 덜 모호한 공통 몸통으로부터 뻗어나온 것이므로 깊이 들여다볼수록 해당 블록이 가장 긴 체인의 일부인지 아닌지가 명확해진다.
6. 궁극적 일관성
가장-긴-체인-기준이 모호할 때 추가된 다음 블록에 의해 어느 것이 가장 긴 체인의 일부가 될지 결정하는데, 이 다음 블록이 블록체인-데이터-구조의 어디에 붙어서 가지를 확장할지는 노드가 알아서 결정한다. 트리-모양 블록체인-데이터-구조는 해시 퍼즐의 속도 경쟁과 네트워크를 통한 메시지 전달의 임의 변동성에 영향을 받으려 무작위로 성장하는데 선택된 가지들은 몸통에 그대로 붙어있다. 따라서 권위 체인의 정상이나 그 근처 블록들은 새 블록이 랜덤으로 도착하는 성질에 영향을 많이 받는다. 시간이 지나 더 많은 블록이 추가될수록 권위 체인에 포함될 가능성이 더 높아지는 현상을 궁긍적 일관성이라 부른다.
7. 조작에 대한 견고성
트리-모양의 블록체인-데이터-구조 중 가장 계산 노력이 가장 많이 들어간 경로가 트랜잭션 이력의 권위 있는 버전이다. 블록체인-데이터-구조 내부의 특정 블록에서 시작하는 새로운 권위 경로를 만들려면 대다수가 유지하고 있는 경로를 따라잡고 앞질러야 하고, 이 점이 블록체인이 가진 견고성의 기초가 된다. 즉 공격자가 내부 블록을 조작하려한다면 작업 증명을 다시 하고, 모든 후속 블록의 해시 퍼즐을 다시 풀어서 정직한 노드들이 유지하고 있는 경로를 따라잡아야 하는데 사실상 불가하고, 결론적으로 시스템이 유지하는 트랜잭션 이력은 조작으로부터 견고하다.
References
[블록체인 무엇인가?] 다니엘 드레셔 지음