【CryptZombies】レッスン3チャプター5:Time Units
時間の単位
Solidityには時間を扱うための固有の単位がいくつか用意されています。
now変数は、現在のunixタイムスタンプ(1970年1月1日から経過した秒数のこと)を返します。unixタイムスタンプは歴史的に32ビットの数値として格納されています。
Solidityには、seconds、minutes、hours、days、weeks、yearsという単位も用意されています。
それぞれuintの秒数に変換されて使用されます。つまり、1 minutesは60になり、1 hoursは3600(60秒×60分)になり、1 daysは86400(24時間×60分×60秒)となります。
uint lastUpdated;
// `lastUpdated` を `now`に設定する
function updateTimestamp() public {
lastUpdated = now;
}
// `updateTimestamp`が呼ばれてから5分経っていれば、`true`が返る。
// 5分経っていなければ、`false`が返る。
function fiveMinutesHavePassed() public view returns (bool) {
return (now >= (lastUpdated + 5 minutes));
}
テストの実行
①cooldownTimeというuintを宣言し、1 daysに設定せよ。(英語の文法的には"1 day"が正しいが、それではコンパイルされないので、ここでは気を付けるように)
②前のチャプターですでにZombie structにlevelとreadyTimeを追加してある。そこで新しいZombie structを作る場合、正しい引数を使うために_createZombie()を更新する必要がある。zombie.pushの行を変更し、1(level用)と、uint32(now + cooldownTime)(readyTime用)(※1&2)の2つの引き通を追加せよ。
※1 デフォルトでnowはuint256を返すため、uinte32(....)が必要になります。そこで明示的にuint32に変換します。
※2 now + cooldownTimeは、現在のunixタイムスタンプ(秒)と、1日分の秒数を足した数字になる。つまり1日後のunixタイムスタンプとなる。ゾンビの捕食に十分な時間が経ったかを判定するために、あとでゾンビのreadyTimeがnowよりも大きくなっているかを確認することになる。
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network