본문으로 바로가기

Bitcoin: A peer-to-Peer Electronic Cash System

category Paper review 2018. 11. 22. 18:11

block chain과 bitcoin을 공부하기 위해 satoshi Nakamoto의 논문을 review 및 설명 하려고 합니다.



1. Introduction



현재의 거래 시스템을 생각해보면 다음과 같은 방식으로 거래가 진행된다.

내가 M4RC0에게 물건을 사기 위해서 나는 제 3의 신용기관인 금융기관을 통해 거래가 이루어진다.

이러한 거래 시스템은 신뢰 기반으로 잘 작동하지만, 신뢰 기반이라는 약점을 항상 가지고 있다.

또한 거래 시스템에서 거래 내용이 가역적이다. 즉, 모든 거래는 되돌릴 수 있는 거래이다.

이런 가역적 특성 때문에, 거래자와, 상인은 피해를 볼 수 있고, 그에 대해 금융기관이 수수료를 갖는 형식으로 진행된다.

제 3의 신용기관인 금융기관을 실제로 설립하고, 운영하기 위해 많은 비용이 들어간다.

Satoshi Nakamoto는 이러한 제 3의 신용기관인 금융기관을 이용하지 않고, 암호학을 기반으로 거래 시스템을 만들 수 있다고 생각한다.

암호학 기반의 거래 시스템은 제 3의 신용기관이 필요 없이 거래 가능한 시스템이면서 비 가역적이다.

암호학 기반의 거래 시스템에서 발생할 수 있는 문제는 double-spending(이중 사용)의 문제인데, 이러한 문제를 해결하는 방법은 뒤에서 나올 timestamp를 이용해 해결 가능하다. 이 시스템에 참여하고 있는 각각의 참여자는 정직하다는 기반으로 작동한다. 만일 이 시스템에 참여한 참여자 중 50% 이상이 attack의 목적을 가지고 있으면 제대로 작동할 수 없다.



2. transaction



Satoshi Nakamoto가 제안한 거래는 일반적으로 제 3 신뢰기관인 금융기관을 통해 거래하는것과는 차이가 있다. 

현재의 거래 시스템은 금융기관을 통해 "통장"으로 돈이 들어오고 "통장"에서 돈이 나간다.

암호학 기번의 거래 시스템은 나에게 주어진 코인을 모아 남에게 전송하거나 나에게 전송하는것이다.

이 과정은 현재의 거래 시스템과 비슷하다고 생각할 수 있지만, 실제는 다르다.

만일 내가 M4RC0에게 3btc을 보내고 싶다면 block chain 거래 시스템에 속해 있는 모든 노드들에게 "내가 M4RC0에 3btc을 보낼거야"라고 전달한다. 여기서 M4RC0는 내가 돈을 보낸 M4RC0가 자기 자신인 것을 입증해야하고, 그것은 private key를 통해 증명할 수 있다.

만일 M4RC0가 private key를 잃어버리거나 노출되면, coin을 얻거나 전달할 수 없다.


거래 과정을 쉽게 알기 위해서, 아래의 의미를 알면 이해하기 쉽다.


개인키(private key): 비트코인에서 난수로 만들어지는 개인적 256 bit key


공개키(public key): 개인키로부터 뽑아낼 수 있는 공개된 key이다. public key를 통해 private key를 유추할 수 없다.


주소(address): 공개키를 sha256으로 변환한 뒤, RIPEMD160으로 변환한 값이 주소이다.


Satoshi Nakamoto는 전자 코인을 "디지털 서명의 체인"으로 정의했다. 각각의 코인의 소유자는 이전 거래와, 전달할 거래자의 public key를 hash하고 디지털 서명 하고 코인의 끝에 추가함으로써 다음 소유자에게 전달 할 수 있다. 이해하기 쉽게 아래의 그림으로 나타낼 수 있다.





이 거래의 문제점은 수취인(payee)의 입장에서 받은 코인이 이중 사용된(double-spend) 코인인지 알 수 없다는 것이다.

이중 사용(double-spending) 문제를 해결하기 위해서, 신뢰를 갖는 중앙 관리를 만들면 된다. 모든 코인은 신뢰를 갖는 중앙 관리로 부터 발행되고, 거래된 코인은 신뢰된 중앙 관리로 들어가 재 발급 되어야 한다. 신뢰된 중앙 관리에 의해 발급된 코인은 즉, 이중 사용(double-spending)되지 않았다는것을 보장해준다. 다시보면, 이것은 신뢰가 중심이되는 거래이다. 하지만 Satoshi Nakamoto가 원하는 거래 양상은 이와 같은 제 3의 신뢰된 기관이 개입한 상황을 추구하는것이 아니다.


거래에 있어서 Satoshi Nakamoto가 추구하는 것은 수취인(payee)가 코인의 이전 소유자가, 이중사용(double-spending)을 했는지 안했는지에 관심이 있고, 이후에 이중사용(double-spending)을 했는지 안했는지는 관심이 없다.


그렇다면 제 3의 신뢰된 기관이 어떻게 이중 사용(double-spending)을 방지할 수 있는지 보면, 모든 코인과 거래를 제 3의 신뢰된 기관이 알고 있기 때문이다. 만일 제 3의 신뢰된 기관 없이 이중사용(double-spending)을 막기 위해서는 어떻게 해야할까? 


Satoshi Nakamoto가 제안한 방법은, 모든 거래들이 거래 될 때 공개적으로 모든 사용자(Node)들에게 알리고, 대다수의 사용자(Node)들이 이중사용(double-spending)되지 않았음을 판단하고 확인하는 방법이다.


소유자 1이 소유자 2에게 송금하기 위해서 소유자 1은 소유자 0으로부터 받은 돈을 전달한다.

소유자 0이 소유자 1에게 돈을 전달하는 거래가 발생하기 위해 소유자 1은 소유자 0에게 자신의 주소를 전달한다.

소유자 0은 소유자 1에게 돈은 전달하고, 소유자 1을 나타내기 위해 소유자 1의 public key를 사용한다.

소유자 1은 소유자 0이 소유자 1에게 돈을 보냈는데 소유자 1이 자기 자신임을 증명하기 위해서 소유자 1의 private key를 사용한다.


소유자 0이 소유자 1에게 거래를 통해 돈을 보냈을 때 돈이 잠겨있다고 생각하면된다.

소유자 1이 소유자 0으로부터 받은 돈을 통해 거래를 하고 싶으면 잠겨있는 돈을 해제하여 거래를 진행해야한다.

아래의 그림으로 쉽게 나타낼 수 있다.


 




소유자 1이 소유자 0으로 받은 거래를 소유자 2에게 보내기 위해서, 거래 해제를 진행하고 잠금을 다시 진행한다.


헤제와 잠금의 단계는 아래와 같다.


해제


<Sig> <pubKey>


잠금


OP_DUP    OP_HASH160    <PubkeyHash>    OP_EQUALVERIFY    OP_CHECKSIG



비트코인의 거래에서 해제와 잠금은 stack 기반으로 작동한다.


해제의 과정은 아래와 같다.



잠금의 과정은 아래와 같다.






3. Timestamp Sever



Timestamp Sever는 satoshi Nakamoto가 제안한 이중거래(double-spending)를 막을 수 있는 방법이다.


Timestamp는 실제 시간(몇시 몇분의 기록)이 아니라 어떠한 작업이 먼저 일어났는지, 시간적 순서를 나타낸다.

거래들이 모인 블록을 해시하고 해시 값을 공개적으로 알린다. 각각의 Timestamp Server는 이전의 Timestamp와 현재 블록의 해시값을으로 Timestamp를 만든다. 블록이 추가될 때마다 chain을 형성하므로 TimeStamp에 의해 보안이 강화된다. 





transaction에서 이야기한 transaction들을 계속 발생하고 약 10분마다 transaction들을 모아 하나의 블록을 만든다.

만일 블록 0이 이전에 존재했고, 블록 1을 만들어 TimeStamp를 하려고 하면 Hash(블록 0의 hash || 블록 1의 hash1)를 한다. chain 형태로 되어있기 때문에, 블록이 더해질수록 신뢰성이 높아진다고 말할 수 있다.



4. Proof-of-Work(PoW)



각각의 블록에는 블록 헤더가 존재하고 블록 헤더의 6개의 정보를 이용해 블록 해시가 만들어진다.


블록 헤더는 아래의 6개로 구성된다.



1.version: 소프트웨어/프로토콜 version

2. previous block hash : 현재 블록 체인 바로 앞에 위치한 블록의 블록 해시

3. merkle hash : markle tree의 root 값

4. time: 블록이 생성된 시간

5. bits: difficulty 조정 값

6. nonce: 0으로 시작하여 조건에 맞는 값을 찾을때 까지 1씩 증가시킨다.



block chain에서 블록을 생성할 권리가 공평하게 분배되지 않고 일부 혹은 집단에 의해서 독과점 되어버리면 timestamp의 순서를 마음대로 바꿀 수 있다. satoshi Nakamoto가 제안한 방법은 PoW를 통해 운에 따라 블록을 생성할 권리를 갖는 방법이다.



PoW는 블록의 해시 값이 요구되는 연속된 0의 값을 찾기 위해 nonce 값을 증가시키며 찾는다. CPU의 노력을 통해 만족시키는 값을 찾은 경우 블록은 이전 블록에 chain 형식으로 연결된다. 블록을 수정하고 싶다면 PoW를 다시 진행해야하고, chain으로 연결되어있기 때문에 수정된 블록부터 이후 블록 모두에 대하여 Pow를 진행해야한다. 그림으로 나타내면 아래와 같이 나타낼 수 있다.





satoshi Nakamoto는 공평한 블록 생성 권리를 정하기 위해 확률적 요소를 적용했다.

"연속된 0 이 나올 때 까지 nonce를 증가시킨다."라고 이야기 했는데 일반적으로 연속된 0의 비트가 70개 나와야한다고 가정해보자. 비트코인은 sha256 해시 함수를 사용하기 때문에 항상 outpout은 256 bit이다. 이 중이에서 연속된 70개의 bit가 0으로 나올 확률을 1/2^70이다. 즉, node(사용자)가 블록 생성권리를 얻기 위해서 2^70정도 계산을 하면 한번 정도 권한을 얻을 수 있다. 만일 어떤 node가 Pow 를 만족하는 값을 찾았다면, node는 블록 생성 권리를 얻었고, 블록에 계산된 해시값을 기록한다.


satoshi Nakamoto는 PoW를 다수결에 의해 결정되는 시스템에서도 적용 가능하다고 생각한다.

다수결에 의해 결정되는 시스템은 내재적으로 one-person-one-vote 기반이다. 만일 one-IP-one-Vote는 다중 IP를 가질 수 있는 사람에 의해 시스템이 무너질 수 있지만, onc-CPU-one-vote는 다중 CPU를 통한 투표가 불가능하다. 하지만 요즘 hardware의 성능이 급격하게 좋아지고 각각의 node(사용자)가 증가하므로 difficulty라는 난이도를 추가했따.


난이도(difficulty)는 단순하게 PoW를 결정하는 난이도라고 생각하면 된다. 난이도(difficulty)에는 연속된 0의 개수가 자체적으로 조절된다. 비트코인은 10분마다 1개의 블록이 생성되도록 2주마다 결정된다. 2주는 약 20,160분이므로 보통 2016개의 block이 2주마다 생성된다고 예상할 수 있다. 시스템이 2주마다 생성된 블록의 개수를 세어 2016보다 많게 블록이 생성되면 난이도(difficluty)를 증가시키고, 2016보다 적게 생성되면 난이도(difficulty)를 낮추어 블록 생성 개수를 조절한다.



5. Network



거래들이 발생할 때 어떻게 블록들이 생성되는지에 대한 설명이다.


네트워크가 돌아가는 과정은 아래와 같다.


1) 새로운 거래는 모든 node(사용자)에게 브로드캐스트 된다.

2) 각각의 node(사용자)들은 새로운 거래를 블록에 수집한다.

3) 각각의 node(사용자)들은 그것의 블록을 위해 PoW를 진행한다.

4) 한 node(사용자)가 PoW를 찾았을 때, 그 node(사용자)는 그 블록을 모든 node(사용자)에게 브로드캐스트한다.

5) node(사용자)들은 블록의 모든 거래가 유효하고 이전에 사용되지 않았을 때, 블록을 받아들인다.

6) node(사용자)들은 블록의 승인을 이전 해시의 블록을 받아들인 해쉬로서 다음 블록을 생성함으로써 나타낸다.


node(사용자)들은 항상 chain의 길이가 제일 긴것을 옳은 것으로 생각하고 길게 늘이려고 노력한다.

만일 두 node(사용자)가 동시에 다음 블록에 대해 브로드캐스트를 진행하면 각각의 node(사용자)들은 자신이 처음 받은 블록을 먼저 수행하고 다른 하나는 다른 branch가 더 길어질 경우를 대비해 저장해둔다. 


새로운 거래에 대한 브로드캐스트 또한 모든 node(사용자)에게 전해질 필요는 없고, 대부분의 node(사용자)에게 전달되면 된다. 왜냐하면 대부분의 node(사용자에 의해) 곧, 거래는 블록에 들어가게 된다. 또한 추후 다음 블록을 받았을때 블록 누락을 알 수 있다.



6. Incentive



블록 생성의 대가(coin, fee)에 대한 설명이다.


각각의 node들은 블록을 생성할 권리를 위해 Pow를 하고, 컴퓨터의 CPU와 전력을 소모한다. 만일 이러한 소비에 대해 incentive가 없다면 이러한 시스템은 오래 유지 될 수 없을 것이다. 따라서 satoshi Nakamoto는 블록을 생성한 node(생성자)에게 코인을 주는 형식으로 incentive를 지급할 것을 제안했다. 블록을 생성하면 시스템이 블록을 생성한 node(생성자)에게 코인을 지급한다. 코인 지급은 블록 생성자의 public key를 이용해 주소를 얻어내어 주소로 코인을 지급한다.


인센트비는 또한 거래 수수료가 될 수 있다. 만일 거래의 out 비용이 in 비용 보다 작으면 그 차익만큼 거래 수수료가 되는 것이다. 각 코인은 미리 정해진 개수가 있기 때문에 코인 어느 정도 유통되면 incentive는 거래수수료가 되고, 인플레이션으로부터 자유로워진.


만일 내가 block을 생성하기 위해 PoW 작업을 진행했고, 그로 인해 CPU power와 전력을 소모했는데, 아무런 incentive도 받을 수 없다면 더 이상 그러한 거래 시스템을 사용하지 않을것이다. 위에서 말했듯이 비트코인은 코인이 미리 정해져 있는데 블록 생성으로 더 이상 코인을 받을수 없다면 손해보는 장사를 하지 않기 위해 PoW 작업을 진행하지 않을 것이고 그 시스템을 사용하는 node(사용자)들이 감소하여 비트코인의 인플레이션이 발생할 것이다. 하지만, 거래 수수료라는 개념을 도입하여, 인플레이션 문제를 해결하고 블록 생성의 인센티브 문제를 해결해 이와 같은 시스템이 충분히 잘 작동하도록 제안하였다.



7. Reclaiming Disk Space



코인에 대한 가장 최근 거래가 충분한 블록들 아래에 묻혀지면, 이전에 발생한 거래들은 디스크 공간을 아까기 위해서 버릴 수 있다. 블록 해시를 망가트리지 않고 이러한 작업을 하기 위해서, 거래들은 Merkle 트리로 해시된다. 또한 Merkle 트리의 root만 블록 해시에 포함된다. 이와 같은 구조를 통해서 Merkle 트리의 가지치기가 가능하다.









Merkle Tree는 위 노드가 자식 노드의 해시값으로 이루어져 chain 처럼 엮여 있기 때문에 거래 중 일부분만 변경되도 그것이 상위 노드에 영향을 주어 해시 값이 변경된다. 하지만 가지치키를 한다고, 해시 값이 달라지는 것은 아니기 때문에 Merkel Tree를 이용하면 보다 쉽게 디스크 공간을 save 할 수 있다.




8. Simplified Payment Verification



간소화된 지불 검증을 위해, Full Node와 Light Node에 대해 알면 이해가 쉬울것이다.


Full Node: 거래에 대한 모든 정보를 가진 노드이다.

Light Node: 블록 내 거래 정보가 없는 블록 헤더로만 구성된 노드이다.



지불에 대한 검증은, Full Node를 사용하지 않고 Light Node를 이용해도 검증할 수 있다. 사용자는 자신이 가장 긴 체인을 가지고 있다고 확신할 때 까지 네트워크 노드에 요청을 해 가장 긴 chain을 얻고 Merkle 가지를 얻는다. 혼자서 거래 입증을 할 수 없지만 현재 chain에 연결 함으로써 거래의 검증이 가능하다. 아래의 그림을 보고 이해를 돕자.






어떻게 하면 Light node를 이용해 검증이 가능할까?

만일 우리가 거래 3에 대해 검증을 진행한다고 하면 Light Node는 Full Node에게 필요한 정보를 요청한다.

필요한 정보는 해시2, 해시 23, 해시01이 될 것이다.


해시3 = hash(거래3)

해시23 = hash(해시2, 해시3)

머클 루트 해시 = hash(해시01, 해시23)


위와 같은 작업을 통해 Light Node가 가지고 있는 Merkle Tree root 와 현재 계산된 root와 값이 같다면 거래가 변조되지 않았다고 생각가능하다. 즉, 우리는 매번 Full Node를 통한 검증이 아닌 Light Node를 통한 검증이 가능하다.


하지만 만일 Network가 attacker에 의해 과반수 이상 과점되면, Light Node에 의한 검증은 신뢰될 수 없다. 왜냐면 Light Node가 Full Node에 정보를 요청하는데 잘못된 정보를 줄 수 있따. 따라서 네트워크 노드가 잘못된 블록을 발견했을 때 경계 신호를 보내거나 블록을 다운받아 거래의 불일치를 확인해야한다.



9. Combining and Splitting Value



코인들을 각각 개별로 처리하는 방법도 있지만, 거래의 모든 단위마다 분리해서 처리해야하기 때문에 이 방법은 사용되지 않는다. 비트코인에서 사용하는 방법은 다수의 input과 다수의 output으로 이루어진 거래로 진행된다. input은 이전의 큰 금액의 single input 혹은 이전의 많은 입금을 통한 multiple input이 될 수 있다. output은 상대방에가 보내는 single output과 차액을 다시 나에게 보내는 single output이 존재한다. 그림으로 나타내면 아래와 같이 나타낼 수 있다.





위에서 언급했듯이 비트코인의 거래에 있어서 현재의 거래와 가장 다른점은 통장의 개념이 없다는 것이다.

현재의 거래 시스템에서 제 3의 신뢰 기관을 통해서 거래가 진행되짐만 비트코인 시스템에서는 이전에 받은 코인을 다른 사람에게 전달하는 것이다. input이 output보다 큰 경우 차이는 거래 수수료가 된다.



10. privacy



전통적인 은행 모델에서는 연관된 사람과 신뢰기관에 대한 정보 접근을 제한함으로써 privacy를 달성했다. 그러나 거래를 공개적으로 알려야하는 상황에서는 privacy를 달성할 수 없다. 따라서 제안한 방법은 public key를 익명으로 사용하는 것이다. 그렇게 되면 거래는 공개적으로 보이지만, 누가 누구에게 보내는지는 알 수 없다. 다면 여러명이 한명에게 집중적으로 거래를 시도하면 소유자를 확인할 수 있는 단점이 존재해, 거래마다 새로운 키 쌍(public key, private key)를 생성한다.




11. conclusion


satoshi Nakamoto 신뢰(trust) 기반이 아닌 새로운 거래 시스템을 제안했다. 

이중지불(double-spending) 문제를 해결하기 위해 peer to peer 기반 시스템을 도입했고, PoW 개념 또한 도입했다. satoshi Nakamoto의 블록체인 기술은 모든 node(사용자)들이 신뢰할 수 있다는것이 기반을 한다. block chain의 유일한 취약점은 "51% 공격"으로 대다수에 의해 과점된 시스템은 소수를 속일 수 있다.