블록체인에서의 스마트 컨트랙트가 ‘제대로’ 작동되고 활성화되려면 우선 오라클(Oracle)이 무엇인지부터 파악해야 한다. 오라클을 설명하기에 앞서, 우선 오라클이 필요한 이유와 오라클이 없는 스마트 컨트랙트의 한계에 대해 짚고 넘어가 보자.
스마트 컨트랙트는 우리의 일상생활과도 맞닿아 있다
사용자 입장에서는 인터넷에서 편리하게 결제할 수 있는 간편결제 시스템, 구독 서비스, 배달 음식 주문 등은 스마트 컨트랙트와 흡사하다고 볼 수 있다.
표면적인 작동 원리로 예를 들자면,
A가 네이버에 등록되어 있는 B라는 가게에서 C라는 상품을 결제를 하려 한다. 네이버는 사용자가 B 가게에서 결제를 실행하면, 네이버의 DB에 사용자의 결제 정보가 입력되게 설정, 이후 사용자가 상품 결제 시 상품을 출고하게 해놓았다(조건). A가 결제 정보를 입력했을 시 B와 연결되어 있는 네이버의 DB에 A의 결제 정보가 입력된다. 이후 결제 정보를 입력한 A가 결제 행위를 하게 되고, 이 행위 바로 뒤에 결제가 되며 비로소 계약이 성사된다(계약 성사). 이것이 표면적인 스마트 컨트랙트의 작동 원리다.
작성한 ‘계약’에 따라 그 ‘조건’이 맞춰지면 자동으로 계약이 체결되어 다음 행위로 넘어가는 것이 스마트 컨트랙트다. 이 예시는 스마트 컨트랙트가 아니며 스마트 컨트랙트의 작동 원리 이해를 돕기 위해 기존 계약 시스템을 토대로 예를 든 것이다. 스마트 컨트랙트에 대한 아래의 자세한 설명을 만나보자.

*스마트 컨트랙트 – 1994년 닉 재보(Nick Szabo)가 제안한 개념으로, 사람이 일일이 실행해야 하는 기존의 계약서 대신 컴퓨터 언어로 계약서를 자동으로 실행할 수 있다는 개념을 제안했다. 참고로 닉 재보는 비트코인 창시자인 사토시 나카모토가 비트코인 백서를 만들 때 참조한 ‘비트 골드’의 창시자이다. 당시 닉 재보는 스마트 컨트랙트를 구현하기 위해 ‘비트 골드’를 고안했다고 알려져 있다.
스마트 컨트랙트는 1994년 당시에는 계약서의 복사 및 조작의 위험성 때문에 개념적으로만 머물렀지만, 이더리움(Ethereum) 덕분에 스마트 컨트랙트가 다시금 수면 위로 올라오게 되었다. 이더리움은 반복문(loop)을 사용할 수 없고 잔고만을 관리할 수 있는 블록체인 기반 최초의 스마트 컨트랙트인 비트코인(Bitcoin) 스크립트의 한계를 극복하기 위해 등장했다.
분산화는 성공했지만, 확장성은 없었던 비트코인 스마트 컨트랙트의 한계를 뛰어넘은 이더리움로 인해 스마트 컨트랙트의 제 3자가 필요 없는 계약의 신뢰를 구축할 수 있게 되었고, 우리가 알고 있는 블록체인 기반 스마트 컨트랙트가 완성되었다. 이더리움의 스마트 컨트랙트는 EVM(Ethereum Virtual Machine)이라는 가상 머신 위에서 작동하며, 솔리디티(Solidity)라는 스크립트 언어로 작성할 수 있다.
추가적으로, 비트코인의 스마트 컨트랙트에 사용되는 언어는 OPCODE 또는 Contract code라고 불리며, IBM이 개발한 프라이빗 블록체인(Private Blockchain)인 Hyperledger Fabric의 경우에는 Chaincode라고 불리는 프로그램으로 스마트 컨트랙트를 만들 수 있다.
블록체인 기반 스마트 컨트랙트가 뜬 이유는 무엇일까?
기존의 계약 시스템은 중개자가 필요하며 검증하는 주체가 한정되어 있고 조작의 위험성이 존재한다는 것이 단점이었다. 단일화되고 중앙화된 주체가 하는 행동에 대해서는 주체 이외의 그 누구도 내부를 감시할 수 없고 그 누구도 이 계약이 조작될 수 없다는 것에 대한 확정성을 보증하지 않는다. 사용자에겐 표면적으로 차이가 없는 듯 보이지만 그 안에는 기존 시스템은 중앙 기관에 대한 신뢰가 작용하고 있는 것이다.
블록체인 기반 스마트 컨트랙트는 기존 계약 시스템과는 다른, 서버의 분산화와 기록된 정보를 돌이킬 수 없는 불변성의 특징이 있다. 기존의 중앙화 된 주체는 조작 가능성이 존재했지만, 블록체인을 활용한 스마트 컨트랙트는 블록체인의 특징을 활용해 그 가능성을 낮출 수 있다. 분산된 서버로 인해 모든 네트워크 참여자가 스마트 컨트랙트에 관한 검증을 할 수 있다는 것이 블록체인 기반 스마트 컨트랙트는 기존에 우리가 경험하고 있던 계약 시스템과는 다른 점이라고 할 수 있을 것이다.
닉 재보는 스마트 컨트랙트를 “신뢰할 수 없는 네트워크 환경에서의 자동 계약 환경”이라고 칭했다. 분산화된 시스템을 통해 기존의 한계를 뛰어넘어 닉 재보가 말하는 스마트 컨트랙트가 블록체인의 분산화에 의해 구현 가능할 수 있게 되었다.
ICO도 스마트 컨트랙트를 활용한다
간단한 예로, 자금 모집의 수단인 ICO에서도 스마트 컨트랙트를 활용한다. ICO에 참여해본 적 있는가? 아래는 ERC-20 토큰으로 발행한 Link 토큰의 스마트 컨트랙트 주소다.
Contract: 0x514910771af9ca656af840dff83e8264ecf986ca
비트코인 이후, 비트코인을 제외한 거의 모든 프로젝트는 위처럼 스마트 컨트랙트 주소를 이용해 자금 모집을 하고 있다.
ICO Token Price: 1 Link = 0.11 USD (0.00038462 ETH)
Chainlink 프로젝트 토큰인 Link 토큰의 공시 금액을 표기하고 이더리움 혹은 비트코인으로 모금한다.
모금 시작 이후, 스마트 컨트랙트 주소로 들어온 이더리움, 비트코인은 투자자 각자의 입금 수량에 비례하여 미리 짜여진 스마트 컨트랙트를 통해 프로젝트의 지갑 주소에서 사용자 지갑 주소로 Link 토큰을 자동 전송한다. 스마트 컨트랙트에 따라 즉각 전송이 이루어질 수도, 모금 이후에 전송이 이루어질 수도 있으며 최소 모금 금액이 채워지지 않으면 반환하는 스마트 컨트랙트를 작성할 수도 있다.
pragma solidity ^0.4.16; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal constant returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
위는 Chainlink 스마트 컨트랙트 소스코드의 일부이다. 스마트 컨트랙트는 이렇듯 코드로 짜여진다.
스마트 컨트랙트로 활용할 수 있는 것들은 오라클이 없으면 무용지물이다.
그럼 처음 언급했던 스마트 컨트랙트를 ‘제대로’ 작동할 수 있게 하는 오라클은 무엇일까? 스마트 컨트랙트는 단지 계약 조건에 따라 무신뢰를 바탕으로 한 계약을 자동으로 체결하고 행위를 사람 대신 이행하는 것일 뿐이다. 스마트 컨트랙트를 자금 모집에 사용하게 해주는 것에 그치지 않고 공공기관, 물류, 제조업, 부동산 등 다양한 분야에 접목되어 쓰일 수 있게 만들어주는 것이 바로 오라클이다. 아래 예시를 읽고 쉽게 이해해보자.



- 나는 지하철을 타고 집에 가기 귀찮아서 강남역 11번 출구 앞으로 ‘타다’를 호출했다. 10분 뒤에 ‘타다’ 기사님이 오신다는 정보를 푸시 알람을 통해 접했다.
- 여기서 스마트 컨트랙트가 작동한 부분은 어떤 곳일까? ‘타다’ 입장에서 생각해보자. ‘타다’는 내가 강남역 11번 출구 앞으로 호출했을 때 자동으로 근처 기사님에게 호출 메시지를 보냈을 것이다.
- 10분 뒤에 ‘타다’ 기사님이 오시고 ‘타다’에 탑승했다. 기사님은 내가 탑승한 것을 확인하시고 ‘타다’ 앱으로 ‘탑승 완료’ 버튼을 누른다. 나의 휴대폰 ‘타다’ 앱에서는 ‘탑승이 완료되었습니다’라는 메시지가 떴다.
이 부분에서 계약 성사(‘타다’ 기사님이 호출한 곳으로 도착)와 이후 행동(기사님이 도착 정보를 입력한 곳으로 운전)이 발생한다.
- 오라클은 내가 ‘타다’를 탔다는 정보를 입력한 기사님이다. 무슨 말이냐고? 오라클은 스마트 컨트랙트에 들어갈 신뢰 있는 정보를 전달해주는 역할을 한다. 즉, 이 부분에서 오라클의 역할을 ‘타다’ 기사님이 ‘탑승 완료’ 버튼을 통해 실행하는 것이고, 이 버튼을 통해 입력된 내 탑승 정보가 ‘타다’의 DB에 기록이 되어 푸시 알람으로 나에게 메세지가 전송이 된 것이다.
오라클 역할을 하는 ‘타다’ 기사님이 없다면 나는 ‘타다’를 타고 집에 도착하지 못했을 것이다. 또한 내가 호출한 정보를 판단하며 그 호출을 토대로 출발 승인을 결정하는 행위가 없었다면 ‘타다’라는 서비스는 존립하지 못할 것이다. 간단히 말해서, 오라클은 스마트 컨트랙트에 활용성을 한껏 더해주는 역할을 하는 매개체라고 생각해볼 수 있다.
스마트 컨트랙트로 많은 것을 할 수 있다고? 천만에.
블록체인 입문자들이 가장 착각하기 쉬운 것은, 블록체인으로 해결할 수 있는 문제들이 많다고 생각하는 것이다. 물론 비가역성을 띠는 네트워크의 특성상 절대로 변하지 않아야 할 사건들의 기록에는 충분히 유용할 수 있고 해결할 수 있다. 하지만 앞서 말한 스마트 컨트랙트가 제대로 작동하기 위해서는 오라클이라는 것이 필수적이며, 오라클에서 발생하는 문제때문에 지금 블록체인이 해결할 수 있다고 말하는 다양한 목표들은 환상에 불과할 수 있다.
스마트 컨트랙트는 단지 계약 조건에 따라 무신뢰를 바탕으로 한 계약을 자동으로 체결하고 행위를 사람 대신 이행하는 것일 뿐이다.
1편은 간단한 스마트 컨트랙트, 오라클의 개념을 예시를 통해 알아보았다. 2편에서는 오라클의 개념에 대해 조금 더 자세히 알아보고 오라클의 종류에 대해서도 알아보도록 하자.