Linea에서 간단한 스테이블코인 작성 및 배포 방법

Linea 네트워크에서 스테이블코인을 작성하고 배포하는 방법 알아보기

6분 읽기
Linea에서 간단한 스테이블코인 작성 및 배포 방법

Stablecoin은 블록체인 및 web3 생태계의 핵심 요소로 자리 잡았으며, 사용자들이 Bitcoin과 Ethereum 같은 암호화폐의 변동성을 피할 수 있도록 도와줍니다. 이 블로그에서는 stablecoin이 무엇인지 알아보고, Linea에서 간단한 stablecoin 컨트랙트를 작성하고 배포하는 방법을 살펴보겠습니다.

Stablecoin이란?

Stablecoin은 가치를 안정적으로 유지하도록 설계된 암호화폐의 한 종류입니다. 미국 달러와 같은 전통 통화, 금과 같은 원자재, 또는 다른 암호화폐처럼 보다 안정적인 자산에 가치를 연동함으로써 안정성을 확보합니다. Stablecoin의 목표는 빠른 거래 처리와 탈중앙화 같은 암호화폐의 장점을 전통 금융 자산의 안정성과 결합하여, 일상적인 거래에서 더욱 신뢰할 수 있고 실용적인 수단으로 만드는 것입니다.

Stablecoin은 담보 구조, 안정화 메커니즘, 상대적 안정성 등 여러 요소를 기준으로 분류할 수 있습니다. 다음은 stablecoin 유형에 대한 종합적인 분류입니다.

1. 법정화폐 담보 stablecoin

법정화폐 담보 stablecoin은 미국 달러나 유로와 같은 전통 통화를 준비금으로 보유하여 가치를 뒷받침합니다 (예: Tether USDT, USD Coin USDC). 법정화폐에 직접 연동되어 있어 안정적이고 사용하기 쉽습니다. 다만, 준비금 관리를 위해 중앙화된 기관에 의존하며 규제 감독을 받습니다.

2. 암호화폐 담보 stablecoin

DAI와 LUSD 같은 암호화폐 담보 stablecoin은 다른 암호화폐를 담보로 하며, 암호화폐의 변동성에 대응하기 위해 초과 담보 방식을 채택하는 경우가 많습니다. 법정화폐 담보 방식보다 탈중앙화 수준이 높지만, 구조가 복잡하고 시장 하락 시 안정성이 낮아질 수 있어 안정성 유지를 위한 적극적인 관리가 필요합니다.

3. 알고리즘 stablecoin

Ampleforth (AMPL)과 같은 알고리즘 stablecoin은 직접적인 담보 없이 알고리즘을 통해 공급량을 조절하고 가격을 안정화합니다. 탈중앙화 수준이 높고 유연하지만, 이해하기 어렵고 신뢰가 하락할 경우 급격한 가치 손실("데스 스파이럴")에 취약할 수 있습니다.

이 외에도 몇 가지 유형이 더 있습니다. Frax (FRAX)와 같은 하이브리드 stablecoin은 담보 방식과 알고리즘 방식을 결합하여 안정성을 추구하며, 다양한 모델의 균형을 제공하지만 복잡성이 높습니다. Paxos Gold (PAXG)와 같은 실물 자산 담보 stablecoin은 실물 자산에 연동되어 현실 세계의 원자재에 디지털로 접근할 수 있게 해줍니다. Compound USD (cUSDC)와 같은 수익형 stablecoin은 대출이나 투자를 통해 수익을 창출하여 패시브 인컴을 제공하지만, 그에 따른 리스크도 높습니다.

Stablecoin의 개념과 현재 생태계에 존재하는 다양한 유형을 이해했으니, 이제 Linea 네트워크에서 stablecoin을 만드는 방법을 살펴보겠습니다.

개발 환경 설정

첫 번째 단계는 환경이 올바르게 설정되어 있는지 확인하는 것입니다.

  • Node.js와 npm(Node 패키지 매니저)을 설치합니다.

  • 다음 명령어를 실행하여 Hardhat을 설치합니다.

npm install --save-dev hardhat

새 Hardhat 프로젝트 생성

프로젝트 디렉토리에서 새 Hardhat 프로젝트를 초기화합니다.

npx hardhat init

이 튜토리얼에서는 TypeScript를 사용합니다. Hardhat이 필요한 모든 종속성을 이미 제공하고 있기 때문입니다. 초기화 후 프로젝트 구조는 다음과 같습니다.

  • contracts/: Solidity 컨트랙트

  • ignition/: Ignition 배포 모듈

  • test/: 테스트 파일

  • hardhat.config.js: Hardhat 설정

이제 RadStablecoin (RAD) 을 위한 stablecoin 컨트랙트를 직접 작성해 보겠습니다. 150% 담보 비율을 적용한 간단한 Ethereum 담보 stablecoin입니다.

이 컨트랙트에서는:

  • ETH가 담보로 사용됩니다.

  • 150% 담보 비율로 안정성을 확보합니다.

  • 사용자는 ETH를 전송하여 stablecoin을 mint하고, 이를 burn하여 담보를 돌려받을 수 있습니다.

  • 간단한 price oracle을 사용하여 ETH 가격을 가져옵니다 (실제 환경에서는 안전한 탈중앙화 oracle을 사용해야 합니다).

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/// @title RadStablecoin
/// @notice A simple stablecoin implementation with collateral-based minting
/// @dev Inherits from ERC20 and Ownable
contract RadStablecoin is ERC20, Ownable {
    /// @notice The collateralization ratio (150%)
    uint256 public constant COLLATERAL_RATIO = 150;

    /// @notice The precision for price calculations (2 decimal places)
    uint256 public constant PRICE_PRECISION = 100;

    /// @notice Mapping to track collateral balances for each user
    mapping(address => uint256) public collateralBalances;

    /// @notice Initializes the RadStablecoin contract
    constructor() ERC20("RadStablecoin", "RAD") {}

    /// @notice Allows users to deposit LineaETH as collateral
    /// @dev The deposited amount is added to the user's collateral balance
    function depositCollateral() external payable {
        collateralBalances[msg.sender] += msg.value;
    }

    /// @notice Allows users to withdraw their deposited collateral
    /// @dev Implements the checks-effects-interactions pattern to prevent reentrancy
    /// @param amount The amount of collateral to withdraw (in wei)
    function withdrawCollateral(uint256 amount) external {
        require(collateralBalances[msg.sender] >= amount, "Insufficient collateral");
        collateralBalances[msg.sender] -= amount; // Update state before making external call
        payable(msg.sender).transfer(amount);     // Safely transfer LineaETH after updating state
    }

    /// @notice Mints stablecoin (RAD) based on the user's deposited collateral
    /// @dev Calculates required collateral based on current LineaETH price and mints RAD tokens
    /// @param stablecoinAmount The amount of stablecoin to mint
    function mintStablecoin(uint256 stablecoinAmount) external {
        uint256 collateralRequired = (stablecoinAmount * COLLATERAL_RATIO * PRICE_PRECISION) / (100 * getCurrentPrice());
        require(collateralBalances[msg.sender] >= collateralRequired, "Insufficient collateral");

        collateralBalances[msg.sender] -= collateralRequired;
        _mint(msg.sender, stablecoinAmount);
    }

    /// @notice Burns stablecoin (RAD) and returns the equivalent collateral to the user
    /// @dev Calculates collateral to return based on current LineaETH price and burns RAD tokens
    /// @param stablecoinAmount The amount of stablecoin to burn
    function burnStablecoin(uint256 stablecoinAmount) external {
        require(balanceOf(msg.sender) >= stablecoinAmount, "Insufficient stablecoin balance");

        uint256 collateralToReturn = (stablecoinAmount * COLLATERAL_RATIO * PRICE_PRECISION) / (100 * getCurrentPrice());
        _burn(msg.sender, stablecoinAmount);
        collateralBalances[msg.sender] += collateralToReturn;
    }

    /// @notice Gets the current price of LineaETH in USD
    /// @dev In a real-world scenario, this would fetch the price from an oracle
    /// @return The current LineaETH price in USD (fixed at $2000 for simplicity)
    function getCurrentPrice() public view returns (uint256) {
        // In a real-world scenario, this would fetch the current LineaETH/USD price from an oracle
        // For simplicity, we'll use a fixed price of $2000 per LineaETH
        return 200000; // $2000.00
    }
}
복사
  1. 담보 관리:- 담보 예치:- 사용자는 depositCollateral을 호출하여 Ether (ETH)를 담보로 예치할 수 있습니다.

  • 예치된 ETH는 collateralBalances 매핑에 저장되어 사용자별 총 담보를 추적합니다.

  • 담보 인출:- 사용자는 withdrawCollateral을 사용하여 담보를 인출할 수 있습니다.

  1. Stablecoin 운영:- Stablecoin Mint:- mintStablecoin 함수는 사용자가 요청한 RAD 토큰 수량을 mint하기에 충분한 담보를 보유하고 있는지 확인합니다.

  • Stablecoin Burn:- burnStablecoin 함수는 지정된 양의 RAD를 burn하고, 150% 담보 비율과 현재 ETH 가격을 기준으로 동등한 양의 ETH를 반환합니다.

  1. Price Feed:- ETH 가격 조회:- 컨트랙트에는 이 간소화된 예시에서 ETH의 고정 가격인 $2000을 반환하는 getCurrentPrice 함수가 포함되어 있습니다.

Linea를 위한 Hardhat 설정

hardhat.config.js를 업데이트하여 Linea 테스트넷 설정을 추가합니다. 다음 네트워크 설정을 추가하세요.

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

dotenv.config();

const config: HardhatUserConfig = {
  solidity: "0.8.24",
  networks: {
    "linea-testnet": {
      url: `https://linea-sepolia.infura.io/v3/${process.env.INFURA_API_KEY}`,
      accounts: [process.env.ACCOUNT_PRIVATE_KEY!],
    },
  },
};
export default config;
복사

배포 스크립트 생성

ignition/modules/ 디렉토리에 RadStablecoin.ts 파일을 생성하고 다음 스크립트를 추가합니다.

import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";

const RadStablecoinModule = buildModule("RadStablecoinModule", (m) => {
  // Deploy the RadStablecoin contract
  const radStablecoin = m.contract("RadStablecoin");

  // Return the deployed contract instance
  return { radStablecoin };
});

export default RadStablecoinModule;
복사

컨트랙트를 컴파일하려면 다음 명령어를 실행합니다.

npx hardhat compile

스마트 컨트랙트를 배포하기 전에, 디렉토리의 .env 파일을 다음 값으로 업데이트해야 합니다.

# Infura API key for connecting to Ethereum networks
INFURA_API_KEY=your_infura_api_key_here

# Private key of the account to be used for deployments and transactions
ACCOUNT_PRIVATE_KEY=your_account_private_key_here
복사

컨트랙트 배포

마지막으로, RadStablecoin 컨트랙트를 Linea에 배포합니다.

npx hardhat ignition deploy ignition/modules/RadStablecoin.ts --network linea-testnet

이 명령어를 실행하면 마켓플레이스 스마트 컨트랙트가 Linea Sepolia에 배포됩니다.

다음 단계는?

Stablecoin은 금융 애플리케이션에 꼭 필요한 안정성을 제공하며 암호화폐 생태계에서 중요한 역할을 담당합니다. 이 튜토리얼에서는 stablecoin의 핵심 개념과 다양한 유형, 그리고 전통 금융과 탈중앙화 기술을 연결하는 방법을 살펴보았습니다. 또한 Linea 네트워크에서 RadStablecoin을 직접 생성하고 배포하는 실습을 통해 담보 기반 stablecoin에 대한 이해를 높였습니다. 즐거운 코딩 되세요!

AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.

번역 평가하기