이더리움(Ethereum) 란? / 스마트 컨트랙트 배포

이재영·2023년 9월 21일
0

BlockChain

목록 보기
6/13
post-thumbnail

이더리움(Ethereum) 란?

  • 블록체인 기술을 기반으로 스마트 계약(컨트랙트) 및 DApp(분산화 애플리케이션) 개발 가능한 분산 컴퓨팅 플랫폼.
  • 블록 생성 시간이 10초대로 짧음.
  • 비탈릭 부테린이 만듬.
  • 이더리움 백서 : https://ethereum.org/ko/whitepaper/ 읽으면 좋음.

vs 비트코인

  • 디지털 화폐로서 전자 지불 수단으로 사용됨
  • 블록 생성 시간 10분
  • 금융상품, 사이트 및 게임에 적용하기 힘듬.

이더리움의 특징

  • 스마트 컨트랙트를 구현할 수 있다. (비트코인은 단순히 자산을 전송)
  • PoW(작업 증명)에서 PoS(지분 증명)으로 변경

PoS(지분증명)

  • 보유한 토큰을 스테이킹하여 블록 생성 및 검증 참여하는 방식, 스테이킹한 토큰의 양이 높을수록 생성 기회가 높아짐.
  • 많은 컴퓨팅파워와 전력을 필요로하는 PoW와 달리 환경친화적.

스마트 컨트랙트

  • 보증기관을 끼우지않고 개인간(P2P)에 원하는 계약을 체결 가능
  • 계약 기간, 금액, 조건 등을 미리 코딩하여 기능 추가 가능하고, 어떠한 종류의 계약도 자동 실행되도록 가능.
  • 스마트 컨트랙트 코드는 EVM(Ethereum Virtual Machine)에서 저장된다.

EVM(Ethereum Virtual Machine)

  • 컴퓨터안에서 다른 운영체제나 프로그램을 실행할 수 있게 해준다.
  • 작동원리
    1. Solidity를 사용해 스마트 컨트랙트 코드 작성.
    2. 위 코드를 컴파일하여 바이트 코드로 컴파일
    3. EVM에서 컴파일된 코드를 실행.
  • 모든 노드들은 스마트 컨트랙트 코드를 가지고 있고, 코드가 블록에 포함되어 체인에 등록되면 각 노드에서 EVM을 통해 실행된다 -> 블록체인 상태를 다른 노드들과 동일하게 유지

이더리움의 Account(계정) - EOA, CA

EOA(External Owned Account) : 외부 소유 계정

  • 개인키가 있는 지갑 계정
  • 트랜잭션을 발생시키고, 다른 EOA , CA에 전송 가능.
  • 대표적 예로, 메타마스크에서 생성한 계정은 EOA

CA(Contract Accounts) : 계약 계정

  • 컨트랙트 코드에 의해 통제되는 계정
  • 컨트랙트 코드는 해시값으로 저장되어 있다.
  • 개인키가 존재하지않아 직접 트랜잭션을 발생시킬 수 없다.
  • 따라서, EOA가 발생시킨 트랜잭션을 전송 받아, 트랙잭션을 실행할 수 있다. -> 컨트랙트 코드가 실행되어 액션 발생.

이더리움 Account 객체 구성

interface Account {
    nonce : number; // 트랜잭션의 횟수 카운터 (이중지불 방지 용도)
    balance : string; // 소유한 잔고, wei 단위로 표시
  // EOA 는 storageRoot, codeHash 사용 x
    storageRoot : string, // account의 상태 저장 공간 초기에는 비어있다.
    codeHash : string; // 스마트 컨트랙트 계약의 코드
}
  • 객체구성에는 nonce 가 있고, 트랜잭션을 발생시킬때 마다 증가시키는데, nonce가 있는 이유는 중복되지 않고 순차적으로 트랜잭션을 처리하고, 이중 지불문제를 방지하기 위해 사용
  • 우선순위를 결정할 때, nonce와 gas fee를 함께 사용해 우선순위 결정.

트랜잭션과 메시지

트랜잭션

  • 서명을 포함
  • 토큰 및 자금 전송

메시지

  • 서명 없음
  • 스마트 컨트랙트 간 상호작용을 위해 주로 사용.

구조

interface Message {
    from : string; // 메시지를 보내는 어카운트 or 컨트랙트의 주소
    to : string; // 메시지를 받는 어카운트 or 컨트랙트 주소
    gas : number; // 메시지를 처리하기 위해 사용할 가스의 량
    gasPrice : number ; // 가스 당의 가격
    value : number; // 메시지와 함께 전송할 이더 량
    data : string ; // 메시지 데이터
    nonce : number ; // 메시지를 전송한 acccount의 nonce 값
}
interface Transaction extends Message{
    v : number; //서명 v 값
    r : string; //서명 r 값
    s : string; //서명 s 값
}

이더리움을 개발할 때 사용하는 툴

  1. geth : go 언어로 작성이 되어있는 이더리움 클라이언트 / chainid를 확인할 수 있는 클라이언트

    • chainid는 블록체인의 고유 식별자 메인넷인지 테스트넷인지 구분을 할 수 있다.
  2. Ganache : 로컬 개발 및 테스트환경을 제공해준다.(이더리움 네트워크)

  3. 파운드리 : 솔리디티 테스트 코드를 작성할 수 있다. TDD 구현 가능.

  4. 메타마스크 : 브라우저의 확장 프로그램으로 웹 어플리케이션에서 이더리움 스마트 컨트렉트와 상호 작용할 수 있도록 도와준다.

    • 개인키의 관리, 트랜잭션을 생성하면 서명을 네트워크에 전달할 수 있다.
  5. Truffle, Hardhat : 스마트 컨트랙트 개발, 테스트 배포를 쉽게 할 수 있도록 도와주는 프레임 워크


Ganache 테스트 환경에서 web3 라이브러리 이용해
잔액 조회 및 송금, 솔리디티로 작성한 코드를
스마트 컨트랙트로 배포 해보기

1. ganache 설치 및 실행 명령어

// 설치
npm i -g ganache-cli
// 실행
npx ganache-cli

설치 후, 실행하면 위 사진처럼 내용이 터미널에 뜨게되는데,
Available Accounts : 사용 가능한 계정
Private Keys : 개인 키
Gas Price : 가스 가격
Gas Limit : 부여할 수 있는 가스 한도
Call Gas Limit : 스마트 컨트랙트 함수를 호출할 때 드는 가스비의 한도, 악의적인 사용자가 가스를 소비해 리소스를 과도하게 사용하는것을 방지할 수 있다.

2. web3 라이브러리 사용

// RPC 통신을 하는 편하게 사용할수 있게 도와주는 web3 라이브러리
// 이더리움 제단에서 지원.
// 스크립트 추가
<script src="https://cdn.jsdelivr.net/npm/web3@1.10.0/dist/web3.min.js"></script>
// web3 생성
const web3 = new Web3("http://127.0.0.1:8545");

127.0.0.1:8545 로 설정하는 이유는 ganache를 실행하면 아래에 듣고있는 IP와 포트가 나온다.

3. 솔리디티 라이브러리 설치 및 코드 컴파일 명령어

// solc 라이브러리 설치
npm i solc@0.8.0
// solc를 사용해서 코드 컴파일
// solc은 solidity 코드를 컴파일하는 도구
npx solc --bin --abi ./test.sol

npx solc 명령어를 통해 컴파일하게 되면 위 사진 처럼 abi 파일, bin 파일이 생기는데,
abi 파일 : 스마트 컨트랙트와 외부 응용 프로그램 사이에서 데이터를 어떻게 인코딩하고 디코딩할지에 대한 규격, 주로 json 형식
bin 파일 : sol 파일에 solidity 언어로 작성한 파일의 내용을 컴파일한 바이트코드(바이너리 코드)

4. 잔액 조회

eth.getBalance("계정주소")를 이용해 계정의 잔고를 가져올 수 있다.
하지만, data에는 wei 라는 단위로 뜨는데 이 단위가 있는 이유는 가스비 연산에 사용하기 위해서다.
1eth = 10^18 wei 이고,
utils.fromWei()를 이용해 이더로 단위 변환할 수 있다.

실행결과

위는 wei 단위, 아래는 eth 단위

5. 송금


eth.sendTransaction : 트랜잭션 발생
from : 보내는 계정 , to : 받는 계정
utils.toWei : ether 10을 wei로 변환

실행결과

blockHash : 블록의 해시값
blockNumber : 블록의 번호
contractAddress : 스마트 컨트랙트가 생성된 경우, 해당 컨트랙트의 주소가 여기에 나타나고, 아닌 경우는 null
cumulativeGasUsed : 현재 블록까지의 누적 가스 사용량
from : 보낸 계정 주소
gasUsed : 이 트랜잭션이 사용한 가스 양
logs : 트랜잭션과 관련된 이벤트 로그등의 정보가 들어가는 배열
logsBloom : 로그 필터링에 사용되는 로그 블룸 필터 값
status : 트랜잭션의 실행 결과 상태
to : 수신 계정 주소
transactionHash : 트랜잭션의 해시값
transactionIndex : 이 트랜잭션이 포함된 블록 내에서의 트랜잭션 인덱스

6. 스마트 컨트랙트 배포


data 의 내용은 bin 파일의 바이트코드 이다.
성공하면 체인에 스마트 컨트랙트가 배포가 된것이다.

출력 결과를 보면 이번엔 contractAddress 에 주소가 나타낸게 확인되는데,
나중에 이 주소를 통해서 sol 파일에 적은 함수들을 접근할 수 있다.

profile
한걸음씩

0개의 댓글