[Blockchain] Smart Contract와 상태 기계, 그리고 EVM

장성호·2022년 7월 6일
1

[Blockchain]

목록 보기
6/7

Solidity를 다루면서 스마트 컨트랙트에 대한 언급을 했다. 간단하게 이야기하자면 디지털로 작성된 계약서를 뜻한다. 이를 작성하는 방법이 Solidity였고, 계약 조건이 충족되면 자동으로 계약 내용이 실행되도록 하는 것이 스마트 컨트랙트이다. Solidity로 스마트 컨트랙트를 작성하는 법은 뒤로 하고, 이번에는 스마트 컨트랙트와 관련된 것들을 알아보자.

스마트 컨트랙트와 상태 기계

스마트 컨트랙트를 이야기하는데, 뜬금없이 상태 기계가 왜 튀어나올까? 이더리움은 왜냐하면 비트코인 시스템의 튜링 불완정성이라는 한계를 극복하고자 나온 시스템이기 때문이다. 마침 이번 학기에 알고리즘 강의를 수강하면서 튜링 머신 덕분에 고생했는데, 종강하자마자 이렇게 바로 만나게 되었다 🤣 아무튼 이더리움은 튜링 완전 프로그래밍 언어와 함께 하는 블록체인을 제공하려고 하기 때문에, 스마트 컨트랙트와 블록체인은 상태 기계와 뗄레야 뗄 수 없는 관계이다.

스마트 컨트랙트가 상태 기계라면, 상태가 존재 해야 할 것이다. 그게 바로 앞서 Solidity를 만져보면서 봤던 myString이라는 문자열의 상태( = Hello, World!)이다. 이러한 상태를 바꾸는 행위는 트랜잭션과 마이닝이다. 트랜잭션을 보내고 블록이 채굴되면 그 때 상태가 변화한다. 트랜잭션만 보내고 채굴이 되지 않으면 상태가 안 바뀐다!

EVM Bytecode

myString을 출력해보면 이러한 로그가 나왔다. 잘 살펴보면 data라고 작성된 부분이 있다. 이걸 Etherscan에서 확인해보자. 메타마스크에서 활동 - 계약 배포 - 블록 탐색기에서 보기 순서대로 진행하면 볼 수 있다.

무언가가 엄청나게 적혀있다. 우리가 작성하고 배포한 것은 Solidity 코드인데, 왜 저렇게 적혀있을까? 스마트 컨트랙트를 작성할 수 있는 Solidity, Vyper, LLL 등의 언어는 모두 EVM Bytecode로 컴파일 된다. 실제로 블록체인에 보내는 것은 EVM Bytecode이다. 이것이 블록이 되어 체인에 연결된다. 참고로 컴파일러는 ECMAScript를 사용한다.

Bytecode

먼저 Bytecode는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다. 보통 컴파일러는 Java, C, Javascript와 같은 고급 언어를 어셈블리어, 기계어 등와 같은 저급 언어로 변환해준다. 고급 언어를 변환해주는 과정을 Front-end, 저급 언어로 변환해주는 과정을 Back-end로 표현한다. 보통 이렇게 직접적으로 고급 언어를 저급 언어로 변환해주는 컴파일러는 플랫폼에 맞게 작성되어 있기 때문에, 플랫폼이 바뀌면 재컴파일 해야 한다.

반면 Bytecode는 고급 언어를 중간 코드로 컴파일 함으로써, 플랫폼에 상관없이 재컴파일 되지 않도록 해주는 역할을 한다. 이를 받아들이는 것이 VM이다. 앞서 Front-end와 Back-end를 언급했는데, Bytecode 같은 경우에는 Middle-ware로 표현한다.

EVM

이번에는 EVM이 무엇인지 알아보자. EVM은 Ethereum Virtual Machine의 약자로, 이더리움 네트워크의 노드들이 공유하는 하나의 가상 머신이다. EVM도 가상머신이기 때문에, Bytecode를 필요로 한다. 그렇기 때문에 우리가 만든 스마트 컨트랙트는 EVM이 읽을 수 있게끔 Bytecode data로 변환되어서 블록체인에 연결되는 것이다.

스마트 컨트랙트라는 기능을 만들기 위해서 상태 기계, Bytecode, EVM, Compiler 등 꽤나 어려운 내용들이 등장했다. 여기서 모두 다 언급하기에는 각 개념이 중요한 위치에 있으면서도 내용이 방대하다. 때문에 하나하나 차근차근 이해하며 나아가보자.

Reference

스마트 컨트랙트 (4-1) | 컨트랙트, 이더리움 가상머신, https://moozii-study.tistory.com/entry/%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-4-1-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80-%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0
Ethereum Virtual Machine (EVM) 개요, https://opentutorials.org/course/2869/18360
프로그램 언어의 종류, https://opentutorials.org/course/2471/13907
[CS] 컴파일러(Compiler)란?, https://yanacoding.tistory.com/entry/CS-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%ACCompiler%EB%9E%80

profile
일벌리기 좋아하는 사람

0개의 댓글