Solidity言語

レッスン4:BattleOfZombie①

修飾子・関数修飾子のまとめ、が書かれたチャプターです。思い出すにはちょうど良くまとめられているので、じっくり読むのをオススメします!ここではpayable修飾子が登場します!

この回を進めると、イーサリアムのスマートコントラクトがいかに素晴らしいかが理解できます!ニコニコ現金払いの無駄を省く、素晴らしいシステムがここにはあります!!

興味がなくても一読する価値はあると思います!今後のお金に関する事ですからね、知ってて損はないっすよ!

10

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

それでは本日も開演します!!

チャプター1: Payable関数

12
ここでは過去のチャプターでも記述のあった修飾子・関数修飾子の振り返りとまとめが書いてありますな!わかりやすいのでそのまま覚えておくのがよさそうですね。
過去記事はこちら👉噛み付いちゃうぞCryptoZombie⑥

privete,internal,external,public,view,pureなどなどこのチャプターではなかなかありがたい振り返りができているので、クリプトゾンビーズ二周目の私としてはとってもありがたいぞw

34

modifier修飾子に関しては過去記事はこちら👉レッスン3:Solidityの高度なコンセプト③

51
新しい修飾子が出てきましたね!payable修飾子とな!

名前の通りですな、pay ableという風に翻訳さんにかけると、「支払うことができる」という意味になるので、その通りの修飾子だって事ですね!

Shidayuu翻訳にかけると「pay(お金)かもしれない」という謎の翻訳になってしまったので、微妙だなと感じたら即翻訳に頼ることをオススメするぞ!w

この内容は深いのでしっかり一読しておくようにね。今までのシステムでは考えられない事ができるようになっているというのがこのEthereum上で行われているスマートコントラクトの素晴らしき特徴だ!

日本の田舎なら当たり前のように蔓延している、、支払いは現金で、、というのがもしこのEthereumのスマートコントラクトで行われたら、、、物が届いたと同時に支払いが完了している、、、という事になりますねw

その瞬間にウォレットから買った分のetherが減っているという、、、未来的な状況になります!!

それを考えると、私はゾクゾクしますw

20

payable修飾子の話題に戻りましょうw
使い方の例をみると、修飾子の後に入るみたいですね。それなら関数修飾子と同じ扱い方だと思えばいいですね。

で、今度はmsg.valueというワードが飛び込んできてますね!いつもならmsg.senderなのでこれは一体なんなんだ??

valueは「値」という意味だから、msg.valueは「送金した金額」という考え方でいいですかね。
requireで確認しているのを見ると、0.001Etherが送られてきた場合は、transferThing(msg.sender)を実行するっていう事ですね。

ちなみにmsg.senderはコントラクトを呼び出した一番最初のアドレスを返す、との事なので、、

transferThing(msg.sender) = 物を転送する(そのアドレスに)、となるって事ですな!

49

尻切れトンボになっているので大事なところなので、もう一度貼りますね。
02
29

valueの部分を見て欲しい↑↑と言っているのでこの部分を見てね。

例えがわかりやすいですなw

通常の取引だと封筒の中に手紙が入ってて、それに返信してから、お金が入った封筒が届く、ようなものですが、そのやりとりを一本で済ませれるっていうのはめちゃくちゃ効率的ですよね。

通常  手紙=>受け取り側が返信=>お金を送金=>受け取り
payable  手紙&お金=>受け取り

payable修飾子おそるべし!!

それではテストだ!!!

00

1では、、uint型のlevelUpFeeという名前で定義し、それが0.001 etherと同様になるよう設定せよ。との事なので、、、

uint levelUpFee = 0.001 ether;

となります。入力する箇所としては、contractの宣言をしたすぐ後ですね。

2では、、関数作成せよ!でパラメータは一つの、external payableとせよなので、

function levelUp(uint _zombieId) external payable {}

となります!

3ではAとBが同等であるか、require使えと親切に教えてくれているので、

require(msg.value == levelUpFee);

となります。

4ではゾンビのlevelを増やすための処理として、ありがたく書いてあるので、

zombies[_zombieId].level++;

となりますね!

まとめると、、

uint levelUpFee = 0.001 ether;

function levelUp(uint _zombieId) external payable {
require(msg.value == levelUpFee);
zombies[_zombieId].level++;
}

となりますね!
これにてチャプター1の解説は完了ですね。

このまま次のチャプターへ行きます!

チャプター2:Withdraws関数

33
チャプタータイトルにもあるwithdrawsとはどういう意味なのか、、いつもの翻訳さんの力を借りると「引き出す・撤退する」という意味が出てきたので、これはetherを引き出すという意味に使われそうですね。

このGetPaidコントラクトはOwnableコントラクトの継承をしていますね。ただパラメータは何もない状態ですね、、、ふむふむ読み進めてみましょう。

書き方として見ると、関数定義のfunctionの後に来ているので名前として宣言していますよね。
47

transfer関数なるものがでてきたな!transferとは転送するという意味です!この言葉に関してはアップル時代に在庫管理の仕事していたので即理解できる単語でしたwよく店舗間で在庫調整する際にトランスファーしてとか電話で言ったり言われたりしてましたからね!なつかしい、、w

this.balanceというワードもありますね、thisは良いとしてbalanceとは残高という意味で使われてます。これも即理解できる単語でしたね、、仮想通貨取引をする際に、BinanceとかCoinExchangeとか使っているとこの言葉が何を意味しているか知る必要があったので、自動的に覚えましたねw

このワードを使えば、溜まっている残高の総量を返す、なのでATMでいう残高照会の意味ですかね。

送り返す関数を作ることも可能だって、、、、凄くないですか?w
これだけでも革命要素ありますよね、、、ATMで送金した金額が多いからって、多い分は自動で戻ってくるって事ですよ!!電話かかってきて入金額が多いので、返金します、と伝えた後に、送金の処理をする必要のある現代のシステムの根幹をぶっつぶす革命要素ですなw

素晴らしい、、、、w

理解するまでは大変だけど、これは理解したらとんでもない事できちゃうわ!
信頼を暗号化して改ざんできないようにしたら、ここまでスマートなコントラクト(契約)になるなんてね、、、ほんとすんげぇわ!

おっ、そうこうしているうちにテストだ!!
01

1では例として出ていたwithdraw関数をそのまま作成せよとのことなので、コピペで、、

function withdraw() external onlyOwner {
owner.transfer(this.balance);
}

となります。
2では仮想通貨市場の変動に関しても言及してますが、気づいたら倍になってたりしますからね、、だいぶ落ち着いて来た感ありますけど、今現在はアゲアゲな傾向なので楽しいですよねw

aではsetLevelUpFeeという名のパラメータはuint _feeとして、externalでありonlyOwner修飾子を用いるとのことなので、、

funciton setLevelUpFee(uint _fee) external onlyOwner {}

となりますね。

bではlevelUpFeeを_feeと同等にせよ、との事なので、、

levelUpFee = _fee;

となりますね。

feeというのは費用という意味ですね。

levelUpFeeは0.001 etherが現在代入されていますが、etherの価格が高騰した際に高騰したままで処理をしてしまうと、莫大な金額になる可能性があり、消費者離れに繋がることを懸念した対応という事になりますね!現在は0.001etherだと56円くらいですけど、2018年1月頃には1etherあたり16万円以上になってましたからね、、同じ0.001etherだとしても1月の時だったら160円ってことになりますねw

ユーザーとしてはめちゃくちゃ親切なゲームじゃないか!と感動する要素になりえますね!!
こういうの大事です!ハートをキャッチするには必要不可欠な要素だね!

あまりに大きな変動があった場合は、こちら側で変更可能にしておく、というのが今回のチャプターでの説明になりますね。

素晴らしいっ!!

まとめると、、

function withdraw() external onlyOwner {
owner.transfer(this.balance);
}

funciton setLevelUpFee(uint _fee) external onlyOwner {
levelUpFee = _fee;
}

となりますね!

これにてチャプター2も完了いたしました!
今日は長かったかもしれませんが、前日の夜にちょいとだけ進めて下書きしておいたので時間内に終われましたな!
寝落ちしない時は今後ともこうしたいと思います(><)/

次回予告もず〜っと終わるまでCryptoZombiesだし、予告しちゃうと予告以外に描きたくなった場合に予告なしに書いてやがる、、って思われるのも嫌なので、予告システムはとりあえず休ませておきますw

CryptoZombies | イーサリアムでのゲーム開発を学ぶ

って事で、本日はもう一本記事かきます!

昼からは私の母親の誕生日のための寿司だったりケーキを買い出しに行って来ます!

最近寿司続きなので、寿司飽きしているんですが、、、贅沢な悩みですよねw
こちらの地区は魚介類豊富で新鮮ですからね、美味しいお寿司を食べたかったら良い店紹介しまっせ!


ではまた後ほど!!

ABOUT ME
shidayuu
元バンドマンで読書・書評をしている函館在住32歳、しだゆうと申します! このブログでは主に読書した内容を元に、「ヒラメキを発信する」をテーマとして毎日更新しています。 書評をメインに、たまに元バンドマンの知識を発信していきます! あなたの役に立てる記事を書いていきます!