O(1) Block Propagation

비트코인 마이너가 블록 생성에 성공하고 나면 네트워크에 빠르게 전파해야 합니다. 블록의 크기가 커질수록 블록 전파에 걸리는 시간도 늘어나기 때문에, 블록 전파 시간을 줄이는 최적화가 중요해집니다. 블록 전파 시간을 줄이는 방법 중에 하나로 비트코인 코어 개발자인 Gavin Andresen이 제안한 O(1) Block Propagation이 있습니다.

마이너가 채굴해서 전파하는 블록에는 트랜잭션들이 포함되어 있습니다. 그런데 블록을 전파 받는 노드들도 사실은 트랜잭션 풀에 마이닝된 트랜잭션을 이미 대부분 가지고 있음에도 불구하고, 정확히 어떤 트랜잭션이 마이닝되었는지 알 수 없기 때문에 블록에 포함된 트랜잭션들을 다시 다운로드 받아야 합니다.

그런데 새로 생성된 블록에 들어있는 트랜잭션의 목록과 트랜잭션 풀에 들어 있는 트랜잭션의 목록의 차이를 바로 알 수 있는 데이터 구조가 있다면, 노드 입장에서 이미 가지고 있는 트랜잭션은 굳이 다시 다운로드 받지 않아도 됩니다.

이러한 문제를 Set reconciliation이라고 하는데, IBLT(Invertible Bloom Lookup Tables)라는 데이터 구조가 이에 대한 해법을 제공합니다. Gavin Andresen의 O(1) Block Propagation 제안은 IBLT를 이용하여 이미 트랜잭션 풀에 있는 트랜잭션을 전파하지 않고도 다른 노드에게 블록을 전파하는 방법을 제안하고 있습니다.

현재 비트코인 마이너들은 별도의 고속 블록 릴레이 네트워크를 사용하고 있기 때문에 O(1) Block Propagation는 받아들여지지 않은 것 같은데, 블록체인 새로 설계하는 분들에게는 재미있는 시도일 수 있을 것 같습니다.

자세한 내용이 궁금하신 분은 원글을 읽어보세요.

리플의 키 관리 방법

리플은 다른 블록체인과 달리 key를 master key와 regular key로 구분합니다. master key는 비트코인과 마찬가지로 주소와 수학적으로 연결된 (ECDSA secp256k1) key pair를 말하고, regular key는 SetRegularKey를 이용하여 블록체인 상에 등록할 수 있는 추가적인 key입니다.

regular key pair를 등록하고 나면 master key의 private key가 아닌 regular key의 private key를 이용하여 transaction을 authorize할 수 있습니다. master key는 리플 주소와 묶여 있기 때문에 바꿀 수 없지만, regular key는 원하는 시점에 언제든 교체할 수 있다는 특징이 있습니다. 비트코인의 경우 key를 도난 당하면 찾을 방법이 없지만, 리플에서는 regular key가 도난 당했을 경우 master key를 이용해 도난 당한 regular key를 무효화시키고 새로운 regular key를 등록할 수 있습니다.

관련 설명은 리플 기술 문서에서 확인하실 수 있습니다.

Commitment Scheme

commitment scheme은 암호학적인 방법을 이용하여 다른 사람에게 값을 공개하지 않고서도 어떤 값을 약속하고 나중에 약속했던 값을 공개하는 방법입니다. 한 번 선택한 값을 나중에 임의로 바꿀 수 없게 하는 특징을 binding이라고 하는데, commitment scheme은 binding을 제공해야 합니다.

일례로 sha256 같은 해시 함수를 이용하면 간단한 commitment scheme을 만들 수 있습니다. 어떤 값 x를 선택한 후에 c = sha256(x) 값만 먼저 공개하고, 나중에 x 값을 밝히면 다른 사람들은 sha256(x) = c인지를 검증하여 x가 실제로 commit했던 값인지 검증할 수 있습니다. 그리고 해시 함수의 특징 때문에 sha256(x’) = c인 x’를 쉽게 찾을 수 없어 binding 속성이 보장됩니다.

비트코인의 micro payment channel, secure multi-party lottery 등 블록체인의 여러 기법이 commitment scheme에 기초하고 있으므로 관심 있는 분들은 아래 강의 노트 참고하시기 바랍니다.

Confidential Transaction

Confidential Transaction은 additively homomorphic commitment scheme과 ring signature 등의 암호학적인 방법을 이용해 트랜잭션의 금액을 숨기는 기술입니다. 비트코인은 public 블록체인이기 때문에 모든 full node가 input이 총합이 output의 총합 (수수료 포함)과 같다는 사실을 확인해야 하는데, 이러한 암호학적인 방법을 이용하면 제 3자 입장에서 input, output 값들을 몰라도 validation을 할 수 있게 됩니다.

Blockstream이 Alpha라는 사이드체인 프로젝트를 통해 비트코인에 Confidential Transaction을 구현했습니다. (메인 브랜치에 반영되지는 않았습니다.) 관련 내용은 아래 링크에서 확인하실 수 있습니다.

https://elementsproject.org/elements/confidential-transactions/

추가로 CT에 구현에 사용된 구체적인 암호학적인 방법에 대해 공부하고 싶으신 분은 Grex Maxwell의 글을 참고하시기 바랍니다.

https://people.xiph.org/~greg/confidential_values.txt

NEO, 블록체인 기술이 맞긴 한가?

비트코인, 이더리움으로 대표되는 암호화폐는 네트워크 상의 어떤 노드든 자유롭게 참여할 수 있는 분산화된 구조를 가장 큰 특징으로 합니다. 그런데 일부 암호화폐는 스스로를 암호화폐로 부르고 암호화폐 거래소에서 멀쩡히 거래도 이루어지지만 실상은 알고 보면 하나의 기관이 모든 노드를 운영하는 중앙화된 구조를 가지고 있습니다.

NEO도 그런 암호화폐 중에 하나인데, 전체 네트워크에 단 7대의 validation 노드만이 존재하고 그나마도 모두 NEO 팀에서 운영을 하고 있습니다. 이런 관점에서 NEO는 암호화폐가 아니라 규제 없는 사설 은행이나 다를 바가 없습니다.

물론 테스트 단계에서 안정성을 위해 전체 노드를 팀에서 운영하고 차츰 분산화시켜 나갈 수도 있기 때문에 현 단계를 과도기로 볼 수도 있습니다. 하지만 NEO의 합의 알고리즘은 dBFT의 특성을 살펴보면 분산화 자체가 불가능하다는 사실을 알 수 있습니다. dBFT는 전세계의 노드 숫자가 고정되고 각 노드는 다른 노드의 위치를 미리 알고 있어야만 동작합니다. 하나의 노드라도 문제가 생기면 합의에 도달할 수 없게 되고 전체 블록체인 시스템이 동작하지 않게 됩니다. 실제로 NEO의 소스 코드를 보면 7개의 validation 노드의 주소가 하드코딩되어 있습니다.

40억 달러의 가치를 가지고 있는 NEO가 실제로는 암호화폐가 아니고 NEO팀이 운영하는 7대의 노드 중 한 대라도 다운되면 동작이 멈추는 기술에 기반하고 있다는 사실을 어떻게 설명해야 할까요? 관련 내용은 아래 글을 참고하세요.

http://storeofvalueblog.com/posts/how-centralized-is-neo/

 

CoinJoin

비트코인은 모든 거래 내역이 장부에 투명하게 공개되기 때문에 privacy가 완벽하게 보호되지는 않습니다. 비트코인 주소가 pseudonymous하기 때문에 어느 정도의 privacy 보호는 가능하지만, 거래 패턴을 분석해 여러 정보를 얻어낼 수 있습니다.

비트코인 프로토콜을 변경하지 않고 비트코인 거래의 privacy를 강화하기 위한 방안으로 CoinJoin이라는 방식이 있습니다. 결론부터 말씀드리면, 결제를 할 때 다른 사람과 함께 공동으로 결제를 하는 방식입니다. 비트코인은 하나의 트랜잭션이 여러 개의 input과 output을 가지기 때문에 여러 명의 input을 동시에 사용하여 다시 여러 개의 output을 만들어 내면 어느 input이 어느 output으로 연결되는지 알 수 있는 방법이 없어서 tracking을 막을 수 있습니다.

CoinJoin은 공동으로 결제할 다른 사람을 찾을 방법이 필요하므로 실제 거래에서는 그다지 사용되고 있지 않지만, 비트코인 트랜잭션의 특징을 어떻게 활용할 수 있는지 잘 보여주는 예입니다.

자세한 방법은 비트코인 위키를 참고하세요 🙂

Bech32

비트코인 주소는 double sha256 checksum을 붙여서 base58로 인코딩합니다. 그런데 이런 인코딩 방식은 다음과 같은 문제점을 가지고 있습니다.

  1. base58은 QR code로 표현했을 때 alphanumeric mode를 사용할 수 없음
  2. double sha256 checksum은 느리고 error-detection에 대한 보장이 없음
  3. error-detecting code는 대부분 character set 크기가 소수(prime number)여야 되는데, bsse58은 소수가 아님
  4. base58 디코딩은 느리고 복잡함

이 문제를 해결하기 위해 Segregated Witness에서 Bech32이라는 base32 기반의 새로운 주소 포맷을 제안하고 있습니다. 자세한 내용은 BIP 173을 참고하세요!

비트코인 오리지널 소스코드

사토시 나카모토는 2008년 비트코인 논문을 통해 비트코인의 핵심 아이디어를 설명하고, 다음 해인 2009년 비트코인 구현을 오픈소스로 공개하고 비트코인 네트워크를 시작하였습니다. (백서가 먼저 나오고 구현이 나왔지만, 실제로는 구현을 먼저 하고 백서를 썼다고 합니다.)

2008년에 나온 비트코인 논문은 지금도 원형 그대로 널리 읽히지만, 비트코인 구현은 그간 계속 발전하여 오늘날의 비트코인 레퍼런스 구현(Bitcoin Core)이 되었습니다. 그리고 Bitcoin Core는 10년 가까이 legacy가 쌓이면서 분석하기가 쉽지 않은 코드가 되었습니다.

다행히 사토시 나카모토가 직접 작성한 오리지널 비트코인 소스 코드가 아직 남아 있습니다. 무려 비트코인 버전 0.1.0은 헤더 파일과 소스 코드를 다 합쳐서 2만 줄도 안 되고 소스 코드도 간단해서 비트코인 개발에 입문하시는 분들이 비트코인의 동작 원리를 공부하기 좋습니다.

 

Decred 소개

국내에는 많이 알려져 있지 않지만 비트코인 초기 개발자들이 모여 만든 Decred라는 암호화폐가 있습니다.

Decred는 비트코인 Go 언어 구현체인 btcd를 포크하여 만들었는데, 비트코인과 달리 민주적인 운영 방법(governance)에 대한 고려가 프로토콜에 반영되어 있는 점이 특징입니다.

마이닝의 중앙화를 막기 위해 PoW와 PoS를 결합한 하이브리도 방식의 합의 알고리즘을 사용하고 있습니다. 여기서 PoS는 트랜잭션을 validate하여 보상을 받는 역할뿐만 아니라 프로젝트의 방향성을 결정하는 투표의 역할도 병행합니다.

보상의 60%는 PoW 마이너, 30%는 PoS 투표자, 10%는 개발팀에 갑니다. Decred 개발 팀 외에도 외부에서 제안을 내고 그 제안이 통과되면 직접 펀딩을 받을 수도 있습니다.

이 외에도 기술적으로는 on-chain atomic swap을 구현하는 등 비트코인에 비해 비교적 새로운 아이디어를 많이 시도하고 있기 때문에 비트코인에 관심 있는 개발자라면 한 번 살펴보시길 권합니다.

비트코인 공부의 정석

개발자가 비트코인 공부하려면 뭐부터 봐야 하는지 물어보는 분이 많이 계셔서 정리해 보았습니다.

일단 비트코인 입문자에게 추천 드리는 강의는 Coursera의 Bitcoin and Cryptocurrency Technologies입니다. 암호화폐 기초 개념 및 동작 원리를 잘 설명하고 있습니다.
https://www.coursera.org/learn/cryptocurrency

강의와 함께 보시면 좋은 책으로는 Mastering Bitcoin 있습니다.
https://www.bitcoinbook.info/

비트코인의 개념을 어느 정도 잡았으면 사토시 나카모토가 작성한 비트코인 논문도 꼭 읽어보시기 바랍니다. 9페이지 짧은 논문이지만 비트코인의 등장 배경과 동작 원리를 그 어느 문서보다 명료하게 설명하고 있습니다.
https://bitcoin.org/bitcoin.pdf

비트코인의 동작 원리는 알았고 구현 세부사항을 알고 싶으신 분은 Bitcoin Developer Guide을 추천 드립니다. 공식 매뉴얼이라 조금 따분하긴 하지만 다른 어느 문서보다 기술 세부사항을 자세히 설명하고 있습니다.
https://bitcoin.org/en/developer-guide

비트코인은 따로 스펙이 없고 Bitcoin Core 소스 코드를 스펙으로 하고 있습니다. 개발자 가이드에서 확인할 수 없는 코너 케이스는 소스 코드를 직접 확인할 수 밖에 없으니 다른 문서를 찾아 헤매지 말고 소스 코드를 공부하시면 됩니다.
https://bitcoin.org/en/bitcoin-core/

Bitcoin Core는 C++로 작성되어 있고 레거시 코드가 많다 보니 처음 보시는 분들이 이해하기에 조금 어려울 수 있습니다. 비트코인 공부의 시행착오를 줄이고 싶으신 분에게는 코드체인 에듀가 제공하는 “비트코인 프로그래밍 입문”을 추천드립니다! 비트코인 기초부터 구현까지 친절하게 안내해 드립니다.

http://edu.codechain.io/course/5