이더리움 백서 조지기 - (2) 이더리움

김진주·2022년 3월 9일
0

오류가 발견되면 꼭 지적해주세요!
본문 내용에 대해 [본문 Page - Paragraph - Line] 표기를 하고 있습니다.

이더리움 어카운트 (Ethereum Accounts)

[본문 11-2] 이더리움에서, 상태(state)는 어카운트(account)라고 하는 오브젝트(object)들로 구성되어 있다. 각각의 어카운트는 20바이트의 주소와 어카운트 간 값과 정보를 직접적으로 전달해 주는 상태변환(state transition)을 가지고 있다.

어카운트 : 주소 + 상태변환

[본문 11-3] 이더리움 어카운트는 다음 네 개의 필드를 가지고 있다.

  • 논스 (nonce) : 각 트랜잭션이 오직 한번만 처리되게 하는 일종의 카운터
  • 어카운트의 현재 이더(ether) 잔고
  • 어카운트의 계약 코드 (존재한다면)
  • 어카운트의 저장 공간 (초기설정(default)상에서는 비어있음)

이해하기 어렵지 않다 여기까지.

물론 여기서 개 ㅋㅋ킹받게 (존재한다면~) 이라는 조건이 처 달려있는데, 이건 밑에 읽으면 나오지만, 외부 소유 어카운트 (EOA)에는 존재하지 않지만, 컨트랙트 어카운트에는 존재하는 계약 코드를 말하는거다.

아니 컨트랙트 어카운트랑 외부 소유 어카운트 설명을 해주고 나서 말해줘야 되는거 아님? 이라는 소신발언을 꿈꾸지만 이 백서 쓴 사람은 나보다 똑똑할 것으로 추정되어서 할 수 업다 백서 특인가보다... 끝까지 읽어야 앞 내용이 이해됨 ㅜㅜ

[본문 11-4] 이더는 이더리움의 기본 내부 암호-연료(crypto-fuel) 이고, 트랜잭션 수수료를 지불하는데 사용된다.

이더리움 수수료를 가스라고도 하는데 (자동차 운행에 gas 가 필요하듯),

이더가 결국 트랜잭션 수수료로 사용되고 이더리움이 작동되도록 하기 때문에 '암호-연료'라는 표현을 쓰는 듯.

갑자기 이얘기 왜하는지 난 잘 모르겠음.

[본문 11-4-2] 보통 두가지 종류의 어카운트가 존재하는데, 프라이빗 키에 의해 통제되는 외부 소유 어카운트(Externally Owned Accounts) 와 컨트랙트 코드에 의해 통제되는 컨트랙트 어카운트(Contract Accounts)가 있다.

트랜잭션이 여기서 뭔지 궁금하다면, 다음 파트에 나오니까 대충 '거래를 해달라는 서명 데이터' 라고 이해하자.


외부 소유 어카운트 (EOA) : 프라이빗 키에 의해 통제

  • 일반 사용자 계정 느낌

  • 트랙잭션을 전송할 수 있음 - 거래를 필요로 하고, 요구하는 주체

  • 비트코인에서 개인키를 갖듯, 본문의 '프라이빗 키'를 갖는 것 - 개인키라 하겟음


컨트랙트 어카운트 (CA) : 컨트랙트 코드에 의해 통제

  • EOA로부터 트랜잭션을 통해 메세지를 받아, 조건 충족시 컨트랙트 코드가 발동되어, 계약 내용이 이행되도록 함

  • 개인키가 없다


본문만 봤을 땐 이게 둘 다 어카운트라는 이름을 써서 뭔 소린가...
컨트랙트 어카운트는 주인이 없는 공공재 계정이란건가...
뭐라는건가 싶었는데

대충 컨트랙트 어카운트를 로봇 은행원의 업무처리 내용이 담긴 계정이라고 생각하자.

AWS 에서는 이렇게 설명한다 : "There are two types of accounts in Ethereum: Externally Owned Accounts (EOA) and Contract Accounts.
An EOA is controlled by a private key, has no associated code, and can send transactions.
A contract account has an associated code that executes when it receives a transaction from an EOA. A contract account cannot initiate transactions on its own. Transactions must always originate from an EOA."
(대충 번역) 두 종류의 이더리움 어카운트가 존재한다. EOA 와 CA.
EOA는 프라이빗키 (개인키)에 의해 통제되며, 코드가 없으며, 트랜잭션을 전송할 수 있다.
CA는 EOA로부터 트랜잭션을 전송받았을 때 실행되는 코드가 존재한다. CA는 직접 트랜잭션을 시작할 수 없다. 모든 트랜잭션은 항상 EOA로부터 비롯된다.

여기서 그려지는 단순한 거래 그림은 요런 것이다.

예시)

CA의 코드가 "1ETH를 받으면 송금자에게 데이터를 전송한다!" 라는 계약 내용을 담고있을 때,
누군가의 EOA로부터 트랜잭션을 통해 메시지를 받는다.
그러면 코드가 발동되어 거래가 이루어지는 것이다.

맞냐?? 그럼 본문 내용을 더 읽어보자...

[본문 11-4-3] 외부 소유 어카운트는 아무런 코드도 가지고 있지 않으며, 이 어카운트에서 메시지를 보내기 위해서는 새로운 트랜잭션을 하나 만들고, 서명(signing)을 해야 한다. 컨트랙트 어카운트는 메시지를 받을 때마다, 자신의 코드를 활성화시키고, 이에 따라 메시지를 읽거나 내부 저장공간에 기록하고, 다른 메시지들을 보내거나, 컨트랙트들을 차례로 생성하게 된다.

대충 EOA가 CA에게 메세지를 보내기 위해서 필요한 것은 (트랜잭션 + 서명).
CA는 메시지를 받으면 코드를 활성화 -> 메시지를 읽기, 내부 저장공간에 기록하기, 다른 메시지들을 보내기, 컨트랙트 생성 ...

아니근데 이 계약서 덩어리같은걸 왜 주체가 있는것 마냥 '계정'이란 말을 써서 나를 헷갈리게 하는걸까?? ㅠㅠ
라는 질문에 대한 답이 마지막에 나와있다. 찔렸냐...

[본문 11-5] 이더리움에서 컨트랙트는, 수행되거나 컴파일 되어야 할 어떤 것이라기 보다는, 이더리움의 실행 환경안에 살아있는 일종의 자율 에이전트(autonomous agents)로서, 메시지나 트랜잭션이 도착하면 항상 특정한 코드를 실행하고, 자신의 이더 잔고와, 영속적인 변수들을 추적하기 위해 자신의 키/값 저장소를 직접적으로 통제하는 역할을 한다.

ㅋㅋ그렇다.. 살아있는 "자율 에이전트" 라서... 납득가긴 함.
트랜잭션을 통해 메시지를 받으면 코드로 발동되는 로봇 은행원이나 우체국 아저씨? 집배원? 같은 느낌으로 이해하면 귀여울 것 같다.

메시지와 트랜잭션 (Messages and Transactions)

[본문 11-6] 이더리움에서 사용되는 트랜잭션(transaction)이란 용어는 외부 소유 어카운트가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 말한다. 이 트랜잭션은 다음을 포함하고 있다.

  • 메시지 수신처
  • 발신처를 확인할 수 있는 서명
  • 발신처가 수신처로 보내는 이더의 양
  • 선택적(optional) 데이터 필드
  • STARTGAS 값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수
  • GASPRICE 값, 매 계산단계마다 발신처가 지불하는 수수료

트랜잭션은 결국 내가 CA (로봇 은행원/집배원) 에게 보내고자 하는 메시지를 담고 있는 서명된 데이터,

[본문 11-8] 처음 세 항목은 암호 화폐에서는 거의 표준처럼 사용되는 값이다.

히히 택배로 치면 이런거 아닐까.

보내는 주소 주소 ~
보내시는 분 서명 ~
보내시는 내용물 ~
... 등등.

쉬워서 이 셋에 대한 부가 설명은 안해주시는 듯 하다.

[11-8-1] 데이터 필드는 초기값으로 설정된 기능(function)은 가지고 있지 않지만, 버추얼 머신(virtual machine)은 컨트랙트가 이 데이터에 접근할 때 사용할 수행코드(opcode)를 가지고 있다. 예를 들어, 블록체인 위에 도메인 등록 서비스로 기능하고 있는 컨트랙트가 있을 경우, 이 컨트랙트로 보내지는 데이터는 두개의 필드를 가지고 있는 것으로 해석할 수 있다. 첫번째 필드는 등록하고자 하는 도메인이고, 두번째 필드는 IP 주소이다. 컨트랙트는 메시지 데이터로부터 이 값들을 읽어서 저장소 내 적당한 위치에 저장한다.

  • 선택적 데이터 필드 .. ㅠㅠ 힝~... 이해 모대~

[본문 12-2] STARTGAS 와 GASPRICE 필드는 이더리움의 앤티-서비스거부(anti-DoS) 모델에 있어서 매우 중요한 역할을 한다. 코드내의 우연적이거나 악의적인 무한루프, 또는 계산 낭비를 방지하기 위해 각각의 트랜잭션은 사용할 수 있는 코드 실행의 계산 단계 수를 제한하도록 설정되어야 한다. 계산의 기본 단위는 gas 이고 보통, 계산 단계는 1 gas 의 비용이 소요되나, 어떤 연산은 더 비싼 계산 비용을 치루거나, 상태의 일부분으로 저장되어야 하는 데이터의 양이 많을 경우 더 많은 수의 gas 비용이 필요하게 된다. 또한 트랜잭션 데이터에 있는 모든 바이트는 바이트당 5 gas 의 수수료가 든다.

앞서 나왔던

  • STARTGAS 값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수
  • GASPRICE 값, 매 계산단계마다 발신처가 지불하는 수수료

Startgas와 gasprice는 우리 로봇 은행원/집배원의 노동권을 지켜준다 ㅠㅠ

아무튼 이더리움 트랜잭션도 결국 데이터를 옮기는 것이기 때문에, 계산이 필요하고, 여기서 계산을 위한 노동의 보상으로 발생하는 것이 이더리움 가스다.

너무 비효율적인 코드는 작업량을 터지게 하고, 이더리움을 사용하는 모두를 빡치게 하기 때문에 이런 수수료가 있는 것이다.

악의적이고 비효율적인 코드를 방지하도록 하는 제재인 셈. (노동권 보호 ㅜㅜ)

[본문 12-2-6] 이러한 수수료 시스템의 의도는 어떤 공격자가 계산, 밴드위스, 저장소 등을 포함하여 그들이 소비하는 모든 리소스에 비례하여 강제로 수수료를 지불하게 하는데 있다. 따라서, 따라서 이런 리소스중 어떤 것이라도 상당량을 소비하는 네트웍과 연관된 트랜잭션은 대략 증가분에 비례한 gas 수수료를 가지고 있어야 한다.

공격자는 이러한 수수료 때문에 공격하기 어렵다. 해봐... 수수료 폭탄
누진세는 없나?

profile
화성 갈래요. 아니 진짜로.

1개의 댓글

comment-user-thumbnail
2022년 10월 27일

으엉어어어ㅓㅜㅜㅜ 다음포스팅은 없나요....너무 이해하기 쉬운데...

답글 달기