BlockChain

📃Smart Contract | 패스트캠퍼스 블록체인 강의 챌린지 5일차

Tony Min 2023. 3. 5. 19:17

Smart Contract

 

Smart Contract는 Dapp 개발자가 개발한 서비스 Logic을 네트워크에 등록하는 것입니다. 사용자는 Contract를 실행하게 되면 그 Contract의 State를 변경하거나 조회합니다. 사용자가 변경한 State는 블록체인상에 등록된 Contract Logic과 State에 따라 위변조없이 동작함을 보장합니다. 이러한 Smart Contract는 Turing complet 한 시스템입니다.

여기서 Turing complet 란, 스마트 계약을 작성하는데 사용되는 프로그래밍 언어가 Turing Machine가 수행할 수 있는 임의의 계산을 수행할 수 있다는 것을 의미합니다.

Turing Machine은 모든 알고리즘이나 계산을 시뮬레이션 할 수 있는 컴퓨터의 이론적 모델입니다. 만약 프로그래밍 언어가 Turing complet라면, 이것은 Turing Machine이 수행할 수 있는 모든 계산을 수행할 수 있다는 것을 의미하며, 계산적으로 해결 가능한 모든 문제를 해결할 수 있다는 뜻입니다. 

Programming Language

스마트 컨트랙트는 블록체인에서 실행되는 자체 실행 프로그램입니다. 기본적으로 블록체인에 저장되는 코드 조각으로, 특정 조건이 충족될 때 미리 정의된 기능을 수행할 수 있습니다. 스마트 계약은 일반적으로 이더리움 블록체인을 위한 Solidity와 같이 블록체인을 위해 특별히 설계된 프로그래밍 언어로 작성됩니다.

  • Solidity : 가장 많은 개발자들이  사용하는 언어로, C++ 기반의 언어입니다. Object 기반 언어이며, 상속, Library, 사용자 지정 type 등을 지원합니다.
  • Vyper : Python 기반 언어입니다. 보안을 위해 Solidity에 비해 더 작은 기능을 가지고 있습니다.(modifiers, 상속, inline assembly, overload 미지원)
  • Yul & Yul+ : 난이도가 높은 언어이며 EVM뿐 아니라 Ewasm도 지원합니다. Yul+는 Low-Level 언어로 Yul에 비해 더 효율적인 개발이 가능합니다.
  • FE : 가장 최근에 개발된 언어로 2021년 1월 출시하였습니다. Ethereum에 처음 도전하는 개발자를 위해 개발되었으며, Python과 Rust 기반 언어입니다.

Solidity에서 Contract는 다음과 같이 블록체인 Storage에 저장될 중요한 데이터와 이를 처리하는 함수로 구성되어있습니다.

Compile Contract

Smart Contract가 프로그래밍 언어로 작성되면 블록체인에서 실행할 수 있는 Bytecode로 컴파일해야 합니다. Smart Contract를 Compile하게 되면 Bytecode, OPCODE, ABI를 얻게 됩니다. 

  • Bytecode는 블록체인 노드가 이해할 수 있는 저수준 언어로, 고수준 프로그래밍 언어 코드를 Bytecode로 변환하는 Compiler에 의해 생성됩니다. Contract를 네트워크에 배포할 때 필요합니다.
  • OPCODE는 Contract를 실행할 때 Gas 계산을 위해서 필요합니다.
  • ABI를 통해서 Client에 정해진 Interface로 Contract와 통신을 할 수 있습니다.

Contract Deploy

Smart Contract가 Bytecode로 Compile된 후에는 블록체인에 배치되어야 합니다. Bytecode와 필요한 매개 변수가 포함된 Transaction을 블록체인으로 전송하여 이 작업을 수행합니다. Bytecode를 Ethereum Network 상에 배포하게 되면 Contract Address 생성과 함께 해당 주소에 Code가 블록체인상에 저장됩니다. Ethereum Network에서 거래가 확인되면 Smart Contract가 배치돼 블록체인 상의 누구나 접근할 수 있습니다. 

Contract Access

배포된 Smart Contract에 접근하려면 Contract Address와 ABI를 알아야 합니다. Contract Address는 계약이 배포될 때 생성되며 해당 계약에 고유합니다. 블록체인 탐색기를 사용하거나 스마트 컨트랙트와 상호 작용하는 API를 제공하는 web3 라이브러리를 사용하여 계약에 액세스할 수 있습니다. 이를 통해서 Dapp 상에서 Smart Contract 코드 상의 함수를 호출할 수 있습니다.

Calling a Smart Contract

Smart Contract를 호출하려면 Contract Address, 호출할 기능 및 필요한 매개 변수가 포함된 Transaction을 전송해야 합니다. 그러면 Contract 기능이 블록체인에서 실행되고 결과가 반환됩니다. 결과는 블록체인에서 읽거나 Transaction의 결과로 반환될 수 있습니다.

사용자가 Contract 함수를 호출할 때 2가지 방식이 적용됩니다.

  • 조회 함수를 호출하는 경우(state 변경이 없을 때) : 블록체인상에 조회 요청이 기록되지 않습니다.
  • 수정 함수를 호출하는 경우(state 변경이 있을 때) : 블록체인상에 수정한느 호출에 대한 Transaction이 기록됩니다.

Inter-Contract Calls

Smart Contract는 또한 계약 간 다른 Smart Contract를 호출할 수 있습니다. 이는 기능 호출 매개변수에 대상 Contract Address를 포함시킴으로써 이루어집니다. 그러면 대상 Contract가 기능을 실행하고 결과를 호출 Contract로 반환합니다. Contract 간 통신는 종종 단일 Contract가 허용하는 것보다 더 정교한 논리를 수행할 수 있는 복잡한 Smart Contract를 구성하는 데 사용됩니다.

Contract 간의 통신은 Internal Transaction으로 블록체인상에 기록되지 않습니다. trace_block을 통해서 조회가 가능합니다. 하지만 가장 먼저 호출한 Dapp 사용자의 Transaction은 블록체인 상에 기록됩니다.

delegate call, staticcall, call, transfer, selfdestruct 등의 함수를 이용해서 사용이 가능합니다. Upgradeable(Proxy) Contract의 기본 개념이 됩니다.

Event

Event는 Smart Contract 상에서 사용자가 알림을 받고 싶은 내용을 등록하는 것입니다. 이를 통하여 거래의 생성이나 변경등을 확인(logs를 통해)하고 그에 맞는 행동을 할 수 있게 도와줍니다.

Event Registration

Event를 등록하려면 Contract 개발자가 Event와 Event를 트리거할 조건을 정의해야 합니다. Event가 등록되면 외부 애플리케이션이나 기타 Smart Contract를 통해 Event를 들을 수 있습니다.

Event는 Solidity 코드 내에서 event로 정의할 수 있으며, 원하는 코드 위치 내에서 emit을 이용해서 Event를 발생시킬 수 있습니다.

Log로 보여주고 싶은 데이터를 지정하여 외부 서비스에서 조회가 가능합니다.

Event Occurrence

Event는 code상에서 확인이 가능하지만 실제로 블록체인 상에서 확인 할 때는 해당 Transaction의 Receipt을 보면 logs로 전체 Event 발생 내역을 확인할 수 있습니다.

조회 등록 시에도 어떤 방식으로 했느냐에 따라서 출력의 결과도 달라집니다.

  • Logs로 조회하는 경우

Receipt에서 Logs 중 Filter한 결과값만 조회됩니다.

  • Contract.events.<Event Name> 으로 조회

해당 Event의 정보가 ABI와 매칭되어 나옵니다.

+) Etherscan Explorer에서는 해당 Transaction에서 발생한 모든 Logs를 확인할 수 있습니다.

Event Management Useful Sites

The Graph

https://thegraph.com/en/

 

The Graph

The Graph is an indexing protocol for organizing blockchain data and making it easily accessible with GraphQL.

thegraph.com

The Graph는 개발자가 Smart Contract Event를 포함한 블록체인 네트워크의 데이터를 구축하고 인덱싱할 수 있는 도구입니다. 개발자는 The Graph를 사용하여 여러 블록체인 네트워크의 데이터를 표준화된 방식으로 쿼리하고 액세스할 수 있으므로 분산형 애플리케이션을 쉽게 구축할 수 있습니다.

OpenSea Activity

https://opensea.io/activity

OpenSea는 블록체인에 저장할 수 있는 고유 디지털 자산인 NFT(Non-Functionable Token)를 사고 팔고 거래하는 장터입니다. OpenSea는 NFT가 생성, 전송 또는 판매되는 경우와 같은 Smart Contract Event를 사용하여 NFT의 활동을 추적합니다. 그런 다음 이 정보가 OpenSea 시장에 표시되어 구매자와 판매자가 거래에 대한 정보에 입각한 결정을 내릴 수 있습니다.

https://bit.ly/3Y60J4D

 

한 번에 끝내는 블록체인 개발 A to Z Online. | 패스트캠퍼스

블록체인 Dapp 개발부터 클론코딩 실습까지 하면서 마스터해보세요!

fastcampus.co.kr

*본 게시글은 패스트캠퍼스 후기 이벤트 참여를 위해 작성되었습니다.