Skip to content

Latest commit

 

History

History
120 lines (81 loc) · 5.28 KB

2-mappings.md

File metadata and controls

120 lines (81 loc) · 5.28 KB
title actions material
マッピング(Mapping)とアドレス(Addresses)
答え合わせ
ヒント
editor
language startingCode answer
sol
pragma solidity ^0.4.19; contract ZombieFactory { event NewZombie(uint zombieId, string name, uint dna); uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; struct Zombie { string name; uint dna; } Zombie[] public zombies; // ここでマッピングを宣言するのだ function _createZombie(string _name, uint _dna) private { uint id = zombies.push(Zombie(_name, _dna)) - 1; NewZombie(id, _name, _dna); } function _generateRandomDna(string _str) private view returns (uint) { uint rand = uint(keccak256(_str)); return rand % dnaModulus; } function createRandomZombie(string _name) public { uint randDna = _generateRandomDna(_name); _createZombie(_name, randDna); } }
pragma solidity ^0.4.19; contract ZombieFactory { event NewZombie(uint zombieId, string name, uint dna); uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; struct Zombie { string name; uint dna; } Zombie[] public zombies; mapping (uint => address) public zombieToOwner; mapping (address => uint) ownerZombieCount; function _createZombie(string _name, uint _dna) private { uint id = zombies.push(Zombie(_name, _dna)) - 1; NewZombie(id, _name, _dna); } function _generateRandomDna(string _str) private view returns (uint) { uint rand = uint(keccak256(_str)); return rand % dnaModulus; } function createRandomZombie(string _name) public { uint randDna = _generateRandomDna(_name); _createZombie(_name, randDna); } }

それじゃあ、データベースのゾンビをオーナーに与えるやり方でマルチプレーヤーゲームを作っていくから、しっかりついてこい。

まず、この作業には新しいデータ型が必要になる。 mappingaddressだ。

アドレス

イーサリアムのブロックチェーンが銀行口座と同じように**アカウント(口座)で構成されているのは知っているな。このアカウント(口座)には、Ether(イーサ)**の残高が記録されていて、Ether(イーサリアムブロックチェーンで使用される通貨)を送金したり受け取ったり、別のアカウントに支払うこともできるのだ。銀行口座から送金するのと全く同じだと思っていい。

それぞれのアカウントにはアドレスがある。これは銀行口座番号だと思えばいい。これはアカウントのためのユニークな識別番号になっていて、次のような番号で表示されるのだ:

0x0cE446255506E92DF41614C46F1d6df9Cc969183

(このアドレスはCryptoZombiesチームのものだ。CryptoZombiesが気に入ったら、Etherを送ってくれ! 😉 )

アドレスの一番重要な部分は後で説明してやるから、今はアドレスは特定のユーザー(またはスマートコントラクトで)が所有するものだとだけ理解しておけばいい

つまり、この数字をゾンビの番号として使用することができるということだ。このアプリで新しいゾンビを作ったら、関数を呼び出して、イーサリアムのアドレスをそのゾンビに設定していくぞ。

Mappings(マッピング)

レッスン 1では、構造体 と **配列**を教えたな。 **Mappings(マッピング)**は、それと同じで、データを格納するときにSolidityで使える方法の一つだ。

mappingは次のように定義するのだ:

// 金融系のアプリの場合、ユーザーのアカウントの残高にuintを格納する:
mapping (address => uint) public accountBalance;
// もしくは、ユーザーIdを基にユーザー名を参照・格納するために使用するぞ:
mapping (uint => string) userIdToName;

マッピングは本質的にはデータの保管と参照のためのキーバリューストアだ。最初の例で言えば、キーはaddress で、バリュー(値)はuintだ。2番目の例だと、キーは uint で、バリューは stringだ。ここまで理解できたか?

それではテストだ

ゾンビのオーナーシップを格納したいので、2つのマッピングを使用する:一つはゾンビを所有するアドレスをトラッキングし、もう一つはオーナーが持つゾンビをトラッキングするものだ。

  1. zombieToOwnerという名前のマッピングを作成せよ。キーは uintとし(idを基にゾンビを参照・保管するぞ)、バリューはaddressとする。マッピングはpublicで作成せよ。

  2. ownerZombieCountという名前のマッピングを作成し、キーはaddress、バリューはuintを設定せよ。