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

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

【CryptZombies】レッスン1チャプター9:Private / Public関数

Solidityでは関数はデフォルトでpublicになっています。

要するに、誰でも(別のコントラクトからでも)自身のコントラクトの関数を呼び出して、実行できるということです。

これでは、攻撃に対してコントラクトが脆弱になることになります。

なので、自分が使う関数はデフォルトでprivateにして、公開しても構わない関数だけをpublicに設定するのだと、心がけが必要です。

 

ptivate関数の宣言方法

uint[] numbers;

function _addToArray(uint _number) private {
  numbers.push(_number);
}

このように書くと、この関数はコントラクト内の他の関数からだけ呼び出して、numbers配列に格納できます。

ご覧の通り、関数名の後にprivateとつけるだけです。簡単!

関数のパラメータと同様に、private関数はアンダースコア(_)で始めるのが通例です。

 

テストの実行

①private関数になるように、createZombieを編集せよ。名付けの通例を忘れるなよ!

private関数にするためには、関数名の後にprivateとつけるだけでOKです。

f:id:nomadomama:20181114161515p:plain

ただし、名づけの通例として、private関数はアンダースコア(_)で始めることになるので、以下のようになります。

f:id:nomadomama:20181114161646p:plain

 

お疲れさまでした!

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

【CryptZombies】レッスン1チャプター8:構造体と配列の操作

新しい構造体を作る

チャプター5でPerson構造体を作成し、チャプター6でpepleという名前のPerson構造体の配列を設定しました。

f:id:nomadomama:20181113235347p:plain

ここでは、新しいPersonを作成し、それをpeople配列に格納します。

 

 ①新しいPersonを作る

Person構造体を使って、新しいPersonを作ります。

Person satoshi = Person(172, "Satoshi");

これで、ageが172、nameがSatoshiのPersonが作成できました。

 

 ② ①で作成したSatoshiという名前のPersonをpeople配列に格納する

配列に格納する場合、「push」を使います。

people.push(satohsi);

 

③ ①と②を合体させる

①と②のsatoshiは同じものを意味します。

そこで、②のsatoshiに、①のsatoshiの右辺を代入すると、以下のようになります。

people. push(Person(172, "Satoshi"))

 

テストの実行

新しいZombieを作れるように関数の中身を埋めてそれをzombies配列に格納せよ。ただし、新しいZombieのnameとdnaは関数の引数(ひきすう)を使用せよ。

まず、青色下線の箇所をみていきます。

「新しいZombieを作れるように関数の中身を埋めて」とあるので、任意のzombiesという名前をあてて、Zombie構造体をもってきます。

Zombie zombies =

続いて、「新しいZombieのnameとdnaは関数の引数を使用せよ」とあるので、

Zombie zombies = Zombie(_name, _dna);

となります。 

f:id:nomadomama:20181114002059p:plain

 

次に、オレンジ下線の箇所をみていきます。

青下線ので作成した任意のzombiesをzombies配列に格納すると、次のようになります。

zombies.push(zombies)

f:id:nomadomama:20181114003103p:plain

 

②書いたコードを1行で書き直してスッキリさせよ。

 

①で赤文字にしているzombiesは同じものを意味します。

そこで、zombies配列に格納したzombiesに、Zombie構造体の右辺を代入すると、以下のようになります。

f:id:nomadomama:20181114004003p:plain

 

お疲れ様でした!

 

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

【CryptZombies】レッスン1チャプター7:関数の宣言

関数(function)とは、同じ処理をまとめて定義し、何度も使いまわしができるかたちにしたものです。

さらに、その処理の部分に共通の変更点が生じた場合にも、変更が一か所ですむというメリットもあります。

なので、同じような処理が何度も出てくる場合は、関数というかたちで一か所にまとめて定義します。

 

関数の宣言

solidityでは次のようになります。

function eatHamburgers(string _name, uint _amount) {

}

これは、stringとuintという2つのパラメータを持つ、eatHamburgersという関数です。

関数の中身、すなわち{ }については、現時点では空の状態です。

なお、グローバル変数と区別をつけるために、関数パラメータの変数名はアンダースコア(_)をつけるのが通例です。

 

テストの実行

①createZombieという名前の関数を作成せよ。関数には、_name(string)と、_dna(uint)の2つのパラメータを設定せよ。(関数の中身は空で構わない。)

「createZombieという名前の関数を作成せよ。」とあるので、まず、

function createZombie

と定義します。

 

次に、「関数には、_name(string)と、_dna(uint)の2つのパラメータを設定せよ。」とあるので、

function createZombie(string _name, uint _dna){ }

と定義します。

回答は次のとおりになります。

f:id:nomadomama:20181111223005p:plain

 

お疲れさまでした!

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

JavaScriptで関数を使う方法【初心者向け】 | TechAcademyマガジン

【CryptZombies】レッスン1チャプター6:配列

配列とは?

なんだか数学の授業で聞いたことがあるようなないような…。

配列とはなんぞやについて、次のサイトで解説してあったので、ご紹介します。 

配列(array)とは同じ型の複数の値を一つの名前(変数名)添え字によって管理する仕組みです。

例えば7人の氏名の情報を配列で管理するとします。

この7人分のデータは配列において一列に並べられているとイメージしてください

この時一人ひとりの名前のデータを「要素」といい、並んでいる順番の番号を「添え字」といいます。

添え字は「0」から始まるので注意しましょう。
”氏名”という配列があるとして、次のようなイメージです。

氏名[0],氏名[1],氏名[2],氏名[3],氏名[4],氏名[5],氏名[6],
というふうに一列に並んでおり、[0]に「田中」だったり、[3]に「佐藤」という値が格納されています。

 

<配列の使い方>

配列は

型名 配列名

で宣言します。

例えば

int number[5];

といった具合です。内に書いている5は要素の数です。

プログラミングの「配列」とはどんなもの?【26回】 | プログラミング講座・研修ならエパノ プログラミングスクール【東京・新宿】 | プログラミング講座・研修ならエパノ プログラミングスクール【東京・新宿】

 

 2種類の配列

Solidityには2種類の配列が用意されています。固定長配列可変長配列です。

2要素の固定長配列の場合

uint[2] fixedArray;

 

5要素の固定長配列の場合(5つの文字列を格納できる)

string[5] stringArray;

 

可変長配列(決まったサイズはないので、格納し続けることができる)

uint dynamicArray;

 

上記のサイトでは「添え字は「0」から始まるので注意しましょう。」と書いてありましたが、Solidityでは添え字は1から始まるのかな?

 

構造体の配列

構造体の配列も作ることができます。チャプター5の解説文ででてきたPerson構造体

f:id:nomadomama:20181111162412p:plain

を例にすると、次のように、「people」という名前のPerson構造体の配列を設定できます。

Person people;

Person[] people; // このように可変長配列で書ける。さらに追加し続けることもできるぞ。

 

チャプター3で、状態変数は永久にブロックチェーンに格納されると説明されていましたが、こういった構造体の可変長配列は、データベースのように使えるので、コントラクトの構造データを格納するときに便利です。

 

パブリックの配列

配列をpublicで宣言すれば、Solidityが自動的にgetterメソッドを作成してくれます。

Person[] public people;

こうすれば、getterメソッドが作成され、他のコントラクトもこの配列を読むことができます。(ただし、書き込めない)

publicはこうした性質を持っているので、コントラクトの公開データを格納するときに便利です。

 

テストの実行

①パブリックなZombie構造体の配列を作り、名前をzombiesとせよ。

チャプター5で作成したZombie構造体は、次のとおりです。

f:id:nomadomama:20181111163836p:plain

このZombie構造体の配列で、パブリックかつ名前がzombiesなので、回答は次のとおりになります。

f:id:nomadomama:20181111163815p:plain

 

お疲れ様でした!

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

【CryptZombies】レッスン1チャプター5:構造体

構造体

複雑なデータ型を作成する場合に、構造体(structure)を使用します。

構造体を使えば、複数のプロパティを持つ複雑なデータ型を作成することができます。

f:id:nomadomama:20181111004136p:plain

上記例では、Personという名前のstruct(構造体)を作成し、Person構造体のプロパティとして、ageという名前のuintとnameという名前のstring(文字列)を設定しています。

プロパティは{}で囲みます。

 

テストの実行

①Zombieという名前のstructを作成せよ。

Zombieという名前のstructを設定し、プロパティを入れるために{}を用意します。

f:id:nomadomama:20181111004903p:plain

 

②Zombie構造体にプロパティを2種類設定せよ:name(string)と、dna(uint)だ。

①で作成したZombie構造体の{}の中にプロパティを設定します。

f:id:nomadomama:20181111005212p:plain

 

お疲れさまでした!

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

【CryptZombies】レッスン1チャプター4:数式演算

Solidityで使う数式はエクセルなどで使うものと同じです。

・加算(足し算):x + y

・減産(引き算):x - y

・乗算(掛け算):x * y

・除算(割り算):x / y

・剰余(余り) :x % y(例えば、13 % 5は3になります。なぜかというと、5を13で割ると、余りが3だからです)

 

指数演算子

指数演算子(xのy乗やx^y)については、 次のように示します。

f:id:nomadomama:20181110163558p:plain

これは、5^2=25と同様です。

 

テストの実行

①dnaModulusという名前のuintを作成し、10のdnaDigits乗に設定せよ。

dnaDigitsは、前回のレッスンで次のとおり設定しています。

f:id:nomadomama:20181110164156p:plain

このことから、10のdnaDigits乗は、10の16乗を示すことになります。

新しく登場するdnaModulusという名前のuintは、10のdnaDigits乗に設定する必要があるので、答えは次のとおりになります。

f:id:nomadomama:20181110164504p:plain

 

お疲れ様でした!

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network

【CryptZombies】レッスン1チャプター3:状態変数と整数

「状態変数」コントラクト内に永遠に保管され続けるものです。

つまり、イーサリアムブロックチェーン上に記載されるということ。

<例>

f:id:nomadomama:20180915222546p:plain

この例では、「myUnsignedInteger」という名前の「uint」を作り、その値を100に設定していますが、この部分がイーサリアムブロックチェーン上に記載されることになります。

 

符号なし整数:uint

「uint」(ユーイント)というのは、unsigned integer(符号なし 整数)の略です。

符号なし整数のデータ型で、負数ではないということを示しています。

これに対し、「int」(イント)は、integer(整数)の略で、符号付整数になります。

 

ちなみに、Solidityでは、「uint」は「uint256」(=256ビットの符号なし整数)のエイリアス(=別名)を意味します。

 

テストの実行

ゾンビのDNAは16桁の数字で決まります。

①dnaDigitsというuintを宣言し、それを16に設定せよ。

「dnaDigits」という名前の「uint」を宣言します。

f:id:nomadomama:20180915224501p:plain

dnaDigitsという名前のuintの値は16なので、

f:id:nomadomama:20180915224622p:plain

となります。

お疲れさまでした!

 

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network