SW/블록체인

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스

얇은생각 2022. 2. 4. 07:30
반응형

스마트 컨트랙트

이더리움에서는 스마트 컨트랙트 실행을 위한 실행 계층이 있습니다. 스마트 컨트랙트는 디지털 방식으로 특정한 계약을 수립, 검증, 실행하기 위한 컴퓨터 프로토콜입니다. 이는 제 3자 없이 신뢰할 수 있는 거래의 수행을 가능하게 하며, 거래들은 추적할 수 있고, 그러나 되돌릴 수 없게 합니다.

닉 자보는 스마트 컨트랙트를신뢰할 수 없는 컴퓨터 인터넷 환경에서 고도로 발달된 계약을 준수하도록 강제하는 프로토콜이다라고 했으며, 이것은 기존의 계약 관련 법률보다 우수한 보안성을 제공하고 동시에 저렴한 비용으로 계약을 처리할 수 있도록 합니다. 스마트 컨트랙트는 디지털 명령어로 계약을 작성하면 조건에 따라 계약 내용을 자동으로 실행할 수 있습니다.

또한, 디지털로 된 계약서는 조건에 따른 계약 결과가 명확하고, 계약 내용을 즉각 이행할 수 있다는 장점이 있습니다. 이 스마트 컨트랙트는 1994년 닉 사보에 의해서 처음으로 제안되었습니다. 최초의 블록체인 기반 스마트 컨트랙트는 비트코인 스크립트라는 단순한 실행 프로그램입니다. 비트코인의 트랜잭션에서 Opcode로 스크립트를 작성해서 보내면 조건에 따라 자동으로 거래를 수행합니다.

이때 스크립트는 입력값에 들어오는 UTXO의 소유권을 검증하여 트랜잭션의 유효성을 검사하는 단순한 기능만을 지원하고 있습니다. 스크립트가 정상이면 트랜잭션이 정상이라고 본다는 일종의 계약 개념이 있으므로 Contract Code로 불리기도 합니다. 하지만 비트코인 스크립트는 반복문을 사용할 수 없고, 비트코인 잔고 외에 다른 정보를 관리할 수 없는 한계가 있습니다.

 

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 1

 

사실 스마트 컨트랙트라는 용어가 본격적으로 사용되기 시작한 것은 이더리움에서부터입니다. 이더리움에서 스마트 컨트랙트는 무엇일까요이더리움은 닉 자보가 고안한 스마트 컨트랙트의 개념을 채용하여 비트코인의 단순한 스크립트를 더욱 발전시켰습니다이 결과, 이더리움은 다양한 형태의 응용 컨트랙트를 개발할 수 있도록 발전했고, 단순 암호화폐 플랫폼을 벗어나 다양한 분야에 적용할 수 있는 블록체인 컴퓨팅 플랫폼으로 발전하게 되었습니다.

이더리움에서 스마트 컨트랙트는 이더리움 어카운트의 상태를 변경할 수 있는 프로그램 코드로서 이더리움 P2P 네트워크상에 배포되어 블록체인 내에 상태 정보로 존재하고, 이더리움 가상 머신(EVM)에서 작동되어 상태전이를 유발합니다. 이러한 스마트 컨트랙트는 이더리움에서 새로운 스마트 컨트랙트가 생성되거나, 특정 스마트 컨트랙트의 함수를 실행하거나, 이더를 전송하는 방식 중 하나로 실행이 됩니다.

모든 컨트랙트의 내용과 입력 정보는 블록체인에 저장되고 공유가 되고, 때문에 악의적으로 컨트랙트를 조작하는 것을 방지할 수 있습니다. 스마트 컨트랙트를 개발하는 언어로는 솔리디티, 서펀트(Serpent), LLL, Mutan(뮤탄) 등이 있지만, 현재 솔리디티가 가장 많이 사용되고 있습니다.

실물 계약서의 내용을 솔리디티 등의 언어를 이용해서 스마트 컨트랙트 코드로 작성합니다. 이것을 컴파일하여, 코드의 byte code로 이더리움 네트워크로 전파시켜 이더리움 블록체인 안에 포함시킵니다. 이렇게 생성된 스마트 컨트랙트는 이더리움에 존재하는 어카운트로부터 사용될 수 있습니다.

 

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 2

 

스마트 컨트랙트의 작동 프로세스에 대해 알아보겠습니다. 우선 솔리디티 등의 언어를 이용해서 스마트 컨트랙트를 작성합니다. 이 작성된 스마트 컨트랙트는 각 언어에 맞는 컴파일러를 통해서 컴파일되어 EVM에서 사용할 수 있는 형태인 바이트 코드로 컴파일됩니다. 예를 들어, 솔리디티로 작성된 스마트 컨트랙트는 solc라는 컴파일러를 통해서 컴파일된 후에 바이트 코드(byte code)가 됩니다.

해당 바이트 코드는 운용 중인 geth와 같은 이더리움 클라이언트를 이용해서 블록체인에 배포됩니다. 이때 외부 사용자 어카운트(EOA)에서 트랜잭션의 payload에 바이트코드를 담아 트랜잭션을 네트워크로 브로드캐스팅하며, 트랜잭션 실행 비용이 발생합니다. 해당 트랜잭션(스마트 컨트랙트의 바이트코드가 담긴)이 블록에 포함되면, 컨트랙트 주소를 갖는 컨트랙트 계정이 생성되고, 자바스크립트 등으로 개발된 다른 애플리케이션에서 이 컨트랙트의 바이트 코드에 접근할 수 있도록 ABI (Application Binary Interface)가 함께 생성됩니다.

컨트랙트의 주소와 ABI를 알고 있어야 외부에서 스마트 컨트랙트를 활용할 수 있습니다. 실제 사용자는 콘솔을 통해서 명령을 입력해, 스마트 컨트랙트를 실행할 수 있습니다. 또한, 자바스크립트 또는 HTML로 개발된 웹 애플리케이션에서 ABI를 통해 특정 컨트랙트에 접근한 후, 해당 컨트랙트 주소에 입력값을 보내며, 트랜잭션 실행 비용을 지급하면 컨트랙트를 사용할 수 있습니다.

 

 

EVM (Etheruem Virtual Machine)

이더리움의 각 노드는 EVM을 포함하고 있으며, EVM을 통해서 컨트랙트의 바이트코드를 Op 코드로 변환 후에 내부에서 실행합니다. EVM(Ethereum Virtual Machine)은 이더리움 스마트 컨트랙트의 바이트코드를 실행하는 32바이트 스택 기반의 실행 환경입니다. EVM 내부에 휘발성 메모리와 비휘발성 메모리로 구성되어 있고, 이 공간에 바이트 배열 형태로 스택의 항목들을 저장합니다.

EVM은 프로그램 카운터를 0부터 증가시키면서 반복적으로 op 코드에 대한 연산을 실행하며 가스를 소비합니다. EVM은 종료 조건을 만족했을 때 코드 실행을 멈춥니다. 종료 조건으로는 오류, STOP 명령어, RETURN 명령어 또는 실행 완료가 있습니다.

 

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 3

 

예를 들어, 가스가 충분치 않거나, 잘못된 명령어이거나, 스택의 항목이 1024 크기를 넘어 오버플로우가 발생하는 등의 예외 상황이 발생하면 실행이 중단되고 모든 상태 변화 내용은 취소됩니다. 그리고 EVM에서 바이트 코드를 실행하기 위해서 다음의 세 가지 공간에 접근이 가능해야 합니다. 첫째, LIFO(Last-In-First-Out) 컨테이너에 값(Value)을 푸시(Push)하거나 팝(Pop) 하기 위한 스택이 있습니다.

둘째, 무한대로 확장 가능한 바이트 배열을 담을 수 있는 메모리가 있습니다. 마지막으로, 계산이 끝나면 리셋되는 스택이나 메모리와는 달리 영속적으로 값을 저장하기 위한 저장소가 있습니다. 다음은 실제 바이트 코드를 갖고 EVM을 이해해보도록 하겠습니다.

3+5를 하는 바이트 코드는 다음과 같이 6003600501입니다. 이 바이트코드는 EVM에서 아래에 있는 Opcode로 변환됩니다. 각각의 opcode에 대한 설명입니다. 0x60 PUSH1 opcode를 말하고, 0x030x05는 각각 값 3, 5를 나타내고, 0x01 ADD opcode를 의미합니다. 0x03 0x05 PUSH1이라는 opcode 뒤에 나왔기 때문에 값이라는 것을 인식합니다.

이더리움에서 제공하는 EVM 도구를 이용해서 바이트코드를 실행해 보았습니다. 아래 그림을 보시면 EVM을 이용하는 명령어를 보실 수 있습니다. 명령어의 의미는 EVM을 통해서 바이트 코드를 실행하고 그 과정을 출력하라는 것입니다.

 

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 4

 

프로그램 카운터(PC) 0에서 시작해서 STOP 명령어가 실행될 때까지 3 5 PUSH1 opcode를 통해 스택에 푸시하고, ADD opcode를 통해 3+5의 결과를 스택에 푸시 합니다. 자세히 보시면 각 opcode를 수행할 때마다 해당하는 비용을 가스로 지급하는 것을 보실 수 있습니다. 해당 테스트에서는 모든 opcode에 가스 3을 소비했습니다. 만약 가스 비용이 없으면 수행이 중단됩니다.

 

블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 5

 

그림은 데이터를 스택에 푸시하고 팝 하는 모습을 나타낸 것이고, 다음 그림은 설명해 드린 3+5의 실행과정을 도식화한 것입니다. 3 5 PUSH1 한 후, 이 둘을 pop 해서 ADD하고, 그 결과를 다시 스택에 넣는 모습을 확인할 수 있습니다. 3x5를 하는 바이트 코드는 다음과 같이 6003600502입니다. 이 바이트코드는 EVM에서 아래에 있는 Opcode로 변환됩니다.

각각의 opcode에 대한 설명입니다. 0x60 PUSH1 opcode를 말하고, 0x03 0x05는 각각 값 3, 5, 0x02 MUL opcode를 의미합니다. 프로그램 카운터(PC) 0에서 시작해서 STOP 명령어가 실행될 때까지 3 5 PUSH1 opcode를 통해 스택에 푸시하고, MUL opcode를 통해 3x5의 결과를 스택에 푸시 합니다.

3+5를 할 때는 모든 opcode가 가스3을 소비했는데, 이번 그림에서는 MUL이 가스5를 소비하는 것을 확인하실 수 있습니다. 이를 통해서 각각의 opcode는 필요한 가스양이 다르다는 것을 알 수 있습니다. 그림은 설명해 드린 3x5의 실행과정을 도식화한 것입니다

 

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

반응형