안녕하세요. 어미새입니다.
이더리움 백서를 쉽게 이해할 수 있도록 풀어서 설명하는 연재물을 작성하고 있습니다. 지난 포스팅을 읽지 못하셨던분은 먼저 아래의 포스팅을 읽어보시는것을 추천드립니다.
Remind
비트코인 시스템은 이세상에 없던 기술들을 총 집합하여 탄생한것이 아니라 아주 오래전부터 그와 관련된 이론들과 논의들이 있었다는 내용과, 비트코인이 어떤 의미에서 혁신적이었는지에 대한 내용을 다뤘으며, 작업 증명 방식, 지분 증명 방식의 두가지 합의 알고리즘을 언급함으로써 이더리움에 시작은 작업 증명 방식으로 이루어지나 추후 지분 증명 방식으로 변화할것을 암시하였습니다.
또한, 기존의 비트코인 시스템에서 사용되는 '상태(State)'와 '상태 변환 함수(state transition function)'에 대한 개념에 대하여 먼저 설명한 후 이더리움에서는 이 부분을 어떻게 수정할지에 대한 내용을 다루게됩니다.
채굴
앞서 언급한 내용들을 중앙 집권화된 서비스 방식으로 구현하자면 매우 간단한 일입니다. 그 이유는 중앙 서버에 상태 변화과정을 저장하고 관리하면 어렵지 않게 구현할 수 있습니다.
하지만 탈 중앙화된 통화 시스템을 구축하기 위해서는 분산 합의 과정이 필요하고, 네트워크가 정상적으로 유지될 수 있도록 도와주는 노드들이 필요합니다. 또한, 이 노드들은 "블록(blocks)"이라 불리는 트랜잭션 패키지를 계속적으로 생성하고 합의하는 역할을 수행해야합니다.
비트코인 네트워크는 약 10분에 한번식 하나의 블록을 생성하도록 계획되었고, 각 블록은 타임스탬프, 논스(nonce), 이전 블록에 대한 참조(이전 블록의 해시), 그리고 이전 블록 이후에 발생한 모든 트랜잭션의 목록을 포함합니다. 이 과정을 통해서 지속적으로 성장하는 블록체인이 생성되며, 비트코인 장부의 최신상태(state)를 나타내기 위해 지속적인 업데이트가 이루어져야합니다.
생성된 블록이 유효한지 아닌지를 확인하기 위한 알고리즘은 아래와 같습니다.
- 생성된 블록에 참조되는 이전 블록이 실제 존재하는 블록인지, 유효한지 확인한다.
- 타임 스탬프 값이 이전 블록의 타임스탬프 값보다 큰 값인지 확인한다, 만약 크다면 2시간 이내인지 확인한다.
- 작업증명(proof of work)이 유효한지 확인한다. (새로운 블록을 찾는 과정이 유효했는지에 대한 검증)
S[0]
를 이전 블록의 마지막 상태(state)가 되도록 설정한다.TX
를n
개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정한다. 폐구간0...n-1
의 모든 i에 대해,S[i+1] = APPLY(S[i], TX[i])
집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료한다.- 참(true)을 리턴하고,
S[n]
를 이 블록의 마지막 상태로 등록한다.
1 ~ 3번 과정은 새로운 블록에 대한 유효성 검증이며, 4 ~ 6번 과정은 지난 이더리움 백서 1편에서 언급한 비트코인의 상태 변화 시스템에 대한 내용입니다.
가장 최근의 블록의 상태 정보를 가져오고, 현재 블록에 있는 트랜잭션 목록들에 대한 유효성을 점검한 후 상태 정보를 업데이트한다고 생각하시면 쉬울것 같습니다. 이 과정이 이해가 되지 않으시다면 1편에서 설명한 상태 변화 시스템에 대한 내용을 다시 읽어보시면 좋을것 같습니다.
기본적으로 블록의 트랜잭션들은 유효한 상태변환을 진행해야합니다. 여기서 유심있게 살펴봐야하는점은 블록내에 어떠한 방법으로도 상태정보가 기록되지 않았다는 점을 주목해야합니다. 상태는 유효성을 검증하는 노드가 매번 계산해서 기억해야 하는 추상적(abstaction)인 개념이며, 이것은 원시 상태(genesis state), 즉 제네시스 블록으로 부터 현재 블록까지의 모든 트랜잭션을 순차적으로 적용함으로 계산할 수 있습니다.
채굴자(마이너)가 블록에 포함시키는 트랜잭션의 순서를 주목해보겠습니다. 만약 어떤 블록에 A와 B라는 트랜잭션이 있다고 가정해보겠습니다. 그리고 B의 트랜잭션은 A의 UTXO를 소비한다고 가정했을 경우 B는 A의 UTXO 정보가 필요하기 때문에 반드시 A의 트랜잭션이 먼저 블록에 담겨 있어야합니다. 만약 트랜잭션 A가 먼저 블록에 담겨 있지 않을 경우 B는 존재하지 않은 트랜잭션 A의 UTXO 정보를 사용하게됨으로 해당 블록의 유효성이 보장되지 않습니다. (즉 블록의 트랜잭션을 어떤순서로 담느냐에 따라 블록이 유효할수도, 유효하지 않을수도 있다는 의미입니다.)
블록 유효성 검증 알고리즘에서 "작업증명(proof of work)"의 조건은 256비트 숫자로 표현되는 블록의 이중-SHA256 해시 값이 동적으로 조정되는 목표값 보다 반드시 작아야 된다는 조건입니다. (비트코인 마이닝편 참조)
작업 증명의 목적은 블록 생성을 계산적으로 어렵게 만들어서 sybil 공격자들이 마음대로 전체 블록체인을 조작하는 것을 방지하기 위함입니다. SHA256 함수는 예측 불가능한 유사난수 함수(pseudorandom function)로 설계되어 있기 때문에 유효 블록을 생성하기 위한 유일한 방법은 블록 헤더의 논스(nonce) 값을 계속 증가시키면 블록 해시 값이 목표값 보다 작은지에 대한 검증을 반복하는 방법밖에 없습니다.
현재 목표 값인 2187(이더리움 백서 작성 시간 기준)에서 하나의 유효블록을 발견하기 위해서는 평균적으로 264번의 시도를 해야합니다. 네트워크는 평균적으로 10분마다 새로운 블록이 생성될 수 있도록 2016개의 블록마다 목표 값을 변경하게됩니다.
채굴자들은 이러한 연산 작업에 대한 보상으로 25 BTC(이더리움 백서 작성 시간 기준)를 획득할 자격을 가지게 되며, 출력 금액보다 입력 금액이 큰 트랜잭션이 있다면 그 차액을 "트랜잭션 수수료(transaction fee)"로 얻게 됩니다. 이러한 과정이 비트코인이 발행되는 유일한 방법이며, 원시 상태(genesis state)에는 아무런 코인이 포함되어 있지 않습니다.
채굴 목적에 대한 이해를 위해 악의적인 공격자가 있을 떄 어떤 일이 발생하는지 생각해보겠습니다. 일반적으로 비트코인의 뼈대를 이루는 암호기법은 안전한 것으로 알려져 있습니다. 그렇기 때문에 공격자는 비트코인 시스템에서 암호 기법에 의해 직접적으로 보호되지 않는 부분인 '트랜잭션 순서'를 공격 목표로 잡을것입니다.
- 어떤 상품(가급적이면 바로 전달되는 디지털 상품)을 구매하기 위해 판매자에게 100 BTC를 지불한다.
- 상품이 전송되기를 기다린다.
- 판매자에게 지불한 것과 같은 100 BTC를 공격자 자신에게 보내는 트랜잭션을 생성한다.(이중지불 시도)
- 비트코인 네트워크가, 공격자 자신에게 보내는 트랜잭션이 판매자에게 지불하는 트랜잭션보다 먼저 수행된 것으로 인식하도록 한다.
1번 과정이 발생하고 몇 분 후에 몇몇 채굴자들이 해당 트랜잭션을 블록에 포함하게됩니다. 그리고 이 블록 번호를 270000 이라고 가정해보겠습니다. 블록은 10분에 한번식 생성되기 때문에 대략 1시간 후에는 이 블록 다음의 체인에 5개의 블록들이 추가될 것입니다. 트랜잭션이 포함된 블록 이후 5개의 블록들이 연결되었기 때문에 컨펌(confriming)되었다고 생각할 수 있으며, 이 시점에서 판매자는 BTC 지불이 완료된 것으로 판단하고 상품을 전송하게됩니다. (상품은 디지털 상품으로 가정하에 전송하는 순간 상품을 받았다고 가정합니다.)
이제 공격자는 판매자에게 보낸 것과 동일한 100 BTC를 공격자 자신에게 보내는 트랜잭션을 생성합니다. 이때 만약 공격자가 그냥 단순하게 트랜잭션을 시도한다면, 채굴자들이 채굴자들이 APPLY(S,TX)
를 실행하여 해당 트랜잭션(TX)은 더이상 존재하지 않는 UTXO를 소비하는 행위인것을 알게되고, 해당 트랜잭션은 진행되지 않습니다.
그렇기 때문에, 공격자는 판매자에게 보낸 시점의 이전 블록인 269999 블록으로 되돌아가 공격자 자신에게 보내는 트랜잭션을 포함한 270000 블록을 생성하여, 블록체인 "분기점(fork)"을 생성합니다.
비트코인 네트워크는 가장 긴 블록체인을 참으로 인식하기 때문에 메인 블록체인에 이미 연결된 270005번 블록까지 조작해야합니다. 그렇기 때문에 공격자는 자신의 체인을 가장 길게 만들기 위해서 네트워크에 연결된 다른 노드들의 계산능력 조합보다 더 큰 계산 능력을 가져야합니다. (이를 51% attack이라 한다.)
Think
오늘 이더리움 백서 번역본에서는 비트코인의 채굴 방식과, 공격 방식에 대한 설명 부분에 대해서 다뤘으며, 백서 후반부에서 이더리움에서는 어떠한 방식의 채굴 방식을 선택할 것이고 공격자의 공격을 어떻게 막을것인지에 대한 이야기가 진행됩니다.
지난 포스팅에서도 잠간 언급되었지만, 탈 중앙화된 암호화폐는 어느 한순간에 나온 개념이 아니며, 아주 오래전부터 연구되어왔던 내용들을 비트코인에서 처음으로 구현하게된것입니다. 그렇기 때문에 블록체인의 개념을 한단어로 정의하기 어렵고, 내용이 방대하여 학습에 어려움이 있는것 같습니다.
하지만 하나식 천천히 반복적으로 뜯어서 학습을 진행하게되면 이해하는데 어려움이 없을것이라고 생각합니다. 이더리움에 대한 명확한 이해를 하기 위해서는 필수적으로 비트코인에 대한 이해가 선행되어야한다고 생각합니다. 오늘 포스팅에서 언급된 내용들에 대한 내용들은 비트코인 포스팅에서 설명한 내용들과 상당히 겹치는 부분들이 많습니다. 혹시 오늘 포스팅이 이해가 되지 않으셨던분들은 비트코인 마이닝 과정, UTXO, 51% acttact에 대한 내용들을 읽어보시면 좋을것 같아서 링크를 남겨두도록 하겠습니다.
- 비트코인 마이닝 과정
- UTXO
- 비트코인 공격 방법
오늘은 이더리움 백서부분에 대한 해석을 여기까지만 하도록 하겠습니다, 본격적인 이더리움에 대한 설명은 머클트리, 블록체인 기술을 이용한 사례, 스크립팅에 대한 챕터 이후 설명이 시작됩니다.
조금은 이전 비트코인 포스팅과 겹치는 부분이 있어서 이더리움을 공부하기 위해 들어오신분들에겐 답답한 마음이 생길 수 있을것 같으나, 비트코인을 변형하여 만들어진 플랫폼이다보니 그 만큼 비트코인에 대한 설명이 중요하다고 생각합니다. (백서의 흐름대로 학습해야지 나중에 더욱더 이해하기 쉽다고 생각합니다.)
혹시 이더리움 백서를 먼저 읽어보고 싶은 분을 위해 이더리움 백서 링크를 첨부해 드립니다.
이상 긴 글 읽어주셔서 감사합니다!(보팅, 팔로워, 리스팀은 제게 큰 힘이됩니다!)
[참고문헌]
잘 보고갑니다 :) 항상 이해가 문제이지만요 ㅠㅠ
블록체인과 관련된 내용들을 한번에 이해하기란 쉽지 않죠~ 그래도 자주 읽다보면 언젠가는 이해가 되실겁니다, 어느 정도 이해가 되셨을때 예전에 읽었던 글들도 읽어보시면 큰 도움이될거라고 생각합니다 😄
열심히 읽었지만 제 무지로 인하여 무슨 말인지 모르겠는게 좀 아쉽습니다 ㅜㅜ
아무래도 조금 쉽게 풀어서 설명하긴 했지만, 백서의 내용이다보니 조금 내용이 딱딱하죠.. 😭
오늘도 좋은글 잘봤습니다!
보팅하고 가요~!^^
감사합니다~ 즐거운 불금 보내세요~ 😄
우앙 멋진 일 하고 계시네요..ㅎㅎ
예전에 하려고 했지만 게을러 못한 일을.. ㅎㅎㅎ
정말 잘 보고 갑니다~~ 공부도 다시 되고 구~~~웃!!!!!
앞으로도 자주 찾아와서 공부할게요 감사합니다~~ ^^
앗 동물원님께서 이전에 작성 포스팅도 읽어봤었습니다! 덕분에 정리하는데 많은 도움이 되었습니다~ 추후 포스팅에도 도움이 될것만 같아요~ 헤헷 자주 방문해주셔서 제가 더 감사합니다 😄
잘보고 갑니다. 작성하신 글들 다 봐야겠네요. 감사합니다 ^^
천천히 읽어보시면 좋을것 같아요~ 주말 잘 보내세요 😄
힘내세요! 짱짱맨이 함께합니다!^^
이더리움 백서 깔끔하게 정리 잘 해주셨네요. 감사합니다!
조금 지난 글입니다만~ 도움이 되셨다니 다행이네요! 정독해보시면 재미있을것 같습니다~ 😄