仮想通貨

CryptoZombiesのレッスン2が終わりました

目次
・マッピング(Mapping)とアドレス(Addresses)
・どうやってアドレスを取ってくる?
・関数に突入したときの条件チェック
・継承 ・・・orz
・importを使おう
・ストレージとメモリ
・Internal と External
・別のコントラクトとのやりとり
・interfaceを使おう
・if文
・最後に「猫ゾンビ」を作って終わり

●マッピング(Mapping)とアドレス(Addresses)

ブロックチェーン上のアドレスという概念を「address」という変数でマッピングする方法を教わりました。

mapping (uint => address) public zombieToOwner;

宣言はこんな風に書きます。

これはKVSと同じで、KeyとValueの対をMapに格納するということらしいです。
上記の場合はuintデータがKeyで、addressデータがValueに当たります。

●どうやってアドレスを取ってくる?

solidityの中では、グローバルで参照できる変数がいくつか用意されているようです。

アドレスを指し示すには「msg.sender」を用いるようです。

この関数を呼び出したユーザー(またはスマートコントラクト)の addressを参照できるようです。

もっと他にもありそうですが、案内人はここまでしか教えてくれないので、先に進みます。

●関数に突入したときの条件チェック

関数に突入したときの条件チェックが必要ですね。

その時は「require」というものを使用するようです。

require( a == b );

aがbでなかった場合、以降の処理は実行されず、エラーで処理を抜けてしまうようです。(うーん。抜けた後はどうなるんだ?)

今は気にしなくて良いらしいので、先に進みます。

●継承 ・・・orz

contractも継承ができるようです。要はこのcontractというのは「class」なんですね。

継承の書き方は

contract A { ... }
// ↓ Aを継承している
contract B is A { ... }

のように書きます。

orz

まあ、わかりますけどね。

is-a関係とhas-a関係ってことで「継承」と「包含」の区別を説明するときに「is」って使いますから。

でもね。。。そこは

「extends」で良かったんじゃないの!

javascript屋さんたちはきっと間違うと思うの!!!

●importを使おう

ファイルが複数に分かれて、他のファイルを参照するときには「import」文を使うようです。

import文の書式は以下。

import "./bar.sol";

うーん。拡張子(.sol)も書くんだ。

ってことは、他にもインポートできるファイルタイプが用意されているのだろうか?

javascriptの場合は大抵拡張子は省略しますけどね。

●ストレージとメモリ

ブロックチェーン上に永続的にデータを残す場合「storage」を使用し、一時的に変数を格納するような場合には「memory」を使うようです。

とりあえず、状態変数(関数外でデータの保持が必要なもの)はsolidityの方で自動的にstorageに指定されるようですが、明示的に指定する必要がある場合には

Foo strage foo = hoge[_bar];

のように「型名」と「変数名」の”間”に指定します。

どうやらsolidityでは修飾子は対象の後ろに配置する設計のようですね。

●Internal と External

Solidityにはpublic とprivateの他に「internal と external」という関数用ビジビリティ(?)が用意されているようです。

で、ビジビリティ??? → visibility

もうね、ここは英語でOK。

要は「可視性」ってことですね。C++/C#/Javaをやってきた人にはおなじみの

public protected private

の3つでしょう。

どうやら internalはprotectedらしいですが、externalは「外部からしか参照させないpublic」らしいです。
使いどころがまだわかっていません。

●別のコントラクトとのやりとり

別のコントラクトとのやりとりには interfaceを定義して行うようです。

interfaceの概念は納得かな。

しかし、定義方法は

contract Hoge {
 function bar() public view returns (uint);
}

のように一見コントラクトの定義のように見えますね。

しかし、内部の関数の実態は定義していないのです。要は宣言だけを記述しています。

ううぬ。だったらサクッと interfaceってエイリアスを作ってほしいのだ。
(すまん。文句ばっかりで)

●interfaceを使おう

interfaceを実体化させるには、newとかも使わずに

Hoge hoge = Hoge(address);

のように、コントラクトのアドレスを与えて初期化するようです。

私なんて、絶対にnewって書きそうだな。まあ、慣れなんでしょうけどね。

●if文

if文はほぼJavaScriptと同じ書き方でした。

if ( 条件 ) {
   処理
}

python屋さんとかには括弧やブラケットは不評かもしれないけど、コードフォーマッタが進化した昨今では、インデントで文の有効範囲を決める方法じゃなくても十分に綺麗なコードは書けると思っています。

●最後に「猫ゾンビ」を作って終わり

結構長いレッスンでしたけど、特に詰まるところはなかったです。

変態javascriptの記述に慣れる必要はありますけどね。

最後に、作成された私のゾンビと合成された猫ゾンビです。

なんか、、、可愛いw


ソフトウェア・エンジニアを40年以上やってます。 「Botを作りたいけど敷居が高い」と思われている方にも「わかる」「できる」を感じてもらえるように頑張ります。 よろしくお願い致します。