教程:部署您的第一个 SAVITRI-20 代币
本教程将引导您使用 SDK 在 Savitri Network 上部署一个同质化代币。
前提条件
- 一个运行中的 Savitri 轻节点(参见快速入门)
- 已安装 Rust 工具链
- 一个有余额的钱包(使用测试网水龙头领取)
1. 项目设置
创建新的 Rust 项目:
cargo new my-savitri-token
cd my-savitri-token
在 Cargo.toml 中添加依赖:
[dependencies]
savitri-sdk = { path = "../savitri-sdk" }
tokio = { version = "1", features = ["full"] }
anyhow = "1"
hex = "0.4"
2. 创建钱包
use savitri_sdk::{Wallet, RpcClient};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 创建或导入钱包
let wallet = Wallet::new();
println!("Your address: {}", wallet.address());
// 连接到本地节点
let client = RpcClient::from_url("http://localhost:8545")?;
// 检查节点是否运行
let health = client.health().await?;
println!("Connected to {} ({})", health.service, health.mode);
Ok(())
}
3. 为钱包充值
通过水龙头领取测试网代币:
let claim = client.faucet_claim(wallet.address()).await?;
println!("Received {} SAVT (tx: {})", claim.amount, claim.tx_hash);
// 等待确认
tokio::time::sleep(std::time::Duration::from_secs(10)).await;
// 验证余额
let account = client.get_account(wallet.address()).await?;
println!("Balance: {} (nonce: {})", account.balance, account.nonce);
4. 部署代币合约
代币部署是一笔 to = None、初始化数据在 data 中的交易:
use savitri_sdk::TransactionBuilder;
// 编码代币初始化参数
fn encode_token_init(name: &str, symbol: &str, initial_supply: u128) -> Vec<u8> {
let mut data = b"initialize_savitri20".to_vec();
data.push(0); // separator
// Name (length-prefixed)
data.extend_from_slice(&(name.len() as u32).to_le_bytes());
data.extend_from_slice(name.as_bytes());
// Symbol (length-prefixed)
data.extend_from_slice(&(symbol.len() as u32).to_le_bytes());
data.extend_from_slice(symbol.as_bytes());
// Initial supply (u128 LE)
data.extend_from_slice(&initial_supply.to_le_bytes());
data
}
// 构建部署交易
let nonce = client.get_nonce(wallet.address()).await?;
let deploy_data = encode_token_init(
"My Token", // name
"MTK", // symbol
1_000_000_000_000_000_000_000_000, // 1M tokens (18 decimals)
);
let deploy_tx = TransactionBuilder::new()
// No .to() — indicates contract deployment
.data(deploy_data)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000) // 0.005 SAVT contract fee
.build_and_sign(&wallet)?;
println!("Deploy TX built. Contract will be created at a derived address.");
5. 与代币交互
部署后,使用 ContractClient 进行交互:
use savitri_sdk::ContractClient;
let contract = ContractClient::from_url_and_wallet(
"http://localhost:8545",
wallet.clone(),
)?;
// 转移代币
let tx_hash = contract.call_contract(
&token_contract_address,
b"transfer",
&encode_transfer(&recipient_address, 1000_000_000_000_000_000), // 1000 tokens
Some(0),
).await?;
println!("Transfer TX: {}", tx_hash);
6. 查询代币余额
// 通过 RPC
let balance = client.call_raw(
"account_getTokenBalance",
serde_json::json!([wallet.address(), token_contract_address]),
).await?;
println!("Token balance: {}", balance);
代币标准快速参考
| 标准 | 使用场景 | 关键函数 |
|---|---|---|
| SAVITRI-20 | 同质化代币 | transfer、approve、transferFrom |
| SAVITRI-721 | NFT | mint、transferFrom、tokenURI |
| SAVITRI-1155 | 多资产 | safeTransferFrom、balanceOfBatch |
费用参考
| 操作 | 费用(SAVT) |
|---|---|
| 代币部署 | 0.005 |
| 代币转移 | 0.005 |
| 代币授权 | 0.005 |
| NFT 铸造 | 0.005 |
| 批量转移 | 0.005 |
金额与精度
所有 Savitri 代币使用 18 位精度:
1 token = 1_000_000_000_000_000_000 (10^18)
0.001 token = 1_000_000_000_000_000 (10^15)
1M tokens = 1_000_000_000_000_000_000_000_000 (10^24)
下一步
- SAVITRI-20 参考 —— 完整的同质化代币 API
- 合约运行时 —— 合约执行原理
- 治理 —— 提议修改代币参数