코인 스토리: 비탈릭 부테린의 이더리움 백서 연구 - 2부; Ethereum White Paper By Vitalik

in #coinkorea6 years ago (edited)

@heroldius' Mondrian.jpeg
@heroldius Mondrian

안녕하세요^^ 오늘은 코인 스토리로, 이더리움 백서 번역-2부입니다 코드를 알아야지만 정확하게 이해할 수 있는 용어가 나오네요 [return an error, true, false] 이런 것인데요 코드를 배워야 하나 깊이 고민하게 됐습니다 그 외에는 거의 비트코인에 대한 설명으로, 앞서 비트코인 백서를 번역해 본 것이 내용을 이해하는 데 많이 도움이 되네요 36 페이지로 비트코인 백서 8 페이지에 비해서 분량이 많아서 오늘 내용까지는 비트코인에 대한 분석이 이어지고 있습니다 더위 조심하세요 감사합니다 ~ ฿


● History
○ Bitcoin As A State Transition System
○ Mining
○ Merkle Trees


Ethereum White Paper

A NEXT GENERATION SMART CONTRACT & DECENTRALIZED
APPLICATION PLATFORM

By Vitalik Buterin
번역: @phuzion7


Bitcoin As A State Transition System

Screen Shot 2018-07-28 at 11.33.45 PM .png

상태 변환 시스템으로서의 비트코인

Screen Shot 2018-08-03 at 12.46.31 AM .png

기술적 관점에서, 비트코인 원장(ledger)은 상태 변환 시스템(state transition system)으로 생각할 수 있다 존재하는 모든 비트코인의 소유권 상태로 구성된 “state(상태)” 그리고 상태 및 트랜잭션을 가지고 결과적으로 새로운 상태를 만드는 “상태 변환 함수(state transition function)”가 있다 예를 들어, 표준 은행업 시스템에서 상태는 재무상태표(balance sheet), 트랜잭션은 A로부터 B에게 $X를 이동시키는 요청, 그리고 상태 변환 함수는 A의 계좌에서 $X 가치를 차감하고 B의 계좌에 $X 가치를 증가시키는 것이다 만약 우선 A의 계좌가 $X 보다 작으면, 상태 변환 함수는 에러를 반환한다 (returns an error) 따라서, 이론적으로 정의하면:

APPLY(S, TX) > S’ or ERROR

은행 시스템으로 위를 정의하면:

APPLY({ Alice: $50, Bob: $50 },”Alice가 Bob에게 $20를 보낸다”) = { Alice: $30, Bob: $70 }

But:

APPLY({ Alice: $50, Bob: $50 },”Alice가 Bob에게 $70$를 보낸다”) = ERROR

비트코인에서 “state”은 미사용 또는 아직 소비되지 않은 모든 코인들의 집합이다 (기술적으로, “소비되지 않은 거래 출력값, unspent transaction outputs” 또는 UTXO) 각각의 UTXO는 금액과 소유자를 가진다 (본질적으로 암호화 공개 키, public key인 20-byte 주소로 정의된다[1]) 하나의 트랜잭션은 하나 또는 그 이상의 입력값이 들어있고, 각각의 입력은 현재의 UTXO에 대한 참조 사항과 소유자의 주소와 관련된 개인 키private key로 만든 암호화 서명(cryptographic signature)을 포함한다 그리고 하나 또는 그 이상의 출력값 각각은 그 상태에 추가되는 새로운 UTXO를 포함한다

상태 전이 함수 APPLY(S,TX) ­> S’는 대략 다음과 같이 정의할 수 있다:

  1. TX의 각 입력에 대해:
    i. 참조된 UTXO가 S(state) 안에 없으면, error를 리턴한다
    ii. 제공된 서명이 UTXO의 소유자와 일치하지 않으면, error를 리턴한다
  2. 모든 입력 UTXO의 총 단위가 모든 출력 UTXO의 총 단위보다 적으면, error를 리턴한다
  3. 제거된 모든 입력 UTXO와 추가된 모든 출력 UTXO를 가진 S를 되돌린다

1번의 i는 트랜잭션 전송자가 존재하지 않는 코인을 소비하는 것을 방지한다 1번의 ii는 트랜잭션 전송자가 다른 사람의 코인을 소비하는 것을 방지하고, 두 번째 단계는 가치의 보존을 강조한다 이것을 지불에 사용하기 위해서, 프로토콜은 다음을 따른다 Alice가 11.7 BTC를 Bob에게 보내려고 한다고 가정한다 우선, Alice는 그녀가 소유한 이용 가능한 일련의 UTXO를 찾아서 적어도 11.7 BTC까지 합산한다 현실적으로, Alice는 정확하게 11.7 BTC를 얻을 수는 없다; 이 말은 그녀가 취할 수 있는 가장 작은 것은 6+4+2=12이다 그런 다음 그녀는 이 세 개의 입력값과 두 개의 출력값을 가진 하나의 트랜잭션을 생성한다 첫 번째 출력은 소유자가 Bob의 주소로 된 11.7 BTC가 될 것이고, 두 번째 출력은 나머지 0.3 BTC “거스름돈” 즉, 소유자는 Alice 그녀 자신이다

Mining

Screen Shot 2018-07-28 at 11.33.45 PM .png
Screen Shot 2018-08-03 at 12.46.58 AM .png

만약 우리가 신뢰할 수 있는 중앙화된 서비스에 접속한다면, 이 시스템을 구현하는 것은 어려운 일이 아니다; 기술한 대로 정확하게 코드화될 것이다 그러나, 비트코인으로 우리는 탈중앙화된 화폐 시스템 구축을 시도하고 있으므로, 모든 사람이 트랜잭션 순서(order of transactions)에 대해 동의했다는 것을 증명하기 위해 상태 변환 시스템과 컨센서스 시스템 (consensus system)을 결합할 필요가 있다 비트코인의 탈중앙화 합의 프로세스는 “ blocks”이라 부르는 거래 묶음 생산을 계속 시도하기 위해 네트워크 안에 노드(nodes)들이 필요하다 네트워크는 대략 10분마다 하나의 블록을 만드는 경향이 있으며, 각각의 블록은 타임스탬프(timestamp), 난스(nonce), 이전 블록에 대한 참조 사항(ie. hash) 그리고 이전 블록 이후 발생한 모든 거래 목록을 포함한다 오랫동안, 이것은 끊임없이 증가하는 즉, 가장 최신의 비트코인 원장 상태를 대표하기 위해 지속적으로 업데이트되는 “blockchain”을 생성했다

이 패러다임에서 표현된 블록이 유효한지를 확인하는 알고리즘은 다음과 같다:

  1. 참조된 이전 블록이 존재하는지와 유효한지를 확인한다
  2. 블록의 타임스탬프가 이전 블록의 것보다 더 큰지 그리고 미래 2 시간보다 적은지 확인한다
  3. 블록에 대한 작업 증명이 유효한지 확인한다
  4. S[0]을 이전 블록의 마지막에 있는 상태라고 하자
  5. TX는 n 개의 트랜잭션을 가진 블록의 트랜잭션 리스트라고 가정하자 0... n-1에 있는 모든 i에 대해, 집합 setS[i+1] = APPLY(S[i],TX[i]) 이다 만약 어떤 적용이 에러를 리턴하면, 종료하고 거짓(false)을 리턴한다
  6. 참(true)을 리턴하고 S[n]을 이번 블록의 마지막 상태로 등록한다

본질적으로, 블록 안의 각각의 트랜잭션은 유효한 상태 변환을 제공해야 한다 그 상태는 어떤 방식으로든 블록 안에 부호화(encode) 되지 않는다는 것을 주의해라; 그것은 검증하는 노드에 의해 기억되는 순수한 추상적 개념이고 최초의 상태에서 시작하고 모든 블록 안의 모든 트랜잭션에 순차적으로 적용함으로써 어떤 블록도 안전하게 계산될 수 있다 또한, 채굴자가 블록 안에 트랜잭션들을 포함하는 순서가 문제가 된다; 만약 A와 B의 두 가지 트랜잭션이 있는데, A가 생성한 UTXO를 B가 소비한다면, 그럼 그 블록은 A가 B보다 먼저 온다면 유효하고 다른 경우는 유효하지 않다

블록 유효성 알고리즘의 흥미로운 부분은 “작업 증명(proof of work)”의 개념이다: 그 조건은 256-bit 수로 처리되는 모든 블록의 SHA256 해시(hash)가 동적으로 조절되는 목표(target)보다 반드시 작아야 한다 이 타깃은 글은 쓰는 시각 현재 대략 2190이다 이것의 목적은 블록 생성을 계산적으로 “어렵게” 만드는 것이며, 따라서 시빌 공격(sybil attackers) 자들이 마음대로 전체 블록체인을 다시 만드는 것을 방지한다 SHA256은 완전히 예측할 수 없는 의사난수 함수(pseudorandom function)가 되도록 설계되었다 유효한 블록을 생성하는 유일한 방법은 단순하게 시행착오로서, 반복적으로 난스(nonce)을 증가시켜서 새로운 해시가 일치하는지를 찾는 것이다 현재의 목표 2192에서, 이것은 평균 264회 시도를 의미한다; 일반적으로, 이 타깃은 매 2016 블록마다 네트워크에 의해 재조정되어서 평균적으로 새로운 블록은 10분마다 네트워크에서 일부 노드에 의해 생성된다 채굴자들의 이런 계산 작업에 대한 보상을 위해서, 모든 블록의 채굴자는 난데없이 25 BTC를 스스로에게 주는 하나의 트랜잭션을 포함할 권리가 주어진다 게다가, 만약 어떤 트랜잭션이 그 출력값보다 입력값에서 더 높은 총 금액을 가진다면, 그 차이 또한 “거래 수수료(transaction fee)”로서 채굴자에게 간다 부수적으로, 이것도 BTC가 발행되는 유일한 메커니즘이다; 최초의 상태(genesis state)는 전혀 아무 코인도 포함하지 않았다

마이닝의 목적을 더 잘 이해하기 위해서, 악의적인 공격자의 사례에서 일어나는 일을 살펴보자 비트코인의 기본적인 암호학은 안전하다고 알려져 있기 때문에, 공격자는 직접적으로 암호학에 의해 보호되지 않는 비트코인 시스템의 한 부분을 타깃으로 할 것이다: 트랜잭션의 순서이다 공격자의 전략은 간단하다:

  1. 100 BTC를 어떤 제품의 대가로 판매자에게 보낸다 (되도록이면 신속-배송 디지털 상품)
  2. 제품의 배송을 기다린다
  3. 자신에게 똑같은 100 BTC를 보내는 또 다른 트랜잭션을 만든다
  4. 자신에게 보낸 그의 트랜잭션이 먼저 온 것이라는 것을 네트워크에게 설득시키려고 노력한다

일단 1번 단계가 발생하면, 몇 분 후에 일부 마이너가 그 트랜잭션을 하나의 블록에 포함시킨다 이를 블록 넘버 270000이라 하자 약 1시간 후에, 5개의 추가 블록들이 체인에 추가될 것이고, 이들 각 블록들은 각각 그 트랜잭션을 간접적으로 지적하고 따라서 그것을 “입증(confirming)”한다 이 지점에서, 상인은 지불이 확정된 것으로 받아들이고 제품을 배송한다; 우리가 이것을 디지털 상품으로 간주하고 있기 때문에, 배송은 즉시 이루어진다 이제, 공격자는 자신에게 100 BTC를 보내는 또 다른 트랜잭션을 생성한다 만일 공격자가 단순히 자연적인 상태에서 그것을 공개한다면, 그 트랜잭션은 처리되지 않을 것이다; 마이너들은 APPLY(S,TX)을 실행해보고 TX가 그 상태(state) 안에 더 이상 없는 UTXO를 소비한 것을 알아차릴 것이기 때문이다 따라서 대신에, 공격자는 블록체인의 “분기(fork)”를 생성하고, 이 블록은 부모로 같은 블록 26999를 가지는 블록 270000의 또 다른 버전을 채굴해서 시작하지만 상인에게 보낸 올드 블록(old block)을 대체하는 새로운 트랜잭션이다 블록 데이터가 다르기 때문에, 이것은 작업 증명 재실행이 요구된다 더 나아가, 공격자의 새로운 버전 블록 270000은 다른 해시(hash)를 가지기 때문에, 원래의 블록들 27001에서 27005까지는 그것을 “인용(point)”하지 않는다; 그러므로, 원래의 체인과 공격자의 새로운 체인은 완전히 분리된다 규칙은 하나의 포크에서 가장 긴 체인(예. 가장 많은 양의 작업 증명이 뒷받침되는 블록체인)이 진실로 인정되기 때문에, 정당한 마이너들은 270005 체인으로 작업을 할 것이고 반면에 공격자는 홀로 그 270000 체인으로 작업하고 있게 된다 공격자가 그의 블록체인을 가장 길게 만들기 위한다면, 따라잡기 위해서 그는 나머지 결합된 네트워크 보다 더 많은 컴퓨터 파워를 가질 필요가 있다 (“51% 공격” 때문에)

Merkle Trees

Screen Shot 2018-07-28 at 11.33.45 PM .png

왼쪽: 분기의 유효성을 증명하기 위해서 머클 트리 안에 소수의 노드들만 표시하면 충분하다 
오른쪽: 머클 트리의 어느 부분을 변경하려는 어떤 시도도 결국은 체인 상 어딘가에서 불일치로 이어질 것이다 


Screen Shot 2018-08-03 at 12.47.15 AM .png

비트코인의 중요한 확장성 기능은 블록이 다중 레벨 데이터 구조(multi-level data structure)로 저장되는 것이다 한 블록의 “hash”는 실제로 그 블록 헤더(header)의 hash일 뿐이며, 블록 헤더는 타임스탬프, 난스(nonce), 이전 블록 해시(previous block hash) 그리고 그 블록 안에 모든 트랜잭션들이 저장된 머클 트리라고 부르는 데이터 구조의 루트 해시(root hash)를 포함하는 일종의 200-byte 데이터이다

머클 트리(Merkle tree)는 이진 트리(binary tree)의 형태이고, 기본적인 데이터를 포함하는 트리의 바닥에 수많은 리프 노드(leaf nodes)들을 가진 노드(node)들의 집합으로 구성된다 일련의 중간 노드들은 각 노드가 두 자식(children)의 해시이며, 마지막 단일 루트 노드(root node)도 역시 두 자식의 해시로 만들어지고 트리의 “상단”을 나타낸다 머클 트리의 목적은 블록의 데이터를 단편적으로 전달할 수 있게 하는 것이다: 노드는 한 소스(source)로부터 블록 헤더만 다운로드할 수 있고, 다른 소스에서 그들과 관련된 트리의 작은 부분을 다운로드하지만, 여전히 모든 데이터가 올바른 것이 보증한다 이것이 작동하는 이유는 해시들이 위쪽으로 증식하기 때문이다: 만약 악의적인 유저가 머클 트리의 바닥 안에 가짜 트랜잭션으로 교환해 넣는 시도를 한다면, 이 변화는 위쪽 노드의 변화를 만들고, 그런 후 그 위의 노드에 변화를 만들어, 결국 트리의 루트 그리고 블록 해시를 변화시켜서, 프로토콜은 그것을 완전히 다른 블록(거의 틀림없이 유효하지 않은 작업 증명)으로 등록되도록 한다

머클 트리 프로토콜은 분명 장기간 지속 가능성을 위해 필수이다 비트코인 네트워크에서 “풀 노드(full node)”는 모든 블록의 완전한 상태를 저장하고 처리하는 노드로 2014년 4월 현재까지 비트코인 네트워크에서 약 15GB의 디스크 공간을 차지하며, 월 당 1 기가바이트 이상 증가하고 있다 현재, 이것은 일부 데스크탑 컴퓨터에서 사용 가능하고 폰에서는 안되며, 나중에 미래에는 사업자나 애호가만이 참여할 수 있을 것이다 “simplified payment verification(간소화 지불 승인)” (SPV)으로 알려진 프로토콜은 “light nodes”로 불리는 다른 등급의 노드가 존재할 수 있게 하며, 이것은 블록 헤더를 다운로드해서, 그 블록 헤더에 대한 작업 증명을 확인하고, 그들과 관련된 트랜잭션과 연관된 “branches(분기)”만을 다운로드한다 이것으로 라이트 노드는 전체 블록체인의 매우 작은 부분만 다운로드하면서도 어떤 비트코인 거래의 상태나 현재 잔액을 강력한 안전을 보장하며 확인할 수 있게 된다

1000x1.png

Screen Shot 2018-05-13 at 7.50.25 PM .png

최근글 ✏️

Coin Marketplace

STEEM 0.15
TRX 0.12
JST 0.025
BTC 54140.93
ETH 2422.15
USDT 1.00
SBD 2.12