Ethereum and very Smart-Contract
스마트 컨트랙트, 이더리움, 탈중앙화 애플리케이션의 관계성에 대하여
스마트 컨트랙트란?
온라인 상 계약이다. 계약자 갑은 ‘을이 갑의 집에서 1시간 일을 하면, 갑은 을에게 99이더를 송금한다.’라는 스마트 컨트랙트를 생성했다고 가정하자. 해당 거래에 입력되는 데이터는 거래조건(노동), 송금액(99이더), 이더 계좌(을의 계좌)를 포함한다.
이 거래 데이터는 암호화(hashing)된 상태의 스크립트 코드로 ‘블록’에 담아 저장된다. 그리고 이 활동은 해당 서비스를 제공하고 있는 이더리움을 통해 이뤄진다. 여러 개의 블록(=거래데이터) 들이 연결(혹은 축적)된 것이 블록체인이며, 블록은 한 번 형성하면 수정할 수 없기 때문에 거래의 실효성을 갖는다.
그리고 이 스마트 컨트랙트 계약서는 계좌 비밀번호, 인증키, 개인키 등 계약자의 보안정보를 갖지 않는다. 오직 입력값(거래내용과 송금액)과 출력값(송금 받을 계좌와 출금액)만으로 구성된다. 이 때 CA는 갑의 계좌가 될 수 도 있고, 을의 계좌가 될 수도 있다.
이후 을은 갑의 집에서 1시간 일을 하여 계약내용을 이행한다. 그러면 갑은 ‘계약내용을 이행함’이라는 추가적인 데이터 메세지를 전송한다. 이 때도 블록에 담아 데이터를 전송하고, 이 블록은 계속해서 블록체인에 추가된다. 이것을 상태변환이라 한다. 메세지 코드를 통해 계약이행이 확인되면 ‘을이 갑의 집에서 1시간 일을 하면, 갑은 을에게 99이더를 송금한다.’라는 코드가 자동으로 수행되고, 을의 계좌에 99이더가 송금된다. 계약자 갑의 계좌에는 100이더가 출금되는데 99이더는 을의 계좌로 송금되고 나머지 1이더는 블록을 사용한 수수료로 채굴자에게 지불한다. 수수료는 이더리움에서 유의미한 스마트 컨트랙트를 생성, 배포, 사용한 대가이다.
*스마트 컨트랙트의 내용에 따라 로직은 상이할 수 있다. 해당 내용은 앞서 작성한 예시에 따라 발생하는 거래를 서술하였다.
이런 식으로 계약자 갑과 을은 제 3의 계약보증인 없이 블록체인을 통해 거래를 형성하고, 거래의 유효성을 확보하며, 이행 후에 거래를 완료한다. 거래 데이터는 스크립트 코드로 작성되기 때문에 다양한 조건과 실행 내용으로 얼마든지 바꿀 수 있다. 여러 댑 서비스로 개발될 수 있으며, 이것이 블록체인이 상용화 가능성을 높게 평가한다. 비트코인과 다르게 재무거래 이상의 활동들을 구현할 수 있다. 이러한 분산 컴퓨팅 기술기반의 데이터 위변조 방지 기술을 블록체인이라 하며, 일련의 블록(데이터)로 형성된 P2P 네트워크상의 계약이 스마트 컨트랙트이다. 스마트 컨트랙트 메커니즘을 활용한 서비스들을 탈중앙화 어플리케이션 (DApp, Decentralized application)이라고 부른다.
그렇다면 비트코인은 무엇이고 스마트 컨트랙트, 이더리움은 어떤 관계를 지닌 것인가?
스마트 컨트랙트가 등장하기 전, 그러니까 본격적인 블록체인 기술을 다양한 서비스에 상용화하기 전 입출금 거래만 가능했던게 블록체인 1세대, 비트코인이다. 비트코인 거래를 담은 코드는 스마트 컨트랙트에 비해 단순하고, 계약에 명시되는 UTXO(Unspent transaction output)의 상태가 ‘사용됨/사용되지않음(거래성공/거래실패)’와 같이 1차원적으로만 나타난다. 이는 익명성과 보안성의 장점을 지녔지만 매번 거래가, 즉 UTXO가 발생할 때마다 수수료를 지불해야 하는 단점이 있다.
스마트 컨트랙트 개발자는 재무거래에 제한된 비트코인의 한계를 극복하려 했다. 그리고 솔리디티라는 계약 지향 프로그래밍 언어를 개발하여 보다 복잡하고 정교한 코드 작성을 가능하게 했고, 마침내 블록체인 2세대인 ‘스마트 컨트랙트’를 만들었다.
결과적으로 스마트 컨트랙트는 금융, 신원관리, 의료, 정부행정, 보험 등 보다 넓은 범위로 블록체인 기술을 확장시켰다. 그리고 각각의 스마트 컨트랙트 기반 서비스가 다양한 탈중앙화 어플리케이션(DApp)을 통해 제공되고 있다. 스마트 컨트랙트는 이더리움 플랫폼을 통해 사용되고 있으며, 이는 곧 이더리움을 통해 댑을 이용하는 것이다. 이더리움을 애플의 앱스토어, 안드로이드의 플레이스토어 쯤으로 생각하면 이해하기 쉽다.
그럼 사용자는 스마트 컨트랙트를 사용하는 것일까?
이더리움? 혹은 댑을 사용하는 걸까?
사용자가 인터페이스에서 마주하는 서비스는 댑이다. 그리고 댑에서의 활동들이 곧 스마트컨트랙트를 생성하는 것이다. 그리고 이러한 스마트 컨트랙트와 블럭을 제공하고 저장하는 곳이 이더리움이다. 댑은 스마트 컨트랙트를 활용한 어플리케이션이다. 사용자는 이더리움 계정과 연결하여 이더리움 화폐인 이더를 지불해 서비스를 이용한다. 댑을 이용하면서 발생시키는 모든 활동이 곧 스마트 컨트랙트를 생성하고 이행하는 과정이다. 그렇기 때문에 사용자는 댑을 이용함과 동시에 이더리움을 이용하는 것이다.
그리고 사용자는 스마트 컨트랙트를 생성하기 위해 이더리움에 일정 수수료를 지불한다. 이더리움에서는 이더(Ether)라는 자체 화폐토큰으로 거래한다. 그리고 스마트 컨트랙트를 생성하는 이더리움의 메인 어플리케이션인 가스(GAS application)을 구입해야한다. 즉 이더리움 플랫폼을 이용한다는 것은 이더로 거래하고, 가스를 통해 스마트 컨트랙트를 생성하며, 그리고 이더리움 계좌를 통해 이더의 입출금을 관리하는 것이다. 물론 훨씬 더 복잡한 과정이 있겠지만 이 정도로 간단하게 이해했다.
사용자는 개인정보를 입력해 이더리움에 가입하면 두 개의 계정이 생긴다. 외부소유계정(Externally Owned Account, EOA)과 컨트랙트 계정(Contract Account, CA)이다. 두 개의 계정 중 EOA가 상위 계정이고, 새로 생성되는 거래는 모두 EOA에서 시작한다. 이더 화폐를 입출금하는 일반적인 은행 계좌와 비슷하다. 반면 CA는 코드에 의해 통제되는 계정이다. EOA 에서 스마트 컨트랙트를 생성하여 계약코드를 CA에 걸어 놓으면 계약 코드의 조건이 만족될 때 CA가 메세지를 받고 계약 내용을 이행한다. 스마트 컨트랙트를 생성하기 때문에 EOA 는 개인키를 사용해 전자 서명 정보를 확인한다. 반면 CA는 EOA로부터 받은 메세지에만 응답하기 때문에 스마트 컨트랙트를 수행하는 역할만 할 수 있다. 자체적인 거래 생성이 불가능하다.
앞에서 든 예시를 다시 활용해 설명하자면, 계약자 갑은 갑의 EOA로 ‘을이 갑의 집에서 1시간 일을 하면, 갑은 을에게 99이더를 송금한다.’라는 스마트 컨트랙트를 만들어 서명하고 블록에 포함시킨다. 그리고 을의 CA는 이를 저장한다. 이후 을은 갑의 집에서 1시간 일을 하여 계약내용을 이행하고, 갑은 ‘계약내용을 이행함’이라는 추가적인 메세지를 전송한다. 메세지를 전송받은 을의 CA는 스마트 컨트랙트를 수행하고, 을의 EOA에는 99이더가 입금된다.
이처럼 스마트 컨트랙트를 직접적으로 수행하여 이더를 송금할 때 사용하는 계정은 CA이다. CA계정에 저장된 거래는 거래 조건이 만족할 시 자동으로 거래가 이행되기 때문에 어떤 이도 이 프로세스를 중단시킬 수 없다. 그리고 스마트 컨트랙트를 새로 생성하고, 실제로 이더가 입출금되는 본 계정은 EOA이다.
앞선 예를 다시 살펴보면, 계약 내용은 ‘을이 갑의 집에서 1시간 일을 하면, 갑은 을에게 99이더를 송금한다.’지만, 갑의 EOA에서는 100이더가 출금된다. 99이더는 을의 EOA로 송금되고 나머지 1이더는 블록을 사용한 수수료로 채굴자에게 지불한다. 스마트 컨트랙트가 작동할 때 사용된 블럭의 수에 따라 수수료가 책정된다. 많은 사용자들이 댑을 이용하기 위해 스마트 컨트랙트를 생성한다. 이것이 곧 어플리케이션 속 활동이고 다양한 형태로 나타날 수 있다. 예를 들어 게임 댑을 개발하여 캐릭터가 레드포션을 마시면 hp를 올리는 것도 하나의 스마트 컨트랙트가 된다.
생성한 스마트 컨트랙트를 유의미하게 만들기 위해 데이터를 담을 블록을 이더리움 플랫폼으로부터 제공받는다. 채굴자는 말그래도 블록을 채굴하여 제공하는 이더리움의 기능이다. 사용자는 블록을 구매해야 스마트 컨트랙트를 블록에 담을 수 있고, 블록체인을 만들면서 유효한 계약을 생성할 수 있다. 생성과 이행(동작)은 별개의 문제이다.
english translation very soon 👀