SAVITRI-721: NFT 표준
SAVITRI-721 (SNT1 -- Savitri Non-Fungible Token)은 Savitri Network의 NFT 표준으로, Ethereum의 ERC-721에 해당합니다. 각 토큰은 고유한 ID와 단일 소유자를 가집니다.
인터페이스
| 함수 | 매개변수 | 반환 | 설명 |
|---|---|---|---|
balance_of | owner | u64 | 주소가 소유한 NFT 수 |
owner_of | token_id | address | 특정 토큰의 소유자 |
transfer_from | from, to, token_id | Result | NFT 전송 |
approve | to, token_id | Result | 토큰 전송을 위한 주소 승인 |
safe_transfer_from | from, to, token_id | Result | 안전 확인이 포함된 전송 |
token_uri | token_id | String | 토큰 메타데이터 URI 조회 |
mint | to, token_id, uri | Result | 새 NFT 발행 |
스토리지 레이아웃
| 슬롯 범위 | 목적 | 파생 |
|---|---|---|
| 0-99 | BaseContract (예약됨) | 직접 |
| 100+ | 토큰 소유자 | keccak256(100 || token_id) |
| 200+ | 토큰 잔액 | keccak256(200 || address) |
| 300+ | 토큰 승인 | keccak256(300 || token_id) |
| 400+ | 토큰 URI | keccak256(400 || token_id) |
Keccak256 해시는 카테고리 간 슬롯 충돌을 방지합니다 (예: token_id 100은 잔액 기본 슬롯과 충돌하지 않음).
NFT 발행
use savitri_contracts::contracts::standards::savitri721::SAVITRI721;
SAVITRI721::mint(
&mut contract_storage,
&storage,
&recipient, // [u8; 32]
42, // token_id: u64
"ipfs://Qm.../meta", // token URI
&mut event_system,
Some(&mut gas_meter),
)?;
전송
// 직접 전송
SAVITRI721::transfer_from(
&mut contract_storage,
&storage,
&from, // 현재 소유자
&to, // 새 소유자
42, // token_id
&mut event_system,
Some(&mut gas_meter),
)?;
조회
// 토큰 #42의 소유자는?
let owner = SAVITRI721::owner_of(&contract_storage, &storage, 42)?;
// 이 주소가 소유한 NFT 수는?
let count = SAVITRI721::balance_of(&contract_storage, &storage, &address)?;
// 메타데이터 URI 조회
let uri = SAVITRI721::token_uri(&contract_storage, &storage, 42)?;
이벤트
| 이벤트 | 필드 | 설명 |
|---|---|---|
Transfer | from, to, token_id | NFT 전송됨 |
Approval | owner, approved, token_id | 승인 허가됨 |
Mint | to, token_id | 새 NFT 발행됨 |
SDK를 통해
use savitri_sdk::{ContractClient, Wallet};
let contract = ContractClient::from_url_and_wallet("http://localhost:8545", wallet)?;
// 컨트랙트 호출을 통한 NFT 발행
let tx = contract.call_contract(
&nft_contract_address,
b"mint",
&encode_mint_args(recipient, token_id, uri),
Some(0),
).await?;