見出し画像

【Astar】WASMコントラクト(時間経過とsaturating)

今回はWASMのコントラクトのうち、次の3つを学んでいきます。

  1. 時間情報の取得(block_timestamp

  2. Durationの使い方

  3. saturating_○○の使い方

では、やってみましょう!

まず前提として、下の5つのデータなどが構造体として存在します。

こちらのfeedという関数を見ていきます。

大まかに、次のような内容です。

  1. 餌を与える関数

  2. 前回から5分以上経っていないと実行できない

  3. 実行すると、各種パラメータが変化する

ここでやりたいのは、次の2つです。

  1. 時間経過を確認する

  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;
            }
        }







いいなと思ったら応援しよう!

ユウキ
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊