初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン5チャプター14:まとめ

このレッスンで学んだこと: ・トークン、ERC721規格、トレード可能な資産/ゾンビ ・ライブラリとその使い方 ・SafeMath関数を使ったオーバーフローとアンダーフロー対策 ・コード中のコメントとnatspecスタンダードこのレッスンでゾンビゲームのSolidityコー…

【CryptZombies】レッスン5チャプター14:まとめ

このレッスンで学んだこと: ・トークン、ERC721規格、トレード可能な資産/ゾンビ ・ライブラリとその使い方 ・SafeMath関数を使ったオーバーフローとアンダーフロー対策 ・コード中のコメントとnatspecスタンダードこのレッスンでゾンビゲームのSolidityコー…

【CryptZombies】レッスン5チャプター13:コメント

コメントのシンタックス(構文) SolidityにおけるコメントはJavaScriptのものと似ています。 // これは1行コメントだ。自分への(または他者へ向けた)注意書きのようなものだ。 ただ//をコメントする箇所に加えれば良い。非常に簡単です。 こんな複数行のコ…

【CryptZombies】レッスン5チャプター11:SafeMathパート3

winCountやlossCount(uint16)、level(uint32)については、これらの引数でSafeMathのaddメソッドを使用すると、これらのタイプはuint256に変換されるのでオーバーフローを防げません。 function add(uint256 a, uint256 b) internal pure returns (uint25…

【CryptZombies】レッスン5チャプター10:SafeMathパート2

SafeMathライブラリの中のコード library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal…

【CryptZombies】レッスン5チャプター9:オーバーフローとアンダーフロー

オーバーフロー&アンダーフロー とは? 例として、uint8は8ビットのみを持ちますが、つまりここに格納できる最大数値はバイナリ(2進数)の11111111ということです。 (またはデシマル(10進数)だと 2^8 - 1 = 255となる※)。 ※0を含むため、「-1」をして…

【CryptZombies】レッスン5チャプター8:ERC721 takeOwnership

takeOwnership関数は、msg.senderがそのトークン/ゾンビを受け取ることを承認されているか確認し、承認されていれば_transfer関数を呼び出すだけでOKです。 テストの実行 ①初めに、requireステートメントを使って、zombieApprovalsでキーが_tokenIdの場合にm…

【CryptZombies】レッスン5チャプター8:ERC721 takeOwnership

takeOwnership関数は、msg.senderがそのトークン/ゾンビを受け取ることを承認されているか確認し、承認されていれば_transfer関数を呼び出すだけでOKです。 テストの実行 ①初めに、requireステートメントを使って、zombieApprovalsでキーが_tokenIdの場合にm…

【CryptZombies】レッスン5チャプター7:ERC721 Approve

approve / takeOwnershipの2つの関数で、トランスファーは2段階で発生します。(チャプター5参照) ①トークン所有者がapprove関数を呼び出し、それに新たな所有者のaddressと彼に送る_tokenIdの情報を与える。 ②新たな所有者がtakeOwnership関数を_tokenI…

【CryptZombies】レッスン5チャプター5&6:ERC721トランスファーのロジック

チャプター5:ERC721規格の所有権の移転 ERC721規格は、2つの異なるトークン移転法を持ちます。 function transfer(address _to, uint256 _tokenId) public; function approve(address _to, uint256 _tokenId) public; function takeOwnership(uint256 _to…

【CryptZombies】レッスン5チャプター4:リファクタリング

リファクタリング リファクタリングとは、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することです。前チャプターで、ownerOfという関数を定義しました。 しかし、レッスン4を振り返ると、同じownerOfという名前のmodifierもzombi…

【CryptZombies】レッスン5チャプター3:balanceOfとownerOf

balanceOf function balanceOf(address _owner) public view returns (uint256 _balance); この関数は単にaddressを受け取り、そのaddressのトークン保有量を返す。 (ここでは、『トークン』はゾンビになります) ownerOf function ownerOf(uint256 _tokenI…

【CryptZombies】レッスン5チャプター2:ERC721規格と多重継承

ERC721規格は次のようになっています。実装が必要なメソッドのリストとも言えます。 contract ERC721 { event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved…

【CryptZombies】レッスン5チャプター1:イーサリアム上トークン

トークン イーサリアム上のトークン は、基本的にいくつかの共通ルールに従ったスマート・コントラクトのことです。 具体的に言うと、transfer(address _to, uint256 _value) や balanceOf(address _owner) といった関数のスタンダードセットを実装している…

【CryptZombies】レッスン4チャプター11:ゾンビの敗北(elseステートメント)

ゾンビは負けてもレベルダウンしません。単純にlossCountに負けを追加し、さらにクールダウンが始まるため、また攻撃をするのに一日待たなくてはなりません。 elseステートメント elseステートメントはifステートメントの延長です。 ifステートメントは、if…

【CryptZombies】レッスン4チャプター10:ゾンビの勝利

チャプター4では、0から100の乱数を計算しました。今度はその乱数を使って、誰が闘いに勝つかを決めて、それに従って成績を更新してみます。 テストの実行 ①ifステートメントを作成し、rand変数がattackVictoryProbability変数 より少ないか同等 であるかチ…

【CryptZombies】レッスン4チャプター9:ゾンビの勝敗

ゾンビたちがバトルを何回勝ち負けしたかをトラックしていくために、Zombie構造体でバトルの成績を保存していきます。 勝敗については、winCountとlossCountとします。 テストの実行 ①Zombie構造体を修正し、さらに2つのプロパティを持つようにせよ。 a. ui…

【CryptZombies】レッスン4チャプター8:Attackへ戻ろう!

テストの実行 ①ownerOf修飾詞をattack関数に加え、関数を呼び出した者が_zombieIdを所有しているか確認せよ。 function attack(uint _zombieId, uint _targetId) external ownerOf(_zombieId) { 中略 } ②まず最初に、我々の関数は両方のゾンビにstorageのポ…

【CryptZombies】レッスン4チャプター6&7:共通ロジックのリファクタリング

今まで、 require(msg.sender == zombieToOwner[_zombieId]); を何度も使用してきましたが、attack関数にも同じロジックを使用します。 コードを綺麗にして繰り返しを避けるために、このロジックを独自のmodifierに格納します。 チャプター6のテストの実行 …

【CryptZombies】レッスン4チャプター5:ゾンビが闘う

ゾンビバトルは次のような仕組みでできています。 ・自分のゾンビから一体を選び、さらに攻撃する相手のゾンビを選ぶ。 ・攻撃するゾンビは勝率70%、守備するゾンビは30%の勝率となる。 ・全ゾンビ(攻撃するものも守備するものも)が、winCountとloss…

【CryptZombies】レッスン4チャプター4:乱数

Solidityにおいて、安全な乱数の生成は不可能です。 理由は次の通り。 keccak256経由での乱数生成 Solidityではkeccak256ハッシュ関数を使って乱数を生成します。 // 1から100までの乱数を生成せよ: uint randNonce = 0; uint random = uint(keccak256(now, …

【CryptZombies】レッスン4チャプター3:ゾンビ・バトル

テストの実行と新規コントラクトの作成(復習) ①ファイル冒頭にSolidity version ^0.4.19を用いることを宣言せよ。 ②zombiehelper.solをimportせよ。 同じディレクトリ(./)内にzombiehelper.solがあればimportできます。 ③ZombieBattleという名の新規cont…

【CryptZombies】レッスン4チャプター2:Withdraw関数

Withdraw関数 withdraw関数は、Etherをコントラクトから引き出す関数です。 コントラクトに送られたEtherは、コントラクトのイーサリアム・アカウントに貯められます。コントラクトからEtherを引き出す関数を追加しない限りはそこに閉じ込められたままになっ…

【CryptZombies】レッスン4チャプター1:Payable関数(修飾詞の復習)

修飾子の復習 可視性修飾詞 いつどこで関数を呼び出すかをコントロールするもの。 private:コントラクト内の別の関数からのみ呼び出される。 internal:そのコントラクトを継承したコントラクトからも呼び出すことができる。 external:コントラクト外から…

【CryptZombies】レッスン3チャプター12:Forループ

getZombiesByOwner関数を素直に実装しようとするなら、オーナーからゾンビ軍団へのmappingをZombieFactoryコントラクトに持たせればOKのはずです。 mapping (address => uint[]) public ownerToZombies 新しいゾンビを作る度に、ownerToZombies[owner].push(…

【CryptZombies】レッスン3チャプター11:Storageのコストは高い

Solidityでstorageへの操作は高コストです。特に書き込みはとても高いです。 なぜかというと、データを書き込んだり、変更するたびに、それがすべてブロックチェーン上に永久に書き込まれるからです。 そこで、コストを抑えるために、絶対に必要な場合を除い…

【CryptZombies】レッスン3チャプター10:View関数でガスを節約

View関数はガスコストが不要 view関数を外部から呼び出す場合、ガスは一切かかりません。(external view) なぜかというと、view関数がブロックチェーン上でなにも変更しないからです。ただデータを参照するのみ。 詳しくいうと、関数にviewとマークするこ…

【CryptZombies】レッスン3チャプター9:ゾンビ修飾子

aboveLevel修飾子を使って次のような関数を作ります。 ・ゾンビのレベルが2以上なら、ユーザーは名前を変更できるようになる。 ・ゾンビのレベルが20以上なら、カスタムDNAを与えることができるようになる。 // ユーザーの年齢を格納するマッピングだ: m…

【CryptZombies】レッスン3チャプター9:ゾンビ修飾子

aboveLevel修飾子を使って次のような関数を作ります。 ・ゾンビのレベルが2以上なら、ユーザーは名前を変更できるようになる。 ・ゾンビのレベルが20以上なら、カスタムDNAを与えることができるようになる。 // ユーザーの年齢を格納するマッピングだ: m…

【CryptZombies】レッスン3チャプター8:関数修飾子の続き(引数を持つ関数修飾子)

引数を持つ関数修飾子 // ユーザーの年齢を格納するマッピングだ: mapping (uint => uint) public age; // ユーザーの年齢が一定の年齢より高いことを要件とする関数修飾子だ: modifier olderThan(uint _age, uint _userId) { require (age[_userId] >= _a…