3️⃣

이중지불과 합의

이중 지불의 예시

이중지불은 같은 현금을 두 번 지불하는 것을 의미한다.
홍길동의 계좌에 100만원이 들어있고, 홍길동은 체크카드를 발급 받았다.
홍길동은 루이비통에서 100만원짜리 가방을 구매하였다.
홍길동의 계좌에서 루이비통의 계좌로 100만원이 이체되기 전에,
홍길동은 샤넬에 가서 100만원짜리 가방을 또 구매한다.
중개업자가 있는 상태에서는 이중지불이 불가하다.
중개업자는 빠르게 이체를 처리한 후 결과를 루이비통 점원에게 전송할 수 있다.
사토시 나카모토는 비트코인이 받을 수 있는 유일한 공격은 이중지불이라고 말하고 있다.
비트코인을 지급한 후 충돌되는 다른 지급을 하여 자신의 돈을 회수하는 방법이다.
예를들어 친구에게 돈을 보낸 후 같은돈을 나에게 또 보내면 이중지불이 된다.

비트코인의 이중지불

같은 UTXO를 입력으로 다른 출력이 있는 트랜잭션이 네트워크에 전파되면 이중지불이 발생한다.
각각의 트랜잭션을 담은 블록이 완성되고 네트워크에 전파되면 포크가 발생한다.
이 경우 두 블록은 경쟁에 돌입하며, 둘 중 하나의 블록만 실제 장부로 인정받는다.
시간이 흘러 두 블록의 높이 차이가 발생하면 최장 체인이 우선 인정된다. (longest block, greatest cumulative work chain)
또 다시 시간이 흘러 앞서가던 블록이 뒤쳐지게 되면, 더 앞선 블록이 인정되지만, 그럴 가능성은 매우 희박하다.
포크는 네트워크나 노드의 상황에 따라 자연적으로 발생하기도 한다.
여기서 보는 포크는 우리가 잘 알고있는 인위적 포크 (소프트 포크, 하드 포크)와는 다른 개념이다.

포크 발생 시나리오

1.
아직 포크가 발생하지 않은 상태이다.
2.
X노드와 Y노드에서 (고의 또는 우연히) 동시에 블록이 생성되었다. 주변 노드부터 블록을 전송 받게된다.
3.
다수의 노드가 두 개의 블록을 받았고 포크가 발생하였다.
4.
삼각형 블록을 받은 노드들은 이미 삼각형의 다음 블록을 만들고 있을 것이고, 역삼각형 블록을 받은 노드는 역삼각형의 다음 블록을 만들고 있을 것이다. 그 와중에 삼각형 블록의 다음 블록이 먼저 완성되었다.
5.
마름모 블록이 가장 최장 체인이 되었고, 다른 노드 들도 이를 받아들인다.

작업증명과 합의

작업증명은 포크된 블록 중 하나를 고르는 메커니즘이다. 왜일까?
전제조건
비트코인에서 논스 값을 찾아서 블록을 만드는 것은 매우 어렵다.
비트코인에서 논스 값을 찾는 것은 해시를 기반으로 하기 때문에 다수가 시도하는 것이 유리하다.
경쟁상태
포크가 발생하였다. 어떤 블록이 먼저 다음 블록을 만들 확률이 높을까?
당연히 해시파워 (특정 시간당 작업증명 시도가 가능한 수)가 높은 블록이 다음 블록을 만들 확률이 높다.
결론
다량의 해시파워(다수의 참여자)가 먼저 블록을 만들 확률이 높다.
51% 공격
위 과정에서 한 명(또는 소수의 매수자)의 사용자가 원하는 블록을 먼저 만들 기 위해서는 전체 해시파워의 50% 이상을 차지해야 한다.
이를 51% 공격이라 한다.
이론적으로 특정 집단이 51%의 해시파워를 점유하게 되면 자신이 원하는 블록을 승인시킬 확률이 높아진다. 즉 이중지불 공격
51% 공격이 비효율적인 이유
51% 공격을 통해 얻는 실익이 공격을 위한 비용보다 현저히 낮다.
2023년 현재 평균 50TWh의 해시레이트를 기록 중에 있다.
2023년 10월 기준 해시레이트
대한민국의 전기료 기준으로 약 5000조원에서 1경원 사이의 비용이 발생한다.
이는 비트코인 시가총액을 훨씬 상회한다.

이중 지불이 성공할 확률

51% 공격 및 이중지불이 성공할 확률은 비트코인 백서에서 소개하고 있다.
다음과 같은 확률을 정의한다.
p=정직한 노드가 다음 블록을 찾을 확률q=공격자가 다음 블록을 찾을 확률qz=공격자가 z 블록 뒤에서부터 따라잡을 확률 qz={1if  pq(q/p)zif  p>q}p = 정직한\ 노드가\ 다음\ 블록을\ 찾을\ 확률 \\ q = 공격자가\ 다음\ 블록을\ 찾을\ 확률 \\ q_z=공격자가\ z\ 블록\ 뒤에서부터\ 따라잡을\ 확률 \\\\ \ q_z =\begin{rcases}\begin{cases} 1 & if\ \ p \leq q\\(q/p)^z & if\ \ p > q\end{cases}\end{rcases}
여기서 p와 q는 정직한 노드와 공격자의 해시레이트 비율로 봐도 무방하다.
p가 q보다 큰 경우라 가정하면 공격자가 따라잡아야 하는 블록 수가 늘어날수록 따라잡을 확률은 지수적으로 감소하게 된다.
예를 들어보자.
공격자의 해시파워가 높은 경우
정직한 노드가 다음 블록을 만들 확률 : 49%
공격자가 다음 블록을 만들 확률 : 51%
뒤쳐진 5 블록을 따가갈 확률 : 100%
이유 여하를 막론하고 무조건 따라잡힌다.
정직한 노드의 해시파워가 높은 경우
정직한 노드가 다음 블록을 만들 확률 : 90%
공격자가 다음 블록을 만들 확률 : 10%
뒤쳐진 2 블록을 따라갈 확률 :
(0.1/0.9)2=0.01234 (1.2%)(0.1/0.9)^2 = 0.01234\ (1.2\% )
뒤쳐진 5 블록을 따라갈 확률 :
(0.1/0.9)5=0.00001693 (0.0016%)(0.1/0.9)^5 = 0.00001693\ (0.0016\% )
그렇다면 내가 비트코인을 송금한 뒤 이중지불을 당할 확률은 얼마나 될까?
비트코인 공격 성공은 거의 나타나지 않으므로 사토시 나카모토는 푸아송 분포를 통해 계산했다.
비트코인 백서는 다음처럼 표현한다.
공격자가 다음 블록을 만들 확률이 10%일때,
이후에 1개의 블록이 만들어졌다면 공격에 성공할 확률이 20%이다.
이후에 2개의 블록이 만들어졌다면 공격에 성공할 확률이 5%이다.
지수적으로 감소한다.
공격자가 다음 블록을 만들 확률이 30%에 육박한다고 해도
이후에 5개의 블록이 만들어졌다면 공격에 성공할 확률은 17.7%이다.
이후에 10개의 블록이 만들어졌다면 공격에 성공할 확률은 4%이다.
만약 공격에 성공할 확률이 0.1%이하가 되려면
공격자가 다음 블록을 만들 확률이 10%일 때, 5개의 블록을 기다리면 된다.
공격자가 다음 블록을 만들 확률이 15%일 때, 8개의 블록을 기다리면 된다.

비트코인과 합의

두 개의 트랜잭션에서 의견 충돌이 발생했을 때, 비트코인은 다수가 지지하는 트랜잭션(실제로는 블록)을 선택하게 된다.
하지만 불특정 다수가 있는 상태에서는 다수결을 실시하기 어렵다.
투표는 개표 과정이 필요하다. 그 개표인을 믿을 수 없다.
개표인이 없는 투표 방법은 너무 많은 리소스를 소모한다. (PBFT 합의기법)
사토시 나카모토의 선택은
시간을 두고 확인하는 방법이다.
다수가 지지하는 블록이 더 길어질 것이고, 소수의 공격가 지지하는 블록이 더 길어질 확률은 매우 낮다.
따라서 비트코인은 충분한 시간을 두고 합의를 진행한다.