初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【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"が正しいが、それではコンパイルされないので、ここでは気を付けるように)

f:id:nomadomama:20181207231540p:plain

 

②前のチャプターですでにZombie structにlevelとreadyTimeを追加してある。そこで新しいZombie structを作る場合、正しい引数を使うために_createZombie()を更新する必要がある。zombie.pushの行を変更し、1(level用)と、uint32(now + cooldownTime)(readyTime用)(※1&2)の2つの引き通を追加せよ。

f:id:nomadomama:20181207231953p:plain

※1 デフォルトでnowはuint256を返すため、uinte32(....)が必要になります。そこで明示的にuint32に変換します。

※2 now + cooldownTimeは、現在のunixタイムスタンプ(秒)と、1日分の秒数を足した数字になる。つまり1日後のunixタイムスタンプとなる。ゾンビの捕食に十分な時間が経ったかを判定するために、あとでゾンビのreadyTimeがnowよりも大きくなっているかを確認することになる。

 

お疲れさまでした!

 

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network