솔리디티 실습

CHOYEAH·2023년 10월 23일
0
post-thumbnail

1. Remix 둘러보기, 배포, 테스팅, 디버깅


Remix - Ethereum IDE

리믹스는 솔리디티 컨트랙트 온라인 IDE로 사이즈가 크지 않은 컨트랙을 테스팅하고 디버깅하기 용이하며 컨트랙 배포 또한 가능하다.

리믹스 UI 둘러보기

  • FILE EXPLORERS
  • SOLIDITY COMPILER
  • DEPLOY & RUN TRANSACTION
    • JavaScript VM: 자바스크립트 버츄얼 머신, 간단한 테스팅시에는 JVM이 편리
    • Injected Web3: 메타마스크 연동시 사용
    • Web3 Provider: Geth나 가나슈의 엔드포인트를 연동시 사용
  • PLUGIN MANAGER
  • SETTINGS

컨트랙트 컴파일

Compile 버튼을 클릭하여 컴파일하면 하단에 컨트랙트를 확인 가능함

컨트랙트 배포

컴파일된 컨트랙트를 선택 후 Deploy 버튼을 클릭하면 컨트랙트가 블록체인에 배포된다.
콘솔 화면에는 컨트랙트 어드레스를 포함한 배포된 트랜잭션 관련된 상세 정보를 확인할 수 있다.
좌측 하단에는 배포된 컨트랙트 패널이 생성되고 이 영역에서 테스트가 가능하다.

컨트랙트 테스트

인풋창에 컨트랙트 인자를 넣고 좌측 버튼(함수명이 출력됨)을 클릭하면 컨트랙트 트랜잭션이 익스큐션되고 콘솔 화면에서 결과값을 포함한 상세 정보를 확인할 수 있다.

컨트랙트 디버깅

컨트랙트를 배포하면 트랜잭션 내역이 콘솔에 출력되는데 이때 우측에 디버그 버튼을 통해 디버깅을 진행할 수 있다.

  • Instructions

    현재 실행중인 컨트랙의 바이트 코드가 옵코드로 변환되서 표시
    디버깅시 스텝 오버 버튼을 클릭하면 코드의 영역에서 사용되는 옵코드들을 볼 수 있다.
    이더리움 가상머신에서는 컨트랙이 배포되었을때 옵코드를 스택에 먼저 쌓고 해당 트랜잭션이 있을 때마다 필요한 옵 코드를 읽으면서 실행시킨다.
    각각의 옵코드는 고유의 역할이 있으며 옵코드마다 소량의 가스비가 든다. 옵코드별 역할 정보는 아래의 링크에서 확인할 수 있다. https://ethereum.stackexchange.com/questions/119/what-opcodes-are-available-for-the-ethereum-evm

  • 스텝 오버 버튼

    한 줄 씩 위/아래로 처리

  • 스텝 인투

    한 라인에 다른 함수가 포함되어있으면 그 함수까지 건너가서 디버깅

  • 점프 아웃

    맨 마지막으로 이동

  • 점프 투 브레이크 포인트

    브레이크 포인트 설정시 그 전/후 브레이크 포인트로 이동

  • Solidity Locals
    현재 디버깅 진행중인 위치의 지역변수 표시

  • Solidity States
    현재 디버깅 진행중인 위치의 상태변수 표시

  • 그외
    현재 실행중인 로우레벨 정보들을 표시

2. 가스란?


  • 가스는 컨트랙 내에 특정 부분의 코드를 실행할때 그 가격을 책정할때 쓰이는 작업 단위.
  • 따라서 코드를 실행중인 계정에서 가스를 지불해야 하므로 가스비를 소비할 잔액이 있어야 한다.
  • 이 가스는 채굴자들에게 보상금으로 지급된다.
    • 수수료 예:
      • 다른 계정으로 코인을 전송할 때
      • 스마트 컨트랙을 배포할 때
      • 함수에서 상태 변수에 새로운 데이터를 추가하거나 업데이트 할 때
      • 등등..
  • 가스 개념이 존재하는 이유는 악의적인 컨트랙트로 네트워크 성능 저하를 방지하기 위하여.
  • 이더가 아닌 가스 단위를 쓰는 이유는 가격 변동성이 이더에 비해 거의 없기 때문.
  • 컨트랙 내의 어떤 함수를 실행시킬때 얼마나 많은 가스가 필요한지는 그 함수의 복잡성에 따라 결정됨.
  • 연산에 소모되는 비용을 옵코드(opcode)라 부른다.
  • 그리고 그 연산에 소모되는 네트워크 상태, 컴퓨팅 자원의 양에 따라 비용(옵코드)이 결정됨.

메타마스크에서 트랜잭션을 처리할때의 예

  • Gas Limit
    실행하려는 트랜잭션에서 쓰이는 가스 최대 한도 비용.
    메타마스크의 경우에는 미리 해당 트랜잭션을 시뮬레이션하여 실제로 쓰이는 가스를 측정해서 그 예측량을 사용자에게 보여줌. 네트워크 상탱에따라 높게/낮게 책정됨.
  • Gas Price
    이 트랜잭션을 끝내기위해 채굴자에게 지불하는 금액으로 GWEI라는 단위를 사용. 네트워크 상태에 따라 평균가가 적용됨. 가스비를 높게 책정해서 지불하면 채굴자들이 나의 트랜잭션을 먼저 선택해서 처리할 가능성이 높다.
    • 다음의 링크에서 현재 네트워크에서 트랜잭션을 처리하는 평균 가스가격을 알 수 있음. Real Time Gas Use
  • Max Transaction Fee
    최대로 들 수 있는 예측 수수료 비용으로 실제 비용은 트랜잭션을 처리 후 알 수 있다.
    가스 비용 계산 예:
    Gas Limit Gas Price = Max Transaction Fee
    40045
    11 Gwei= 0.004405ETH
    (11 Gwei는 0.000000011 Ether)

3. OpCodes


연산에 소모되는 비용 == Opcode(Operation Code)

  • 산술 연산
  • 로직 연산
  • Memory or Storage 연산
  • 등등..

컨트랙트를 컴파일하면 바이트 코드로 변환이 되고 그 다음으로 옵코드로 분해되서 이더리움 가상 머신에 의해 실행이된다.
리믹스에서 트랜잭션 컴파일 후 Compilation Details 버튼을 클릭하면 상세 내용을 확인할 수 있는데,

BYTECODE 영역의 object 필드가 컴파일된 바이트 코드이다.
각각의 옵코드는 고유의 역할이 있으며 옵코드마다 소량의 가스비가 든다.

object 밸류값을 복사해 https://etherscan.io/opcode-tool 페이지 인풋에 붙여넣고 디코드를 하면 리믹스 상세 창에서 보이는 Opcode와 동일한 결과를 출력시킨다.

옵코드별 역할 정보는 다음의 링크에서 확인할 수 있다.
https://ethereum.stackexchange.com/questions/119/what-opcodes-are-available-for-the-ethereum-evm

profile
Move fast & break things

0개의 댓글