1.13「Motoko——Managing cycles」
互联网计算机的使用是按**cycle**
来衡量和支付的。互联网计算机保持每个canister智能合约cycle的平衡。此外,cycle可以在canister之间转移。
在以互联网计算机为目标的 Motoko 程序中,每个actor代表一个互联网计算机canister,并具有相关的cycle平衡。cycle的所有权可以在actor之间转移。cycle通过消息有选择地发送和接收,即共享函数调用。调用方可以选择通过调用传输cycle,被调用方可以选择接受调用方提供的cycle。除非明确指示,呼叫者(Callers)不能转移周期,被呼叫者(Callees)也不能接受周期。
Callees 可以接受所有的,部分的或none的可用cycle,直到由他们的actor的当前平衡所决定的极限(limit)为止。任何剩余的cycle都将退还给Callers。如果一个call trap了,它所有的伴随cycle自动退还给Callers,没有损失。
将来,我们可能会看到 Motoko 采用专门的语法和类型来支持cycle编程的安全性。现在,我们提供了一种临时方法,通过一个底层的命令式 API 来管理cycle,这个 API 是由包库中的 ExperimentalCycles 库提供的。
Note |
这个库可能会发生变化,并且很可能会被更高级别的对 Motoko 后期版本周期的支持所取代。 |
ExperimentalCycles库:
Experimentalcycle 库提供了命令操作,用于观察actor当前的cycle平衡、转移cycle和观察退款。
该库提供以下操作:
func balance() : (amount : Nat)
func available() : (amount : Nat)
func accept(amount : Nat) : (accepted : Nat)
func add(amount : Nat) : ()
func refunded() : (amount : Nat)
函数 balance ()
返回actor当前的cycle余额。函数balance ()
是有状态的,可以在调用 accept (n)
、add
cycle后调用函数或resuming from await (reflecting a refund)后返回不同的值。
因为周期测量所花费的计算资源,所以通常从一个共享函数balance()
调用到下一个共享函数balance()
调用返回的结果是不同的。
函数available ()
,返回当前可用(available)的cycle数量。这个数量是**从当前caller收到(received)的金额,减去此call到目前为止接受(accepted)的累积金额。**
通过return
或throw
从当前共享函数或异步表达式退出时,所有剩余的可用(available)数量将自动返回给caller。
函数accept()
从available()
到balance()
转移一定数量的cycle。它返回实际转移的金额,这可能低于请求,例如,如果可用的金额较少,或如果canister的cycle限额(limit)已经达到。
函数add (amount)
表示下一个远程调用(即对共享函数调用或异步表达式的计算)中要传输的额外cycle数量。在call时,但不是在call之前,自上次call以来所增加(add
)的总量将从balance()
中扣除。如果这个总数超过了balance ()
,则caller trap,终止call。
函数 refunded ()
报告在当前上下文的最后等待中退还的cycle数量,如果没有等待,则为零。调用 refunded ()
只提供信息,不影响balance()
。相反,退款会自动加到当前余额中,不管是否用 refunded ()
来观察它们。
![](https://i-blog.csdnimg.cn/blog_migrate/e51ea83250489088f11c6c9533e4e556.png)