CryptoZombiesでSolidityを学ぶ #02

1.用語定義

アドレス
アカウントにはアドレスが紐付けされている。これは銀行口座番号のようなもの。特定のユーザ(スマートコンストラクタ)が所有している。

Mappings(マッピング)
データを格納するときにSolidityで使える方法の一つ。マッピングは本質的にはデータの保管と参照のためのキーバリューストアである。

// ユーザーのアカウントのにuintを格納する:
mapping (address => uint) public accountBalance;

キーは" address "を表し、バリュー(値)は" uint "を表している。この事からも定義の仕方としては、" mapping (key => value) "として扱う。

KVS(キーバリューストア)
keyに対応するvalueを保存しているだけの単純な構造。keyを使って該当データを引き出すイメージ。特定キーに対して特定のデータを扱うシンプルなデータベースの種類。

msg.sender
全ての関数で利用できるグローバル変数のうちの一つ。その関数を呼び出したユーザの addressを参照できる。現在の 関数呼び出し に対して、その 呼び出しの送信者のアドレス を表しています。そのため、セキュリティ作成のためにも重要なものとなっています。

注:Solidityは、常に外部の呼び出し元から関数を実行しなければならないという決まりがある。その関数を呼び出すまでは、コントラクトはブロックチェーン上で何もせずに、ただそこにあるだけなのだ。だから何かをするときには常にmsg.senderを使用するのだ。

(引用:CryptoZombies チャプター2)

mappingを更新してmsg.sender下にデータを格納する時には、" 定義した変数名[msg.sender] = 変数名 "とする。また、格納された値を受け取る時は、" return 定義した変数名[msg.sender]; "とする。この時返す値は、格納されている時はアドレス。格納されていない時は0を返す。

Require
特定条件を満たさない場合、エラーを吐き処理を停止させる役割を持つ。使用例は以下の通り。

function StopCodeTest(string _nonStopName) public returns (string) {
  // (注:Solidityはネイティブで文字列比較ができないため,keccak256 を使ってハッシュ同士を比較する方法を使用。)
  require(keccak256(_nonStopName) == keccak256("Threw"));
  // もし真ならば、以下の文字列を返す:
  return "Clear";
}

継承
長文になってしまいがちなコードを論理毎に分割する。整理整頓の練習を沢山しよう!!!!

contract Animal {
  function animmalName() public returns (string) {
    return "My Animals";
  }
}

contract Cat is Animal {
  function animmalName() public returns (string) {
    return "My Cats";
  }
}

コンパイルしてからCatにアクセスしたら、animmalName()とanimmalName()両方にアクセスできるようになる。

Import
Solidityのプロジェクトで長いコードを処理するときいくつかのファイルに分ける事がある。特定のファイルにアクセスする時に使用するのが、importである。使用方法は、" import "./ファイル名.sol"; "となる。./はコントラクトと同じ階層を示す。

Internal と External
public とprivateの他に、internal と externalという参照制約が用意されている。Internalは、privateとほぼ同義だが、継承先でもアクセスが可能となる。Externalは、publicとほぼ同義だが、コントラクト外から出ないと参照ができない。

他者のコントラクタとのやり取り
interfaceを定義してやることで誰でも他のコンストラクタからアクセスが可能となる(publicを忘れずに)。宣言時は、括弧({ や })ではなく、関数宣言の終わりにセミコロン (;)を使用する。使い方は以下の通り。

contract KeyInterface{
 function getKey(uint256 _id) external view returns (
    bool keyIsReady,
    uint256 keyNextAct,
    uint256 keySiringWithId,
    uint256 keyBirthTime,
    uint256 keyMatronId,
    uint256 keyGeneration,
    uint256 keyGenes
  );

contract ZombieFeeding {

  address ckAddress = アドレスPASS;
  KeyInterface keyInterface = KeyInterface(ckAddress);

  function keyOnDesk(uint _keyId, uint _deskId) public {
    uint keyPass;
   // 複数の返り値の処理。 
    (,,,,,,,,,keyPass) = kittyContract.getKitty(_deskId);
  }
}


この記事が気に入ったらサポートをしてみませんか?