‘스마트 컨트랙트로 하면, 다 되는거 아니에요?’
얼마 전에 참석한 모임에서는 어김없이 블록체인에 대한 이야기가 나왔습니다. 특히 사람들의 관심사는 블록체인 기술의 활용사례였는데, 그 중 한 사람이 반려동물 인식표 시스템 개선을 블록체인으로 하는 것을 연구하고 있다고 말했습니다. 그래서 블록체인을 어떻게 적용할 수 있는지 묻자, 그 분은 ‘스마트 컨트랙트로 하면, 다 되는거 아니에요?’ 라고 답변하셨습니다.
안타깝게도 스마트 컨트랙트로, 무엇이든 다~되는 것은 아닙니다.
이날 집으로 돌아가는 길에 스마트 컨트랙트에 대해 설명하는 글을 작성해야겠다고 생각했습니다. 이번 글에서는 스마트 컨트랙트가 무엇인지, 어떻게 작동하는지 그리고 어떻게 사용되는지에 대해 설명합니다.스마트 컨트랙트란
서면으로 이루어지던 계약을 코드로 구현하고 특정 조건이 충족되었을 때 해당 계약이 이행되게 하는 script
- 스마트 컨트랙트 등장 배경
간혹 몇몇 분들은 스마트 컨트랙트라는 개념이 블록체인과 함께 등장한 것으로 알고 계시지만, 이는 사실이 아닙니다. 스마트 컨트랙트는 1994년 컴퓨터 공학과 법을 전공한 Nick Szabo라는 사람에 의해 처음 제안되었습니다.
그는 ‘Formalizing and Securing Relationships on Public Networks’라는 논문을 통해, ‘스마트 컨트랙트는 프로토콜 및 사용자 인터페이스를 사용하여 계약 프로세스의 모든 단계를 용이하게 한다. 이것은 기존 서면 계약 방식보다 훨씬 기능적인 디지털 계약을 사용할 수 있는 새로운 방법을 제공한다.’라고 주장하였습니다. 또한, 스마트 컨트랙트를 통해 기존 계약의 거래 비용 등을 줄일 것이라고 설명합니다.
그리고 2013년, 이더리움의 창시자인 Vitalik Buterin은 자신의 블로그에 ‘Ethereum: The Ultimate Smart Contract and Decentralized Application Platform’라는 백서를 공개하였습니다. 이때, Vitalik은 스마트 컨트랙트라는 개념을 이더리움 블록체인에 도입하였고, 실제로 이를 구현함으로서 본격적으로 스마트 컨트랙트가 사용되기 시작했습니다.
여기서 한 가지 흥미로운 사실!
작년에 Vitalik은 자신의 트위터를 통해 ‘스마트 컨트랙트' 명칭을 사용한 것을 후회하며, ‘차라리 persistent scripts’로 명칭할 걸 그랬다'는 의견을 밝히기도 했습니다. 참고로 이러한 Vitalik의 의견은, 스마트 컨트랙트라는 명칭이 지나치게 확대해석될 여지가 있다는 점 때문인 것으로 보입니다.
- 블록체인의 스마트 컨트랙트 개념
현재 블록체인에서 사용되고 있는 스마트 컨트랙트는, 서면으로 이루어지던 계약을 코드로 구현하고 특정 조건이 충족되었을 때 해당 계약이 이행되도록 하는 script에 가깝습니다.
스마트 컨트랙트를 활용하면 두 당사자가 서로를 모르거나 신뢰하지 않더라도 계약을 체결할 수 있습니다. 왜냐하면 특정 조건이 충족되지 않으면 해당 계약은 실행되지 않기 때문입니다. 그렇기 때문에 중개인 없이도 계약을 이행할 수 있다는 것이 스마트 컨트랙트의 특징입니다.
스마트 컨트랙트는 현재 이더리움 뿐만 아니라 많은 블록체인 플랫폼 위에서 구현되어 있습니다. 블록체인은 많은 감시자(witness)들을 가지고 있고 입력을 기반한 결과를 도출하는 플랫폼이다 보니, 스마트 컨트랙트라는 개념을 도입하기에 최적의 환경이었을 것으로 예측해볼 수 있습니다.스마트 컨트랙트 작동방식
대부분의 스마트 컨트랙트는 프로그래밍 언어를 토대로 만들어 집니다. 조건에 따라서 일정 금액을 지급하거나, 은행과 같은 제 3자 없이도 담보 대출 서비스를 제공할 수 있습니다. 즉, 스마트 컨트랙트는 조건에 맞는 정확한 작동을 수행하는 능력을 갖추고 있습니다.
그런데 안타깝게도 기존에 사용하던 프로그래밍 언어로는 이더리움에서 스마트 컨트랙트를 만들 수 없습니다. 대신 Solidity, Vyper와 같은 스마트 컨트랙트를 만드는 전용 언어로 논리적인 계약의 작동을 정의할 수 있습니다. 그리고 컴파일러를 통해 논리적인 계약의 작동을 바이트 코드로 변환하여 블록체인에 배포하게 됩니다.
이더리움 스마트 컨트랙트의 구체적인 작동방식은 다음과 같습니다.
- 스마트 컨트랙트로 구현하고자 하는 내용을 Solidity 등으로 구현합니다
- Solidity 코드를 컴파일 하여 네트워크에 배포할 수 있는 Bytecode를 생성합니다
- Transaction에 Bytecode를 담고, 마이너가 해당 Transaction이 담긴 블록을 채굴합니다. 이와 동시에 해당 Transaction은 블록체인 네트워크에 기록됩니다
- 유저는 ABI를 통해 배포된 스마트 컨트랙트 코드에 정의된 함수를 호출하는 Bytecode를 생성하고, Transaction에 담아 블록체인 네트워크에 전달합니다.
- 채굴자는 유저로부터 받은 Bytecode를 배포된 스마트 컨트랙트 코드에 따라 EVM(Ethereum Virtual Machine) 위에서 실행합니다. 이때, Gas Fee가 계산되면서 블록에 추가되고, 실행 결과가 유효한 경우 실행 결과가 State에 반영됩니다.
논리적인 계약의 작동을 Bytecode로 변환할 때에 Application Binary Interface(이하 ABI)라는 것을 같이 전달해 줍니다. 계약을 사용하고자 하는 당사자는 컴퓨터와 직접적으로 통신하지 않습니다. 키보드, 마우스, 모니터와 같은 입출력 장치를 통해 상호작용하기 때문에, 사람이 이해할 수 있는 단어로 인터페이스를 구성하여야 합니다. ABI라는 인터페이스를 이용하면, 사람이 이해할 수 있는 인터페이스를 만드는 작업을 좀 더 수월하게 할 수 있습니다.
스마트 컨트랙트와의 상호작용을 위해 ABI와 함께 대표적으로 Web3.js라는 라이브러리가 제공되는데, 스마트 컨트랙트에서 제공하는 함수들을 웹 브라우저에서 이용할 수 있도록 도움을 줍니다. 만약 Python에서 이를 이용하고 싶다면, Web3.py도 존재하며, 모바일 환경이라면 Swift와 Kotlin 구현체 등을 활용할 수 있습니다.
예제를 통해 배우는 스마트 컨트랙트
스마트 컨트랙트 자체는 Singleton 형태를 가진 Class와 동일합니다. 아래 스마트 컨트랙트는 Solidity 공식 문서에 나와 있는 간단한 경매 컨트랙트입니다. JAVA와 같은 OOP 프로그래밍 언어에서 볼 수 있었던 Class와 정말 유사하다는 것을 알 수 있습니다.
1) 생성자
기능 : 경매 시간 및 수혜자를 설정합니다.큼직 큼직하게 코드를 블록 단위로 보겠습니다. 17~23번째 줄을 보시면 생성자를 정의해 두었습니다. 인자로 들어오는 _biddingTime의 경우 현재로 부터 얼마동안 경매를 진행할 것인지 설정하며 _beneficiary의 경우 이 경매가 끝났을 때 수혜자를 설정하게 됩니다.
2) bid()
기능 : ETH를 이용해 경매에 참여합니다.그러면 이제 경매에 참여하기 위해서는 bid 라는 함수를 실행함과 동시에, Ether를 전송해야 합니다. 25~42번째 줄을 보시면, 현재 시간이 경매가 끝난 시간 이후인지를 확인하는 구문이 있으며, 함수를 실행하며 보내는 Ether가 가장 높은 가격인지 확인합니다.
기존 Database System에서는 여러 쿼리들을 묶은 것을 Transaction이라 부르는데요, 블록체인과 상호작용 하기 위해서 전송하는 통신의 단위 또한 Transaction이라 합니다. 특성 또한 완전히 동일하며, Transaction의 실행이 완전히 끝날 때 까지 Database에 변경 사항이 반영되지 않습니다. 만약 Transaction을 구성하는 쿼리가 하나라도 실패하면, Transaction은 실패한 것으로 간주하여 중간에 있던 변경 과정을 되돌립니다.
내부 논리적 구문에서도 볼 수 있듯, require() 내부의 구문이 성립하지 않는다면 전체 Transaction을 실패한 것으로 간주합니다! 해당 Transaction이 성공적으로 끝난다면, 기존 가장 높은 가격을 제시했던 입찰자는 pendingReturns라는 map 자료형에 저장될 것이고, 가장 높은 입찰가와 입찰 가격은 Transaction을 보낸 사람으로 설정될 것입니다.
3) auctionEnd()
기능 : 경매 가능한 시간이 지나면 경매를 종료하고 수혜자에게 ETH를 전달합니다.그렇다면, 설정된 시간을 지나 아무도 추가 입찰을 하지 않았다고 가정해 봅시다. 그렇다면, 누군가는 57~65번째 줄의 auctionEnd() 함수를 호출할 것입니다. 미리 스마트 컨트랙트에 설정된 수혜자(beneficiary)는 가장 높게 예치된 Ether를 전송받고 해당 계약은 종료됩니다.
4) withdraw()
기능 : 최고 입찰자가 아닌 경매 참여자들이 ETH를 인출합니다.이후에 최고 입찰자가 아닌 사람들은 44~55번째 줄의 withdraw() 함수를 호출할 것입니다. 별도의 시간은 검사하고 있지 않으니, 계약이 계속 지속되는 한 언제든 출금할 수 있습니다.
각각의 함수를 보셨을 때 이런 구문이 눈에 들어오지는 않으셨나요? 이는 Event라 불리는 것으로, 해당 함수가 잘 실행되었다는 의미로 로그를 남기기 위해 사용됩니다. Transaction의 결과로써 receipt라는 것을 전달 받는데, 이 receipt는 Event를 담고 있습니다. Transaction이 실패한 경우라면 Event는 기록되어 있지 않을 것입니다.
혹시나 이 스마트 컨트랙트의 업그레이드 버전을 보고싶으시다면, https://solidity.readthedocs.io/en/latest/solidity-by-example.html#id2 을 참고 하시면 되겠습니다.
스마트 컨트랙트, 왜 필요한가?
그렇다면 도대체 스마트 컨트랙트가 왜 필요한 것인지에 대해 알아보기 전에, 우선 스마트 컨트랙트의 특장점에 대해 정리해보도록 하겠습니다. 기술적인 관점에서 스마트 컨트랙트는 아래와 같은 대표적인 특징을 가지고 있습니다.
1) 누구나 컨트랙트를 배포할 수 있다.
2) 컨트랙트의 소유자가 아니더라도 누구든지 검증할 수 있다.
3) 코드의 실행을 자동화할 수 있다.
4) 위변조가 어렵다.따라서 스마트 컨트랙트는 투명한 거래 내역이 공개되어야 하고, 중개인 비용을 절감해야하는 곳 그리고 거래 수수료 비용을 감소해야하는 곳에 사용되는 것이 가장 적합합니다. 실제로 Etherscan이나 Decentralized Metadata and Source Code Repository를 통해 이더리움 메인넷과 테스트넷에 배포된 모든 contract를 누구든지 조회할 수 있습니다.
또한, 스마트 컨트랙트는 블록체인 상에 trustless한 네트워크를 구축하는데 효과적입니다. 만약 Alice가 매달 마지막 날에 Bob에게 $50를 전송해야한다고 했을 때, 은행이나 제 3자 신뢰할 수 있는 기관에 의존하지 않고서도 해당 계약을 이행할 수 있게됩니다.
스마트 컨트랙트, 어디에 쓸 수 있는가?
이더리움의 등장과 함께 스마트 컨트랙트는 다양한 곳에 활용되었습니다.
- Initial Coin Offering (ICO)
대표적인 사례로는 스마트 컨트랙트로 토큰을 제작해서 Initial Coin Offering(ICO)를 한 것이 있습니다. 이때 사용되는 대부분의 토큰은 ERC-20라는 규격을 따르는데, ERC-20는 EIP(Ethereum Improvement Proposal) 20에서 제안되었고, 토큰 스마트 컨트랙트 인터페이스의 표준을 정의하고 있습니다. EIP에서는 ERC-20 토큰이 따라야할 스마트 컨트랙트의 표준 규격 (토큰 전송, 교환, 권한 등에 대한 속성)을 정의하고 있습니다. 참고로 ERC는 Ethereum Request for Comment의 약자입니다.
토큰 세일을 스마트 컨트랙트로 진행하는 이유는 스마트 컨트랙트가 가지고 있는 정보가 블록체인 네트워크에 투명하게 공유하여 누구나 그 정보를 신뢰할 수 있기 때문입니다. 실제로 토큰 세일을 진행한 에어블록의 류원경 Director님의 경우 해치랩스와 인터뷰에서 아래와 같이 답변을 해주었습니다.
“스마트 컨트랙트를 이용하게 되면, 토큰 세일에 참여하시는 분들께 세일의 진행 상황이나 토큰 발행량, 판매량 등을 투명하게 공개할 수 있어 참여자분께 세일에 대한 신뢰를 드리는데 큰 도움이 된다고 생각합니다.”
- 게임 아이템
게임 아이템을 스마트 컨트랙트로 구현하고 유저의 소유권을 증명할 수 있다면, 아이템 거래도 암호화폐를 송금하듯이 손쉽게 주고 받을 수 있게 됩니다. 그렇게 되면 중개 서비스를 통해서 아이템을 거래할 사람을 찾거나 게임내에서 별도로 거래할 필요없이, 거래소를 통해 팔고 싶은 아이템을 원하는 가격에 손쉽게 거래할 수 있는 것 입니다. 이 때 스마트 컨트랙트는 특정 아이템과 매칭이 되어야하고, 1 ETH가 0.5 ETH로 나눠질 수 있는 것처럼 쪼개질 수 있으면 안됩니다. 이러한 특징을 반영해서 만든 스마트 컨트랙트 규격이 ERC-721과 ERC-1155입니다. 이 두 가지 기준을 따라 만든 게임 아이템의 경우, 개발사가 아이템을 소유하는 것이 아니라 개인이 소유하기 때문에 게임 개발사의 동의 없이도 해당 아이템을 외부 마켓 플레이스를 통해 거래할 수 있습니다. 또한 금융 상품의 소유권을 증명할 때에도 이러한 NFT(Non-Fungible Token)를 활용해볼 수 있습니다.
자금조달, 게임 아이템 이외에도 탈 중앙화 금융(De-fi), 월렛, 탈중앙화 거래소 등 다양한 분야에서 스마트 컨트랙트를 활용하고 있습니다.
스마트 컨트랙트의 한계점
그런데 스마트 컨트랙트는 기존 계약의 한계점을 완벽하게 해결하지는 못합니다.
스마트 컨트랙트는 블록체인 외부의 정보를 스스로 가져오지 못합니다. 즉, 어떠한 조건을 충족했을 때 코드로 구현된 계약이 이행되는 과정에서, 해당 조건 충족 여부 확인을 위해 특정 정보가 필요한 경우 문제가 발생합니다. 예를 들면, ‘이더리움의 가격이 100만원을 넘어가면, A가 B에게 1 ETH를 준다'는 스마트 컨트랙트를 만들었다고 가정해보겠습니다. 이 때, 이더리움의 가격이 100만원을 넘어가는지, 넘어가지 못하는지에 대한 데이터가 입력되어야만 스마트 컨트랙트가 작동하게 됩니다. 따라서, 블록체인 외부에 있는 암호화폐 거래소의 정확한 이더리움 가격 데이터를 가져왔을 때 해당 컨트랙트가 실행될 수 있는 것입니다.
그런데 블록체인 외부 데이터를 가져오는 과정에서 잘못된 데이터를 가져오거나, 고의로 잘못된 데이터를 입력하는 문제가 발생할 수 있습니다. 다시 말해서 스마트 컨트랙트가 실행되기 위해서는 특정 조건에 대한 정보를 가져와야하고, 이때 필요한 데이터를 가져오기 위해 제 3자에 의존해야