Mastering Bitcoin: Programming the Open Blockchain 2nd Edition 책을 정리한 내용입니다.

용어 정리

  • Cryptography : 암호학
  • Public key : 공개키는 지정된 인증기관에 의해 제공되는 키 값이다. 공개키로부터 생성되는 개인키와 함께 결합되어 메시지 및 전자서명의 암호화와 복원에 사용할 수 있다.
  • Private key : 개인키는 무작위로 추출된 숫자와 문자의 조합으로 이루어진 비밀번호와 같은 기능을 한다.
  • elliptic curve multiplication(ECC, 타원곡선암호기술) : RSA의 대안으로 대두된 이산대수의 난해성에 기반한 공개키 암호화 알고리즘
  • script : 스택 기반의 프로그래밍 언어이다. 비트코인은 스크립트로 작성된 코드를 읽어 이를 실행하면서 코인 트랜잭션을 수행한다.
  • P2SH(pay to script hash) : 공개키가 아닌 스크립트 해시에 지불하는 개념으로, 하나의 공개키로 해싱하는 것이 아닌 여러 공개키가 함께 해싱하여 출력하는 개념이다.

Introduction

비트코인의 소유권은 digital keys, bitcoin addresses, digital signatures을 통해서 구성된다. digital key들은 네트워크에 저장되어있지 않고 파일안에서 소유자들에의해 저장되고 생성되거나 wallet이라고 부르는 단순한 DB에 저장된다. 소유자의 지갑안에있는 digital key들은 비트코인 프로토콜과 완전히 독립되어있으며 블록체인이나 인터넷을 통한 방법 없이 소유자의 지갑에의해 운영되고 생성될 수 있다. Key들에는 분산형 신뢰와 제어, 소유권 증명, 그리고 암호학 증명 안전 모델을 포함한다. 대부분의 비트코인 거래는 유효한 디지털 서명이 블록 체인에 포함되어야 하며, 이것은 비밀 키를 통해서만 생성될 수 있기 때문에, 그 키의 복사본을 가진 사람은 누구나 비트코인을 제어할 수 있다.

자금을 소비하기위해 사용되는 디지털 서명은 *witness(*증인)라고도 한다. 비트코인 거래에서 witness 데이터는 사용중인 자금의 진정한 소유권을 인정한다. key들은 개인키와 공개키로 구성되는 쌍으로 제공된다. 공개키에 대해서 생각해보면 은행 계좌번호와 비슷하고 개인키는 비밀 PIN 또는 수표의 서명과 비슷하다. 비트코인 거래의 결제 부분에서, 수신자의 공개키는 디지털 지문, 즉 수표의 수익자 이름과 동일한 방식으로 사용되는 비트코인 주소로 보내진다. 대부분의 경우 비트코인 주소는 공개키에서 생성된다. 하지만 비트코인 주소들이 다 공개키를 나타내진 않는다.

다음과 같은 내용에 대해서 알아볼 것이다.

  1. cryptography와 비트코인에서 사용되는 수학을 설명
  2. 어떻게 Keys가 생성, 저장, 관리되는지

Public key cryptography and cryptocurrency

공개키 암호학은 1970년대에 발명되었으며 정보보안과 컴퓨터를 위한 수학적 기반이다. 공개키 암호학의 발전 덕분에 수학적 함수들이 발견됐는데 이러한 것들을 바탕으로 암호학은 digital secrets와 unforgeable한 디지털 서명의 생성을 가능하게했다. 비트코인은 암호학의 기초로 curve multiplication을 사용한다.

비트코인에서는 공개키 암호법을 사용하여 비트코인에 대해 엑세스를 제어하는 키 쌍을 만든다. 키 쌍은 개인키와 그로 부터 파생된 unique한 공개키로 구성된다. 공개키는 자금을 받기위해 사용되며 개인키는 자금을 소비하기위해 거래들에 싸인하기위해 사용된다.

공개키와 개인키 사이에있는 수학적 관계가 있어 개인키를 사용하여 메시지에 서명을 생성할 수 있다. 이 서명은 개인키를 공개하지 않고 공개키에 대해 검증할 수 있다. 공개키와 서명을 통해, 비트코인 네트워크에 있는 모든 사람이 이 거래가 유효한지 확인하고 받아들일 수 있으며, 이는 전송 당시 비트코인을 양도한 사람이 이 거래를 소유하고 있었음을 확인시켜준다.

Private and Public Keys

비트코인 지갑에는 각각 개인키와 공개키로 구성된 키 쌍이 들어 있다.

개인키(k)는 일반적으로 무작위로 선택하는 숫자다. 이전 개인키에서 단방향 암호화 함수인 elliptic curve multiplication(타원 곡선 곱셈)을 사용하여 공개키(K)를 생성한다. 공개키(K)에서 단방향 암호화 해시 함수를 사용하여 비트코인 주소(A)를 생성한다.

Private keys

개인키는 랜덤한 숫자다. 개인 키는 거래에 사용되는 펀드의 소유권을 증명하여 비트코인을 소비하는 데 필요한 서명을 만드는 데 사용된다. 개인키를 제3자에게 공개하는 것은 그들에게 그 키로 확보한 비트코인에 대한 통제권을 주는 것과 같다.

Generating a private key from a random number

  • 비트코인 클라이언트로 새 키를 생성하려면 → getnewaddress
  • 비트코인에 개인키 노출 요청 → dumprivkey

Public keys

공개키는 되돌릴 수 없는 elliptic curve multiplication을 사용하여 개인키에서 계산된다. elliptic curve multiplication은 ’trap door’ 라고 부르는 함수의 한 종류다. 한 방향으로(곱셈)수행이 쉽고 역방향 수행(나누기)이 불가능하다. 개인키의 소유자는 공개키를 쉽게 만든 다음 다른 사람이 공개키에서 개인키를 계산할 수 없다는 것을 알고 다른 사람들과 공유할 수 있다.

Generating a public key

K=k*G (k = 개인키, G = generator point, K = 결과 공개키이며 곡선의 점.)

생성기 포인트는 모든 비트코인 사용자에게 항상 동일하기 때문에, 개인키 k에 G를 곱하면 항상 동일한 공개키 K가 된다. K와 K 사이의 관계는 고정적이지만, k에서 K까지 한 방향으로만 계산될 수 있다. 이것이 (K에서 파생된) 비트코인 주소를 누구와도 공유할 수 있고 사용자의 개인키(k)를 공개하지 않는 이유이다. 개인키는 공개키로 변환할 수 있지만 수학은 한가지 방식으로만 작동하므로 공개키는 개인키로 변환할 수 없다.

Bitcoin Addresses

비트코인 주소는 당신에게 돈을 보내기를 원하는 누구와도 공유될 수 있는 숫자와 문자의 연속이다. 공개 키로 생성된 주소는 숫자 “1"로 시작하는 일련의 숫자와 문자로 구성된다.

비트코인 주소는 단방향 암호화 해싱을 통해 공개키에서 파생된다. “해싱알고리즘” 은 임의의 크기의 입력의 지문이나 “해시"를 생성하는 단방향 함수이다. 공개키로 비트코인 주소를 만드는 데 사용되는 알고리즘은 보안 해시 알고리즘(SHA)과 RACE 무결성 기본 요소 평가 메시지 다이제스트(RIPEMD), 특히 SHA256 및 RIPEMD160가 있다.

비트코인 주소는 거의 항상 “Base58Check"로 인코딩되며, checksum을 사용하여 인간의 가독성을 돕고, 모호성을 방지하며, 주소 전사 및 입력의 오류로부터 보호한다.

Base58 and Base58check encoding

Base58은 텍스트 기반 바이너리 인코딩 형식으로, 비트코인에 사용하기 위해 개발되었으며 다른 많은 암호 화폐에 사용된다. 오타나 전사 오류에 대한 보안을 강화하기 위해 Base58Check는 Base58 인코딩 형식으로, 오류 검사 코드가 내장되어 있는 비트코인에 자주 사용된다. checksum은 인코딩 중인 데이터의 끝에 추가된 4bytes이다. checksum은 인코딩된 데이터의 해시로부터 파생되므로 전사 및 입력 오류를 감지하고 방지하는 데 사용할 수 있다.

Pay-to-Script Hash(P2SH) and Multisig Addresses

P2SH 주소는 트랜잭션 출력을 사용할 수 있는 사용자를 정의하는 트랜잭션 스크립트에서 생성된다. P2SH 주소 인코딩에는 비트코인 주소 생성 시 사용된 것과 동일한 더블 해시 함수를 사용하는 것이 포함되며, 공용키 대신 스크립트에만 적용된다.

현재 P2SH 기능의 가장 일반적인 구현은 Multisignature addresses이다. 기본 스크립트는 소유권을 증명하고 따라서 자금을 지출하기 위해 둘 이상의 서명을 필요로 한다.

Vanity addresses

vanity 주소는 사람이 읽을 수 있는 메시지를 포함하는 유효한 비트코인 주소이다. vanity 패턴으로 시작하는 주소의 개인 키는 다른 주소보다 쉽게 찾을 수 없다.