【CryptoZombiesを触ってみた】Lesson2で学んだこと

【CryptoZombiesとは】

Solidityでスマートコントラクトの構築を学習できるサイト
日本語で丁寧に説明してくれるので、プログラミングやったことない人でも学習できる。

cryptozombies.io

【はじめに】

Solidityは未経験ですが、JavaScriptは触ったことがあります。
そんな人が自分用の学習メモとして書いています。

【学んだこと】

  • データ型のmappingとaddress
    • mappingはKVS(Key-Value Store)
    • addressはEthereumのアドレス
'mappingの書き方 Key => Value
mapping (address => uint) public accountBalance;
mapping (uint => string) userIdToName;
  • msg.sender

その関数を呼び出したユーザー(またはスマートコントラクト)のaddressを取得する。

mapping (address => uint) accountBalance;

function setBalance(uint _myBalance) public {
  accountBalance[msg.sender] = _myBalance;
}

function whatIsMyBalance() public view returns (uint) {
  return accountBalance[msg.sender];
}
  • Require

条件を満たさない場合、エラーを投げる。

'挨拶(_greeting)が"Hello"の場合、"Hello!"を返す。
'"Hello"以外の場合、エラーになる。
function sayHello(string _greeting) public returns (string) {
  require(keccak256(_greeting) == keccak256("Hello"));
  return "Hello!";
}
  • 継承
'BabyDogからtype()も実行可能
contract Dog {
  function type() public returns (string) {
    return "puppy";
  }
}

contract BabyDog is Dog {
  function age() public returns (string) {
    return "1 year old";
  }
}
  • Import

別ファイルに定義されているコントラクトをImportで呼び出し、
継承すれば使用可能になる。

import "./someothercontract.sol";

contract newContract is SomeOtherContract {

}
  • 変数のStorageとMemory
    • Storageはブロックチェーン上に永久に格納される。
    • Memoryは関数呼び出し時に消去される。
  • InternalとExternal

関数宣言はprivateやpublicの宣言方法と同じ。
Internalはprivateと同じだが、このコントラクトから継承したコントラクトにもアクセスできる。
Externalはpublicと同じだが、コントラクトの外からだけ呼び出すことができる。
コントラクト内部の別の関数から呼び出すことはできない。

  function eat() internal {
  }

  function drink() external {
  }
  • interface

ブロックチェーン上の他人のコントラクトとやりとりする時に使用する。

'Ethereumのアドレスと電話番号を紐づけるコントラクト
contract PhoneNumber {
  mapping(address => uint) numbers;

  function setNum(uint _num) public {
    numbers[msg.sender] = _num;
  }

  function getNum(address _myAddress) public view returns (uint) {
    return numbers[_myAddress];
  }
}
'別のコントラクトからPhoneNumberのコントラクトを使用したい場合、Interfaceを定義する。
contract PhoneNumberInterface {
  function getNum(address _myAddress) public view returns (uint);
}

contract MyContract {
  address PhoneNumberInterfaceAddress = 0x......;
  PhoneNumberInterface phoneNumberContract = PhoneNumberInterface(PhoneNumberInterfaceAddress);

  function someFunction() public {
    uint num = phoneNumberContract.getNum(msg.sender);
  }
}
  • 複数の返り値

返り値は複数指定することができる。
特定の返り値のみ取得する場合は不要な返り値をブランクにする。

function multipleReturns() internal returns(uint a, uint b, uint c) {
  return (1, 2, 3);
}

function processMultipleReturns() external {
  uint a;
  uint b;
  uint c;
  (a, b, c) = multipleReturns();
}

function getLastReturnValue() external {
  uint c;
  (,,c) = multipleReturns();
}
  • If

JavaScriptと同じ

【できたもの】

ゾンビにクリプトキティを食べさせると進化する。

f:id:takuyafujita:20180729182042j:plain
f:id:takuyafujita:20180729182220j:plain