Wei, Gwei, Ether 단위
이더리움의 기본 화폐는 Ether(ETH) 입니다. 하지만 스마트 컨트랙트 내부에서 금액을 다룰 때는
항상 가장 작은 단위인 Wei 를 기준으로 계산합니다. Solidity 에는 소수점 타입이 없어 모든
금액을 정수로만 표현해야 하기 때문입니다.
Ether 를 실수(예: 0.5)로 다룬다면 반올림 오차가 쌓여 1원, 1전 단위에서 자금이 새어 나갈 수
있습니다. 그래서 화폐의 가장 작은 조각인 Wei 를 단위로 삼아, 정수 연산만으로 오차 없이 금액을
다룹니다.
단위 환산표
세 단위는 모두 10의 거듭제곱 관계로 연결됩니다. 1 ether 는 1 gwei 의 10억 배이고,
1 gwei 는 다시 1 wei 의 10억 배입니다.
| 단위 | Wei 환산 | 거듭제곱 |
|---|---|---|
| 1 wei | 1 | 10^0 |
| 1 gwei | 1,000,000,000 (10억) | 10^9 |
| 1 ether | 1,000,000,000,000,000,000 (100경) | 10^18 |
Solidity 의 금액 변수는 예외 없이 모두 정수(Wei)입니다. 1 ether 라는 표기는 10^18 이라는
거대한 숫자를 사람이 읽기 쉽게 바꾼 별칭일 뿐, 새로운 타입이 아닙니다.
단위 접미사 사용하기
Solidity 는 wei, gwei, ether 라는 단위 접미사(unit suffix) 를 언어 차원에서 기본
제공합니다. 숫자 뒤에 접미사를 붙이면 컴파일 시점에 자동으로 Wei 값으로 환산되므로, 10^18
같은 숫자를 직접 적어 실수할 위험이 사라집니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract EtherUnits {
uint256 public oneWei = 1 wei; // 1
uint256 public oneGwei = 1 gwei; // 1_000_000_000
uint256 public oneEther = 1 ether; // 10^18
// 단위 접미사는 컴파일 시점에 정수로 환산됩니다.
bool public isGweiCorrect = (1 gwei == 1e9); // true
bool public isEtherCorrect = (1 ether == 1e18); // true
// 0.5 ether 같은 값도 Wei 정수로 안전하게 표현됩니다.
uint256 public halfEther = 0.5 ether; // 5 * 10^17
}가스 가격(gas price)은 보통 gwei 단위로 이야기하고("지금 가스 30 gwei"), 지갑이나 화면에
보여주는 금액은 ether 단위로 환산해 표시합니다. 컨트랙트 내부 계산은 언제나 Wei 입니다.