이더 단위
비트코인에서는 네트워크에서 비트코인(BTC)을 화폐로 사용하고 최소 단위로 사토시(Satoshi)를 사용합니다. 암호화폐는 쪼개질 수 있으므로 1BTC는 10^8(1억) 사토시입니다. 이와 마찬가지로 이더리움 네트워크에서도 사용되는 화폐가 존재합니다.
바로 이더(Ether)라는 암호화폐가 사용되고, 이더리움에서 계정들은 이더를 전달할 수도 있고 전달받을 수도 있습니다. 또한 이더는 저명한 암호화폐로서 거래소를 통해 시장에서 거래가 되고 있습니다. 그리고 이것은 이더리움상의 리소스를 사용한 대가로 지급할 가스(Gas)와 교환하기 위해 사용됩니다. 가스에 대해서는 자세히 설명하도록 하겠습니다.
그림은 이더의 단위를 보여줍니다. 기본단위인 Wei부터 Tether까지 나와 있으며, 이 이름들은 모두 사람 이름에서 유래된 것입니다. 1 Ether는 기본적으로 10^18승 Wei입니다. 이러한 이더 간의 단위 변환은 이더리움 컨버터를 이용하면 쉽게 계산할 수 있습니다.
가스
이더는 가격 변동성이 크기 때문에, 이더리움은 변동성이 거의 없는 가스라는 운영 토큰을 도입했습니다. 가스는 이더리움 시스템에서의 운영 토큰이며 이더리움 플랫폼을 이용한 대가를 지급하는 데 사용됩니다. 이더리움에서 트랜잭션이나 스마트 컨트랙트를 처리하기 위해서 이더리움 가상 머신이 이용되고, 이것들이 포함되는 블록을 생성하기 위해 마이닝을 하는 등 일련의 이더리움 상의 리소스를 이용합니다.
이때 이더리움의 리소스를 이용하려는 사람, 즉 트랜잭션을 만들어서 보내는 계정은 이에 대한 대가를 지급해야 합니다. 예를 들어서 트랜잭션을 처리하기 위해 마이너에게 트랜잭션 처리 비용을 가스로 지급해야 트랜잭션이 처리됩니다. 가스를 사용하는 다른 이유는 트랜잭션의 남용을 막는 데 있습니다.
만약 단위 트랜잭션이 너무 복잡해서 많은 리소스를 소모한다면 블록체인에 큰 악영향을 미칠 수 있습니다. 그래서 트랜잭션은 단순해야 하며, 그뿐만 아니라 악의적인 사용자가 DoS 공격을 하기 위해서 여러 트랜잭션을 생성해서 보내는 것을 저지하기 위해서 가스는 필요합니다.
비슷한 예로서 비트코인은 트랜잭션에 fee를 부과하여 Attacker가 DoS 공격을 하지 못 하도록 했습니다. 또한, 이더리움에서 스마트 컨트랙트는 완벽한 튜링 완전한 프로그래밍 환경을 제공하기 때문에, 악의적으로 중단하지 않는 무한 루프 코드를 포함시킬 수도 있습니다. 이런 경우는 특히 블록체인 전체 네트워크에 큰 영향을 미칩니다. 이를 막기 위해서도 트랜잭션 실행에 가스 비용을 부과한 것입니다.
이더리움에서 트랜잭션을 처리하기 위한 비용은 다음과 같이 “가스 가격(gas price) x 가스 총량(gas limit)”으로 계산됩니다. Gas price는 1 가스당 지급할 가격이고, gas limit은 트랜잭션 수행에 소비될 총 가스에 대한 예상치로서 사용자가 임의로 추정하여 입력하는 값입니다.
추가적으로, Gas price는 높을수록 마이너에 의해서 빨리 처리되며, 이 비용은 트랜잭션을 요청한 사람이 지급합니다. 아래 그림을 보면 “Max Transaction Fee”에 대한 개념을 이해할 수 있습니다. 자동차 주유하는 것과 비슷하게 생각하시면 됩니다.
주유를 할 때 목적지까지 가기 위한 연료탱크의 용량이 50L이고 리터당 가격이 2,000원이면 가득 채우기 위해서 총 10만 원을 연료비로 지불합니다. 이더리움에서 트랜잭션을 수행할 때 최대 소모될 예상치인 Gas limit이 2만 가스이고, 1000 가스당 5,000Gwei을 지급할 의향이 있으면 총 10,000 Gwei가 최대 트랜잭션 실행 비용이 되는데, 이것을 ETH로 환산하면 0.0001ETH가 됩니다.
트랜잭션 과정
트랜잭션이 어떻게 처리되는지 알아보겠습니다. 다음 그림은 사용자 A가 사용자 B에게 송금하는 트랜잭션을 보내는 상황이며, 이더리움에서 어떻게 처리되는지 보겠습니다. 사용자 A는 사용자 B에 ETH를 보내는 트랜잭션을 자신의 개인 키로 ECDSA 전자 서명 암호화를 합니다.
geth 같은 이더리움 클라이언트는 해당 트랜잭션을 네트워크에 연결되어 있는 peer(근처) 노드에게 브로드캐스팅합니다. 이는 곧 마이너를 포함한 이더리움 전 네트워크에 전파될 것입니다. 만약 마이너가 해당 트랜잭션을 전달받으면, 트랜잭션이 문법에 맞게 구성되었는지, A의 공개키를 사용하여 해당 전자 서명이 유효한지, 사용자 A의 어카운트에 있는 Nonce와 맞는지 등의 트랜잭션의 유효성 검증을 수행합니다.
또한, 트랜잭션 처리 비용(가스 총량 x 가스 가격)을 계산하고, 사용자 B의 어카운트 주소를 확인하고, 최종 실행을 위해서 트랜잭션 풀에 해당 트랜잭션을 등록합니다. 마이너는 블록을 생성할 때 트랜잭션 처리비용이 높은 순으로 트랜잭션을 선택하는데, 이 트랜잭션이 선택되었다고 가정하겠습니다.
선택된 트랜잭션의 송금 값을 사용자 A 어카운트에서 사용자 B 어카운트로 옮깁니다. 이때 사용자 B가 컨트랙트 어카운트라면 해당 컨트랙트 코드를 작동시키는데, 컨트랙트 코드는 작업이 완료되거나 가스가 모두 소모될 때까지 실행됩니다.
트랜잭션을 처리할 때 만약 사용자 A에 충분한 이더(Ether)가 없거나 가스가 모두 소비되는 등 코드 실행이 불가능하다는 이유로 중간에 송금이 실패한다면, 해당 트랜잭션의 실행 비용을 제외하고 모든 상태를 초기 상태로 복구하고 트랜잭션 처리 대가를 마이너 어카운트에 전송합니다.
트랜잭션이 성공하면 결과를 State DB에 반영하고 남아 있는 모든 가스를 이더로 환산해서 보낸 어카운트인 사용자 A에게 반환하고 트랜잭션 처리 비용을 마이너에게 전송합니다. 이렇게 모든 트랜잭션 처리를 하고, 마이닝에 성공한 블록은 블록체인에 연결합니다.
트랜잭션 비용 처리
이더리움에서는 트랜잭션과 컨트랙트 등을 실행하기 위해서 일정한 대가를 마이너에게 지급해야 합니다. 다음과 같은 가정을 하고 사용자 A가 사용자 B에게 이더를 송금하는 트랜잭션 처리 비용에 대한 계산 과정에 대해서 단계적으로 살펴보겠습니다.
(1) 트랜잭션이 실행되고 (2) 해당 트랜잭션이 유효한지를 검사합니다. (3) 만약 트랜잭션 검증을 통과했다면, 트랜잭션을 만들어서 보내는 사용자 A의 잔액을 살펴봐서 최대 처리비용인 2이더 이상을 보유하고 있는지 검사합니다. (4) 사용자 A가 2이더 이상 보유하고 있으면, A의 어카운트에서 2이더만큼을 차감하고, AccountNonce를 1 증가시킵니다.
(5) gas를 2000으로 초기화하고 메모리 사용 비용으로 500 가스를 지불합니다. (6) 트랜잭션을 실행하고 처리비용 300 가스를 지불합니다. (7) 마지막으로 남은 1,200 가스를 1.2이더로 교환한 후에 A의 어카운트에 더해줍니다. 그리고 해당 상태를 반영시킵니다.
참조
http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about
'SW > 블록체인' 카테고리의 다른 글
블록체인 : 이더리움에서 지원하는 스마트 컨트랙트 : 스마트 컨트랙트를 실행하기 위한 실행엔진 (EVM), 실행 프로세스 (0) | 2022.02.04 |
---|---|
블록체인 : 이더리움 합의 알고리즘인 PoW 원리, 문제점 (0) | 2022.02.03 |
블록체인 : 이더리움의 데이터 계층의 블록의 구조 : 비트코인의 머클트리를 개선한 머클 패트리샤 트리 (0) | 2022.02.01 |
블록체인 : 이더리움의 데이터 계층 : 어카운트, 트랜잭션, 트랜잭션 리시트의 구성 요소 (0) | 2022.01.31 |
블록체인 : 이더리움의 탄생, 로드맵 : 비트코인과의 차이점 (0) | 2022.01.30 |