互联网计算机的使用是按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)addcycle后调用函数或resuming from await (reflecting a refund)后返回不同的值。

因为周期测量所花费的计算资源,所以通常从一个共享函数balance()调用到下一个共享函数balance()调用返回的结果是不同的。

函数available (),返回当前可用(available)的cycle数量。这个数量是从当前caller收到(received)的金额,减去此call到目前为止接受(accepted)的累积金额。通过returnthrow从当前共享函数或异步表达式退出时,所有剩余的可用(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 ()来观察它们。

— Motoko —

A Student on the way to full stack of Web3.