[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-06-14

임형석·2023년 6월 14일
0

Ethereum


블록구조

이더리움의 블록구조 역시 비트코인과 마찬가지로 헤더, 바디로 이루어져 있다.

헤더에는 블록의 메타데이터가 저장되어 있다.

블록해시, 이전 블록해시, 루트해시, 난이도, 타임스탬프, 논스 등이 들어있다.

추가적으로 엉클해시, tx해시, receipt해시, 가스리밋 등이 포함되어 있다.

비트코인의 경우 루트해시는 머클루트이다. 이더리움의 경우에는 3가지 다른 트라이루트가 포함되어있는데, 각각 state, transactions, receipts 3가지 이다.

이더리움은 특성에 맞게 여러 정보들이 추가되어 있다. 하지만 기본적으로 헤더에는 메타데이터, 바디에는 거래내역이 들어있는 것은 비트코인과 같다.

아래는 이더스캔에서 확인한 블록의 정보이다.

state trie 는 이더리움 네트워크에 존재하는 모든 계정에 대한 정보를 키-값 쌍으로 보관한다.

여기서 키는 계정 주소를, 값은 주소에 대한 정보를 의미한다.(논스, 잔고, stroage root, code hash)

이더리움에 기록되는 정보는 2가지로 나뉠 수 있다. 영구적인지 휘발성인지.

영구적인 것은 일어난 거래이다. 거래 내역은 변하지 않으며, 휘발성인 것은 계정의 상태이다. 계정의 상태는 계속 변하기 때문.

영구적인 정보를 저장하는 곳은 transaction trie 이고, state trie 는 휘발성 정보를 저장하고 있다.

transaction 루트에 값이 담기고, 완전히 담기게 되면 transaction 이 실행되면서 state 루트를 변경시킨다.

state 루트의 Path 가 주소이며, 특정 주소의 논스값으로 거래를 몇번했는지도 파악이 가능하다.


Trie

이더리움의 트라이는 state, transactions, receipts 3가지 이다.

트라이로 해결할 수 있는 점

  • 이 거래가 특정 블록에 속해있는지?
    ㄴ transaction trie
  • 지난 30일 동안, 이 주소에서 생성된 특정 형태의 모든 거래는?
    ㄴ receipts trie
  • 특정 계정의 현재 잔고가 얼마인지?
    ㄴ state trie
  • 현재 이 계정이 존재하나요?
    ㄴ state trie
  • 특정 거래를 특정 계약에서 실행시켜보려고 하는데 출력값은?
    ㄴ state trie

Gas

gas 는 이더리움의 ether 에서 가져온 이름이다. 소프트웨어 내에서 사용되는 다양한 요소들은 연관된 이름을 자주 쓰곤 한다.

비트코인과 마찬가지로, 이더리움도 수수료 제도가 있다. 가스가 그 역할을 한다.

가스와 관련하여 알아야 할 것은 다음과 같다.

  • Gas limit
  • Gas price
  • Gas used
  • Block gas limit

Gas limit * gas price = max transaction fee

Gas price 는 1 가스 당 가격을 의미한다. Gas limit 은 사용할 최대 가스양, 가스 상한선이다.

Block gas limit 은 1개의 블록에 담길 수 있는 최대 가스양을 의미한다.

블록에 담긴 각 트랜잭션의 가스리밋의 총합이 이것을 넘길 수 없다.

다음의 예시 사진을 보며 가스를 이해해보자.

전송자가 보내는 OPcode 의 스택마다 소모되는 가스비가 정해져있다.

OPcodes for EVM

그리고 전송자가 트랜잭션에 OPcode 와 100의 가스를 사용한다고 하면,

OPcode 의 전송에 사용되는 가스를 계산하여 가스가 충분한지 확인한다.

가스가 충분하다면 가스를 소모해 수신자에게 전송하게 된다.

그리고 전송에 사용된 가스는 내 거래를 블록에 담아 블록을 생성한 사람에게 보상으로 지급된다.

남는 가스는 다시 전송자에게 돌아오게 된다.

만약, 전송자의 가스가 충분하지 않다면..

Initial state 로 돌아가며, 트랜잭션이 실행되지 않는다.


메타마스크에서는 트랜잭션을 실행하기 전, gas price , gas limit 을 설정할 수 있다.

아래에서는 web3.js 에서 트랜잭션을 생성할 때 만드는 코드이다.

gas price, gas limit , 수신자 , 보낼 이더 등을 직접 코드로 작성하여 트랜잭션을 생성할 수 있다.

web3.eth.signTransaction({
    from: "0xEB014f8c8B418Db6b45774c326A0E64C78914dC0",
    gasPrice: "20000000000",
    gas: "21000",
    to: '0x3535353535353535353535353535353535353535',
    value: "1000000000000000000",
    data: ""
}).then(console.log);

  • gas 값을 높게 측정할수록 빨라질까?
    ㄴ gasPrice 를 높이면 블록에 담길확률이 높아지고, 처리속도도 빨라진다.

  • gas limit 이 충분하지 않으면 어떤 일이 벌어질까?
    ㄴ 트랜잭션이 실행되지 않는다.

  • gas limit 에 도달하지 않고 남은 gas 들은 어떻게 되는 것일까?
    ㄴ 남은 가스들은 모두 전송자에게 돌아간다.

  • gas 값, gas limit 그리고 block gas limit 은 각각 누가 결정할까?
    ㄴ 값과 리밋은 전송자가 결정한다. 블록 가스 리밋은 이더리움 프로토콜에서 자체적으로 계산. 결정된다.

  • 어떻게 해야 빠르게 블록 안에 담기게 될까?
    ㄴ 가스 값을 높게 설정하면 먼저 블록에 담길 가능성이 높아진다.


Solidity


Hardhat

하드햇은 이더리움 소프트웨어 개발 환경으로, 스마트 컨트랙트와 디앱을 개발, 컴파일, 디버깅, 배포까지의 개발 환경을 지원하는 툴 이다.

또한, 여러 task, plugin 등을 사용해 개발자가 원하는 기능을 커스터마이징 할 수 있다.

설치부터 사용까지 알아보자.


npm init
npm install --save -dev hardhat
npm install --save-dev @nomicfoundation/hardhat-toolbox
npx hardhat

여기서 아래와 같은 화면이 나오는데, 키보드 화살표로 JS 를 선택하고 엔터.

설치가 끝나면, 폴더에 아래 사진과 같이 설치가 되어있는 것을 볼 수 있다.

여기서 contracts 폴더의 Lock.sol 파일로 컨트랙트를 작성한다.

컨트랙트를 작성했다면 아래의 명령어로 컴파일.

npx hardhat compile

로컬과 테스트넷 배포는 다음 글에서..


0개의 댓글