dApp이란 탈중앙화된 어플리케이션을 뜻합니다. 그러면 탈중앙화된 어플리케이션은 무엇인지 어떻게, 왜 나오게 되었는지 먼저 알아보고 개발하는 과정을 살펴보겠습니다.
우선 블록체인과 이더리움이 무엇인지 살펴보겠습니다.
1. 블록체인(Blockchain)
가장 먼저 살펴볼 것은 블록체인 기술입니다. 블록체인은 본론부터 말씀드리면 모든 거래자의 전체 거래장부 공유 및 대조를 통해 투명한 거래를 보장하고 안전한 거래를 보장하는 보안기술 입니다. 쉽게 말해 데이터 분산 처리 기술로 네트워크에 참여하는 사용자 모두가 모든 거래내역등의 데이터를 분산, 저장하는 기술입니다. 이 때문에 블록체인은 '공공 거래 장부' 또는 '분산 거래 장부'라 불리기도 합니다. 블록체인에서 블록은 개인과 개인의 거래(P2P)의 데이터가 기록되는 장부 역할을 하게 됩니다. 이러한 블록들은 형성된 후 시간의 흐름에 따라 순차적으로 생긴 블록들과 연결되어 사슬(chain)의 구조를 가지게 되는데 그로 인해 블록체인이라는 이름이 붙게 되었습니다.
1-1 기존 거래와 블록체인과의 차이점
기존의 거래방식은 은행이 모든 거래 내역을 가지고 있습니다. 예를 들어 A가 B에게 돈을 송금한다고 하면 현재 금융 시스템에서는 은행이라는 중간 다리를 거쳐 B에게 돈이 전달 됩니다. 왜냐하면 A가 B에게 송금을 했다는 사실을 증명해야 하기 때문입니다. 따라서 안전하게 거래할 수 있도록 은행이 중간 역할을 하는 구조입니다. 블록체인 방식도 거래 내역을 저장하고 증명합니다. 하지만 기존 방식과는 달리 은행이 아닌 블록체인 네트워크의 이용자 모두가 저장을 합니다. 나중에 거래 내역을 확인할 때 블록으로 나누어진 저장된 데이터들을 확인하게 됩니다.
1-2 블록체인의 특징
블록체인은 분산저장을 한다는 점이 특징입니다. 기존 거래 방식에서 데이터를 위 · 변조하기 위해서는 은행의 중앙 서버를 공격하면 가능했습니다. 그러나 블록체인은 이용자 모두가 데이터를 저장하기 때문에 위 · 변조하기가 매우 어렵습니다. 블록체인 네트워크 참여자의 모든 거래 데이터를 바꿔야 하기 때문에 사실상 해킹은 불가능 하다고 여겨집니다. 그로 인해 공식적인 증명, 등기, 인증 등이 사라지게 되면서 중앙 관리자가 필요하지 않게 됩니다.
1-3 블록체인의 생성과정
※출처 : https://coinreport.net/tree-chains-vs-side-chains-controversy-explained/
위 그림처럼 블록체인에서의 각 블록은 이전 블록을 근거로 생성됩니다. (아래에서 위방향) 녹색은 최초의 블록으로 탄생 블록(Genesis Block)이며, 이 녹색 블록 없이 그 위에 블록을 반드는 것은 불가능 합니다. 따라서 각 블록들은 이전 블록의 정보를 가지고 있고 그것이 모여 체인을 이루게 됩니다. 검은색 블록은 해시파워(CPU Power)를 통한 경쟁에서 승리하여 블록 생성에 성공하고 실제 블록체인의 일부가 된 블록들입니다. 따라서 해당 블록안에 데이터는 해당 네트워크에서 '공유 지식'이 됩니다. 보라색은 경쟁에서 실패하여 블록체인의 일부가 되지 못한 고아가 된 블록으로 네트워크에 공유되지 못하며 폐기되어 버립니다.
의문점
만약 고아가 된 블록에 있던 거래 중 유실되는 거래가 생기지 않을까?라는 의문이 생길 수 있습니다. 어떤 거래가 보라색 블록에만 있고 같은 단계의 옆 검은색 블록에 포함되지 않더라도 결국 이후의 검은색 블록에는 담기게 되어있습니다. 왜냐하면 그 거래를 아직 블록체인에 포함되지 않은 거래들과 마찬가지로 취급하며 다시 블록에 추가하기 때문입니다. 탄생블록부터 경쟁에서 이긴 블록들로 이루어진 체인을 '주 체인(Main Chain)'이라 칭하며 이곳에 들지 못한 블록을 '탈락 블록(Orphan /Stale /Invalid Block)' 이라고 칭합니다. 주 체인상의 블록에 포함되어 있는 데이터 내역만 유효한 것으로 인정받게 됩니다.
※출처 : http://i.stack.imgur.com/HUZQ2.jpg
위 그림은 블록체인 내부를 들여다 본 모습니다. 각 블록안에는 데이터 집합이 있는데 각 데이터는 위와 같이 전자 서명을 통해 연결되어 있습니다. 이전 데이터가 없이는 이후의 데이터가 나올 수 없고 따라서 각 데이터는 모두 연결되어 있어 서로의 유효성을 증명하는 역할을 합니다. 이렇게 기존 내역을 근거로 불일치하는 내역이 있을 시 오류 처리가 됩니다. 아래의 그림으로 일반적인 블록체인의 거래 흐름을 확인해 볼 수 있습니다.
※출처: 매일경제 기사
1-4. 블록
블록은 블록 헤더와 거래정보, 기타정보 등으로 구성됩니다. 블록헤더에는 비트코인의 경우 version, previousblockhash, merklehash, time, bits, nonce로 구성되며 이더리움의 경우 uncle block, gas등의 개념이 추가가 됩니다. 거래정보에는 여려개의 거래가 포함될 수 있습니다. 실제로 비트코인의 블록 하나에는 평균 약 2000개의 거래 정보가 포함된다고 합니다.
1-5 작업증명
블록체인이 신뢰의 원천이 될 수 있는 핵심요소는 작업증명(Proof of Work) 입니다. 흔히 채굴이라고도 표현합니다. 블록헤더의 나머지 정보들은 블록 해쉬를 만드는 시점에서 값이 확정 되지만 nonce의 값은 새롭게 구해서 최종적으로 블록 해쉬 값을 구하고, 그 블록 해쉬값을 식별자로 가지는 유효한 블록을 만들어 내는 것이 작업증명, 즉 채굴이라고 합니다. 채굴로 nonce 값이 구해지는 자세한 과정 설명은 아래의 링크를 참조하세요.
이 nonce 값을 구하는 채굴 작업에는 엄청나게 많은 횟수의 해쉬 계산이 필요하며 그런 계산을 수행하는 채굴기와 그 채굴기를 돌리는데 막대한 양의 전기 비용이 발생하게 되는데 이런 비용에 대한 보상이 없다면 아무도 채굴을 하지 않을 것입니다. 따라서 비트코인에서는 보상으로 새로 발행되는 비트코인과 해당 블록에 포함되는 거래의 거래 수수료의 합이 주어집니다.
2. 이더리움
이더리움은 2013년 비탈릭 뷰테린 (Vitalik Buterin) 에 의해 고안되었으며 프로그래밍이 가능한 블록체인 (Programmable Blockchain) 을 구현한 웹 프레임워크로 확장된 분산 어플리케이션(dApp) 만들 수 있는 플랫폼입니다. 계좌 거래뿐만 아니라 다양한 분야 응용이 가능하여 각광받고 있는 기술입니다. 블록체인 2.0 시대를 표방하며 나온 혁신적인 개념의 기술입니다. 완전한 의미의 블록체인을 처음으로 활용하여 디지털 화폐인 거래할 수 있도록 만들어진 비트코인, 그보다 한단계 더 나아가서 화폐만의 기능이 아닌 신규도메인을 만들 수 있도록 권리를 대표하는 토큰의 기능까지 구현한 네임코인, 더 나아가 컴퓨팅 파워를 이중적으로 활용하는 프라임코인, 비트코인에 대표성을 입혀 화폐가 특정 자산을 대표할 수 있도록 설계된 컬러드코인으로 발전하면서, 이더리움은 블록체인을 하나의 데이터베이스로 보고 모든 자산을 올릴 수 있고 각 자산이 구동하거나 거래되는 방식까지 직접 프로그래밍할 수 있는 하나의 오픈 플랫폼으로 설계되었습니다.
2-1 비트코인과 이더리움의 차이점
몇년 전부터 지금까지 가상화폐가 크게 알려지게 되면서 가장 유명한 가상화폐인 비트코인은 많이 들어보셨을 것이라고 생각됩니다. 그 비트코인과 지금 사용하게 될 이더리움과는 무슨 차이가 있는지 알아보도록 하겠습니다. 비트코인의 스크립트 언어는 비교적 단순해서
비트코인이 화폐로서만 작동하게끔 구성되어 있습니다. 이를 비트코인의 튜링 불완전성(Turing-incompleteness) 이라고 합니다. 하지만 이더리움의 개발자 비탈릭은 비트코인의 스크립트 보다
더 세련된 언어를 구사하려고 시도하였으며 튜링 완전 언어를 통해 지금의 이더리움을 만든 핵심개념인 튜링 완전성(Turing-Comleteness) 을 구현하게 되었습니다.
튜링 완전 ?
튜링 완전 언어는 다음과 같은 정의가 내려집니다.
- 프로세스를 충분히 분할할 수 있을 만큼 작은 단위를 사용할 수 있어야 한다.
- 조건(if)과 반복(for,while) 명령어가 있어야 한다.
그 이유는 조건과 반복 명령이 있으면 문제를 풀 때까지 영원히 멈추지 않는 알고리즘을 설계할 수 있기 때문이라고 합니다. 비트코인의 스트립트 언어는 if, 즉 조건문만을 지원하며
자체적인 한계성도 지니고 있기 때문에 다양한 곳에 대해 응용 개발이 힘들었습니다. 하지만 이더리움은 튜링 완전 언어들(Solidity, Mutan, LLL, Serpent)을 지원하기 때문에 사실상 상상 가능한 모든 형태의 프로그래밍이 가능하다고 여겨집니다.
말이 약간 어려우므로 실생활에서의 예를 들어보겠습니다. 이 실생활에서의 예는 ( http://www.seunghwanhan.com/2015/06/ethereum-introduction_3.html ) 를 참고하였습니다.
앞에 물 컵이 있는 상황에서 뇌에서 명령이 떨어집니다. "저 컵의 물을 마셔라" 이 명령은 너무 구체적이고 특정적이어서 다른 곳에 응용할 수가 없습니다. 하지만 실제로 그 명령은 작은 여러가지의 명령어로 이루어져 쪼갤 수 있습니다. 눈으로 물 컵을 확인한다 > 뇌가 신호한다 > 손을 뻗는다 > 물 컵을 잡아 들어올린다 > 마신다 등 더 잘게 쪼갤 수도 있습니다. 이 경우 아래의 그림과 같아질 것입니다. ( 명령어의 분할 )
이렇게 잘게 쪼갤 수 있다면 각 과정의 중간 단계에서 반복이 가능해집니다. 손을 뻗는 동작만 반복할 수도 있고 마시는 동작을 반복할 수도 있습니다. 또한 응용성이 매우 높아집니다. "저 컵의 물을 마셔라"로 할 수 있는 행위는 한 가지지만 쪼개진 명령에서는 손을 뻗는 동작만을 분리하여 벨을 누를 때에도 운동을 할 때에도 사용할 수가 있게 됩니다. 아래는 반복과 응용을 한 그림입니다.
그 작은 명령 하나로도 위 그림처럼 모든 것을 실행할 수가 있게 됩니다. 이 것을 튜링 완전한 알고리즘이라고 합니다. 따라서 물만 마시는 것이 비트코인이었다면 어마어마한 범위로 응용이 가능하도록 만들어진 것이 이더리움이라고 할 수 있습니다.
2-2 특징
이더리움은 비트코인과 같이 화폐로서의 기능뿐만 아니라 프로그램 실행을 위한 기능이 추가되었습니다.
- 계정
비트코인과 동일하게 개인 키에 의해 통제되는 외부 소유 계정 (Externally Owned Accounts) 과 계약 코드에 의해 통제되는 계약 계정 (Contract Accounts) 로 구분됩니다.
- 통화 발행
초기에 약 72만 이더(ETH) 를 발행하여 투자 비용을 위해 사전 판매(62만 이더)하였으며 신규 이더의 발행률 비중이 '0' 이 되도록 매년 줄어들게 하였습니다. 이더는 이더리움 네트워크에서 사용되는 화폐 단위 입니다.
- 스마트 컨트랙트
미리 프로그래밍 된 계약(Contract)에 따라 자동으로 실행되도록 구현한 것으로 EVM(Ethereum Virtual Machine) 코드로 작성되었습니다.
- 분산 어플리케이션
이더리움의 EVM 에서 동작하는 분산 환경 기반 응용 프로그램입니다. 이더리움 네트워크의 자원을 활용하여 신뢰성, 안전성을 제공하고 서버 운영 및 보안을 위한 추가 비용이 발생하지 않는 장점이 있습니다. 하지만 프로그래밍 코드가 복잡할수록 수수료(Gas) 사용량이 증가하여
부담을 증가시킨다는 단점이 존재합니다.
2-3 GAS
이더리움 플랫폼에서는 이더(Ether, ETH)라는 자체 화폐토큰이 있고 가스(Gas)라는 연료로 사용해 이더리움이 Smart Contract를 하는 데 연산력과 저장공간 제공의 연료로 사용되게 됩니다. 이더리움은 EVM(Ethereum Virtual Machine)이라는 블록체인 환경에서 실행됩니다.
네트워크에 참여하는 모든 노드들이 블록을 확인하는 프로토콜의 일부로서 EVM을 실행하고 있습니다. 이렇게 노드가 서로의 증인이 되기 때문에 안전한 구조라고 할 수 있습니다.
EVM ?
EVM 은 이더리움의 핵심 개념중 하나입니다. 풀어서 설명하자면 이더리움 블록체인 네트워크의 노드들이 공유하는 하나의 가상머신으로 거대한 분산 컴퓨터라고 할 수 있습니다. 네트워크 상의 수 많은 노드는 이 거대한 가상 머신에 접근하여 가상 머신 내에 있는 자료들을 조회하고 변경할 수 있습니다. 하지만, 동시에 많은 사람들이 수정을 하게 된다면 충돌이 일어날것임은 분명합니다. 이런 충돌을 중재하는것이 EVM의 중요한 역할입니다. 이더리움은 이런 문제들을 예방하기 위해 일정 비용을 지불하게 설계하였습니다. 네트워크 이용자가 이더를 보내면 네트워크의 모든 노드들이 동일한 계산을 수행하고 동일한 값을 저장해야 하는 일련의 작업이 필요해지는데 이런 작업량을 GAS, 혹은 특정금액으로 환산되기 때문에 GAS Value라고 표현합니다.
또한 용어를 보시면 이더리움은 이름을 잘 지은 것을 확인해볼 수 있습니다. 이더는 영어로 Ether이고, 이건 우리가 알고 있는 석유화학물질 에테르입니다. 에테르는 유기용매로서 에테르 추출법을 실행하면 가스가 발생합니다. 그래서 이더도 거래에 사용하면 가스가 발생합니다.
GAS는 GAS Limit, GAS Price 라는 것이 있습니다. 모든 ETH거래에는 GAS Limit 와 GAS Price가 포함되어 있어야합니다. GAS Limit의 개념은 쉽습니다. 지금 사용자가 하려는 거래가 '작업'을 발생시킬텐데" 그 '작업'이 최대 몇 가스를 발생시킨다." 라는 작업량 예상치 입니다. Estimated 된 것이라서 송금창에서 수정도 가능합니다.GAS Price는 자유롭게 호가하는 것이라서 이용자가 직접 지정해야 합니다. 현재 모든 이더거래가 마이너들(Miners)에 의해 선택되기 때문에 사용자가 보내려는 GAS Price는 거래가 걸리는 시간에 영향을 미칩니다. 시간에 영향을 미친다는 뜻은 '작업'에 들어가는 비용은 정해져있습니다. 이 비용이 부족하면 아예 거래가 성사되지 않습니다. 그러나 비용이상 지불했다고 하더라도, Block GAS Limit을 초과시키는 GAS Limit은 거부될 수 있습니다. 예를 들어, 각 거래의 GAS Limit이 10, 20, 30, 40, 50 인 5개의 거래가 있다고 가정하면Block GAS Limit가 100 인 경우, 처음 4개의 거래가 블록에 맞을 수 있습니다. 마이너들은 블록에 포함할 거래를 "선택"적으로 조합합니다. 그런데 다른 마이너는 블록 (50 + 40)에서 마지막 두 개를 먼저 Transaction에 포함할 수 있으며, 그 경우 남은 공간에 첫 번째 Transaction(10)만 포함할 수 있습니다. 20과 30은 먼저 신청했더라도 Pending 됩니다. 그렇게 현재 Block GAS Limit를 초과시키는 거래는 네트워크에 의해 거부되고 사용자는 "거래가 Block GAS Limit를 초과하였다"라는 메시지를 받게 됩니다. 수익을 위해 최적화하는 마이너에게 GAS Price가 많이 낮거나, 0인 거래를 먼저 수락하도록 설득하기는 어려울 것입니다.
결론적으로 GAS Limit : 본 송금 '작업'에서 소비되는 가스량 (Estimated 한 수치라서 변경가능합니다. 하지만 너무 작게하면 거부될 수 있습니다.) GAS Price : 내가 가스당 지불할 가격 (경매처럼 내가 금액을 제안하는 것입니다.) 라고 할 수 있습니다.
이상 블록체인과 이더리움에 대한 설명을 마치고 후속으로 스마트 컨트랙트, dApp, 개발환경 구축하기를 진행하도록 하겠습니다.
'유용한 정보' 카테고리의 다른 글
Ethereum_dApp_2_스마트 컨트랙트와 dApp, 개발환경 구축하기 (0) | 2018.06.01 |
---|---|
Fabric에 대해 살펴보겠습니다.(2편) (0) | 2018.05.25 |
Fabric에 대해 살펴보겠습니다.(1편) (0) | 2018.05.16 |
웹 보안, 웹 취약점을 간단한 설정으로 막아보자 (0) | 2017.12.15 |
thymeleaf (server-side template engine) 사용법 정리 - 2 (0) | 2017.08.24 |