Move语言社区

Move黑客松_MyLegacy源码分析

MyLegacy 是⼀个构建在 Starcoin 公链上的 Asset-Management 项⽬,实现了资产的安全存储、分批线性 解锁等能⼒。整个业务模型除了财产继承,其实在很多其他常⻅的场景都很适合,例如分期结算项⽬资 ⾦、⽀付季度奖或者年终奖等等。尤其是在缺乏信任⽀撑的分布式场景,通过链上公开透明地逐步分期 ⽀付或者结算,是⼀个⾮常具有想象⼒的⽅向。

这⾥我们通过对合约源码进⾏分析,来学习⼀下如何使⽤ Move 安全地实现资产的管理。我们先来看⼀ 下 MyLegacy 项⽬的整体设计图:

从上图可以看出,整个合约有 2 个核⼼的 Struct

  • Legacy

  • Payment

以及 2 个关键的 function

  • init_legacy

  • redeem

Struct定义

接下来,我们分析⼀下 MyLegacy 的核⼼数据结构。

1. Legacy 遗产

struct Legacy has key, store {

payer: address,// 委托⼈

payee: address,// 受益⼈

total_value:u64,// 总的⾦额

times:u64,// 总的释放次数

freq:u64,// 释放周期

unpaid: vector,// 线性释放的款项

}

先看⼀下这个 Legacystruct ,有 keystoreability ,那意味着, Legacy 只能索引和存储,不能被 dropcopy

2. Payment 款项

struct Payment has key, store {

id: u64,// 唯⼀标识

value: u64,// 值

balance: Token,// STC

time_lock: u64,// 时间锁, STC释放时间

}

PaymentstructLegacy ⼀样,也只能索引和存储,不能被 dropcopy

  • LegacyPayment 这么设计有很多安全⽅⾯的好处:

  • Legacy 或者 Payment 不能在传输的过程中凭空丢掉,不会产⽣「丢币」的问题

  • Legacy 或者 Payment 也不能拷⻉,任何时候都不能从⼀个 Legacy 实例⽣成另⼀个Legacy 实例,意味着没法通过拷⻉进⾏「不安全的增发」

  • Legacy 或者 Payment 是⼀个完整的整体,只能通过合约的 function 进⾏修改,合约外部只能存

储,不能修改

上⾯提到的这些安全特性,并不需要开发者特别注意, Move 帮助开发者⾃动处理了。

function 定义

1. init_legacy 函数

public(script) fun init_legacy(account: signer, payee: address, total_value:

u64, times: u64, freq: u64)

上⾯是 init_legacy 函数的签名,这个函数根据参数初始化 Legacy 信息, Legacy 会作为资源存储安全地在 当前⽤户的账号下。有⼏个地⽅说明⼀下:

  • script 函数可⻅性:这个函数只能当成交易执⾏,不能被其他函数调⽤

  • 函数没有返回值

  • payee 指定能赎回 STC 的地址, total_value 表示总的 STC 个数, times 表示当前 Legacy 包含的Payment 个数,每个 PaymentSTC 个数: total_value/timesPayment 之间时间间隔是 freq

2. redeem 函数
public(script) fun redeem(account: signer, payer: address) acquires Legacy

以上是 redeem 函数的签名,这个函数⽤于赎回 Payment 。这⾥简单说明⼀下:

  • 也是 script 函数可⻅性

  • 函数也没有返回值

  • payer 可以是创建 Legacy 的账号地址,也可以是创建 Legacy 的时候指定的 payee

  • acquires :设置当前函数使⽤到、并且在当前合约中定义的 struct ,这⾥是 Legacy

  • ![|8x8](file:///C:\Users\MAX\AppData\Local\Temp\ksohtml5676\wps21.jpg) 具体能取出多少 Payment :(当前时间 上次赎回时间) / freq ,如果第⼀次取,上次赎回时间 **=**初始化 Legacy 时间

思考

合约本身不复杂,但是覆盖的场景很多。

我们从合约的⻆度来分析⼀下优缺点。

1. 合约设计上的优点:

  • 数据分散在「初始化 Legacy 」的账号下,没有⼤数组问题

  • PaymentLegacy 都没有 dropcopyability ,安全可靠

  • 函数可⻅性管理得很好,只暴露了 init_legacyredeem 这两个⼊⼝

  • 功能完整

2. 合约可以进⼀步优化的地⽅:

  • 可以通过泛型⽀持任何类型的 Token ,实现成⼀种更通⽤的协议;

  • ⽀持形式化验证,通过数学⽅式证明合约的安全性;

  • redeem 的时候可以释放掉没有 PaymentLegacy

  • 同⼀个账号下只能同时有⼀笔 Legacy

  • 还有⼀些细节,例如 timesfreq0 ,冗余数据的存储

总结

MyLegacyStarcoin 公链上的⼀个安全可靠的 Asset-Management 项⽬,虽然叫 MyLegacy ,但是可以 想象的场景很⼴泛,⽐如分期结算项⽬资⾦等等。

合约总共 100 多⾏,既实现了复杂业务逻辑,⼜有了很好的安全性,这⾥查看完整代码(https://github.com/WestXu/mylegacy/blob/master/module/MyLegacy.move)。