블록체인

[블록체인] 이더리움, smart contract와 탈중앙화 애플리케이션

윤밥밥 2023. 12. 17. 16:03

이더리움, smart contract와 탈중앙화 애플리케이션


스마트 컨트랙트란?

컨트랙트 계좌는 코드를 가지고 있고, 이에 대한 data storage를 가지고 있다.
참고로 컨트랙트 계좌는 누군가 ether를 옮기고 하는 것이 아니므로 private key가 필요 없다.(반대로 EOA는 private key로 인해 관리된다.)

스마트 컨트랙트란 단순히 EVM에 의하여 실행되는 컴퓨터 프로그램이다.
스마트 컨트랙트가 한번 배포되면 절대 바꿀 수 없다.
스마트 컨트랙트에 의한 실행 결과는 누구나 동일 하다. 그래서 이더리움이 wordl computer이다.

스마트 컨트랙트를 통해 펀딩을 받을 수 있다. 특정 수익 이상이면 어느 금액 돌려주겠다라고 할 수 있다.

Life Cycle of a Smart Contract

  1. 스마트 컨트랙트는 solidity같은 high level 언어로 작성될 수 있으며, EVM에서 실행되기 위해 low level bytecode로 compile되어야 한다.
  2. 이렇게 complie된 코드는 contract creation transaction을 사용하여 뿌려진다. 다만 목적지는 따로 없으므로 contract creation transaction의 주소는 0x0이다. 이 주소를 통해서 스마트 컨트랙트임을 인지 할 수 있다.
  3. 이럻게 만들어진 contract는 오직 EOA에 의하여 실행될 수 있다.
  4. 컨트랙트는 병렬로 실행될 수 없다. 즉 ethereum world computer는 single thread 머신이다.
  5. 이러한 트랜잭션은 atomic하게 돌아간다. 즉 트랜잭션이 성공하거나, 실패하여 처음으로 돌아가던가 두 종류밖에 없다.
  6. 만약 실행이 error 인해 실패한다면 원래 상태로 돌아간다. 이때도 gas는 사용한 만큼 줄어든다.

컨트랙트의 코드의 내용은 바꿀 수 없으나, 완전히 삭제하는 것은 가능하다. 삭제하면 내부 상태는 비어 있는 계좌가 된다. 이렇게 삭제된 컨트랙트로 트랜잭션을 보내도 어떤 코드 실행도 일으키지 않는다.
이를 위해서 EVM opcode인 SELFDESTRUCT를 실행함으로써 contract를 삭제할 수 있다.
참고로 이렇게 SELFDESTRUCT를 사용하려면 코드에 내부에 추가해야 하며, 코드에 SELFDESTRUCT를 추가하지 않은 경우 삭제할 수 없다.

SELFDESTRUCT는 음수 가스를 소모하므로, 즉 gas는 그대로 환불된다. 이로 인해 코드와 상태 삭제를 권장한다.

Dapp

dapp도 web interface를 갖고 있어, 브라우져를 통한 접근이 가능하다.
다만 dapp은 블록체인에 있는 웹사이트 이다.
스크트 컨트랙트는 dapp을 블록체인에 연결한다.

EVM: Comparison with other VM technologies

EVM은 단순히 계산, 저장에 대한 추상화를 제공하는 계산 엔진이다.
EVM은 스케줄링 기능이 없다. 즉 병렬 프로세싱이 존재하지 않다.
따라서 ethereum world computer는 싱글 스레드이다.

EVM


EVM은 smart contract 배포와 실행을 관리한다.
EVM은 영구적으로 보관되는 실행가능한 객체들을 가진 탈중앙화된 컴퓨터이다.
EVM은 gas로 인해 실행이 제한되는 유사 튜링 컴플리트 상태머신이다.
EVM은 모든 값을 메모리에 저장하는 스택기반의 아키텍쳐이다. 모든 value는 256비트 이다.

  • 불변 프로그램 ROM: smart contract를 실행하기 위해 바이트코드로 로드된 불변 코드 ROM이라는 것이 존재한다.
  • 휘발성 메모리: 모든 위치가 0으로 초기화된 휘발성 메모리가 존재하고, CONTRACT실행을 마치면 그 내용은 사라진다. 여기서 메모리는 그냥 쓸 수 있는 메모장 같은 존재다.
  • 영구 저장소: 계약 상태를 영구적으로 저장하고 검색할 수 있는 곳이다. 여기도 초기에는 0으로 초기화 되어 있다.

EVM 대부분의 존재하는 모든 기능을 제공한다.
참고로 ORIGIN은 누가 이 트랜잭션을 시작하였는지
CAALDATALOAD는 호출할때 명시한 argument에 대한 정보

EVM state

이더리움은 외부의 actor로 인하여 상태변화를 시작한다.
Ethereym world state는 20바이트의 이더리움 주소를 계좌로 매핑시켜준다.

이더리움 주소는 다음과 같은 것들을 포함하여 account를 나타낸다.

  • balance: 계좌가 소유하고 있는 wei
  • nonce: EOA라면 성공한 트랜잭션 수, smart contract라면 만들어진 contract 수
  • storage: smart contract에 의하여 사용되는 영구 저장소, 즉 EOA라면 비어 있다.
  • program code: smart comtract일 경우만 코드를 가지고,EOA는 비어 있다.

EVM은 현재까지 만들어진 모든 블럭과, smart code를 실행시키는 모든 transaction 정보를 가지고 실행된다.

  • ROM: 호출된 contract 코드와 함께 적재된다.
  • PC: 시작은 0
  • storage: contract 계좌로부터 적재된다.
  • memory: 0으로 설정된다.
  • gas supply: sender가 설정한 금액

Contract Deployment Code

새로운 contract를 만들기 위한 코드와, contract 그 자체 코드는 다르다.

contract를 생성하려면 특별한 transaction이 필요한다. 이는 to에 0x00으로 주소가 따로 없고, data필드에는 contract 초기화 코드(즉 contract를 만드는 코드)가 들어있다.
ROM은 코드와 함께 초기화 되므로, 이 data에 들어간 코드가 ROM에 적재된다.
이 transaction의 실행 결과로 새 contract account코드가 만들어진다.
이러한 결과로 새로운 contranct가 초기화 된다.

배포 bytecode(deployment bytecode)

위에서 말한 새로운 contract를 만들기 위한 코드가 deployment byte코드이다.

실행 bytecode(runtime bytecode)

이는 새로운 contract가 호출되었을 때 실행되는 bytecode이다.
즉 contract 그 자체 코드이다.
즉 스마트 컨트랙트 코드이다.

EVM and Gas

EVM은 스마트 컨트랙트의 실행으로 발생하는 매 계산과정마다 gas를 이용하여 정산을 한다.

즉 EVM은 sender가 명시한 gas limit에 해당하는 gas가 갖고 실행을 한다.
그리고 매 계산마다 gas가 줄어든다.
매 계산전에 gas가 충분한지 확인한다.

이렇게 무사히 실행을 마치면 validator에게 줄 gas를 계산하고 ether로 준다.
이때 ether = gas cost x gas price이다.
또한 남겨진 gas는 sender에게 ether로 돌려준다

Gas Cost vs Gas Price

  • gas cost: 특정 명령을 수행하는데 든 gas량
  • gas price: sender가 gas당 지불할 ether양
    sender는 gas당 지급할 gas price를 명시해야 한다.block gas limit블록에 포함된 모든 트랜잭션의 gas limit 합의 크기는 제한되어 있다.
    따라서 block gas limit를 넘게 만드는 트랜잭션을 블록에 넣으려하면 거절된다.
  • Block Gas Limit

block gas limit를 제한한 이유는 world computer의 과부하를 막기 위해서이다.

Coins vs Token

coin은 디지털 화폐
token은 블록체인에 존재하는 프로젝트에 의해 만들어진 단위이다.
즉 Dapp은 원한다면 얼마든지 token을 발행시킬 수 있다.
블록체인은 token과 아예 무관하고, 존재도 모른다.
만약 내가 토큰을 생성하길원한다면, 소유 ,전송정보등을 포함한 smart contract를 배포하기만 하면된다.

토큰은 nft등을 위해서도 사용될 수 있고, 투표, 화폐의 용도로도 사용될 수 있다.
이러한 토큰에 대한 정보는 ERC20에 기재되어 있다.
ERC20이란 이더리움에서 표준으로 만들어 놓은 fungibletoken을 만드는 방법이다.

참고로 토큰은 fungible token, non fungible token 두 가지가 존재한다.

  • fungible token이란 두 토큰을 맞바꿔도 똑같다. 즉 화폐 같은것, 10000원을 교환해도 똑같이 10000원이라는 가치를 갖는 거처럼
  • non fungible token: 똑같이 생겨도 서로 다른 것. 즉 nft처럼 완전히 똑같아 보여도 고유번호가 다르면 엄연히 다른 것.

initial coin offering(ico, 기업 공개)

이는 기업에게 투자를 받고(비트코인, 이더리움) 그 대신에 token을 지급하는 것.
즉 token 자체는 기업 초반에는 가치가 없을 수 있으나, 기업이 성장하면서 토큰의 가치가 성장할 거라 생각해서 token을 받는 투자이다.

위는 Alice가 AliceCoperation에 500을 투자 받겠다는 것이다.
이를 본 bob은 AliceCoperation에 10을 투자했고
이를 확인한 AliceCoperation은 AliceCoin을 발행하여 Bob에게 준다.

Dapp

탈중앙화 app을 위하여 다음과 같은 것들을 탈중화할 수 있다.

  • 백엔드 소프트웨어
  • 프론트엔드 소프트웨어
  • 데이터 베이스
  • 메세지 커뮤니케이션

dapp의 장점

  • resiliency(견디는 성질): 서버는 blockchain에서 관리되므로 다운될 일이 없다.
  • transparency: dapp은 모든 코드가 공개되어 있으므로 모두에게 검사되고, 모든 dapp에서의 상호작용은 blockchain에 기록된다.
  • censorship resistance: 즉 유저는 중앙 제어없이 dapp과 상호작용할 수 있다.

디앱구성요소:backend

하지만 백엔드 코드가 크면 그만큼 gas소모를 많이 하므로 규모가 큰 비즈니스 로직을 넣기는 어렵다. 따라서 몇몇 기능은 off chain 상태에서 존재할 수 밖에 없다.
그러므로 완벽하게 탈 중앙화라고 보기 힘들다.

디앱구성요소:frontend

이더리움과 상호작용(트랜잭션 서명, 보내기, 키관리등)은 meta mask같은 web broswer를 통해 수행할 수 있다.
다만 대부분의 tool이 웹을 위해 존재하며 앱을 위한 tool이 적다.
이더리움 연결을 위해 주로 web.js라는 자바스크립트 라이브러리를 사용한다.

디앱구성요소:data storage

대부분의 데이터들은 매우 거대하므로, ethereum chain에 저장하는 것은 무리가 있다. 따라서 대부분은 off chain으로 데이터를 저장한다.

이더리움에서는 swarm이라는 database storage 솔루션을 제공한다.

  • ipfs(inter planetary file system): 이는 탈중앙화된 방법으로 content를 접근할 수 있는 저장시스템이다. 모든 파일을 해시하여, 피일을 식별하는데 사용한다. 이는 nft를 저장하는 용도로 쓰이고 있다.
  • swarm:이는 p2p 방식으로 작동한다. 즉 content의 해시값을 제시하면 어디 있는 지 알려주고, 가서 받아 온다.디앱구성요소: decentralized message communications즉 p2p기반의 탈중앙화된 메세지 전달 서비스가 존재한다.
    대표적으로 whisper가 있다.디앱구성요소: Ehtereum name serviceENS라고 불리는 이 것은 domain과 유사한 거다.
    즉 이더리움에서 address는 사람이 이해하기 힘드므로 name service를 통해 www.naver.com 처럼 접근을 가능하게 한다.