、最近重新学习Sui区块链的开发,主要涉及Move合约编写以及合约部署等方面。在此记录一下学习过程和重要命令。基础的区块链知识:[北京大学肖臻老师《区块链技术与应用》公开课](https://www
关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
最近重新学习 Sui 区块链的开发,主要涉及Move 合约编写以及合约部署等方面。在此记录一下学习过程和重要命令。
智能合约的用途:https://www.bilibili.com/video/BV1BMD8Y2EfE/?spm_id_from=333.999.0.0
定义资产:定义USD,定义NFT
操作资产:增删改查
权限控制:限制访问,现在转移权限
创建新钱包
sui client new-address ed25519
查看钱包地址
sui client addresses
切换当前使用的地址
sui client switch --address <YOUR_ADDRESS>
sui client envs
切换使用环境
sui client switch --env testnet
# 创建新项目
sui move new my_project
# 项目结构
my_project/
├── Move.toml # 项目配置文件
└── sources/ # 合约源码目
编译合约
sui move build
运行测试
sui move test
强烈建议在发包之前执行此操作,避免发布失败,消耗不必要的gas
sui client verify-bytecode-meter
添加gas 预算 可防止发布失败导致浪费
sui client publish --gas-budget 100000
报错记录
使用强制命令解决了:sui client publish --gas-budget 100000000 --skip-fetch-latest-git-deps --skip-dependency-verification
发布合约后记录返回的 package ID
常见问题与解决方案
详细任务参考:let‘s move 项目
ERC-20 规定如何实现代币的协议之一。定义了一组代币在以太坊区块链上必须遵守的规范,提供与代币交换的通用框架,确保了不同程序,钱包之间的互操作性。
代币在区块链中表示数字资产,可以在区块链上被转移和交易,具有潜在价值。
Coin 在Move中,用户收到Coins 时,这些Coins会存储在用户的对象中(钱包),用户可自由提取对象中的Coins 并使用它们。
TreasuryCap
意译是国债资本,这里我理解为拥有铸造代币权限的ID。(后续再记录理解)
用到的命令:
--split-coins <COIN> <[AMOUNT]>
Split the coin into N coins as per the given array of amounts.
Examples:
--split-coins gas [1000, 5000, 75000]
--assign new_coins # bounds the result of split-coins command to variable new_coins
--split-coins @coin_object_id [100]
例子:
sui client ptb \
--split-coins gas [1000, 2000, 3000] \
--assign coins \
--transfer-objects [coins.0, coins.1, coins.2] to_address \
--gas-budget 5000000
命令查找:Sui CLI PTB 文档
如果猜错:玩家损失投入的代币
AdminCap: 管理员权限凭证
破产保护
if(game_val < coin_value*10) {
abort EExceedLimit;
};
余额检查
if (game_val < coin_value) {
abort ENotEnough;
};
确保游戏合约始终保持足够的储备金。
初始化
fun init(ctx: &mut TxContext){
// 创建游戏实例并共享
let game = Game{
id: object::new(ctx),
val: zero(),
};
share_object(game);
// 创建管理员权限并转移给部署者
let admin = AdminCap{
id: object::new(ctx),
};
transfer(admin,sender(ctx));
}
存款功能
public fun deposit(game: &mut Game, in: Coin<FUNNYYANNE_FAUCET_COIN>, _ctx: &mut TxContext)
提款功能
//**只有管理员可以从游戏合约提取代币。**
public fun withdraw(_: &AdminCap, game: &mut Game, out_amt: u64, ctx: &mut TxContext)
游戏核心逻辑
#[allow(lint(self_transfer))]
public fun play (game: &mut Game, flip_value: bool, in: Coin<FUNNYYANNE_FAUCET_COIN>, rand: &Random,ctx: &mut TxContext){
let coin_value = coin::value(&in);
let play_address = sender(ctx);
let game_val = balance::value(&game.val);
if (game_val < coin_value) {
abort ENotEnough;
};
// proctect the game from being bankrupted
if(game_val < coin_value*10) {
abort EExceedLimit;
};
let mut gen = random::new_generator(rand, ctx);
let mut flag = random::generate_bool(&mut gen);
if (flip_value == flag) {
let win_balance = balance::split(&mut game.val, coin_value);
let win_coin = from_balance(win_balance, ctx);
public_transfer(win_coin, play_address);
public_transfer(in, play_address);
}else {
let in_balance = into_balance(in);
balance::join(&mut game.val, in_balance);
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!