이더리움 백서 톺아보기 - 2편
비트코인과 비교했을 때 이더리움의 가장 큰 장접으로 스마트 컨트랙트를 꼽습니다. 하지만 이로 인해 비트코인에서는 스마트 컨트랙트가 불가능하다는 오해를 불러일으키기도 합니다. 여기서 확실히 알아두어야 할 것은 비트코인에서도 스마트 컨트랙트가 가능하다는 것입니다. 이더리움에 비해 스마트 컨트랙트의 기능구현이 미흡한 것이지 전혀 불가능한 것은 아닙니다. 이를 이해하기 위해 오늘은 비트코인에서 스마트 컨트랙트 구현이 가능한 스크립팅에 대해 살펴보도록 하겠습니다.
UTXO와 스크립팅 언어
별도의 확장 없이도 비트코인 프로토콜은 낮은 수준의 "스마트 컨트랙트"의 개념을 가능하게 할 수 있다. 비트코인의 UTXO는 공개키만으로 획득할 수 있을 뿐만 아니라, 단순 스택-기반 프로그래밍 언어로 표현되는 더 복잡한 스크립트로도 획득할 수 있다. UTXO를 지출하는 거래는 그 스크립트를 만족하는 데이터를 제공해야만 한다. 사실 기초적인 공개키 소유권 메커니즘도 스크립트를 통해 실행된다.
- 이더리움 백서 -
비트코인에서 사용하는 거래의 기본 단위는 UTXO(Unspent Transaction Outputs)입니다. 아직 사용되지 않은 트랜잭션 출력이라는 의미의 UTXO에는, 개인이 가지고 있는 비트코인 잔고를 하나가 아니라, 아직 사용하지 않은 잔고를 여러 개로 기록합니다.
예를 들어, 내 은행 계좌의 잔고가 100만 원이 있다면 잔고 내역이 100만 원으로 기록됩니다. 하지만 비트코인 시스템에서는 아직 사용하지 않은 잔고 20, 30, 50만 원으로 기록됩니다. 이렇게 나누어진 데이터를 가지고 비트코인에서 스마트 컨트랙트를 작성할 수 있습니다. 여기서 우리는 잔고 100만 원으로 스마트 컨트랙트를 작성하는 것보다 20, 30, 50만 원으로 나누어진 데이터로 스마트 컨트랙트를 작성하는 게 더 복잡하고 어렵다는 것을 발견할 수 있습니다.
비트코인에서 사용 가능한 스마트 컨트랙트 기능을 이더리움 백서에서 이렇게 소개하고 있습니다.
예를 들어, 주어진 세 개의 개인키 가운데 두 개로부터 서명을 받아야만 승인이 되도록 스크립트를 짤 수 있다. 이런 스크립트는 회사 계정, 보안 저축 계정, 상업 공탁 상황 등에 유용하게 쓰일 수 있다. 스크립트는 또한 어떤 계산 문제의 답에 대한 포상금을 지불하는데도 쓰일 수 있다. "만약 당신이 이 액면가의 도지코인 거래를 나에게 보냈다는 SPV 증명을 제공한다면, 이 비트코인 UTXO는 당신 것이다"라는 식으로 말하는 스크립트를 짤 수도 있다. 즉, 근본적으로 탈중앙화된 상호-암호화폐 교환을 가능하게 한다.
- 이더리움 백서 -
비트코인에서 다중 계약을 활용한 회사의 저축 계좌, 회사 간의 자금 보관 등의 스마트 컨트랙트 구현이 가능합니다. 또, 어떠한 조건을 제시하고 해당 조건이 맞을 경우 자동으로 포상금을 지불하는 스마트 컨트랙트의 구현도 가능합니다.
정리하자면, 비트코인에서도 자동으로 자금 이체, 전달, 보관 등의 기본적인 스마트컨 트랙트 기능을 활용할 수 있다는 것입니다. 다만, 비트코인에서는 스마트 컨트랙트 구현 시 UTXO를 기반으로 해야 한다는 제한이 있습니다. 이것이 비트코인과 이더리움에서의 스마트 컨트랙트 기능구현에 있어서 가장 큰 차이를 가져오는 것입니다. 이러한 기본적인 제약사항으로 인해 스마트 컨트랙트 구현의 편의성 및 활용성에서 이더리움에 비하여 한계가 존재합니다. 그럼 지금부터 그 제약사항에 대해서 살펴보도록 하겠습니다.
튜링 불완전성: 비트코인 스크립트 언어로 할 수 있는 작업이 많긴 하지만, 모든 경우의 프로그래밍을 다 지원하지는 않는다. 특히 while이나 for와 같은 순환(loop) 명령 카테고리가 빠져 있다. 순환 명령어를 없앤 이유는 거래 증명을 할 때 무한 순환에 빠지는 것을 막기 위해서 였다. 이론적으로는 이건 스크립트 프로그래머가 극복할 수 있는 장애물이기는 하다. 왜냐하면 어떤 순환 명령이든 단순히 하위 코드를 여러 차례 if 구문과 함께 반복함으로써 구현이 가능하기 때문이다. 하지만 이것은 아주 공간 비효율적인 프로그램이 된다. 예를 들어 대안 타원곡선서명 알고리즘을 실행하려면 코드 안에 있는 곱셈을 모두 개별적으로 256번 반복하는 것이 필요하다.
- 이더리움 백서 -
첫 번째로 언급되는 비트코인에서의 제약사항은 튜링 불완전성입니다. 일반적으로 컴퓨터 프로그래밍의 가장 큰 특징은 반복문입니다. 반복문은 어떠한 반복적인 행위를 하는 동작이나 행위를 자동으로 구현해 주는 프로그래밍의 기법입니다.
예를 들어 1에서 10까지 덧셈을 한다면 1+2+3+4+5+6+7+8+9+10과 같이 계산을 할 수도 있지만, 일반적으로 컴퓨터 프로그래밍에서는 반복문을 사용해서 1부터 10까지 다 적지 않고 “처음 숫자는 1, 마지막 숫자는 10, 그리고 차례대로 1부터 10까지 덧셈을 계산하세요!” 등의 명령어로 축약해서 표현합니다.
1에서 10까지 덧셈하는 건 모두 적을 수 있겠지만 1부터 100까지 더해야 한다면 굉장히 불필요한 공간과 시간을 낭비하게 됩니다. 그래서 대부분의 규칙이 있는 반복적인 작업에는 반복문을 사용해서 프로그래밍합니다. 즉, 반복문의 사용은 프로그래머가 프로그래밍을 효율적이고 작성된 코드를 다른 사람들이 쉽게 이해할 수 있는 언어로 표현하는 행위라고 볼 수 있습니다. 반복문의 사용이 가능한 걸 튜링 완전언어라고 표현하고, 그 반대를 튜링 불완전언어라고 표현합니다. 요약하자면 비트코인에서는 반복문 사용이 불가능하고 이더리움에서는 반복문 사용이 가능하다고 할 수 있습니다.
가치무지 - UTXO 스크립트만으로는 인출 액수를 세밀하게 통제할 방법이 없다. 예를 들어, 신탁 계약의 강력한 실용 사례라 할 수 있는 헷지 계약을 살펴보자. A와 B가 $1000의 상당의 BTC를 공동계좌에 입금했다고 하자. 시간이 지나면 비트코인의 가격이 오를 수가 있다. 두 사람은 30일 후 자동으로 A가 $1000 상당의 BTC를 받고 B는 공동계좌의 나머지 잔액을 받는 그런 계약을 맺고 싶다. 하지만 이 계약은 1BTC가 미국 달러로 얼마인지 정해줄 제3자를 필요로 한다.
만약 이런 계약이 실현 가능하다면 지금 현존하는 완전 중앙집권적인 금융 시스템 아래에서도 고도로 발전된 계약 형태라고 볼 수 있다. 하지만 UTXO 는 인출액 전부가 송금되거나 말거나 밖에 선택할 수가 없다.
즉, 세부 작은 단위로 나눠질 가능성을 포함할 수 없는 것이다. 앞서 예를 든 계약 거래를 실행할 유일한 방법은 변하는 UTXO의 액면가 단위를 아주 다양하게 양산하고(예를 들어 1부터 30까지의 모든 자연수 k에 대해 2의 k승의 1 UTXO를 만듦), A가 B에게 이중에서 필요한 금액에 맞는 것을 선택해서 보내게 하는 방식과 같이 매우 비효율적인 편법을 사용하는 길 뿐이다.
- 이더리움 백서 -
비트코인 잔고의 특징은 UTXO입니다. 이더리움 백서에서 소개된 $1000 상당의 BTC는 $100, $500, $400 세개의 UTXO로 구성되어 있을 수 있습니다. 문제는 위의 예에서 설명된 헷지 계약의 이익을 B가 받을 양은 $1,000정도의 BTC라면 대략적으로 $10 정도로 예상해 볼 수 있습니다.
문제는 해당 컨트랙트에 포함된 BTC에는 $10의 UTXO단위가 없다는 사실입니다. 즉, 스마트컨 트랙트로 위와 같은 헤지상품을 비트코인의 스크립트 언어를 활용해서 만든다면 작은 단위의 이자나 세분화된 금액의 분할할 수가 없습니다. 이는 비트코인 언어의 스크립트 언어의 한계 그리고 UTXO의 특성으로 발생하는 문제입니다.
애초에 비트코인은 스마트 컨트랙트로 활용할 수 있는 플랫폼을 고려한 것이 아니라, 디지털자산의 안전한 보관과 전송을 위해서 만들어졌기 때문에 보안성과 사용성을 고려해서 불필요한 부분은 최대한 제한시켰습니다. 결국 이러한 특징이 다양한 금융상품을 비트코인 시스템 위에서 운용하는 건 어렵게 만들었습니다.
위의 2가지 가장 큰 제약사항 이외에도 이더리움 백서에서는 비트코인 스크립팅 언어의 한계로 상태표현 제한과 블록체인 무지에 대해서 이야기하고 있습니다.
상태표현제한은 UTXO가 표현할 수 있는 상태는 사용되었거나 그렇지 않거나하는 두 가지 제약사항이 있습니다. 이러한 특징으로 인해서 다중계약이나 스크립트를 만드는 게 어렵고, 분산화된 환전거래나 이중 암호 실행프로토콜 같은 다중 조건 계약을 어렵게 하고 있습니다.
블록체인 무지의 경우는 UTXO에서는 논스(nonce), 타임스탬프, 이전블록해시 같은 블록체인에 기록된 자료를 읽지 못합니다. 이러한 한계는 다양한 애플리케이션을 만드는데 많은 한계를 보여주고 있습니다.
정리하자면 비트코인에서도 UTXO와 스크립트 언어를 활용해서 간단한 형태의 스마트 컨트랙트 구현이 가능하다는 것입니다. 그러나 UTXO의 특징과 단순한 형태의 코딩만 가능한 스크립트 언어의 한계로 인하여 다양하고 복잡한 형태의 스마트 컨트랙트 프로그램 구현은 불가능한 것이 비트코인의 현실입니다. 이는 비트코인이 다양한 애플리케이션을 위한 플랫폼이 아니라 디지털자산의 저장, 교환, 유통을 위한 목적으로 만들어졌기 때문입니다. 이러한 목적에서 발전시킨 형태를 구현하고자 한 것이 이더리움입니다. 즉, 이더리움은 비트코인에서는 제약이 많았던 스마트컨트랙트의 기능을 개선하고 블록체인을 활용한 다양한 탈중앙화된 애플리케이션 플랫폼을 만들려고 하였습니다. 이것이 비트코인과 이더리움의 가장 큰 차이입니다.