BlockChain/스마트 컨트랙트

이더리움 스마트 컨트랙트

Dev_2H 2022. 12. 22.
반응형
이더리움 

이더리움은 블록체인 기술을 활용해 스마트 컨트랙트와 암호화폐 거래를 제 3자 없이 안전하게 이뤄질 수 있도록 하는 오픈소스 퍼블릭 서비스다.

 

누구든 dApp을 이더리움 네트워크에 배포할 수 있고, dApp을 만들 수 있도록 튜링 완전한 언어인 솔리디티 ( Solidity )를 제공했으며, 이더리움 네트워크에 올라간 솔리디티 코드는 EVM ( Ethereum Virtual Machine ) 을 통해 실행된다.

 


EVM?

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

 

이더리움 스마트 컨트랙트에 기반한 dApp은 솔리디티라는 언어로 작성된다.

 

솔리디티로 작성된 dApp을 이더리움 네트워크에 올려야한다.

 

솔리디티는 고급 언어이기에 EVM이 바로 해석하기 어렵다

 

EVM은 기계가 이해할 수 있는 바이트코드(Bytecode)로 변환해주어야 한다.

 

블록체인에 저장된 바이트코드 형태의 dApp은 EVM에서 실행되며, EVM은 바이트코드를 Opcode로 변환하여 실행함

 

솔리디티로 작성된 스마트 컨트랙트는 EVM에서 동작하기 때문에 특정 운영체제나 하드웨어에 종속되지 않는다.

 


EVM 내부 동작 구조

이더리움은 거래에 기반을 둔 상태 머신 ( Transaction-Based State Machine ) 이다.

 

상태 머신이란 일련의 거래를 읽고 그 입력을 기반으로 새로운 상태로 전환되는 것을 의미

 

이더리움이라는 상태 머신은 Genesis State에서 시작, 트랜잭션이 실행되면 다음 상태로 전환

더 이상 트랜잭션이 들어오지 않은 상태가 바로 이더리움 현재 상태 

 

이더리움의 상태에는 수천 개의 트랜잭션이 있다. 이 트랜잭션은 블록이라는 그룹에 묶여 있다

블록은 직전에 만들어진 블록과 이어져 있다.

 


EOA와 CA

이더리움에는 EOA ( External Owned Account ) 와 CA ( Contract Account ) 라는 두 종류의 계정이 있다.

 

모든 계정은 160bit 길이의 주소로 식별되며, 동일한 주소 공간을 가진다.

 

EOA와 CA 모두 다음과 같은 요소로 구성되어 있다.

  • 잔액 ( Balance)
  • 논스 ( Nonce )
  • 스토리지 ( Stroage )
  • 컨트랙트 코드 ( Contract Code )

EOA는 주소에 상응하는 비밀키를 갖고 있지만

CA는 비밀키가 없다.

CA는 스스로 새로운 트랜잭션을 만들 수 없다.

CA는 EOA나 다른 CA에게서 받은 트랜잭션에 대한 응답에 대해서만 트랜잭션을 만들 수 있다.

 

따라서 이더리움 블록체인에서 일어나는 모든 액션은 항상 EOA에서 만든 트랜잭션부터 시작한다.

 


전역 상태

이더리움의 전역 상태는 계정 주소와 계정 상태를 매핑한 것으로 구성되어 있다. 

매핑은 머클 패트리샤 트리 형태로 저장되어 있다.

 

트랜잭션과 메세지

이더리움은 트랜잭션 기반 상태 머신이라는 것을 알 수 있었다.

계정 간 일어난 트랜잭션은 이더리움의 전역 상태를 하나의 상태에서 다음 상태로 이동시킨다는 것 

 

기본적으로 트랜잭션은 EOA에서 생성되고, 일련의 과정을 거쳐 블록체인에 올라간다.

 

 

트랜잭션과 메세지

이더리움이 트랜잭션 기반 상태 머신이라는 것을 배웠다.

즉, 계정 간에 일어난 트랜잭션은 이더리움의 전역 상태를 하나의 상태에서 다음 상태로 이동시킨다는 것

 

기본적으로 트랜잭션은 EOA에서 생성되고 일련의 과정을 거쳐 블록체인에 올라간 암호화 서명된 명령어의 집합

 

그 외의 트랜잭션은 메세지 호출 ( Message Call )과 컨트랜트 생성 ( Contract Creations ) 두 종류로 나뉜다.

 

이더리움의 모든 트랜잭션은 항상 EOA에서 만들어지고 블록체인에 올라간다.

트랜잭션 외부 세계를 이더리움 내부의 상태로 연결해 주는 다리와 같다. 그 연결 창구가 CA다.

 

CA는 메세지 ( Message ) 나 내부 트랜잭션 ( Internal Transaction ) 을 통해 다른 CA와 상호작용 할 수 있다.

 


CA 생성

CA를 만들기 위해서는 먼저 특별한 공식을 이용해 새로운 계정의 주소를 정의해야 함

 

1. 논스를 0으로 설정

2. 송신자가 CA 생성 트랜잭션에 이더를 함께 보낸 경우, 이를 CA의 잔금 ( Balance)로 설정

3. EOA 계정의 잔금에서 Value 만큼 제외한다

4. CA의 스토리지를 빈 값으로 초기화한다.

5. CA의 코드를 빈 문자열의 해시값으로 초기화한다.

 

한번 계정을 초기화하고 나면 트랜잭션에서 보낸 init 코드를 사용해 새로운 CA를 생성할 수 있다.

남아 있는 가스를 다 사용한 경우 OOG ( Out-of-Gas ) 예외 처리와 함께 코드 실행이 종료된다.

미사용된 가스는 송신자에게 환불되고 변경된 상태가 저장된다.

 

 

메시지 호출

메세지 호출을 실행하는 것은 CA생성과 비슷하지만, 몇 가지 다른 점이 있다.

 

새 계정이 생성되지 않기 때문에 메시지 호출 실행에는 init 코드가 포함되지 않는다.

 

CA생성과 마찬가지로 메시지 호출을 실행할 때 가스가 부족하거나 트랜잭션이 잘못되어 종료되는 경우

( 스택 오버플로우, jump 실행의 결과가 올바르지 않거나, 잘못된 명령어를 사용 )

사용된 가스는 환불되지 않으며 상태는 직전 상태로 돌아간다.

 

 


스마트 컨트랙트 실행 비용

트랜잭션 실행 수수료는 이더리움에서 가장 중요한 개념 중 하나다.

 

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

 

Gas는 트랜잭션 코드에 있는 모든 Opcode를 실행하는데 필요한 수수료를 측정하는데 사용하는 단위이다.

 

  • Gas Price는 gas당 지불하려고 하는 이더의 양을 의미하며 Gwei라는 단위를 사용
  • Gas Limit은 송신자가 트랜잭션을 실행하는데 지불하고자 하는 Gas의 최대량을 의미한다.

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

 

트랜잭션 송신자는 트랜잭션을 보낼 때 Gas LimitGas price를 트랜잭션에 지정해야 한다.

 

 

송신자가 Gas Limit 을 50000으로 설정하고 Gas Price를 20 Gwei로 지정했다고 가정했을 시

송신자가 최대 50000 * 20 Gwei = 10^15 Wei = 0.001 이더를 트랜잭션을 실행하는데 지불하는 걸 의미한다.

송신자가 트랜잭션을 실행할만한 충분한 Gas를 제공하지 않은 경우 트랜잭션은 OOG 상태가 되며 실행이 중지된다.

 

상태가 변경되었다면 다시 이전 상태로 돌아가며 또한 실패한 트랜잭션에 대한 기록이 남으며 

 

연산에 사용된 Gas는 환불되지 않는다.

 

이 Gas는 채굴자의 주소로 송금된다. 채굴자는 연산을 수행하고 트랜잭션을 검증하는 데 자원을 소모하기에

이에 대한 보상으로 Gas 수수료를 받게 된다.

 

 

 

스토리지 수수료

연산할 때 뿐만 아니라, 스토리지를 사용할 때도 수수료를 내야 한다.

스토리지의 최종 수수료는 32바이트 단위에 비례한다.

 

스토리지 수수료는 일반적인 수수료와는 다르게 특이한 부분이 있다.

스토리지가 증가하면 모든 노드에서 이더리움 상태 데이터베이스의 크기가 커지기 때문에 저장되는 데이터의 양을 적게 유지할수록 인센티브를 부여한다.

 

트랜잭션이 스토리지에 있는 특정 요소를 지우는 연산을 수행하면 해당 연산을 수행하는 데에 대한 수수료는 면제하고, 저장 공간을 확보했기에 기존의 요소를 스토리지에 추가했을 때 지불하던 Gas를 환불 받는다.

 


수수료를 지불하는 이유?

이더리움은 비트코인과 달리 모든 연산에 대해 gas라는 수수료를 부과한다

수수료를 부과하는 이유는 이더리움 네트워크 위에서 동작하는 스마트 컨트랙트 작업들이 전체 노드에 영향을 미치기 때문이다.

 

이더리움은 튜링 완전 언어 이기에 튜링 불완전한 비트코인 스크립트와 달리 반복문을 지원한다.

 

반복문의 가장 큰 문제점은 무한 루프 문제가 일어날 수 있다는 것이다.

 

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

 

이러한 악의적인 공격으로 네트워크를 보호하기 위해 연산마다 수수료를 부과하여 악의적인 공격을 예방할 수 있다.

악의적인 사용자가 존재하더라도 연산마다 수수료를 지불해야 하기에 쉽게 무한 루프 코드를 실행할 수 없다.

 

'BlockChain > 스마트 컨트랙트' 카테고리의 다른 글

솔리디티 기본 문법  (1) 2023.03.29
솔리디티란? ( Solidity )  (2) 2023.03.28
비트코인 스크립트  (2) 2022.12.21
비트코인 스마트 컨트랙트  (1) 2022.12.21
스마트 컨트랙트  (0) 2022.12.21

댓글