// 为了增加丰富性,这边接着增加 杂货店 及 杂货店老闆 两个结构 struct Grocery has key { id:UID, profits:Balance<SUI> } //杂货店 struct GroceryOwnerCapability has key { id:UID } //杂货店老闆
杂货店的结构中,有加入一个profits,代表杂货店在卖了火腿跟麵包后,会将赚来的钱放在这里。
这边有将profits定义类型为 Balance,这里所使用的Token为SUI。
因为有用到新的类型,所以要在上面加入 use sui::balance::Balance;
// 常数部分 则接着新增错误讯息 const EInsufficientFunds: u64 = 001; //购买时,金额不足 const ENoProfits: u64 = 002; //老闆要从杂货店领钱时,杂货店没有钱
错误代码的名称表现可以在叙述前加上E,有些也会将其完整呈现
如: Error_No_Profits ,这就依照个人喜好。
以上这些部分,在个人编写时,也不一定是一次写完,可以先把有用到的先编写,等后续如果有要用到不同的结构或函数,以及调用,再来补上也可以。
在把所需要的结构及常数建立完成后,接下来开始编写函数的部分。
module sandwich::shop { use sui::object::UID; use sui::balance::Balance; struct Ham has key { id:UID } struct Bread has key { id:UID } struct Sandwich has key { id:UID } struct Grocery has key { id:UID, profits:Balance<SUI> } struct GroceryOwnerCapability has key { id:UID } const HAM_PRICE: u64 = 10; const BREAD_PRICE: u64 = 2; const EInsufficientFunds: u64 = 001; const ENoProfits: u64 = 002; //函数 fun init(ctx: &mut TxContext) { transfer::share_object( Grocery{id:object::new(ctx), profits:balance::zero<SUI>()}); transfer::transfer( GroceryOwnerCapability {id:object::new(ctx)},tx_context::sender(ctx)); }
在sui中,使用初始一次性执行,都以init命名为主。init多半用于赋予合约部署钱包权限,让其有权限对此合约进行操作。
后面(),为这个函数中,有需要从外部引用 结构、常数、手动输入值 等...时,要在()内填入。
首先 ctx 是指引用物件时,我们给他一个函数中所使用的替代物,名称可依照个人编译习惯命名,以全小写为主。
&mut是引用的意思,依带入参数的用途不同而调整,有2种:
如果都不输入时,代表这个带入参数是外部输入,如 钱包地址、拥有的NFT。 非现在要部署的内容物,此时:后面是在定义其类型,有时也会将其定义为某个我们的结构。
此处我们 &mut TxContext,代表这里带入的参数就是我们的钱包,让此函数的内容与钱包做绑定。