[블록체인] 2. 비트코인(Bitcoin) - 사토시 나카모토 논문 해석

2021. 7. 3. 20:01Blockchain

이번 장에서는 암호화폐의 조상격인 비트코인이 처음 소개된 논문에 대해 분석해본다. 

 

Bitcoin : A Peer-to-Peer Electronic Cash System이라는 제목의 논문은 기존의 전자 결제 시스템의 

 

이중 지불 문제를 지적하고, 이를 해결하기 위해 비트코인이라는 블록체인 기반의 새로운 해법을 제시한다. 

 

이 논문은 2009년 '사토시 나카모토'라는 필명을 가진 익명의 프로그래머에 의해서 처음 소개되었다.

 

사토시 나카모토의 정체는 아직도 밝혀진 바가 없으며, 이러한 신비한 내러티브가 비트코인의 몸값 상승에 어느정도 역할을 

 

하지 않았나 추정한다. 

출처 : https://bitcoin.org/bitcoin.pdf

 

자 이제부터 나카모토씨가 작성한 논문의 각 단락을 분석해보자. 

 

 

Abstract


논문의 개요에서는 기존 전자 화폐에서의 Double-spending 문제에 대해 지적하는 것으로 시작한다. 

 

그리고 새로운 트랜잭션을 작업증명을 통한 해시 기반의 체인에 추가하는 네트워크 개념을 통해 이를 극복할 수 있다고 

 

주장한다. 가장 긴 체인이 가장 진실된 거래기록들임을 증명하며, 이 믿음 하에 각 노드들은 자유롭게 네트워크를 떠나고

 

재참여할 수 있다. 

 

 

1. Introduction


인터넷 상거리는 금융 기관에 의존하며, 제3자의 신뢰에 기반한다. 이러한 시스템은 근본적으로 약점을 갖고있다. 

 

금융 기관은 이에 대해 책임지는 구조이기에, 트랜잭션은 완전히 비가역적이지 않다.

 

이는 트랜잭션 구조의 비효율로 이어지며, 이를 관리하는 것 역시 중앙 기관에 부담을 준다. 

 

따라서 제3자 없이도 신뢰할 수 있는 거래 구조를 만들어야한다. 

 

누군가를 '신뢰'하는 것이 아닌 암호화된 증명에 기반한 결제 시스템을 만들어야한다. 

 

이 논문에서는 p2p로 분산화된 타임스탬프 서버를 통해 연대순으로 정리된 트랜잭션을 생성해내는 방식으로

 

double-spending 문제를 해결하는 방안을 제시한다.

 

이 시스템은 해킹하려는 노드들보다 많은 수의 신뢰가능한 노드들이 CPU power를 더 많이 사용함으로써

 

시스템 통제권을 지배적으로 확보하여 보안성을 획득한다. 

 

 

2. Transactions


우리는 전자화폐를 일종의 전자서명 체인으로 규정한다. 코인을 보낼 때 [이전 트랜잭션, 다음 Owner의 공개키]를

 

Hash하여 이를 코인의 끝에 추가한다. 수취인은 서명을 증명할 수 있다.

 

이 과정의 문제점은 수취인이 소유자 중 누군가 double-spending하지 않았다는 것을 증명할 수 없다는 것이다.

 

이는 신뢰할 수 있는 중앙 기관이나 조폐국을 통해 매 트랜잭션을 검증할 수 밖에 없다.

 

이 문제를 극복하기 위해서는 이전 소유자가 이전 트랜잭션에 서명하지 않았음을 수취인이 확인할 수 있도록 해야한다. 

 

이런 목적에서 가장 앞선 트랜잭션 중 하나를 인정하고, 나중에 시도된 이중 거래를 무시하는 것이다.

 

그러한 이중 거래가 없다는 것을 알기 위해서는 모든 거래에 대해서 인식하고 있어야한다. 

 

제 3자 없이 이를 가능케 하기 위해서는 모든 트랜잭션에 대해서 투명하게 공개하고

 

수취인은 다수의 노드 참여자들이 그 시점의 트랜잭션이 첫번째로 받은 것임에 동의했다는 것을 증명해야한다. 

 

 

3. Timestamp Server


위의 내용이 가능하기 위해서는 타임스탬프 서버가 필요하다. 타임스탬프 서버는 아이템의 블록의 해시에 타임스탬프를 찍고

 

그 해시를 널리 배포하는 방식으로 작동한다. 타임스탬프는 그 데이터가 해당 시간대에 존재했었다는 것을 증명하고, 

 

각 타임스탬프는 이전 타임스탬프를 자신의 해시로서 포함한다.

 

 

4. Proof of Work


P2P 기반의 분산 네트워크 타임스탬프 서버를 구현하기 위해서 아담 백의 해쉬캐시 같은 작업증명 시스템을 필요로 한다. 

 

작업 증명에는 SHA-256 같이 다수의 0비트로 시작하는 해쉬된 값을 찾는 과정을 포함한다. 

 

평균 작업은 요구되는 0비트 개수에 따라 지수적으로 증가하며 단일 해쉬를 수행하는 것으로 확인된다.

 

이 타임스탬프 네트워크에는 작업증명(PoW)을 도입하는데, 블록해시 결과가 0비트들을 갖도록하는 value가 찾아질때까지

 

블록 내의 nonce를 증가시키는 방식이다. 한번 CPU 작업이 PoW를 만족하는데 다달았으면, 블록은 재작업 없이 

 

바뀔 수 없다(고정된다). 이것 이후에 나중 블럭이 변경되려면, 블록 변경을 위한 작업은 이것 이후의 모든 블럭에 대한 

 

재작업을 포함해야한다. 

  또한 작업증명은 다수결에서의 의사결정 문제도 해결한다. 만약 다수가 1 IP 1 투표라면 많은 IP를 선점한 자가

 

네트워크를 왜곡할 것이다. 작업증명은 반드시 1 CPU 1투표이어야한다. 다수 결정은 (가장 많은 작업증명 작업이 투입된)

 

가장 긴 체인에 의해 대표된다. 대다수의 CPU power가 믿을 수 있는 노드들에 의해 제어된다면, 가장 믿을 수 있는 체인은 

 

가장 빠르게 성장(grow)하며 다른 노드들을 압도할 것이다. 과거의 블록을 변경하기 위해 공격하는 블록 및

 

그 이후의 모든 블록에 대한 재작업을 수행해야하며, 믿을 수 있는 노드들을 따라잡고 추월해야한다. 우리는 이러한 공격자의

 

가능성이 이후 블록들이 이어짐에 따라 지수적으로 감소함을 이후에 서술하겠다. 

 

  시간이 지남에 따라 운영되는 노드들의 흥미를 돋구고, 증가하는 하드웨어 속도를 보상하기 위해, 작업증명 난이도는 

 

시간당 평균 블록수를 타겟팅하는 이동 평균을 기준으로 한다. 너무 빠르게 생성되면, 난이도는 올라간다. 

 

 

 

5. Network


네트워크를 운영하는 단계는 다음과 같다.

 

  1. 새 트랜잭션은 다른 노드들에 전파된다.
  2. 각 노드들은 블록에 새 트랜잭션을 모은다. 
  3. 각 노드는 그 블록에 대한 작업증명을 수행한다. 
  4. 노드가 작업증명을 풀어냈을 때, 이 블록을 모든 노드에 전파한다. 
  5. 노드들은 그 블록 내의 모든 트랜잭션이 타당하고 이전에 쓰이지 않았음을 확인하면 블록을 승인한다. 
  6. 노드들은 받아들인 블록을 이전 해시로 사용하여 체인 내 다음 블록을 생성함으로써 블록 승인을 표현한다.

노드들은 항상 가장 긴 노드가 옳은 것임을 상정하며, 이것을 계속해서 확장시킬 것이다. 만일 두 노드가 서로 다른 버전의

 

새 블록을 동시에 받는다면, 몇몇 노드들은 한쪽(또는 다른 한쪽) 블록을 먼저 받을 것이다. 그들은 자신이 먼저 받은 블록에 

 

대해서 작업을 수행하며, 다른 한쪽이 길어지는 것에 대비하여 그 branch를 저장해둔다. 다음 작업증명에서 한 branch가 

 

더 길다는 것이 밝혀지면 이 동률(tie)은 파괴된다.(이에 따라 다른 branch에서 작업하는 노드들은 더 긴쪽으로 전환한다.) 

 

  새 트랜잭션의 전파는 항상 모든 노드에 전파될 필요는 없다. 그들이 많은 노드에 도달하는 한, 머지않아 블록에 포함될

 

것이다. 블록 전파는 Drop된 메시지에도 내성이 있는데, 만약 노드가 블록을 받지 못하였고 다음 블록을 받고 하나를 

 

놓쳤다는 사실을 알게되면 이 블록을 다시 받게끔 요청할 것이다. 

 

 

 

6. Incentive


약속에 의해, 블록의 첫번째 트랜잭션블록 생성자에 의해 새 코인이 소유되도록 시작하는 특별한 트랜잭션 이다.

( → 최초의 채굴 작업은 채굴자에게 새 코인을 지급한다는 의미인듯 하다.)

 

이것은 노드들이 네트워크를 지탱하고, 초기에 코인이 유통될 수 있는 방법을 제공한다(발행하는 중앙 기관이 없기 때문).

 

꾸준하게 일정한 양의 코인을 추가(addition)하는 것은 금 채굴자가 새 금을 유통시키기 위해 자원을 쏟는 것과 유사하다.

 

우리의 경우에는 이것이 CPU 시간과 전기가 되는 것이다.

 

  인센티브는 트랜잭션 비용으로 조성될 수도 있다. 트랜잭션의 결과값(output value)이 투입값(input value)보다 작다면

 

이 차이는 트랜잭션을 블록에 포함시키는 인센티브 비용으로 추가된 트랜잭션 비용이다. 한번 미리결정된 코인의 수가 

 

유통되고나면, 그 이후로는 인센티브는 전적으로 트랜잭션 비용이 되고 인프레이션 free하다. 

 

  인센티브는 노드들이 정직할 수 있도록 유인한다. 공격자가 모든 정직한 노드들을 압도할만큼 더 많은 CPU 파워를 

 

가진다면 공격자는 그의 지불을 철회하여 사람들을 속이거나, 새로운 코인을 생성할 셈일 것이다. 

 

(그러나)그는 시스템을 훼손하는 것보다 룰대로 Play하는 것이 자신에게 더 많은 코인을 제공하고 부 축적에 도움이

 

될 것이라는 것을 깨달아야한다. 

 

 

7.  Reclaiming Disk Space (디스크 공간의 재확보)


한번 코인의 가장 최근 크랜잭션이 충분한 블록 밑에 묻히게되면, 이것 이전에 보내진 보내진 트랜잭션은 디스크 공간을 

 

아끼기 위해 철회될 수 있다. 블록 해시를 손상시키지 않고 이것을 촉진시키기 위해서, 트랜잭션은 머클 트리에 해시된다. 

 

(머클 트리 : 블록 해시에 루트 해시만 포함되는 구조의 트리) 

 

오래된(과거) 블록들이 트리에서 가지쳐짐으로써 크기가 작아질 수 있다. 내부 해시들은 저장될 필요가 없다.

  트랜잭션이 없는 블록 헤더는 80바이트 정도의 크기이다. 만약 블록이 10분마다 생성된다고 가정하면 1년에 4.2MB가

 

생성된다. 1년에 1.2GB씩 증가한다는 무어의 법칙에 따라 블록 헤더가 메모리에 저장되어야 한다하더라도

 

저장용량(storage)는 문제가 되지 않는다.

 

 

 

8. Simplified Payment Verification


전체 네트워크를 사용하지 않고 지불 검증이 가능하다. 사용자는 가장 긴 블록의 블록헤더의 복사본을 필요로 하며,

 

네트워크 노드에 확신이 될 때까지 질의함으로써 이를 쿼리(query)하여 얻을 수 있다.

 

이는 머클 트리에서 얻는데, 타임스탬프된 블록에 트랜잭션을 연결하는 자료 구조이다. 

 

사용자 스스로 이것을 검증할 수 없고 체인에 연결하여 네트워크 노드가 이를 승인했는지, 이후 블록들도 네트워크에 

 

승인된 것인지 확인할 수 있다. 

이처럼 정직한 노드들에 의해 네트워크가 통제되는 이상 검증을 신뢰가능하지만 네트워크가 공격자에 의해 압도되면 

 

더 취약해진다. 네트워크 노드들이 트랜잭션들을 검증하는 동안, 단순화된 방법이 공격자의 공격에 의해 무력화될 수 

 

있다. 이를 막는 한가지 방법은 네트워크 노드들이 이상한(invalid) 블록을 발견하거나, 사용자 소프트웨어에서 전체 

 

블록을 다운받으려고 시도하거나, 트랜잭션의 비일관성을 발견했을 때 경보를 울리는 것이다. 빈번한 지불을 하는 

 

사업자 입장에서는 더 독립적이고 빠른 검증을 하는 그들 자체적인 노드를 운영하길 원할 것이다. 

 

 

 

9. Combining and Splitting Value


코인들을 개별적으로 다루는 것이 가능할지라도, 전송 시에 매 센트마다 트랜잭션을 나누는 것은 다소 불편하다.

 

값들을 통합하고 분할하기 위해서 트랜잭션은 다수의 input과 output들로 구성된다. 보통 더 큰 이전 트랜잭션으로부터 

 

단일 input이거나 더 적은 양을 통합한 다수의 input 모두 가능하며, output은 최대 2개이다 (하나는 지불,

 

나머지는 거스름돈 등). 

여기서 트랜잭션이 더 많은 몇몇 트랜잭션에 의존하는 fan-out에 대해서는 문제가 되지 않는다. 

 

트랜잭션 기록의 완전히 독립된 사본을 추출할 필요가 없다.

 

 

 

10. Privacy


 전통 뱅킹 모델에서는 당사자와 믿을 수 있는 3자만에게 정보 접근을 허용하는 방식인 'level of privacy'를 이뤘다. 

 

모든 트랜잭션에 대해서 공연하게 오픈시키는 필요성에 의해 위 방식은 불가하다. 하지만 공개키를 익명화하고

 

정보 흐름을 차단함으로써 보안(privacy)은 유지된다. public은 누군가 → 누군가 로의 송금은 확인할 수 있으나, 

 

트랜잭션을 누군가에게 연결하는 정보는 보지 못한다. 이는 시간과 거래량만 확인 가능한 주식 거래와 비슷한 

 

'level of information'과 비슷하다. 

추가적인 방화벽으로, 새로운 키 쌍(key pair)이 각 트랜잭션에 사용되어 그들이 일반 사용자에 의해 연결되는 것을 

 

막게 해준다. 몇 링크들은 multi-input 트랜잭션을 겪어야만한다(그 input들은 같은 소유자에 의한 것임을 나타냄).

 

이것의 리스크는 키의 소유자가 노출되면, 같은 소유자에 종속된 다른 트랜잭션들도 노출된다는 것이다. 

 

 

 

11. Calculations 


우리는 공격자가 정직한 체인을 추월한 대체적 체인을 생성하는 경우를 생각해봐야한다. 

 

이것이 달성되더라도, 값을 난데없이 생성하거나 돈을 사취하는 등과 같이 시스템에 임의의 변화를 주도록 하지 못한다. 

 

노드들은 invalid 블록을 승인하지 않을 것이며, 정직한 노드들은 그들을 블록에 포함하지 않는다. 공격자는 오로지 

 

그가 보낸 것에 대한 트랜잭션을 바꿀 수 있을 뿐이다. 

 

정직한 체인과 공격자와의 레이스는 Binomial Random Walk로 특징지어질 수 있다. 

 

성공한 경우는 정직한 체인이 하나의 블록을 늘렸을 때 +1, 실패한 경우는 공격자가 블록 하나를 늘렸을 때 -1이다. 

 

타고난 적자로부터 시작한 공격자가 따라잡을 가능성은 Gambler's Ruin problem과 유사하다.

 

갬블러가 적자 상태의 무한한 신용으로 시작하여 본전이라도 따기 위해 무한히 시도하는 상황을 가정하자. 

 

우리는 그가 본전을 딸 확률(정직한 체인을 따라잡을 확률)을 계산할 수 있다. 

 

p = 정직한 노드가 다음 블록을 찾을 확률

q = 공격자가 다음 블록을 찾을 확률

q_z = 공격자가 이후의 z개 블록을 따라잡을 확률

p > q이라고 가정할 때, 공격자가 따라잡아야할 블록의 개수가 늘어감에 따라 이 확률(q_z)은 지수적으로 떨어진다. 

 

승산이 없는 상황에서 일찌감치 돌진하지 못하면 뒤처질수록 승산이 희박해진다.

 

우리는 새 트랜잭션의 recipient가 <sender가 트랜잭션을 바꾸지 않았음을 충분히 확신할 때>까지 얼마나 오래

 

기다려야하는지 생각해보자. 여기서 sender는 공격자고, recipient가 돈을 받았음을 한동안 믿게끔 하길 원한다. 그런 뒤에 

 

돈을 자신에게 다시 돌려보내고자 한다. recipient는 그것을 알아차리지만, sender는 그것이 이미 늦기를 바란다. 

 

recipient는 새 키 쌍(key pair)를 생성하여 sender에게 서명 직전에 공개키를 준다.

 

이 방식은 공격자가 미리 연산을 해두어 록 체인을 준비해서 그 순간에 트랜잭션을 실행하는 것을 방지한다.

 

트랜잭션이 한번 보내지고나면, 이러한 sender는 그의 다른 버전의 트랜잭션을 포함하는 체인을 은밀하게 병행하여

 

수행한다.  recipient는 트랜잭션이 블록에 추가되고 z 블록들이 이후로도 계속 연결되기까지 기다린다.

 

그는 공격자가 얼마나 많은 연산을 수행했는지 모르지만, 정직한 블록들은 블록당 평균 기대 시간을 갖는다.

 

공격자의 잠재 진행수준은 Poisson distribution의 기댓값인 다음과 같다. 

공격자가 현재를 따라잡을 확률을 구하기 위해 Poisson density를 그가 그 시점에 따라잡을 수 있는 매 진행에 곱한다. 

 

 분포의 무한급수를 더하지 않기 위해 정리하면...

이를 C 코드로 표현하면 

결과값을 보면, z값에 따라서 확률이 지수적으로 급감하는 것을 확인할 수 있다. 

q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006

P를 0.1% 이하의 값으로 설정하면

P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340

 

 

12. Conclusion


우리는 신뢰에 의존하지 않는 전자 트랜잭션을 위한 시스템을 제안했다. 

 

논문의 초반에 전자 서명으로 만들어진 보통의 코인 프레임워크를 살펴보았다. 이는 강력한 소유권의 제어를 갖지만 

 

이중 지불 문제에 취약하다. 이를 해결하기 위해 작업증명을 통해 트랜잭션의 공개된 기록을 남겨서 정직한 노드가

 

CPU power를 장악하는한 공격자가 공격하기 어려운 p2p 네트워크를 제안했다. 

 

 이 네트워크는 구조적이지 않은 단순함에서 강점이 있다. 노드들은 거의 협력하지 않고도 일할 수 있다. 

 

메시지가 다른 곳으로 route되지 않고 best effort basis로 전달되기 때문에 노드들은 identified될 필요가 없다. 

 

노드들은 자유롭게 네트워크를 떠나거나 재참여할 수 있으며 Pow 체인이 그들이 떠난 동안의 증거로 받아들인다.

 

그들은 CPU power로 체인을 확장하거나 이상한 블록을 거절함으로써 타당한 블록의 승인에 대해 투표한다. 

 

어떤 필요시되는 규칙과 인센티브가 이러한 합의 매커니즘을 강화할 수 있다.