[블록체인] 솔리디티와 스마트 계약 개념정리1

이희재·2024년 11월 7일

블록체인

목록 보기
1/1
post-thumbnail

블록체인을 이용한 프로젝트를 해보려하는데 개념이 헷갈리고 어려워서 정리 해보았다.

아래는 공부하면서 생각나는 것들과 궁금했던 점들에 대한 답변을 메모처럼 정리한 내용이다.


솔리디티란?

솔리디티란 스마트 계약 코드(contract)를 작성하기 위한 언어이다. 이렇게 작성된 스마트 계약 코드는 이더리움에 의해 컴파일되어 이더리움 블록체인에 배포, 실행된다.

솔리디티 개발은 뭘로 하는데?

솔리디티 개발은 Remix IDE를 이용해 웹 상에서 개발하거나 truffle을 이용해 로컬 환경에서 개발할 수 있다.

스마트 계약 코드(=contract)가 배포되는 이더리움은 뭐지?

이더리움이란 블록체인이 존재하는 네트워크이다.

이더리움 네트워크에는 종류가 있다.
1. 이더리움 메인넷: 이더리움의 주요 네트워크로 실제 거래와 스마트 계약이 실행된다.
2. 테스트넷: 개발자가 스마트 계약을 테스트할 수 있도록 설계된 네트워크

ERC-20은 뭐고 스마트 계약 코드는 어떻게 생겼지?

ERC-20은 이더리움 블록체인에서 토큰을 만들고 관리하기 위한 표준이다. 토큰이 어떻게 이동하고, 어떻게 토큰을 전송하는지 등을 정의한다. ERC-20표준을 따르는 토큰은 서로 호환된다.

ERC-20표준에 따른 contract 코드의 예시는 다음과 같다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract MyToken is IERC20 {
    string public constant name = "MyToken";
    string public constant symbol = "MTK";
    uint8 public constant decimals = 18;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    constructor(uint256 initialSupply) {
        _totalSupply = initialSupply;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(_balances[msg.sender] >= amount, "ERC20: transfer amount exceeds balance");
        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(_allowances[sender][msg.sender] >= amount, "ERC20: transfer amount exceeds allowance");
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        _allowances[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }
}

contract가 배포되면 무슨 일이 일어나지?

  1. 컴파일: 이더리움은 contract를 바이트 코드로 컴파일한다.

  2. 배포 트랜잭션 생성: 블록체인에 바이트 코드를 배포하기 위해 트랜잭션을 생성한다. 바이트 코드와 가스 비용(GAS)을 지정해야한다.

  3. 트랜잭션 처리: 배포 트랜잭션이 이더리움 네트워크로 전송되어 네트워크의 노드들에 의해 검증되고 트랜잭션을 블록에 포함시켜 블록체인에 추가한다.

  4. 계약 주소(contract address)할당: 배포(블록체인에 추가)에 성공하면, contract는 고유한 계약 주소를 할당받는다. 이 주소를 이용해 계약과 상호작용한다.

  5. 상호작용: 계약주소를 이용해 contract에 작성된 함수를 호출하고 데이터를 조회할 수 있다.

계약과의 상호작용이 뭔데?

contract 코드에 작성했던 함수를 호출하는 것이 상호작용이다. 크게 두 가지 종류가 있다.

  1. Transaction
    블록체인의 상태를 변경하는 것. 토큰을 전송, 데이터를 기록, 계약 상태 변경 등. 블록체인에 기록되고 가스 비용이 발생한다.

  2. call
    블록체인의 상태를 변경하지 않고 데이터만 조회하는 것. 계약의 변수 값 확인 등. 블록체인에 기록되지 않고 가스 비용이 발생하지 않는다.

그래서 이걸 이용해서 뭘 할 수 있는 거지?

스마트 계약의 특징을 이용해서 다양한 서비스를 개발할 수 있다.

  1. 스마트 계약은 자동 계약을 가능하게 해서 사람의 개입 없이 특정 조건이 충족되면 자동으로 작업을 실행한다.

이를 이용해 특정 가격에 자동적으로 주식을 사고팔 수 있는 자동 주식 거래 프로그램을 만들 수도 있다.

  1. 작품을 토큰화하여 블록체인에 기록할 수 있다. = NFT
profile
그냥 하는 사람 @Heejae-L

0개의 댓글