SAVITRI-20: 대체 가능 토큰 표준
SAVITRI-20은 Savitri Network의 대체 가능 토큰 표준으로, Ethereum의 ERC-20에 해당합니다. 전송, 승인, 허용량 메커니즘을 갖춘 대체 가능 토큰의 생성 및 관리를 가능하게 합니다.
인터페이스
| 함수 | 매개변수 | 반환 | 설명 |
|---|---|---|---|
initialize | owner, name, symbol, initial_supply | - | 새 토큰 배포 및 초기화 |
total_supply | - | u128 | 총 토큰 공급량 |
balance_of | address | u128 | 주소의 토큰 잔액 |
transfer | to, amount | Result | 수신자에게 토큰 전송 |
approve | spender, amount | Result | 지출자에게 허용량 승인 |
transfer_from | from, to, amount | Result | 허용량을 통한 전송 |
allowance | owner, spender | u128 | 승인된 허용량 확인 |
mint | to, amount | Result | 새 토큰 발행 (소유자 전용) |
burn | from, amount | Result | 토큰 소각 |
스토리지 레이아웃
| 슬롯 범위 | 목적 |
|---|---|
| 0-99 | BaseContract (예약됨) |
| 100 | 총 공급량 |
| 101+ | 잔액 매핑: keccak256(address || 101) |
| 200+ | 허용량 매핑: keccak256(spender || keccak256(owner || 200)) |
| 300+ | 토큰 이름 (문자열 스토리지) |
| 400+ | 토큰 심볼 (문자열 스토리지) |
모든 값은 u128 값을 little-endian으로 저장한 32바이트 배열로 저장됩니다.
SAVITRI-20 토큰 배포
컨트랙트 런타임을 통해 (Rust)
use savitri_contracts::contracts::standards::savitri20::SAVITRI20;
// 새 토큰 초기화
SAVITRI20::initialize(
&mut contract_storage,
&storage,
&owner_address, // [u8; 32]
"My Token", // name
"MTK", // symbol
1_000_000_000_000_000_000_000_000, // 1M tokens (18 decimals)
Some(&mut gas_meter),
)?;
SDK를 통해
use savitri_sdk::{TransactionBuilder, Wallet};
let wallet = Wallet::from_private_key_hex("your_key")?;
// 토큰 컨트랙트 배포
let deploy_tx = TransactionBuilder::new()
.data(savitri20_bytecode)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;
토큰 작업
전송
// 직접 전송
SAVITRI20::transfer(
&mut contract_storage,
&storage,
&sender, // [u8; 32]
&recipient, // [u8; 32]
1000_000_000_000_000_000, // 1000 tokens
&mut event_system,
Some(&mut gas_meter),
)?;
승인 및 TransferFrom
// 지출자 승인
SAVITRI20::approve(
&mut contract_storage,
&storage,
&owner,
&spender,
5000_000_000_000_000_000, // 5000 token allowance
&mut event_system,
Some(&mut gas_meter),
)?;
// 허용량을 통한 전송
SAVITRI20::transfer_from(
&mut contract_storage,
&storage,
&spender, // caller (허용량 필요)
&owner, // from
&recipient, // to
1000_000_000_000_000_000,
&mut event_system,
Some(&mut gas_meter),
)?;
잔액 조회
let balance = SAVITRI20::balance_of(&contract_storage, &storage, &address)?;
let supply = SAVITRI20::total_supply(&contract_storage, &storage)?;
let allowed = SAVITRI20::allowance(&contract_storage, &storage, &owner, &spender)?;
이벤트
| 이벤트 | 필드 | 설명 |
|---|---|---|
Transfer | from, to, amount | 토큰 전송 |
Approval | owner, spender, amount | 허용량 승인 |
Mint | to, amount | 새 토큰 발행 |
Burn | from, amount | 토큰 소각 |
보안
- null 주소 확인: 제로 주소로/에서의 전송 거부
- 잔액 검증: 발신자 잔액 부족 시 전송 실패
- 허용량 확인:
transfer_from은 허용량을 원자적으로 확인하고 감소 - 오버플로우 방지: 모든 산술 연산에 확인된 연산 사용
- Keccak256 슬롯 해시: 매핑 간 스토리지 슬롯 충돌 방지