Solidity 기초 및 ERC 토큰 표준


  # Solidity 기초 및 ERC 토큰 표준

Solidity는 이더리움 가상 머신(EVM)을 타겟으로 하는 정적 타입 객체 지향 스마트 컨트랙트 프로그래밍 언어입니다.

[TOC]

---

## 1. EVM 가스 절감을 위한 Solidity 테크닉

### 1.1 스토리지 슬롯 패킹 (Struct Packing)
EVM은 256비트(32바이트) 단위로 스토리지 슬롯을 할당합니다. 변수 선언 순서에 따라 슬롯 낭비가 발생합니다.

```solidity
// 나쁜 예: 총 3개 슬롯 소모 (약 60,000 gas)
struct BadStruct {
    uint128 a;  // 슬롯 0 (16바이트 사용, 16바이트 낭비)
    uint256 b;  // 슬롯 1 (32바이트 사용)
    uint128 c;  // 슬롯 2 (16바이트 사용)
}

// 좋은 예: 총 2개 슬롯으로 패킹 (약 40,000 gas)
struct GoodStruct {
    uint128 a;  // 슬롯 0 (16바이트)
    uint128 c;  // 슬롯 0에 함께 패킹 (총 32바이트 채움)
    uint256 b;  // 슬롯 1 (32바이트)
}
```

---

## 2. ERC-20 토큰 표준 인터페이스

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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);
}
```

* **보안 주의점**: `approve` 함수를 무제한(`type(uint256).max`)으로 승인하면, 해당 디앱이 해킹당했을 때 내 지갑의 토큰이 전액 탈취될 수 있습니다.