智能合约
Savitri Network 提供原生智能合约运行时,内置代币标准、治理模块和预言机支持。
合约运行时
合约在沙箱环境中运行,具备以下特性:
- Gas 计量:每个操作消耗 Gas,以防止无限循环
- 存储槽:使用 Keccak256 哈希槽地址的键值存储
- 事件系统:合约向外部消费者发出事件
- 内存监控:运行时内存限制防止拒绝服务攻击
- 升级支持:合约可通过治理升级
代币标准
| 标准 | 类型 | 等效标准 | 描述 |
|---|---|---|---|
| SAVITRI-20 | 同质化 | ERC-20 | 代币转账、授权、限额 |
| SAVITRI-721 | 非同质化(NFT) | ERC-721 | 唯一代币所有权、转账、元数据 |
| SAVITRI-1155 | 多资产 | ERC-1155 | 批量操作、混合同质化/非同质化 |
内置合约
治理
链上提案与投票系统:
- 创建带有标题、描述和投票周期的提案
- 以支持/反对方式投票
- 执行已批准的提案
- FL(联邦学习)提案专项支持
详见 治理。
预言机
外部数据馈送系统:
- 注册预言机提供者
- 请求并提交数据
- 证明验证
- 数据模式验证
详见 预言机系统。
通过 SDK 与合约交互
使用 ContractClient
use savitri_sdk::{ContractClient, Wallet, RpcClient};
let wallet = Wallet::from_private_key_hex("your_key")?;
let contract = ContractClient::from_url_and_wallet("http://localhost:8545", wallet)?;
// Call a contract function
let tx_hash = contract.call_contract(
&"contract_address".to_string(),
b"transfer",
&encoded_args,
Some(0),
).await?;
使用 TransactionBuilder
use savitri_sdk::TransactionBuilder;
let tx = TransactionBuilder::new()
.to("contract_address")
.data(call_data) // function selector + encoded args
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000) // 0.005 SAVT contract fee
.build_and_sign(&wallet)?;
存储模型
合约使用与以太坊类似的基于槽的存储模型:
- 槽 0-99:为
BaseContract保留(所有者、元数据) - 槽 100+:合约专用存储
槽地址使用 Keccak256 哈希派生,以防止冲突:
balance_slot = keccak256(address || SLOT_BALANCES_BASE)
allowance_slot = keccak256(spender || keccak256(owner || SLOT_ALLOWANCES_BASE))
所有值以 32 字节数组存储(数值类型采用小端序)。
Gas 费用
| 操作 | Gas 消耗 | 费用(SAVT) |
|---|---|---|
| 合约部署 | 可变 | 基础 0.005 |
| 合约调用 | 可变 | 基础 0.005 |
| 存储写入(SSTORE) | 20,000 | 含于基础费用 |
| 存储读取(SLOAD) | 200 | 含于基础费用 |
| 代币转账 | ~50,000 | 0.005 |
| NFT 铸造 | ~80,000 | 0.005 |
| 治理投票 | ~30,000 | 0.005 |
合约部署
合约通过特殊交易部署,交易中 to = None,合约字节码放在 data 字段:
let deploy_tx = TransactionBuilder::new()
// No .to() -- indicates contract deployment
.data(contract_bytecode)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;