Rust智能合约开发库soroban-builtin-sdk-macros的使用,为Soroban区块链平台提供内置SDK宏功能
Rust智能合约开发库soroban-builtin-sdk-macros的使用,为Soroban区块链平台提供内置SDK宏功能
安装
在项目目录中运行以下Cargo命令:
cargo add soroban-builtin-sdk-macros
或者在Cargo.toml中添加以下行:
soroban-builtin-sdk-macros = "23.0.0"
示例代码
以下是使用soroban-builtin-sdk-macros开发Soroban智能合约的完整示例:
use soroban_sdk::{contractimpl, Env};
// 使用合约宏标记合约实现
#[contractimpl]
impl MyContract {
// 合约初始化函数
pub fn init(env: Env, initial_value: i32) -> i32 {
env.storage().set(&"value", &initial_value);
initial_value
}
// 获取存储值函数
pub fn get_value(env: Env) -> i32 {
env.storage().get(&"value").unwrap_or(Ok(0)).unwrap()
}
// 设置存储值函数
pub fn set_value(env: Env, new_value: i32) -> i32 {
env.storage().set(&"value", &new_value);
new_value
}
// 递增存储值函数
pub fn increment(env: Env) -> i32 {
let current = Self::get_value(env.clone());
let new_value = current + 1;
Self::set_value(env, new_value);
new_value
}
}
完整示例DEMO
以下是一个更完整的智能合约示例,展示了soroban-builtin-sdk-macros的更多功能:
use soroban_sdk::{contractimpl, symbol_short, Env, Symbol};
// 定义合约结构体
pub struct TokenContract;
// 使用contractimpl宏实现合约逻辑
#[contractimpl]
impl TokenContract {
// 初始化代币合约
pub fn initialize(env: Env, admin: Address, total_supply: i128) {
// 保存管理员地址
env.storage().set(&symbol_short!("admin"), &admin);
// 设置总供应量
env.storage().set(&symbol_short!("total"), &total_supply);
// 将总供应量分配给管理员
env.storage().set(&(symbol_short!("balance"), admin), &total_supply);
}
// 获取代币余额
pub fn balance(env: Env, owner: Address) -> i128 {
env.storage()
.get(&(symbol_short!("balance"), owner))
.unwrap_or(Ok(0))
.unwrap()
}
// 转账函数
pub fn transfer(env: Env, from: Address, to: Address, amount: i128) {
// 检查from地址余额是否足够
let from_balance = Self::balance(env.clone(), from.clone());
if from_balance < amount {
panic!("insufficient balance");
}
// 更新from地址余额
env.storage().set(
&(symbol_short!("balance"), from),
&(from_balance - amount)
);
// 更新to地址余额
let to_balance = Self::balance(env.clone(), to.clone());
env.storage().set(
&(symbol_short!("balance"), to),
&(to_balance + amount)
);
}
}
关键特性
#[contractimpl]
宏自动处理合约接口暴露- 简化了与Soroban环境的交互
- 自动生成ABI(应用程序二进制接口)
- 提供类型安全的存储操作
所有者
该库由Stellar官方维护
1 回复
Rust智能合约开发库soroban-builtin-sdk-macros使用指南
概述
soroban-builtin-sdk-macros
是为Soroban区块链平台提供的Rust智能合约开发库中的宏功能部分,它简化了Soroban智能合约的开发流程,提供了一系列便捷宏来定义合约接口、处理数据结构和实现合约功能。
主要功能
- 合约接口定义宏
- 数据结构序列化/反序列化宏
- 合约方法绑定宏
- 类型转换辅助宏
安装
在Cargo.toml中添加依赖:
[dependencies]
soroban-builtin-sdk = { version = "0.9.0" }
soroban-builtin-sdk-macros = { version = "0.9.0" }
核心宏使用示例
1. 定义合约结构体
use soroban_builtin_sdk_macros::contract;
#[contract]
pub struct MyContract {
value: i64,
}
2. 实现合约方法
use soroban_builtin_sdk_macros::contractimpl;
#[contractimpl]
impl MyContract {
pub fn init(&mut self, value: i64) {
self.value = value;
}
pub fn get_value(&self) -> i64 {
self.value
}
pub fn set_value(&mut self, value: i64) {
self.value = value;
}
}
3. 定义自定义类型
use soroban_builtin_sdk_macros::contracttype;
#[contracttype]
pub enum Status {
Pending,
Active,
Inactive,
}
#[contracttype]
pub struct User {
pub id: u32,
pub name: String,
pub status: Status,
}
4. 事件记录
use soroban_builtin_sdk_macros::event;
#[event]
pub struct ValueChanged {
pub old_value: i64,
pub new_value: i64,
pub by: Address,
}
完整合约示例
use soroban_builtin_sdk::{Address, Env};
use soroban_builtin_sdk_macros::{contract, contractimpl, contracttype, event};
// 定义合约状态
#[contract]
pub struct Token {
admin: Address,
balances: Map<Address, i64>,
total_supply: i64,
}
// 定义事件
#[event]
pub struct Transfer {
from: Option<Address>,
to: Option<Address>,
amount: i64,
}
// 实现合约方法
#[contractimpl]
impl Token {
pub fn initialize(env: Env, admin: Address, total_supply: i64) {
let mut token = Token::new(env);
token.admin = admin;
token.total_supply = total_supply;
token.balances.set(admin.clone(), total_supply);
}
pub fn transfer(&mut self, from: Address, to: Address, amount: i64) {
// 检查余额
let from_balance = self.balances.get(from.clone()).unwrap_or(0);
assert!(from_balance >= amount, "Insufficient balance");
// 更新余额
let to_balance = self.balances.get(to.clone()).unwrap_or(0);
self.balances.set(from.clone(), from_balance - amount);
self.balances.set(to.clone(), to_balance + amount);
// 记录事件
Transfer {
from: Some(from),
to: Some(to),
amount,
}
.publish();
}
pub fn balance_of(&self, address: Address) -> i64 {
self.balances.get(address).unwrap_or(0)
}
}
最佳实践
- 模块化设计:将合约逻辑拆分为多个模块,使用宏来简化接口定义
- 充分测试:利用Soroban测试环境测试所有合约方法
- 事件记录:为重要状态变更添加事件记录
- 错误处理:合理使用assert宏进行参数校验
- 文档注释:为所有公共方法添加文档注释
注意事项
- 宏展开后的代码会依赖Soroban环境,不能在标准Rust程序中使用
- 所有公共方法都会暴露为合约接口
- 自定义类型需要实现必要的trait以支持序列化
- 合约状态会被持久化到区块链上,设计数据结构时要考虑存储成本
通过使用soroban-builtin-sdk-macros
,开发者可以更高效地构建Soroban智能合约,减少样板代码,专注于业务逻辑实现。