【CryptoZombiesを触ってみた】Lesson2で学んだこと
【CryptoZombiesとは】
Solidityでスマートコントラクトの構築を学習できるサイト
日本語で丁寧に説明してくれるので、プログラミングやったことない人でも学習できる。
【はじめに】
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と同じ
【できたもの】
ゾンビにクリプトキティを食べさせると進化する。