여기는 내가 비트코인을 공부하며, 떠오르는 질문에 대해서 자문자답 형태로 기록해 내가는 페이지이다.

 

Q. 공식홈페이지?

A. http://bitcoin.org 

 

Q. 개발자용 공식 페이지가 있나?

A. https://developer.bitcoin.org/

 

Q. 비트코인 소스코드는 어디에 있으며, 누가 관리하고 있는가?

A. https://github.com/bitcoin/bitcoin 여기에 오픈소스로 있는 것 같긴한데, 아직 범위는 잘 모르겠다(실제 돌아가는 원장을 관리하는 툴인지, 단순 툴관련인지 등)

 

Q. 기술검색하기 좋은 사이트가 있나?

A. 가장 기본적으로 비트코인개발자사이트가 있고 위키 스택오버플로 페이지가 있다.

 

Q. 비트코인 분산 원장이 실제로 저장되는 물리적 위치는 어디이며, 어떻게 채굴자들에게 공유되는가?

A. 비트코인은 기본적으로 P2P 네트워크를 사용하므로 peer IP를 알아내는게 중요한데, 최초의 peer IP접근은 DNS Seed라고 불리는 DNS를 통해 진행되고, 여기에는 몇개의 IP가 하드코딩되어 있다. 채굴자는 기본적으로 비트코인네트워크의 노드로서 참여하게 되는거고, 이는 공식홈페이지를 보면 비트코인코어를 다운로드 받아서 돌리는 방법을 통해 진행된다.

 

Q. 그럼 비트코인 코어를 받아서 돌리면, 채굴이 자동으로 되고, 경우에 따라 비트코인을 받을 수 있는거냐?

A. 비트코인 코어의 기본기능은 월렛과 비트코인네트워크지원(?) 인것 같지만, 채굴도 여기보면 가능한거 같다.

 

Q. 현재 분산원장 크기는 얼마인가?

A. 2022.3.19현재 340기가바이트 정도 된다.

 

Q. 유명한 채굴 프로그램은 뭐가 있나?

A. 일단 여기서 뭘 채굴할지 검토가 가능하고, 여기여기가 심플하고 유명한 채굴툴인데, 프로그램 사용 수수료가 있는듯하다.

반응형

'비트코인' 카테고리의 다른 글

웹3.0  (0) 2022.04.15
이더리움 관련 Q&A(자문자답)  (0) 2022.03.23
비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12

논문링크: https://bitcoin.org/bitcoin.pdf

한글번역판 링크: https://mincheol.im/wp/wp-content/uploads/2017/09/bitcoin_ko_v1.2.pdf

(한글번역판이 있다는걸 내가 직접 리뷰하던 도중 알게 됐지만, 나는 직접번역을 계속하려한다.)

 

읽기좋게 약간의 의역 및 생략/추가가 포함돼있다.

중간중간 내 생각은 다른 색깔로 표시돼 있다.

 

아래 논문을 보다보면 자주나오는 용어들이 있는데, 그에 대한 풀이를 먼저 기록해둔다.

용어집

신뢰기반모델: 기존 금융을 비판하기 위해 쓰인 용어 같은데 정확히 모르겠다. 검색도 원활하게는 안되는듯? 

신뢰집단: 개인간 대면거래가 아닌, 비대면 통신채널에서 거래를 하는데 있어서, 기존 금융에서는 반드시 필요한 집단. 

비가역거래: 거래는 비가역적이어야 하며, 기존 금융에선 이게 안된다고 하고 있다.

이중지불: 간단히 이야기하면 코인 복사를 해서 두번 지불하는걸 의미

지불=결제: payment가 문맥에 따라 지불 또는 결제로 번역되는데 같은 의미로 보면 된다.

 

hashcash:

  • (문과적설명) 만드는데는 짧은 시간이 걸리지만 문제를 푸는데는 긴 시간이 걸린다. 적절한 시간내에 문제를 풀었다면, 이 사용자는 유효한 사용자라는 것을 증명 할 수 있다.
  • (이과적설명) hashcash는 특정한 조건을 가지는 해시값을 찾는 것이다. 그 특정한 조건이란 특정한 해시를 계속 수행해서 해시된 결과의 앞자리 비트 몇개가 0인 것. 자세한 알고리즘은 여기가 이해가 편했다.

 

제목: Bitcoin: A Peer-to-Peer Electonic Cash System

 

Abstract

bitcoin으로 개인간 돈을 직접 전송한다.

전자서명으로는 위의 이슈를 일부 해결가능하나 이중지불 문제를 피할 수 없다(이 문장이 좀 모호한데 일단 넘어가자 ㅋ)

우리는 peer-to-peer network으로 이중지불 문제를 피할 수 있는 솔루션을 제시한다.

해당 네트워크는 해시베이스의 proof-of-work로 진행되는 체인에 트랜잭션 타임스탬프를 넣으며, 이것은 proof-of-work를 다시하기전까진 변조될 수 없다.

가장 긴 체인은 이벤트 증명으로서의 역할 뿐 아니라, 가장큰 CPU파워풀에서 나왔음을 증명한다.

가장큰 CPU power를 가진쪽이 공격자와 협력하지만 않는다면, 그들은 가장긴 체인을 만들어 공격자를 앞지를 것이다.

네트워크 자체는 minial structure를 요구한다. 

메시지는 best effort 기반으로 브로드캐스트 되며, 모든 노드는 네트워크를 참여하거나 떠날수 있다(이건 무슨말?)

가장긴 proof-of-work 체인을 그동안 지나온길로 받아들이며 .

 

1. 서론

인터넷 전자상거래는 전자지불을 처리하는 서드파티역할을 하는 금융기관에 거의 독점적으로 의존해왔다.

그 시스템은 대부분의 트랜잭션에 대해서 잘 동작하는 한편, 신뢰기반모델의 내재하는 약점에 여전히 고통받고 있다.

완전히 되돌릴수없는 거래는 가능하지 않다, 금융기관은 분쟁조정(mediating dispute)을 피할수 없기 때문이다.

중재비용은 거래비용을 증가시키고,

현실적인 최소 거래규모를 제한하며, 작고 캐주얼한 거래의 가능성을 잘라버린다. 

그리고 되돌릴수없는 서비스에 대한 되돌릴수없는 지불이 불가하기에 더 광범위한 비용이 존재한다. 

되돌릴수 없는 거래가 가능하지 않기 때문에, 신뢰에 대한 필요가 확산된다.

상거래자들은 고객에 대해 걱정해야하며, 필요이상의 더 많은 정보들로 인해 귀찮게 된다.

특정확률로 사기는 피할수 없다고 받아들여진다.

이러한 비용과 지불의 불확실성은 대면거래에서는 물리적화폐를 통해 피할수 있지만,

통신채널을 통해서는 신뢰집단없이는 기술적으로 불가하다.

필요한것은 암호신뢰증명에 기반한 전자적지불시스템이며, 이를 통해 두 집단간 거래는 제3의 신뢰집단없이 가능하다.

 

되돌리기가 계산적으로 불가능한 거래는 판매자를 사기로 부터 보호하며, 제3자예치(이게 머지?)방식은 구매자를 보호한다.

이 논문에서, 우리는 거래 시간순의 전산적 증명을 생성하는 peer-to-peer 분산 타임스탬프 서버를 사용한 이중지불문제의 솔루션을 제시한다.(뭔솔?)

이 시스템은 정직한 노드들의 합이 공격자 노드들 보다 많은 CPU파워를 컨트롤 한다면 안전하다.

 

2. 거래

우리는 전자적 코인을 전자서명의 체인으로 정의한다.

각 소유자는 전 거래의 hash 및 다음 소유자의 공개키에 전자서명함으로서 코인을 송금한다. 그리고 이걸 코인의 끝에 추가한다.

돈은 받는 사람은 이 서명들을 검증해서 소유권 체인을 검증할 수 있다.

일단 소유권 이전에 대해서 기록할 수 있다는 개념 정도는 이해된다.

 

(위 그림을 보면 이전 소유자와 다음소유자의 전자서명과 검증과정이 들어가는걸 볼 수 있고, 위의 구조가 minimal인지는 잘 모르겠네.

그냥 봐서는 좀 복잡해 보이는 느낌인데.전 거래의 해시가 들어가는건 당연할건데, 이걸 왜 이전 소유자의 전자서명을 해두는걸까? 

아마도 소유권 증명같은걸 위해서겠지?좀더 파보자.)

 

문제는 수신자가 이중지불이 되지 않았는지 검증이 힘들다는 것이다.

일반적인 해결책은 믿을만한 중앙통제기관이나 조폐국을 두고 모든 거래에 대해 이중지불을 체크하는 것이다.

거래마다, 코인은 조폐국으로 반납돼서 새 코인이 발급되고, 이것만 이중지불 되지 않았음을 보장한다.

(위에서 소유권 체인을 만들었음에도 이중지불 문제가 남아있는 이유는 뭘까? 뒤에 나오지만 소유자가 반복해서 거래 노드를 만들수 있다면 가능할 것이다.)

이 방법의 문제점은 전체 화폐시스템이 조폐국을 운영하는 특정회사에 의존한다는 점이다. 모든 트랙잭션에 대해. 마치 은행처럼.

수신자입장에서 이전 소유자들이 앞 전 거래들에 어러번 싸인을 하지 않았음을 알아야만 한다.

유일한 방법은 기존 모든 거래를 인식하고, 이어서 수신된 최초로 싸인된 거래를 차례대로 승인하는 방법이다. 

조폐국 없이 이를 수행하려면 거래는 공개적으로 알려져야 하고, 모든 참가자들이 단일한 이력에 대해 합의 하는 시스템이 필요하다.

수금자는 각 거래의 시점에 그게 최초로 받은 거래임을 노드 다수가 동의했다는 증명을 요한다.

 

3. 타임스탬프 서버

우리는 이 문제 해결을 위해 타임스탬프 서버를 제안한다.(왜 갑자기 타임스탬프 이야기가 나오지?)

이 서버는 아이템 블록을 타임스탬프와 함께 해시하고 신문이나 유즈넷게시물처럼 널리 배포하는 식으로 동작한다.

타임스탬프는 해당 아이템이 특정 시간에 존재했음을 증명한다. 각 타임스탬프는 이전 타임스탬프를 해시에 포함한다. 이로서 하나씩 연장하는 체인을 형성한다.

 

(이 3번단락은 내용도 짧고 내용도 타임스탬프를 넣어서 시간정보를 기록한다는 내용 뿐이라 왜 굳이 단락을 할당했는지 모르겠다. 이중지불 문제가 타임스탬프로 단순하게 풀린다는 것처럼 써있는데, 그 논리도 잘 이해가 안된다. 뒤에 다시 타임스탬프 언급이 나오는지 살펴보자.)

 

4. 작업증명

 

P2P 베이스로 분산 타임스탬프 서버를 구현하기 위해, 뉴스나 유즈넷보다는 아담백의 hashcash같은 작업증명시스템이 필요하다.

(여기서 hashcash이야기가 나오는데, 먼저 공부하고 와도 좋을 것 같다.)

작업증명은 SHA256등으로 해시된 결과가 몇 개의 제로비트로 시작되는걸 스캔하는 작업을 포함한다.

제로비트 개수에 따라 필요한 작업은 지수적으로 증가하는 반면, 검증은 hash한번으로 쉽게 된다.

우리의 타임스탬프 네트웍을 위해서, 우리는 nonce를 증가시키면서 주어진 블럭의 해시결과가 필요한 제로비트 개수를 포함하도록 작업증명시스템을 구현했다.

한번 CPU써서 작업증명을 만족시키면 이 작업을 다시하지 않는한 블럭은 바뀌지 않는다.

블럭뒤에 다른 블럭이 붙기 때문에, 바꾸려고 하면 이 모두를 다시 작업 수행해야한다.

 

작업 증명은 또한 다수결 의사 결정에서 대표성을 결정하는 문제(릉?)를 해결한다.

다수결을 IP주소당 한개의 투표권을 기반으로 한다면, 많은 IP를 할당할 수 있는 사람이 이겨버리는 문제가 생긴다.

작업증명은 기본적으로 CPU당 한표이다. 다수결은 가장 긴 사슬로 표현되며, 가장 큰 작업 증명 노력이 투자된 것이다.

CPU대부분이 정직하게 제어되는 경우, 정직한 체인이 가장 빠르게 성장하고 체인 경쟁에서 다른 체인을 능가한다.

 

과거 블록을 변조하기 위해서는 공격자가 해당블록과 그 이후의 모든 블록의 작업 증명을 다시 실행한 다음 정직한 노드의 작업을 따라잡고 능가해야 한다.

후속 블록이 추가됨에 따라 더 느린 공격자가 따라잡을 확률이 기하급수적으로 감소한다는 것을 나중에 보여줄 것이다.

시간이 지남에 따라 증가하는 하드웨어 속도와 노드 실행에 대한 다양한 관심을 보상하기 위해 작업 증명 난이도는 시간당 평균 블록 수를 목표로 하는 이동 평균으로 결정되고, 너무 빨리 생성되면 난이도가 높아진다.

 

5. 네트워크

네트워크를 실행하는 단계는 다음과 같다.
1) 새로운 트랜잭션은 모든 노드에 브로드캐스트된다.(블럭은 뭐고 노드는 뭐지, 노드는 네트워크 참여자를 의미하는걸까..그런듯)

2) 각 노드는 새로운 트랜잭션을 블록으로 수집한다.(이 노드들은 어떻게 서로가 서로를 알고 소통할까)

3) 각 노드는 해당 블록에 대한 (까다로운) 작업 증명을 수행하려고 노력한다.

4) 노드가 작업 증명을 찾으면 블록을 모든 노드에 브로드캐스트한다.

5) 노드는 모든 트랜잭션이 유효하고 아직 사용되지 않은 경우에만 블록을 수락한다.

6) 노드는 승인된 블록의 해시를 이전 해시로 사용하여 체인에서 다음 블록을 생성하는 작업을 통해 블록 승인을 표현한다.

 

노드는 항상 가장 긴 체인을 올바른 체인으로 간주하고 계속해서 확장 작업을 수행한다. 두 노드가 다음 블록의 다른 버전을 동시에 브로드캐스트하는 경우 일부 노드는 하나 또는 다른 하나를 먼저 수신할 수 있다. 그런 경우, 그들은 받은 첫 번째 블록으로 작업하지만 더 길어질 경우를 대비하여 다른 분기를 저장합니다. 다음 작업 증명이 발견되고 한 가지가 더 길어지면 타이가 해결됨. 그러면 다른 분기에서 작업하던 노드는 더 긴 것으로 전환한다. 새로운 트랜잭션 브로드캐스트가 반드시 모든 노드에 도달할 필요는 없다. 그들이 많은 노드에 도달하는 한, 그들은 머지 않아 블록에 들어갈 것입니다(이건 왜글지?). 블록 브로드캐스트는 삭제된 메시지도 처리된다. 노드가 블록을 수신하지 않으면 다음 블록을 수신하고 누락된 블록을 깨달았을 때 요청한다.

 

6. 인센티브

일반적으로 블록의 첫 번째 트랜잭션은 블록 작성자가 소유한 새 코인을 시작하는 특별한 트랜잭션인다(블럭마다 그 블럭을 생성한 생성자가 새코인을 발행하고 그걸 가진다는 이야기) 이것은 노드가 네트워크를 지원하도록 인센티브를 추가하고, 발행할 중앙 기관이 없기 때문에 초기에 코인을 유통에 배포하는 방법을 제공한다. 일정한 양의 새로운 코인을 꾸준히 추가하는 것은 금 채굴자가 금유통을 늘리기 위해 자원을 소비하는 것과 유사하다.우리의 경우 소비되는 것은 CPU 시간과 전력이다. 

인센티브는 거래 수수료로 조달할 수도 있다. 트랜잭션의 출력 금액이 입력 금액보다 작은 경우 차이는 수수료이다. 미리 정해진 수의 코인이 유통에 들어가면 인센티브는 완전히 거래 수수료로 전환되고 인플레이션이 전혀 없다(많은 사람들의 오해와 다르게 채굴이 종료되어도 네트웍이 유지될 수 있겠네(수수료지급은 계속 되므로))

 

인센티브는 노드가 정직함을 유지하도록 장려하는 데 도움이 될 수 있다.

탐욕스러운 공격자가 모든 정직한 노드보다 더 많은 CPU 파워를 모을 수 있다면, 그는 이를 사용하여 지불금을 훔쳐 사람들을 기만할 것인지, 아니면 새 코인을 생성하는 데 사용할 것인지 선택해야 한다. 그는 다른 모든 사람을 합친 것보다 더 많은 새 주화로 자신에게 유리한 규칙을 따르는 것이 시스템과 자신의 부의 유효성을 훼손하는 것보다 더 수익성이 있음을 알아야 한다(심지어 51%공격이 가능한 사람이 나오더라도, 그냥 건전하게 채굴이나 계속하는게 신규코인을 계속 받을 수 있으니 유리하다는 논리까지 이미 갖추고 있었네)

 

7. 디스크 공간 회수

코인의 최신 트랜잭션이 충분한 블록 아래에 묻히면 디스크 공간을 절약하기 위해 이전에 사용한 트랜잭션을 폐기할 수 있습니다. 블록의 해시를 손상시키지 않고 이를 용이하게 하기 위해 트랜잭션은 블록의 해시에 포함된 루트만 포함하여 Merkle Tree[7][2][5]에서 해시됩니다. 그런 다음 오래된 블록은 가지치기를 통해 압축할 수 있습니다. 내부 해시는 저장할 필요가 없습니다.

(음 자세한 로직은 잘 모르겠고 왜 트리구조인지도 잘 모르겠지만, 어쨌든 너무 길어지면 뭔가 압축되는 과정이 원래부터 고려된건 신기하네..근데 블록 안에서만 압축되는건가?)

트랜잭션이 없는 블록 헤더는 약 80바이트입니다.(블록안에 트랜잭션이 많으면?, 년도가 쌓이면?) 10분마다 블록이 생성된다고 가정하면 연간 80바이트 * 6 * 24 * 365 = 4.2MB입니다. 2008년 현재 일반적으로 2GB의 RAM으로 판매되는 컴퓨터 시스템과 현재 연간 1.2GB의 성장을 예측하는 무어의 법칙을 고려할 때 블록 헤더를 메모리에 보관해야 하는 경우에도 스토리지는 문제가 되지 않습니다.

 

8. 단순화된 지불 검증

(그러니까 위의 압축, 머클트리 이런걸로 단순화 시켰을때 약점이 존재한다는걸 짚은거 같은데, 전반적으로 뭔소린지 모르게 기술돼 있다. 이해하려고 하면 관련 논문이나 추가자료를 봐야할듯?)

전체 네트워크 노드를 동원하지 않고도 결제를 확인할 수 있습니다. 

사용자는 그가 최장 작업증명 사슬을 가졌다고 확신할 때까지 네트워크 노드를 조회해, 얻을 수 있는 가장 긴 사슬의 블록 헤더 사본을 유지하면서, 해당 거래 를 타임스탬프가 찍힌 블록에 연결한 머클 분기를 얻기만 하면 된다(대체 뭔솔? 갑자기 왠 사용자?)

그는 트랜잭션을 직접 확인할 수는 없지만 체인의 한 장소에 연결하면 네트워크 노드가 이를 수락하고 네트워크가 수락했음을 추가로 확인한 후에 추가된 블록을 볼 수 있습니다(뭔소리냐고..)

따라서 검증은 정직한 노드가 네트워크를 제어하는 한 신뢰할 수 있지만 네트워크가 공격자에 의해 압도되는 경우 더 취약합니다. (why?)

네트워크 노드가 자체적으로 트랜잭션을 확인할 수 있지만 공격자가 네트워크를 계속 압도할 수 있는 한 공격자의 조작된 트랜잭션에 의해 단순화된 방법을 속일 수 있습니다. (그러니까 뭔소리냐고)

이를 방지하기 위한 한 가지 전략은 네트워크 노드가 유효하지 않은 블록을 감지할 때 경고를 발송하여, 사용자의 소프트웨어가 전체 블록을 다운로드하도록 하고 불일치를 확인하도록 하는 것입니다.

빈번한 지불을 받는 기업은 더 독립적인 보안과 더 빠른 검증을 위해 여전히 자체 노드를 실행하기를 원할 것입니다.(노드는 오픈환경에서 서로 경쟁하는거 아닌가? 자체 노드를 돌린다는게 무슨뜻이지? 단순히 오픈환경에 여러노드를 참여시킨다는 정도의 의미인가? 그렇다면 이게 왜 더 유리하지?)

 

9. 가치 결합 및 분할

코인을 1개씩 개별적으로 취급하는 것은 가능하지만, 이체 시 1코인마다 별도의 트랜잭션처리를 하는 것은 현명하지 않다. 가치를 분할 및 결합할 수 있도록 트랜잭션에는 입출력이 여러개이다. 일반적으로 이전 트랜잭션의 큰 단일 입력 또는 더 적은 금액을 결합한 여러 입력이 있으며 최대 두 개의 출력이 있습니다.두개의 출력중 하나는 지불을 위한 것이고 다른 하나는 거스름돈이 있는 경우 송금인에게 다시 반환하는 것입니다.

 

트랜잭션이 여러 트랜잭션에 의존하고 이러한 트랜잭션이 더 많은 트랜잭션에 의존하는 팬아웃은 여기서 문제가 되지 않는다는 점에 유의해야 합니다. 트랜잭션의 완전한 기록사본을 추출할 필요가 없습니다(대충 원래 트렌잭션 추적을 제대로 하려면 트리구조가 나오는데, 그걸 몰라도 된다는 내용인거 같은데, 자세히는 모르겠다)

 

10. 개인 정보 보호

(걍 실명제가 아니라서 프라이버시가 보장된다는 내용을 길게도 써놨네)

전통적인 뱅킹 모델은 관련 당사자 및 신뢰할 수 있는 제3자에게만 정보에 대한 액세스를 제한함으로써 개인 정보 보호 수준을 달성합니다. 비트코인에서는 모든 거래를 공개적으로 발표해야 하는 필요성 때문에 이 방법은 못쓰지만,

공개키 익명성을 보존 해 다른 장소에서 정보의 흐름을 끊는 걸로 여전히 프라이버시가 보장될 수 있다.

대중은 누군가가 다른 사람에게 금액을 보내고 있음을 알 수 있지만 거래를 누구와 연결하는 정보는 없습니다.

이는 개인 거래의 시간과 규모인 '테이프'를 공개하되 당사자가 누구인지는 밝히지 않은 증권거래소가 공개하는 정보 수준과 비슷하다.

 

추가적인 방화벽으로서, 각 트랜잭션에 대해 새 키 쌍을 사용하여 공통 소유자와 연결되지 않도록 해야 합니다. 일부 연결은 다중 입력 트랜잭션에서 여전히 피할 수 없으며, 이는 해당 입력이 동일한 소유자의 소유임을 필연적으로 나타냅니다. 위험은 키 소유자가 공개될 경우 연결 시 동일한 소유자에게 속한 다른 트랜잭션이 공개될 수 있다는 것입니다.

(뭐여.. 일부 한계가 있다는 점을 쿨하게 인정하고 넘어감?)

 

11. 계산

공격자가 정직한 체인보다 빠르게 대체 체인을 생성하려는 시나리오를 고려해보자.

그런일이 발생해도, 허공에서 가치를 창출하거나 공격자의 소유가 아닌 돈을 빼앗는 것과 같은 임의의 변경까지 시스템이 허용하진 않는다(진짜?

노드는 유효하지 않은 거래를 지불로 수락하지 않으며 정직한 노드는 이를 포함하는 블록을 수락하지 않습니다.(왜?)

공격자는 최근에 지출한 돈을 회수하기 위해 자신의 거래 중 하나만 변경할 수 있습니다.(왜일까.. 최근이 아니면 너무 변경할게 많아서 그런거고 자신의 거래가 아니면 키관련 문제가 있어서 그럴까?) 정직한 체인과 공격자 체인 간의 경쟁은 이항 랜덤 워크(Binomial Random Walk)로 특징지을 수 있습니다. 

성공 이벤트는 정직한 체인이 한 블록 확장되어 리드가 +1 증가하는 이벤트이고, 실패 이벤트는 공격자의 체인이 한 블록 확장되어 격차가 -1만큼 감소하는 것입니다. 

공격자가 주어진 격차를 따라잡을 확률은 도박꾼의 파멸(Gambler's Ruin) 문제와 유사합니다. 

(도박꾼의 파산은 유한한 초기 자산을 가지고 일련의 공평한 도박을 하는 도박꾼은 거의 확실하게 자산이 0이 되어 파산하게 된다는 정리이다. 위키백과)

신용이 무제한인 도박꾼이 적자에서 시작하여 손익분기점에 도달하기 위해 잠재적으로 무한한 시도를 한다고 가정합니다. 다음과 같이 공격자가 손익분기점에 도달하거나 공격자가 정직한 체인을 따라잡을 확률을 계산할 수 있습니다.

 

이담에 수학적인 식들이 나오는데, 결국 공격이 힘들다는 내용이므로 일단 지금은 생략하자.

 

12. 결론

우리는 신뢰에 의존하지 않는 전자 거래를 위한 시스템을 제안했습니다.

우리는 소유권에 대한 강력한 제어를 제공하지만 이중 지출을 방지할 방법이 없으면 불완전한 디지털 서명으로 만든 코인의 일반적인 프레임워크로 시작했습니다.이 문제를 해결하기 위해 우리는 작업 증명을 사용하는 P2P 네트워크를 제안하여 정직한 노드가 CPU 성능의 대부분을 제어하는 ​​경우 공격자가 변경할 수 있는 계산적으로 빠르게 비실용적이 되는 트랜잭션의 공개 이력을 기록합니다. 네트워크는 구조화되지 않은 단순성으로 인해 강력합니다. 노드는 약간의 조정으로 한 번에 모두 작동합니다. 메시지가 특정 위치로 라우팅되지 않고 최선을 다해 전달되기만 하면 되므로 식별할 필요가 없습니다. 노드는 네트워크를 떠나고 다시 참여할 수 있으며 작업 증명 체인을 네트워크가 없는 동안 발생한 일의 증거로 받아들입니다. 그들은 CPU 파워로 투표를 하여 유효한 블록을 확장하는 작업을 통해 승인을 표현하고 작업을 거부하여 유효하지 않은 블록을 거부합니다. 이 합의 메커니즘을 통해 필요한 모든 규칙과 인센티브를 시행할 수 있습니다.

 

반응형

'비트코인' 카테고리의 다른 글

이더리움 관련 Q&A(자문자답)  (0) 2022.03.23
비트코인 관련 Q&A (자문자답)  (0) 2021.12.30
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12
비트코인 분석 연재를 시작하며  (0) 2017.12.10

교양 측면에서 우수한 영상자료들이 유툽에 이미 업로드 되어 있다.

예를 들면 여기여기

 

기술자료는 유툽보다 웹링크에 많다.

유툽에서는 이게 볼만하고,

기술적인 내용에 포커싱을 맞추면 이런  자료들이 있다.

 

블록체인이나 비트코인을 이해하려면 질의응답 형식이 편할수도 있다.

(특히 나중에 되새김할때 유용하리라 기대)

이미 아래처럼 질의응답이 제공되는 웹페이지도 존재

https://buybitcoinworldwide.com/how-many-bitcoins-are-there/

 

How Many Bitcoins Are There? (Circulating Supply - Live)

This is a complete guide to how many Bitcoins there are. Learn how many exist plus much more from this in-depth post (updated hourly).

buybitcoinworldwide.com

예를들면 다음과 같은 질문은 어떨까?

 

블럭체인 결제는 왜 느린가?

원장이 모든 노드에 공유되고 작업증명이 동반되기 때문일텐데,

작업증명이 아닌 지분증명등이 쓰이는 코인도 카드만큼 빠르진 않은 이유는 뭘까?

작업증명이 아니더라도 거래내역을 검증하는 합의 매커니즘 때문에 느려지며 이는 node수가 많아질수록 더 느려진다.

 

Nonce란 무엇이고 왜 쓰일까?

비트코인에 쓰이는 해시는 맨앞에 비트0이 연속되어서 나오는걸 요구한다.

이를 개념적인 식으로 써보면 다음과 같다.

SHA256(거래내역, Nonce) = "00000101101011011...0101"

위에 보면 앞자리 5비트가 0으로 시작함을 알 수 있는데, 이렇게 하기위한 nonce를 계속 브루트포스로 대입해보는게바로 작업증명을 수행하는 과정이 된다. 자세한건 여기 참조(근데 어렵다)

 

작업증명이 어려운건 알겠는데, 풀어낸 사람이 독점적인 블록추가를 권한 가질 수 있는 이유는 무엇인가?

문제를 풀어야 블록을 추가할 수 있으니, 문제를 풀지 못한사람은 할 수 없는 권한을 자연스럽게 가지게 된다.

 

서로다른 두 개의 노드에서 작업증명이 동시에 되어 충돌이 일어나면 어떻게 이를 처리하는가?

정상적으로 두 개의 노드에서 동시에 채굴에 성공하면 누구의 노드가 선택되는지는 우연에 의해 결정됩니다. 그러나 이러한 경우는 드물며, 이러한 상황이 발생할 때마다 블록체인 프로토콜은 이를 처리하기 위한 규칙을 갖고 있습니다. 예를 들어, 일부 프로토콜은 해시값의 크기를 기반으로 우선순위를 결정합니다.

이 과정에서 잠시동안 블록체인이 복수개 존재할 수도 있는데,  결국은 더 긴 블록체인이 올바른 것으로 인식한다(작업증명이 그만큼 더 들어가 더 난이도가 높고 해킹이 어렵다는 관점) 

길이가 동일하다면 하나가 더 길어질때까지 기다린다.

 

위조된 거래내역이 담긴 블록으로 작업증명 문제를 풀어서 블록추가를 하면 더 이득일텐데 왜 못하는가? 51%어택은?

유효한 서명 없이 비트코인에 이상거래를 쓰는 것 또한 가능하지 않습니다. 그러므로 난데없이 제어되지 않는 양의 비트코인을 생성한다든지, 다른 사용자들의 자금을 사용한다든지, 네트워크를 변질시킨다든지 하는 것은 가능하지 않으며 이들과 비슷한 어떠한 것도 마찬가지입니다.

그러나 다수결 원칙에 따라 다수의 채굴자들이 독단적으로 최근 거래들을 막거나 철회할 수 있습니다. 또한 이들은 이렇게 프로토콜의 변화를 입법하도록 압력을 가할수도 있습니다. 비트코인이 모든 사용자들간의 합의가 있어야만 작동하기 때문에, 프로토콜을 변경하는 것은 매우 어려운 일일 것이며, 소수의 사용자들이 선택의 여지가 없을 만큼 압도적인 다수가 변화를 원하여만 가능할 것입니다. 상식적으로 보았을 때 비트코인 사용자들의 자신들의 돈에 위험이 될만한 변화를 받아들이기를 원치는 않을 것입니다.

 

 

이전해시를 포함해서 해시를 하는 이유는 무엇인가?

이전 블록중 어느하나라도 위변조가 일어났을때 이를 탐지하고 방지하기 위해서이다.

 

이전해시가 포함된 형태로 다시 개념적인 식을 써보면?

이번해시 = SHA256(이전블록의해시, 거래내역, Nonce)  = "00000101101011011...0101"

그림으로는 다음과 같다. (Proof of work라고 되어 있는 부분이 Nonce이다)

좀더 자세하게는 아래와 같다.

하나의 블록은 "블록 헤더 + 블록 바디"로 만들어지고, 그 중 블록 헤더는 "이전 블록 헤더의 해시값 + 논스 + 트랜잭션의 해시값"으로 구성된다. 블록을 생성하려면 앞의 블록 헤더의 정보와 논스 및 그 블록에 포함된 모든 트랜잭션의 루트해시값을 포함시켜 해시 함수를 입력해야 한다.

 

채굴자에게 제공되는 보상(비트코인)은 어떻게 발생하는가?

거래내역에 비트코인 보상 정보를 끼워넣는 방식이다(아래 노란박스). 여기서 1개로 되어 있는데 규칙이 있고, 이 규칙을 따르지 않으면 다른 노드들이 인정해주지 않겠지.

비트코인 소스코드는 계속해서 업데이트 되는가?

비트코인 소프트웨어는 아직 베타 버전이며 많은 미완성의 기능들이 활발한 개발중에 있습니다. 더 안전하고 대중들이 쉽게 접근할 수 있는 비트코인을 만들기 위해 새로운 툴, 기능, 서비스가 개발중에 있습니다. 이중 일부는 아직 모든 사람이 사용하기에는 이릅니다. 대부분의 비트코인 사업은 최근에 생겼으며 아직 어떠한 보험도 제공하지 않습니다. 전반적으로, 비트코인은 아직도 성숙하는 과정에 있습니다.

 

그렇다면 업데이트로 인해 위험하지는 않은가?

이부분은 좀 모호하긴한데(예를들어 특정그룹에서 여론을 일으켜 이상한 방향으로 SW업데이트를 시킨다던지)

여기에서 다음과 같이 설명하고 있는것 같다.

비트코인에 대한 대부분의 신뢰는 그것이 신뢰가 필요없다는 데에서 나옵니다. 비트코인은 완전히 오픈소스이며 분권화되어 있습니다. 이는 누구나 언제 어디서나 전체 소스코드를 볼 수 있다는 뜻입니다. 고로 세계 어느 개발자든지 비트코인이 어떻게 작동하는지를 확인할 수 있습니다. 현재까지 발생된 모든 비트코인과 거래들을 누구나 투명하게 실시간으로 조사할 수 있습니다. 모든 지불이 제삼자의 존재여부와 상관없이 이루어질 수 있으며, 시스템 전체가 힘껏 상호 심시된 온라인 뱅킹에서 사용하는 것과 비슷한 암호 작성 알고리즘에 의해 보호됩니다. 어떤 개인이나 단체가 비트코인을 독점통제할 수 없으며, 구성원들 전부가 신뢰할 수 없더라도 네트워크는 안전하게 유지됩니다.

반응형

'비트코인' 카테고리의 다른 글

비트코인 관련 Q&A (자문자답)  (0) 2021.12.30
비트코인 논문 리뷰  (0) 2021.08.31
md5, sha  (0) 2017.12.12
비트코인 분석 연재를 시작하며  (0) 2017.12.10
암호화 해시 함수(cryptographic hash function)  (0) 2017.12.10

MD5

 

md5는 암호화 해시 함수의 일종이다.

해시함수(http://sevity.tistory.com/21) 및 암호화해시함수(http://sevity.tistory.com/22)에 대해서는 각각의 링크를 참조해주시기 바랍니다.

 

다음 그림과 같이 어떤 길이의 인풋이 들어오더라도 128bit의 해시값으로 만들어준다.

 

 

인풋의 길이와 상관없이 128비트의 해시값을 생성한다(위의 DFDD등은 16진수로 표기한것이며, 위 샘플은 해시값의 길이가 128비트가 아니어서 정확히 md5 예제는 사실아님에 유의, 위는 계산하면 160비트다 그리고 그렇다면 SHA가 되겠다 ㅎㅎ)

 

글자하나가 미묘하게 바뀌어도 결과값이 크게 달라지는 난수화 효과가 발생함을 알 수 있다. (이래야 역공학이 힘들다)

 

MD5의 내부 구현기술은 여기(https://ko.wikipedia.org/wiki/MD5)를 참조하면 되는데, 

 

실제 구현시에는 #include <openssl/md5.h> 등으로 쉽게 라이브러리를 쓸 수 있어서, 학습용이 아니면 반드시 직접 구현할 필요는 없다.

 

 

linux 머신에서 다음과 같이 간단한 방법으로 md5 값을 확인할 수 있다.

 

$ echo -n "sevity" | md5sum

34208682f4f71b1cc3a87bbaad4af709

 

 

나중에 새로 나온 SHA에 비해서 보안에 취약하다는 약점이 있다.

 

SHA

 

MD5랑 개념적으로는 암호화 해시의 일종이라는 점에서 같고, 어떤 길이의 인풋이 오더라도 160bit의 해시값으로 만들어 준다.

MD5와 마찬가지로 내부 디테일까지 꿰고 있을 필요는 없어보인다.

MD5보다는 좀 더 역상 공격하기 힘들게 설계되어 있다. 

 

미국 국가안보국(NSA)이 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정

 

SHA버전별 정보는 위키피디아에서 가져온 아래 표 참조

 

 

 
필드에서는 SHA-256이 많이 쓰이고 있는 상황인 것 같다.
 
linux 머신에서 다음과 같이 간단한 방법으로 SHA값을 확인할 수 있다.
 
echo -n sevity | sha256sum
3334da01eb032a81a83e89d1b60198910647fcb698f47a81bdd61c0719212309  -
 
 

 

 

 

 

반응형

'비트코인' 카테고리의 다른 글

비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
비트코인 분석 연재를 시작하며  (0) 2017.12.10
암호화 해시 함수(cryptographic hash function)  (0) 2017.12.10
hash 기초  (0) 2017.12.10

비트코인에 쓰인 알고리즘에 대해서 피상적으로는 해시함수나 블록체인 기술이 사용됨을 알고 있지만,

세부적인 내용에 대해서는 잘 모르기에, 그 내용을 파악해 가면서 관련 글을 연재해볼까 합니다.


일단 시작은 해시 함수에 대한 내용이 될 것 같습니다.


해시함수 기초: http://sevity.tistory.com/21

함호화 해시함수: http://sevity.tistory.com/22

반응형

'비트코인' 카테고리의 다른 글

비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12
암호화 해시 함수(cryptographic hash function)  (0) 2017.12.10
hash 기초  (0) 2017.12.10

해시함수의 기본적인 내용에 대해서는 이전 글(http://sevity.tistory.com/21) 참조


자세한 설명에 들어가기전에 다음 예제를 살펴보자.

철수는 영희에게 중요한 문서를 전달할 예정이다.

그런데 누군가 중간에서 그 문서의 내용을 해킹으로 바꿀 수 있기 때문에, 문서내용에 대해서

(string to int) hash function을 적용해서 오프라인으로 해시값을 알려주기로 했다. 

이 해시값을 42라고 해보자.

영희는 문서를 전달받은다음, 철수와 동일한 hash function을 적용해서 42라는 값을 얻었고, 문서가 해킹당하지 않았음을 확신했다.


위와 같은 시나리오로 보안에서 해시가 사용되는 거시다.


그런데 만약 해시값인 42로 부터 원본 문서의 내용을 일부라도 유추할 수 있다면 어떻게 될까..

예를 들어 해시값이 4로 시작하면 원본 문서의 내용에 money라는 단어가 들어간다던가..

이런일이 있으면 안되기 때문에 해시값으로 부터 원본의 내용을 찾는게 계산상 어렵도록 hash function을 설계해야 한다.

이러한 공격을 제1역상 공격이라 하며, 이에 저항하기 위해 hash function이 가져야 하는 성질을 제1역상저항성(preimage resistance)이라 한다.


그런데, 또 다른 예를 살펴보자.

해커가 제1역상 공격을 통해 원본 내용을 찾는것은 불가능하더라도, 

여러가지 문서들을 hash function에 넣어보면서 42라는 같은 결과가 나오는 전혀다른 문서를 찾는다면 어떻게 될까?

이런게 가능하다면 영희는 해시값이 42로 동일하기 때문에 문서내용이 바뀌어도 모를 수 있을 것이다.

(단 이런 공격을 시도 하려면 hash function이 공개되어 철수/영희가 사용하는 것과 해커가 사용하는게 같아야 한다는 전재조건이 붙는다)

위와 같은 공격을 제2역상공격이라 하며, 이를 막기위해 입력의 해시 값을 바꾸지 않으면서 입력을 변경하는 것이 계산상 어렵도록 hash 함수를 설계해야 하며 이를 제2역상저항성(second preimage resistance)이라 한다.


위의 제2역상 공격은 사실 해시 함수의 충돌(collision)이라는 약점을 파고드는 것인데,

해시 함수는 더 큰 인풋(문서내용)을 더 작은 아웃풋(숫자하나)로 바꾸는 과정이기 때문에 충돌이 아예 없을수는 없다.

하지만 같은 해시 값을 생성하는 두 개의 입력값을 찾는 것이 계산상 어려워야 하며 이를 충돌 저항성(collision resistance)이라 부른다.

즉, 입력값과 해시 값에 대해서, 해시 값을 망가뜨리지 않으면서 입력값을 수정하는 공격에 대해 안전해야 한다. 이러한 성질을 가지는 해시 값은 원래 입력값을 의도적으로 손상시키지 않았는지에 대한 검증 장치로 사용할 수 있다.


좀더 알기쉽게 표현하자면 인풋의 일부만 바뀌어도 결과값이 크게 바뀔때 위의 속성들을 만족하는 좋은 해시라고 보통 표현을 하게된다.


또다른 예로는 패스워드를 암호화하는 것을 들 수 있다.

일방향이고 리버스 엔지니어링이 힘들다는 역상저항성을 활용해서, 주민번호나 패스워드를 직접 DB에 저장하는 대신 해시값을 저장하게 되면,

운영자에게 비밀번호나 주민번호를 노출하지는 않으면서도 로그인 보안은 구현할 수 있게 된다.

(물론 여기서도 전혀다른 비밀번호가 같은 해시값을 도출하게되는 제2역상공격이 성공하게 되면 큰일이다)

반응형

'비트코인' 카테고리의 다른 글

비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12
비트코인 분석 연재를 시작하며  (0) 2017.12.10
hash 기초  (0) 2017.12.10

hash라고 했을때 헷갈리는 이유는 

자료구조로서 hash map (hash table) 과 

핵심함수인 hash function 이 헷갈려서 그런 이유가 크다.


비트코인에는 hash function이 내부적으로 사용된다.



자료구조로서 hash map은

key와 value가 있는데, key를 주면 value를 빠르게 토해내는 컨테이너..

기능으로 보자면 stl map이나 python dict 등과 비슷하다고 볼 수 있다.

단 map이나 dict는 보통 tree(그 중에서도 레드-블랙트리가 일반적)로 구현된다.

tree는 O(log N)의 복잡도를 가져서 hash의 O(1)보다 느리지만, 사용량에 따라 가변적으로 메모리를 할당하기 유리하기 때문.

거꾸로 말하면 hash는 미리 상당한 양의 메모리를 덩어리째 할당해야하는 구조라 trade-off가 있다고 볼 수 있다.

 

hash map은 O(1)의 속도를 위해서 쓰는것은 자명한데.. 어떤것이 빠른거냐.

Insert,Update,Delete,Search

위 네 가지 연산 모두 O(1)이다.

(물론 메모리공간을 처음에 충분히 할당한 경우이며, worst case 시나리오에서 collision이 발생하면 실제로는 이보다 느려질 수 있음)


c++에서는 stl map 을 쓰면 내부구현에 tree가 보통 사용되고, 내부적으로 tree가 아닌 hash가 사용되도록 하고 싶으면 unordered_map을 쓰면된다.



핵심함수인 hash function은 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 

이게 무슨 뚱딴지 같은 소리인가 하겠지만.. 

일단 이해를 돕기위해 string to int hash function의 예를 들어보자.

임의의 string이 들어왔을때 1024이하의 숫자하나로 매핑이 된다고 해보자.

예를 들면 "Kim Wonil"이 들어왔을때 42로 매핑이 되고,

"Lee Hana"가 들어왔을때 27이 매핑되는 식이다.

이런걸 만들어서 어따가 쓸까..

1. hash map 자료구조를 hash function을 통해서 만들면 O(1)로 매우 빠른 자료구조를 만들수 있다.

2. 긴 길이의 데이터를 짧은 길이의 숫자로 바꿔주는 구조로 인해서 변경내용이 있는지 확인하는데 쓸 수 있다.

예를 들어서 겉보기에는 매우 비슷한 소스코드 두 개가 있다고 해보자.

그런데 둘의 내용이 일치하는지 아닌지 확실하지 않다고 해보자.

그러면 나이브한 방법으로는 두 파일을 바이트 단위로 비교하는 방법이 있을 것이다.

그런데 이렇게 나이브하게 하지 않고, 두 파일의 내용에 대해 각각 (string to int) hash function을 적용한다음 결과로 나온 숫자를 비교하는 방법도 있다.

예를 들어 첫번째 파일에서는 내용으로 해시한 결과값이 42인데 두번째 파일로 나온 값은 27이라면 두 파일의 내용은 확실히 다르다고 판정할 수 있다.

단, 해시값이 예를 들어 42로 동일하다고 해도 반드시 두 파일의 내용이 같다고 역으로 보장해주지 않는다.

이는, 큰 숫자를 작은숫자로 매핑하는 과정에서 반드시 충돌이 발생할 수 있다는 점을 상기해 보면 쉽게 이해가 된다.


이를 다시 적어보면 다음과 같다.

두 해시 값이 다르다면 그 해시값에 대한 원래 데이터도 달라야 한다. (역은 성립하지 않는다)

해시 함수의 가장 기본적인 성질은 두 해시 값이 다르다면 원래의 데이터도 다르다는 것이다. 이 특징은 해시 함수가 결정적이기 때문이다. 

위의 내용중 바이트 단위로 비교한다는 나이브 접근이 심각해보이지 않을 수도 있는데, 

단 두개의 문서를 비교할때는 심각성이 크지 않을 수 있지만,

예를 들어 특정폴더에 있는 파일중 내용이 같은파일이 있는지 검사하는 프로그램을 짠다고 해보자.

나이브한 방법으로는 파일의 갯수가 n개라면 모든 pair에 대해서 n(n-1)/2번 비교를 해야 중복파일 여부를 알 수 있다. 즉 $O(n^2)$

그런데 위의 해시함수를 사용한 방법으로는 해시함수값 끼리만 숫자비교를 하면 되기 때문에 $O(n)$ 으로 수행속도를 줄일 수 있다.


3. 함호학이나 비트코인에서 사용되는 해시 함수는 관련글(http://sevity.tistory.com/22) 참조

 

http://www.partow.net/programming/hashfunctions/index.html

위링크에 가보면 엄청 많은 종류의 해시펑션을 제공함..

반응형

'비트코인' 카테고리의 다른 글

비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12
비트코인 분석 연재를 시작하며  (0) 2017.12.10
암호화 해시 함수(cryptographic hash function)  (0) 2017.12.10

+ Recent posts