【Astar】WASMコントラクト(時間経過とsaturating)
今回はWASMのコントラクトのうち、次の3つを学んでいきます。
時間情報の取得(block_timestamp)
Durationの使い方
saturating_○○の使い方
では、やってみましょう!
まず前提として、下の5つのデータなどが構造体として存在します。
こちらのfeedという関数を見ていきます。
大まかに、次のような内容です。
餌を与える関数
前回から5分以上経っていないと実行できない
実行すると、各種パラメータが変化する
ここでやりたいのは、次の2つです。
時間経過を確認する
一定時間が経過していたら、ステータスを変更する
1 時間情報を取得する
では、時間情報を取得しましょう。
それが、下の「self.env().block_timestamp()」です。
これにより、現在時刻を取得することができます。
ただし、取得するのは下のような、「ミリ秒」であることにご注意ください。
次に、「time_since_last_fed」を取得します。
これは前回の餌やりからどの程度時間が経ったかです。
2 Durationを使用する
最後に、今回は5分、間を空けようと思うので、5分を取得します。
下のように、「Duration::from_secs」が使われています。
例えば、Duration::from_secs(5)は「5秒間」であることを表します。
後に出てきます、ミリ秒などと比較を行うときに便利です。
なお、Durationを使うときは、下のように宣言します。
use core::time::Duration;
では、「5分以上経っていれば」という条件を加えます。
ポイントは、「time_since_last_fed」がミリ秒であるということです。
そのため、下のように、「Duration::from_millis」を使用しています。
3 saturating_○○について
最後に、こちらの「saturating_○○」について、見ていきましょう。
saturatingとは飽和するという意味です。
今回の空腹度は0以上で、マイナスにはなりません。
そのため、例えば空腹度が10だった場合、20減っても最小値である0を返すようになっています。
#[ink(message)]
pub fn feed(&mut self) {
let current_time = self.env().block_timestamp();
let time_since_last_fed = current_time - self.last_fed;
let five_minutes = Duration::from_secs(FIVE_MINUTES);
if Duration::from_millis(time_since_last_fed) >= five_minutes {
self.hunger = self.hunger.saturating_sub(20);
self.happiness = self.happiness.saturating_add(10);
self.health = self.health.saturating_add(5);
self.last_fed = current_time;
}
}