Home 02-블록체인-기초-스마트-컨트랙트
Post
Cancel

02-블록체인-기초-스마트-컨트랙트

1. 정의

1990년대 Nick Szabo가 소개한 개념으로 디지털 형식으로 명시된 서약(Commitment)들의 집합이다.

  • 결고 스마트하지 않은 단순 컴퓨터 프로그램이다.
    • 다소 잘못된 용어임에도 불구하고 자리 잡았다.
  • 법적 맥락이 없다.
    • 계약서 안에 서로 서명을 하거나, 참여한 사람들 끼리의 약속이다.
    • 계약서가 블록체인에 담기기 때문에, 계약서를 신뢰할 수 있게 된다.
    • 즉, 계약에 담긴 코드를 신뢰할 수 있게 된다.


1) 블록 체인에서의 정의

불변의 컴퓨터 프로그램

  • 컴퓨터 프로그램
  • 불변 (한 번 배포가 되면 변경이 불가능하다.)
    • 한번 배포가 되어 컨트랙트 주소가 생성이 되면, 해당 주소와 코드는 불변으로 매핑이된다.
  • 결정적 실행한 결과가 모두 같다.
    • 같은 프로그램을 모두가 공유를 하고 있기 때문에,
    • 전세계 모든 컴퓨터는 해당 프로그램에 대해 똑같은 input에 똑같은 output을 가진다.
  • EVM 위에서 동작한다.
  • 탈중앙화된 World Computer 동일한 상태를 유지한다.
    • 전세계 수많은 사람들이 똑같은 로직과 저장소를 가지고 있다.
    • 이더리움은 거대한 한 대의 컴퓨터이다.
  • 이더리움 애플리케이션의 기본적인 구성 요소로 모든 변수와 함수는 어느 한 컨트랙트에 속해있다.


2) Smart Contract를 작성하는 언어

  • Solidity
  • LLL
  • Viper
  • Assembly


3) Smart Contract 배포와 호출


image-20220825171158140


  • Smart Contract Code 작성
  • EVM Bytecode, ABI in JSON으로 컴파일
    • EVM: 이더리운 블록체인 네트워크의 노드들이 공유하는 하나의 가상 머신 (매운 거대한 하나의 분산 컴퓨터)
      • EVM은 누구나 접근할 수 있는 거대 컴퓨터이며, 수만ㅎ은 사용자가 변경하는 데이터의 충돌과 보안을 담당한다.
      • 솔리디티 코드 =(컴파일) => 바이트코드 => 바이트 코드를 EVM이 실행한다.
    • ABI: 컨트랙트의 함수와 매개변수들을 JSON 형식으로 나타낸 리스트다.
  • 트랜잭션을 생성하여 Smart Contract의 Bytecode가 data에 담기게 된다.
  • 트랜잭션을 서명하고 전세계의 이더리움 네트워크로 보낸다.
  • 이더리움 네트워크에 참여한 모든 컴퓨터들이 해당 스마트 컨트랙트에 대한 내용을 받게 된다.
  • 클라이언트 (EVM)이 서명을 하고 바이트 코드를 실행하여 트랜잭션을 전파한다.
  • 해당 트랜잭션이 블럭 안에 담기게 되고 이는 불변의 데이터이기 때문에 해당 스마트 컨트랜트 코드가 불변의 데이터가 된다.
  • 배포가 완료가 되면 컨트랙트 주소가 생성된다. (스마트 컨트랙트도 이더나 토큰들을 보관할 수 있다. )
  • 주소와 인터페이스를 통해 로직을 실행할 수 있게 된다. (CA와 ABI를 통해 함수를 호출한다.)


:white_check_mark: 용어

  • ByteCode
  • ABI (Application Binary Interface)
  • CA (Contract Address)


4) 작업 증명

  • 컨트랙트의 함수를 실행하면 트랜잭션으로서 네트워크 노드 하나 혹은 려어 노드에 실행을 알린다.
  • 네트워크 노드들은 여러 개의 트랜잭션을 모으고 작업 증명으로 알려진 계산이 매우 복잡한 수학문제를 풀기위한 시도를 한다.
  • 해당 트랜잭션 그룹을 그들의 작업 증명과 함꼐 블록으로 네트워크에 배포하게 된다.
  • 한 노드가 어떤 작ㅇ업증면을 풀면, 다른 노드들을 그 작업 증명을 풀려는 시도를 멈추고 해당 노드가 보낸 트랜잭션 목록이 유효한 것인지 검증한다.
  • 유효하다면 해당 블록을 받아들이고 다음 블록을 풀기 시작한다.


2. Smart Contract 배포

  • 스마트 컨트랙트 IDE인 remix 활용
    • 별도의 개발환경 설정 없이 스마트 컨트랙트를 작성하고 배포, 호출할 수 있다.
  • Slolidity 코드는 컨트랙트 안에 쌓여있다.


1) 배포 단계

  • Storage.sol파일을 컴파일한다.
    • 배포 가능한 컨트랙트를 생성한다.
  • ABI가 생성된다.
    • Storage_metadata.json파일에서 확인이 가능하다.
    • 전세계의 이더리움 컴퓨터에 배포되어 있는 모든 스마트 컨트랙트에서 사용되는 함수를 확인할 수 있다.
    • 함수의 매개변수, 반환값 등
  • Bytecode가 생성된다.
    • Storage.json파일에서 확인이 가능하다.
    • 어샘블리어와 유사한 opcode가 나열되어 있는 것을 확인할 수 있다.
    • 이를 토대로 이더리움 머신에 배포를 하게 된다.
  • 컴파일이 완료가 되면 직접 블록체인에 배포를 할 수 있다.
  • 배포된 컨트랙트의 주소를 확인할 수 있다.


3. Smart Contract 호출

1) 호출


image-20220825173655011


// 모든 솔리디티 소스 코드는 version pragma로 시작해야 한다. 
// 이는 해당 코드가 이용해야 하는 솔리디티 버전을 선언하는 것이다. 
pragma solidity >=0.7.0 <0.9.0;

contract Storage {

	// number를 설정하지 않으면 기본값으로 0으로 지정된다. 
    uint256 number;

	// number라는 변수의 값을 설정 (setter)
    function store(uint256 num) public {
        number = num;
    }

	// number라는 변수의 값을 return (getter)
    function retrieve() public view returns (uint256){
        return number;
    }
}
  • store: store라는 함수를 호출
    • store 함수를 호출함으로 값을 변경시킬 수 있다. (정해진 규칙대로만 변경할 수 있다.)
    • 전세계의 모든 컴퓨터에 정해진 규칙을 가지고 값을 설정함으로서 해커와 같은 악성 유저가 해당 가치를 변경할 수 없도록한다.
    • 값을 설정하기 때문에 gas를 사용한다. (이더리움 네트워크가 연결된 모든 컴퓨터가 일을 하게 하기 때문)
    • 트랜잭션을 생성한다.
  • retrieve: retrieve라는 함수를 호출
    • 단순하게 저장된 데이터를 불러온다.
    • gas를 사용하지 않는다.


gas가 존재하는 이유

솔리디티에서는 함수를 실행할 때마다 가스라는 화폐를 지불해야 한다.

연산을 수행하는 데 소모되는 컴퓨팅 자원의 양이 해당 비용을 결정한다. 사용자들이 함수를 실행하면 실제 돈을 사용하기 때문에 코드 최적화는 필수이다.

gas가 있는 이유는 다음과 같다. 이더리움은 크고, 느리지만 굉장히 안전한 컴퓨터이다. 함수를 실행할 때 네트워크 상의 모든 개별 노드가 함수의 출략값을 검증하기 위해 해당 함수를 실행해야 한다.

모든 함수의 실행을 검증하는 수천 개의 노드가 바로 이더리움을 분산화하고 데이터를 보존하며 누군가 검열할 수 없도록 하는 요소이다. 특정 사용자가 무한 반복문을 써서 네트워크를 방해하거나 네트워크 자원을 모두 사용하지 못하도록 만들지 못하기 위해 연산처리에 비용이 들게 만들었다.


2) 제 3자의 접근

image-20220825174816813

  • 컨트랙트 주소(CA)를 통해 접근 한다.
  • ABI를 통해 함수 호출이 가능하다.


This post is licensed under CC BY 4.0 by the author.