SAVITRI-20:同质化代币标准
SAVITRI-20 是 Savitri Network 的同质化代币标准,等同于以太坊的 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+ | 代币符号(字符串存储) |
所有值以 32 字节数组存储,u128 值采用小端序格式。
部署 SAVITRI-20 代币
通过合约运行时(Rust)
use savitri_contracts::contracts::standards::savitri20::SAVITRI20;
// Initialize a new token
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")?;
// Deploy token contract
let deploy_tx = TransactionBuilder::new()
.data(savitri20_bytecode)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;
代币操作
转账
// Direct transfer
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
// Approve spender
SAVITRI20::approve(
&mut contract_storage,
&storage,
&owner,
&spender,
5000_000_000_000_000_000, // 5000 token allowance
&mut event_system,
Some(&mut gas_meter),
)?;
// Transfer using allowance
SAVITRI20::transfer_from(
&mut contract_storage,
&storage,
&spender, // caller (must have allowance)
&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 | 代币销毁 |
安全性
- 非零地址检查:拒绝向/从零地址转账
- 余额验证:发送方余额不足时转账失败
- 限额检查:
transfer_from原子性地验证并减少限额 - 溢出保护:所有算术运算使用检查操作
- Keccak256 槽哈希:防止不同映射之间的存储槽冲突