스마트 콘트랙트는 1996년 암호학자 닉 사보(Nick Szabo)에 처음 개념화되었다. 그는 스마트 콘트랙트에 대해 다음과 같이 정의했다.
"A smart contract is a set of promises, specified in digital form, including protocols within which the parties perform on these promises." 한마디로 정의하면 '자동화된 거래 규약'을 의미하며 계약의 이행방식을 모두 코드화시킨 것을 뜻한다.
원래의 계약 이행방식은 법과 제3의 기관을 통해서 이루어졌다. 당사자 간의 약속은 법과 공증을 통해 확인되었으며, 그것이 지켜지지 않았을 때는 사법기관이 개입하여 비용을 부담하게 했다(벌금, 금고형 등). 그런데 디지털 환경에서는 알고리즘으로 계약 파기자가 엄두도 못 낼 만큼의 비용을 감당하게 할 수 있다는 생각에서 스마트 콘트랙트가 출현했다.
스마트 콘트랙트 이해하기
스마트 콘트랙트는 이해하기 어려운 개념이 아니다. 특정 조건이 만족하였을 때, 제3자의 개입 없이도 자동으로 이행되는 것이 스마트 콘트랙트이다.
음료수 자동판매기를 생각해보면 이해가 쉽다. 1000원짜리 초코우유를 마시고 싶다고 가정하자. '1000원을 넣고' 내가 마시고 싶은 음료수를 '선택'한다는 조건을 모두 만족하면, 상품이 자동으로 나온다. 이 과정에서 개입한 제3자는 아무도 없다. 다만 블록체인과 자판기의 차이점은 현실 세계에는 이 자판기를 운영하는 사람이 있다는 것이다. 우리는 자판기 운영자가 제대로 된 상품을 넣어뒀을 것이라 믿고 그 기계를 이용하는 것이다. 1000원짜리 초코우유를 선택했는데 800원짜리 흰 우유가 나오는 낭패도 겪을 수 있다.
블록체인에서는 이러한 특정 운영 주체의 개입조차 없고, 1000원을 넣고 1200원짜리 바나나우유를 얻기 위해서는 엄청나게 많은 해킹 비용을 부담해야만 한다.
스마트 콘트랙트와 이더리움
이더리움이 특별한 이유는 튜링 완전한(Turing Complete) 스마트 콘트랙트를 블록체인상에서 구현해냈기 때문이다. 지금 우리가 사용하는 컴퓨터 수준의 연산을 할 수 있는 조건이라 보면 된다. 비트코인은 튜링 완전하지 않았다. 비트코인은 스택(Stack : 데이터를 쌓는 방식의 연산 기법) 기반의 스크립트 언어를 사용하며 바이트 단위인 OP-CODE(Operation Code)를 통해 명령이 실행되기 때문이다. 이는 원시적인 언어이며 간단한 작업만 수행할 수 있다. 이렇게 설계한 이유는 D-Dos(Distributed Denial of Service) 공격과 같은 반복 작업 공격으로 인해 전체 네트워크가 다운될 것을 방지하기 위함이었다. 그래서 비트코인에서 할 수 있는 것은 대체로 개인 키와 공개 키를 대조해보며 UTXO(Unspent Transaction Output) 사용이 정당한 트랜잭션인지 확인하는 것뿐이다. 반면 이더리움에서는 명령어의 분할이 가능하고 반복문을 사용할 수 있다. 덕분에 계약상으로 나타낼 수 있는 거의 모든 내용을 코드로 표현할 수 있게 되었다. 비로소 제대로 된 스마트 콘트랙트를 블록체인상에서 구현할 수 있게 된 것이다.
이더리움 스마트 콘트랙트의 작동 원리
이더리움에서 스마트 콘트랙트는 두 가지 역할을 한다. 블록에 데이터를 저장하거나, 저장된 상태를 변화시키는 것이다. 이는 크게 1) 스마트 콘트랙트 생성 2) 스마트 콘트랙트 실행 3) 이더 전송, 세 가지 임무를 수행한다.
좀 더 기술적으로 분해하여 보자. 이더리움에서는 대표적으로 Solidity라는 언어로 코드를 작성한다. 해당 코드는 solc 컴파일러(Solidity Compiler)를 통해 바이트 코드로 명령어가 입력되고 EVM(Ethereum Virtual Machine)에 의해 실행된다. EVM은 이더리움 위에서 실행되는 가상 머신이다. 이는 모든 노드에 연결되어 있으며 이더리움 블록체인을 유지하고 업데이트하는 역할을 한다. 이더리움 외부 소유 계정(Externally Owned Account, EOA)에서 가스(Gas)비를 이더로 지불하고 특정 코드를 실행시키면 위 작업을 거쳐 스마트 콘트랙트가 실행되는 것이다. 가스는 이더리움 네트워크를 이용하기 위해 지불하는 수수료인데, 같은 작업을 반복하며 서버를 다운시키는 공격을 예방해준다.
비트코인에서는 UTXO라는 디지털 증명서를 생성하고 삭제하는 방식으로 콘트랙트가 실행되었다면, 이더리움에서는 블록에 저장된 상태를 변화시키는 방식으로 작업이 이뤄진다. 쉽게 설명하자면, 현금을 이용하여 버스를 타다가 교통카드를 이용하는 것으로 비유할 수 있겠다. 비트코인에서는 현금을 주고받으며 잔금을 치렀다면, 이더리움은 계좌의 숫자 상태를 바꿔가며 거래를 하는 것이다. 이더리움이 더 많은 작업을 유연하게 실행시킬 수 있는 배경이다.
<참고자료>
ⅱ 이병욱, <<비트코인과 블록체인, 탐욕이 삼켜버린 기술>>, 에이콘 출판사, 2018.02.12, 176p
ⅲ https://en.bitcoin.it/wiki/Script
ⅳ http://www.seunghwanhan.com/2015/06/ethereum-introduction_3.html
ⅴ http://www.ethdocs.org/en/latest/introduction/what-is-ethereum.html#ethereum-virtual-machine