스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

스마트 컨트랙트의 역사

스마트 컨트랙트의 개념은 1994년 닉 재보(Nick Szabo)에 의해 만들어졌다.
닉 사보는 스마트 컨트랙트를 다음과 같이 정의했다.

"계약 조건을 실행하는 전산화된 트랜잭션 프로토콜"은 "일반적인 계약 조건을 만족하고,
 악의적이거나 우발적인 예외를 최소화하며, 신뢰할만한 중개자의 필요성을 최소화하는 것"을 목표로 한다.

비트코인 등장

스마트 컨트랙트를 실제로 지원하기 시작한 첫 화폐는 2009년 출시된 비트코인이다.

비트코인이 스마트 컨트랙트를 지원할 수 있는 핵심적인 이유는 비트코인의 핵심 기술인 블록체인이
디지털이며, 위조를 방지할 수 있고, 제삼자가 필요하지 않기 때문이었다.

비트코인의 경우 오피코드(opcode)를 사용해 화폐 거래를 위한 제한적인 스크립트만을 작성할 수
있었기 때문에 프로그램 구현 시 제약이 많았다.
오피코드(opcode) : 비트코인에서 스마트 컨트랙트를 동작시키는 연산들의 집합

이더리움 등장

2015년에는 프로그래밍 가능한 스마트 컨트랙트를 위한 블록체인인 이더리움이 등장하였다.

이더리움에서는 솔리디티(Solidity)라는 언어를 통해 스마트 컨트랙트를 위한 코드를 작성하고,
EVM(Ethereum Virtual Machine)을 통해 이더리움 블록체인 위에서 코드를 실행시킬 수 있었다.

스마트 컨트랙트의 장점

  • 보안
    • 한번 스마트 컨트랙트 코드가 블록체인 네트워크에 올라가면 모든 노드가 스마트
      컨트랙트 내용과 이행 결과를 가지게 된다.
    • 계약에 대한 중앙화된 공격 지점이 없고, 누군가에게 뇌물을 주고 계약 내용이나
      결과를 변조할 위험이 없다.
  • 신뢰성
    • 스마트 컨트랙트 로직이 조건에 부합해 계약이 이행되면 블록체인 네트워크에 있는
      노드들에 의해 여러번 수행되고 검증되기 때문에, 위변조가 매우 어렵고 정확성이 높다.
  • 공평함
    • 계약 조건을 공유하고 강제하기 위해 분산화된 블록체인 네트워크를 사용하기 때문에,
      수수료를 가져가는 등 영리적 목적의 중개자가 필요하지 않습니다.
  • 효율성
    • 계약 이행을 자동화하기 때문에 계약 당사자들은 수동으로 데이터를 입력하거나, 상대방의
      계약 의무 이행 여부 검증하거나, 중개자가 계약을 집행하는지 확인할 필요가 없다.

트랜잭션 구조

스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

  • 트랜잭션 버전(Transaction Version)
    • 네트워크에서 트랜잭션의 유형을 지정하는 버전 번호이다.
  • 잠금 시간(Lock Time)
    • 마지막 데이터로, 트랜잭션을 블록체인에 바로 포함시킬 수 있는지를 정한다.
  • 입력(Inputs)과 출력(Outputs)
    • 출력은 잠금(lock)과 값(value)으로 구성되어 있다.
    • 입력은 포인터(pointer)와 해제 키(unlocking key)가 들어있다.
    • 포인터는 이전 트랜잭션의 출력을, 키는 이전출력을 해제하는데 사용된다.
    • 출력은 가본적으로 잠겨있으며, 입력에는 잠금을 해제할 수 있는 키(key)가 들어있다.

입력에 의해 생성된 후, 다른 입력에 의해 해제되지 않은 트랜잭션 출력을 UTXO라고 한다.

비트코인 스크립트

비트코인에서는 스크립트(Script)라는 스크립터 언어를 사용해 스마트 컨트랙트를 구현한다.
간단한 연산 목록으로 구성되어 있으며, 스크립트에서 사용하는 연산들은 opcode에 해당하고
이 연산들은 C++로 작성되어 있다.

이 스크립트 실행을 통해 비트코인의 송금이 이루어지고, 이러한 특징으로 인해 비트코인은 프로그래밍
가능한 화폐(programmable money)에 대한 대중성을 부여했다고 볼 수 있습니다.

스크립트 동작원리

스크립트는 역폴란드 표기법(reverse polish notation)으로 작성된 스택 기반 튜링 불완전 언어이다.
스크립트 프로그램은 두 종류의 객체를 가지고 있다.

opcode: 덧셈, 뺄셈, 곱셈과 같은 연산 작업을 나타낸다.
데이터: OP_CODE가 아닌 모든 데이터는 원시 데이터로 해석되며, 스택에 들어가게 된다.

노드가 네트워크로부터 새로운 트랜잭션을 받으면, ScriptSig와 ScriptPubkey 필드를 추출하여 연결하여 최종적으로 <ScriptSig><ScriptPubkey> 형태의 스크립트를 얻게 된다.

스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

  • 스크립트는 이 opcode와 DATA를 일렬로 늘어놓은 것이다.
  • 포인터(pointer)는 일렬로 늘어진 opcode와 데이터를 순서대로 하나씩 가리킨다.
  • 포인터가 데이터를 가리키면 데이터를 스택에 넣고, opcode를 가리키면 스택에서 데이터를 꺼내온다.

비트코인 스마트 컨트랙트의 한계

비트코인은 확장성이나 성능 등의 한계가 존재했다.
비트코인의 단점을 극복하기 위한 다양한 플랫폼과 프로젝트가 존재한다.

라이트닝 네트워크(Lightning network)

라이트닝 네트워크에서는 트랜잭션 내용은 블록체인 외부에 저장하고, 트랜잭션의 최종 결과만 블록체인에 올린다. 트랜잭션이 블록체인 바깥에서 이루어지기 대문에 트랜잭션이 처리되기까지 대기 시간이 필요하지 않아 즉시 처리된다.

루트스탁(Rootstock, RSK)

루트스탁은 비트코인에 스마트 컨트랙트 기능을 탑재하는 사이드체인 프로젝트이다.
이를 통해 비트코인 네트워크에서도 튜링 완전한 스마트 컨트랙트를 실행할 수 있게 되었다.

탭루트(TapRoot)

탭루트는 2021년 11월 중으로 이루어질 비트코인 업그레이드를 의미한다.
탭루트에는 슈노르 서명과 MAST 등 중요한 사항들이 포함되어 있다.

MAST와 슈노르 서명을 통해 스크립트 실행에 대한 효율성이 극도로 커지기 때문에,
기존에 제약이 많았던 비트코인 스마트 컨트랙트의 활용성이 확장될 것으로 기대된다.

이더리움 스마트 컨트랙트

EVM

스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

EVM(Ethereum Virtual Machine)은 작성한 코드와 이더리움 블록체인 사이에 있는 가상 머신으로, 블록체인에서 코드가 실행될 수 있도록 한다.

이더리움 스마트 컨트랙트에 기반한 dApp은 솔리디티라는 언어로 작성된다. 우리는 솔리디티로 작성된 dApp을 이더리움 네트워크에 올려야 한다.

그런데, 솔리디티 언어는 고급 언어이기 때문에 EVM이 이해하기 어렵다.
EVM은 솔리디티를 읽을 수 없기 때문에, 먼저 작성한 솔리디티 코드를 solc를 이용해 컴파일하여 EVM이
읽을 수 있는 바이트코드 형태로 만들고, 이 바이트코드를 geth를 이용해 이더리움 네트워크에 올린다.

스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong
솔리디티 코드 → 바이트코드 → opcode 흐름이다.

솔리디티(Solidity)

솔리디티는 스마트 컨트랙트를 실행하는 객체 지향(object-oriented), 정적 타입(static typed),
고급(high-level) 스크립트 언어로, EVM에서 실행된다.

솔리디티는 컨트랙트 기반의 고급 프로그래밍 언어이다. C++과 파이썬, 자바스크립트를 기반으로 만들어졌으며, 이더리움 네트워크에서 스마트 컨트랙트를 생성할 수 있도록 설계되었다.

솔리디티는 정적 타입 스크립트 언어로, 런타임 언어와는 달리, 컴파일 시 제약 조건을 확인하고 적용한다.

역사

솔리디티는 2014년 8월 컴퓨터 과학자 가빈 우드(Gavin Wood)가 처음 제안하였다.

우드는 이더리움에서 2년간 CTO로 재직했으며, 크리스찬 라이트와즈너(Christian Reitwiessner)가
우드를 이어받아 솔리디티 개발을 이끌었다. 그 결과 2015년 8월 솔리디티가 정식으로 출시되었다.

솔리디티로 할 수 있는 일

솔리디티는 이더리움 네트워크의 기반이다. 솔리디티가 없으면 이더리움도 존재할 수 없다.

이더리움 네트워크에서 언제든지 원하는 분산형 앱(dApp)을 사용할 수 있다. dApp을 올리기 위해서는 솔리디티로 프로그래밍을 해야 한다. 다만 앱스토어처럼 중앙기관에 심의를 받을 필요 없이 누구나 약간의 비용만 내면 이더리움 네트워크에 자신이 만든 dApp을 올릴 수 있다.

스마트 컨트랙트와 튜링 완전, 불완전성

사토시 나카모토는 무한 반복 공격과 같은 보안상의 이슈를 고려해 의도적으로 반복문 opcode를 제외했다. 따라서 비트코인 스크립트를 두고 튜링 불완전하다고 말한다.

이더리움의 핵심은 이러한 비트코인의 튜링불완전성이라는 한계를 넘어, 개발자가 원하는 스마트 컨트랙트를 유연하게 구현할 수 있도록 튜링 완전을 제공하는 것이다.

EVM은 반복문 opcode들을 지원하는 대표적인 튜링 완전 머신이며, 솔리디티는 튜링 완전 머신을 동작하게 하는 튜링 완전 언어이다.

솔리디티 개발 도구

  • Remix IDE
  • solc
  • Ganache
  • TestNet
  • Truffle, Embark, Dapple

스마트 컨트랙트 동작원리

이더리움은 상태 머신

이더리움은 거래에 기반을 둔 상태 머신(transaction-based state machine)이다.

이더리움이라는 상태 머신은 Genesis state에서 시작한다. 그리고 트랜잭션이 실행되면, 다음 상태로
전환하게 된다. 더이상 트랜잭션이 들어오지 않은 마지막 상태가 바로 이더리움의 현재 상태이다.

스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong
이더리움의 상태에는 수천 개의 트랜잭션이 있다. 이 트랜잭션은 "블록"이라는 그룹에 묶여 있으며,
블록은 직전에 만들어진 블록과 이어져 있다.
스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

EOA와 CA

이더리움에는 EOA(External Owned Account)와 CA(Contract Account)라는 두 종류의 계정이 있다.
모든 계정은 주소로 식별되며, 동일한 주소 공간을 가진다. EVM은 이 160 bit 길이의 주소들을 처리한다.

EOA와 CA 모두 잔액(balance), 논스(nonce), 스토리지(stroage), 컨트랙트 코드(contract code)로 구성되어 있다.

전역 상태

이더리움의 전역 상태는 계정 주소와 계정 상태를 매핑한 것으로 구성되어 있다. 이 매핑은 머클 패트리샤 트리(Merkle Patricia Tree) 형태로 저장되어 있다.

머클 트리(Merkle trie, Merkle tree)는 이진 트리의 한 종류로, 다음의 특징을 가지고 있다.

  • 트리 맨 아래에 있는 노드들은 데이터를 가지고 있다.
  • 부모 노드는 두 자식 노드를 모아 해싱한 값을 가진다. 맨 위의 루트 노드도 자식 노드의 해싱한 값이다.
    스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

머클 패트리샤 트리에서 변조가 시도되면 그 즉시 발견되기 때문에, 루트 노드는 데이터에 대한 ID처럼 사용될 수 있다. 또한 블록 헤더는 상태, 트랜잭션, 영수증 트리의 루트 노드 값을 가지고 있기 때문에, 네트워크의 노드들은 모든 상태를 저장하고 있지 않더라도 이더리움의 상태 일부분을 검증할 수 있다.

트랜잭션과 메시지

트랜잭션은 "메시지 호출(message call)"과 "컨트랙트 생성(contract creations)" 두 종류로 나뉜다.

이더리움의 모든 트랜잭션은 항상 EOA에서 만들어지고 블록체인에 올라간다.
즉, 트랜잭션은 외부 세계를 이더리움 내부의 상태로 연결해주는 다리와 같다. 그리고 연결의 창구가
바로 CA인 것이다.

CA 생성

  1. 논스를 0으로 설정한다.
  2. 송신자가 CA 생성 트랜잭션에 이더를 함께 보낸 경우, 이를 CA의 잔금(balance)으로 설정한다.
  3. 잔금에서 value 만큼을 제외한다.
  4. CA의 스토리지를 빈 값으로 초기화한다.
  5. CA의 코드를 빈 문자열의 해시값으로 초기화한다.

트랜잭션 실행 모델과 EVM

EVM 구성 요소

  • 스택
  • 메모리
  • 스토리지
    스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

EVM은 트랜잭션을 반복적으로 실행하며, 각 사이클에서 시스템 상태(이더리움의 전역 상태)머신 상태(machine state)를 계산합니다.

머신 상태의 구성

  • 사용 가능한 가스
  • 프로그램 카운터
  • 메모리에 들어있는 값
  • 메모리에서 활성화된 단어의 수
  • 스택에 들어있는 값

스마트 컨트랙트의 실행 비용

이더리움에서 트랜잭션의 결과로 발생하는 모든 연산은 수수료를 요구한다.
이 수수료를 가스(gas)라고 합니다.

가스는 트랜잭션 코드에 있는 모든 opcode를 실행하는데 필요한 수수료를 측정하는 데 사용하는 단위이다. Gas price은 가스 당 지불하려고 하는 이더의 양을 의미하며, Gwei라는 단위를 사용한다.

1 이더 = 10^18 wei 이며, 1 Gwei= 10^9 wei

트랜잭션 송신자는 gas limit과 gas price를 트랜잭션에 지정한다. 이 gas price와 gas limit은 송신자가 트랜잭션을 실행하는데 지불하고자 하는 Wei의 최대 양을 의미한다.

가스는 채굴자의 주소로 송금된다. 채굴자는 연산을 수행하고 트랜잭션을 검증하는 데에 자원을 소모하기 때문에 이에 대한 보상으로 가스 수수료를 받는다.

수수료 지불 이유

이더리움은 튜링 완전 언어이기 때문에, 튜링 불완전한 비트코인 스크립트와는 달리 반복문을 지원한다.
그러나 반복문의 가장 큰 단점은 무한 루프 문제가 일어날 수 있다는 것이다.

만약 악의적인 사용자가 큰 자원을 소모하는 무한 루프 코드가 들어있는 트랜잭션을 실행시킨다면, 트랜잭션은 이더리움 네트워크의 엄청난 양의 자원을 소모하게 될 거고, 이더리움 네트워크의 전체가 멈출 수도 있다.

수술는 이러한 악의적인 공격으로부터 네트워크를 보호한다. 수수료를 부과하면 악의적인 사용자가 무한 루프를 쉽게 실행시킬 수 없으며, 실행 시키더라도 gas limit 설정으로 가스 소모 전에 실행을 멈출 수 있다.

프라이빗 블록체인에서의 스마트 컨트랙트

프라이빗 블록체인의 특징

  • 높은 효율성
  • 완전한 개인 정보 보안
  • 불법적 활동 제한

퍼블릿 브록체인과 프라이빗 블록체인의 차이
스마트 컨트랙트 비용 - seumateu keonteulaegteu biyong

대표적인 프라이빗 블록체인

  • 하이퍼레저
  • R3
  • 넥스레저

하이퍼레저 패브릭과 체인코드

하이퍼레저 패브릭은 분상 원장 솔루션을 제공하는 대표적인 프라이빗 블록체인 플랫폼이며 기밀성, 탄력성, 유연성 및 확장성을 제공한다.
하이퍼레이저 기술을 플러그 앤 플레이 방식으로 지원하며 유연하고 탄력적인 아키텍처를 제공한다.

하이퍼레이저 블록체인적 특징

  • 프라이버시와 기밀성
    • 하이퍼레저 패브릭은 채널(channel)이라고 불리는 제한된 메시지 경로를 제공하며, 이러한
      채널은 네트워크의 특정 하위 노드 집합에게 트랜잭션 프라이버시와 기밀성을 보장해준다.
  • 효율적인 처리
    • 네트워크의 노드들은 노드 유형에 따라 이러한 액션을 수행하는 역할이 정해져 있다.
      이러한 동시적 실행은 각 노드의 처리 효율성을 높이고 트랜잭션 전달을 가속화한다.
  • 체인코드
    • 체인코드는 스마트 컨트랙트에 해당하며 자산과 트랜잭션 명령을 인코딩하는데 사용한다.
  • 모듈식 설계
    • 하이퍼레저 패브릭은 모듈식 아키텍쳐를 구현하여 네트워크 설계자에게 기능적 선택권을 제공한다.

하이퍼레이저 패브릭의 주요 개념

  • 피어(Peer)
    • 피어는 블록체인 네트워크의 기본 요소이며, 원장과 스마트 컨트랙트를 호스팅하는 노드이다.
    • 네트워크 상호작용의 시작점이며, 어플리케이션이 체인 코드를 실행 실행하여 쿼리를
      하거나 원장을 업데이트하도록 한다.
  • 채널(Channel)
    • 하이퍼레저 패브릭 채널은 둘 이상의 특정 네트워크 노드 간의 통신을 위한 프라이빗 서브넷으로, 프라이빗 트랜잭션을 수행하기 위한 목적으로 사용된다.

스마트 컨트랙트와 체인 코드

일반적으로 스마트 컨트랙트와 체인코드라는 용어는 혼용되지만, 스마트 컨트랙트는 전역 상태에 포함된 비즈니스 객체의 상태를 변경시키는 트랜잭션 로직을 정의한다.

체인코드는 블록체인 네트워크에 배포하기 위해 패키징된 스마트 컨트랙트의 집합이다. 즉, 스마트 컨트랙트는 트랜잭션을 관리하며, 체인 코드는 스마트 컨트랙트를 배포하기 위해 패키징하여 관리합니다.

이더리움과 하이퍼레저 패브릭의 차이점

이더리움하이퍼레이저 패브릭
플랫폼의 목적 EVM 위에서 스마트 컨트랙트를 실행하는 하나의 목적을 위해 만들어졌다. 고성능과 신뢰성이 높은 블록체인 개발을 위한 산업 전반의 협업을 가속화하기 위해 도입되었다.
작동방식 퍼블릭 블록체인으로, 누구나 블록체인 네트워크에 접근할 수 있고, 네트워크에 접근할 때 허가를 받을 필요가 없다. 프라이빗 블록체인으로, 허가된 사용자만이 네트워크에 참여할 수 있다.
피어 역할 트랜잭션이 완료되면 이를 위해 여러 노드가 참여해야 하므로 확장성, 효율성 등의 문제가 발생할 수 있다. 네트워크 내의 각 피어에게 트랜잭션을 수행하기 위해 정보를 제공할 필요가 없는 DLT를 제공한다.
기밀성 퍼블릭 네트워크이기 때문에, 블록체인 네트워크에 기록된 모든 트랜잭션에 누구든지 접근할 수 있다. 허가형 프라이빗 네트워크이기 때문에 허가된 멤버만 트랜잭션에 접근할 수 있다.
합의 메커니즘 모든 노드가 합의에 도달해야 하는 PoW 합의 알고리즘을 사용한다. 다른 종류의 합의 알고리즘을 사용한다. 아예 합의를 하지 않거나, 다양한 합의 프로토콜 중 하나를 선택할 수 있다.
프로그래밍 언어 이더리움의 자체 언어인 솔리디티를 사용한다 Go 언어를 사용한다.

스마트 컨트랙트를 활용한 새로운 서비스들

  • 금융 상품(DeFi)
  • 게임 및 NFT
  • DAO
  • ICO
  • 브릿지

스마트 컨트랙트 활용 사례

  • 일정한 형식의 반복적인 계약이 많은 경우
    ex) 보험
  • 원격자 간 계약 체결이 필요한 경우
    ex) 자동차 렌탈 서비스
  • 제품의 유통 추적이 필요한 경우
    ex) 물류 유통

오라클 문제

오라클이란?

Web API나 마켓 데이터 피드와 같은 방식을 통해 블록체인과 스마트 컨트랙트용 외부 데이터를 검색하고 검증하는 것을 의미한다.

외부에서 오는 데이터는 블록체인이나 스마트 컨트랙트처럼 결정적(deterministic)이지 않다.
오라클은 외부에서 오는 비결정적인 정보를 블록체인이 이해하고 특정 조건에서 실행할 수 있도록 하는 형식으로 만들어주는 가교 역할을 한다.

오라클 문제란?

오라클 문제는 서드 파티 오라클과 스마트 컨트랙트의 무신뢰성 실행 간 보안, 인증, 신뢰 충돌 문제에
관한 것이다.

스마트 컨트랙트는 주어진 데이터에 따라 계약 이행 여부를 결정할 뿐이지, 데이터에 대한 자체적인 판단 능력은 가지고 있지 않다.