RedPackage是首届Move黑客松中,由虫洞工作室设计的一个很好玩、很实用的工具。
RedPackage是首届Move黑客松中,由虫洞工作室设计的一个很好玩、很实用的工具。通过Move智能合约定义一个安全可靠的SHIBA,并针对SHIBA设计了有意思的红包逻辑,发布到Starcoin链上,为大家提供一个链上拼手气的红包功能。RedPackage是一个通用的协议,可以使用任何有store能力的struct作为红包数据。
这里我们通过对合约源码进行分析,来学习一下如何使用Move实现一个通用的红包协议。下图是RedPackage的一个整体设计:
从上图我们看到RedPackage设计比较简洁:
「红包发起人」通过create函数创建一个RebPackage,并且将数据分成多份,保存到当前账号下。用户通过claim函数领取红包。接下来我们深入分析一下源码。
RedPackage的设计比较简洁,有4个数据结构,我们一个一个看。
struct RedPackage<TokenType: store> has store {
merkle_root: vector<u8>,// 红包id
tokens: Token::Token<TokenType>,// 红包
leafs: vector<u128>,// 每份红包数量
claimed: vector<address>,// 领取红包的address
}
RedPackage存储了红包包含的所有数据,主要的逻辑都在其中:
struct SHIBA has copy, drop, store {}
这是一个普通的struct,但是通过Token协议注册成了有意义的资源,感兴趣的可以去了解一下Starcoin的Token协议。
struct SharedMintCapability has key, store {
cap: Token::MintCapability<SHIBA>,
}
SharedMintCapability代表了SHIBA的Mint权限。
struct SharedBurnCapability has key, store {
cap: Token::BurnCapability<SHIBA>,
}
SharedBurnCapability代表了SHIBA的Burn权限。
public fun create<TokenType: store>(account: &signer, merkle_root: vector<u8>,
token_amount: u128, leafs: vector<u128>)
create函数是红包初始化的入口,会生成RedPackage放到「红包发起人」账号下:
public fun claim<TokenType: store>(account: &signer, owner_address: address, merkle_root: vector<u8>)
claim函数是用户领取红包的入口,用户指定「红包发起人」的地址和红包id来领取红包。
Capability在Starcoin的Stdlib中代表「权限」。
在中心化的系统中,用户有没有某个权限,通常是通过一个bool型字段来判断。在真实的场景中,「权限」通常是某个人或者某类人所拥有,可以认为是一种稀缺的「资源」。Move是面向资源编程的。所以,在Move中会用一个「资源」类型的Struct来代表「权限」。这是一种有意思的编程范式,在Starcoin的Stdlib中很常见。参看更多关于Capability的详情。
在RedPackage中,SharedMintCapability代表了SHIBA的Mint权限,SharedBurnCapability代表了SHIBA的Burn权限。
RedPackage项目非常地实用,从合约实现细节来说,代码相对比较简洁。我们来总结一下合约代码实现上的优缺点。
总的来说,RedPackage在设计上巧妙地应用了Move的优势,例如RedPackage和Capability等等,感兴趣的可以查看完整代码。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!