跳到主要内容

智能合约

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,0000.005
NFT 铸造~80,0000.005
治理投票~30,0000.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)?;