何も分からないところからスタートするSolidity学習

####はじめに
先日[完成させたサービス](https://qiita.com/shotashimura/items/df013b686bc5965120c1)を未来へ向けてアップデートするため、そして個人的に参加したいプロジェクトがあるので、Solidityを勉強することにしました。
数日かけてブロックチェーンの基本的な概念は理解出来たので、これからはEthereumを運用する中でサーバーサイド的な立位置となる、『Solidity』を勉強していきたいと思います。

#####Solidityとは？
Ethereumが「スマートコントラクト」を実施するために開発されたプログラミング言語のことを指します。
ちなみにスマートコントラクトとは、その名の通り、ブロックチェーン上で容易に取引や契約を履行すること意味します。

#####基本的な文法の使用例

```javascript
// 冒頭でsolidityのバージョンを指定する。
pragma solidity ^0.4.19;

// ちなみにコメントアウトはJavaScriptと同じで、
// 一行コメントはこんな感じ

/* 
   複数行コメントはこういう感じ
   */ 

// contractという大きな入れ物を定義。ここに関数や変数を指定する。
contract myFirstSolidity {

//ブロックチェーン上に直接記載される「状態変数を定義」
//「uint」は符号がない整数を定義する際に利用
uint myApples = 10;

//四則演算も使えます。例えば足し算。引く掛ける割るも同様。割愛。
uint herPresent = 5 + myApples;

//配列について
// 3つ格納出来る配列
uint[3] testArray;
//10つの文字列を格納できる配列の例
string[10] stringArray;
//[ ]内に数字がない配列は多数の要素を格納出来る
uint[] mugenArray;

//「構造体」を用いて複数のデータ型を扱うことも可能。
struct Person {
  uint age;
  string name;
}
//構造体の配列も作れます。
Person[] people;
//publicで宣言することによって、コントラクト内だけでなく、外部からも呼び出しが可能になる。裏を返せば、外部からの攻撃に晒される可能性が高い。
Person[] public people;

//「構造体」はクラスのようなイメージ。
// 先ほど定義した構造体（Person）に新規構造体を作る
Person simuwo = Person(26, "Simuwo");
// それを配列に格納する
people.push(simuwo);
//１行で書くことも出来ます
people.push(Person(26, "Simuwo"));


//関数について
function eatApples(string _impressions, uint _amount) {
//関数内の引数には、型指定をした後に「_hoge」のように頭にアンダースコア（_）を入力。
}
//関数を呼び出すときはこのように。
eatApples("yammy!", 10);

// イベントの宣言
//イベントとは、ブロックチェーンに何かが生じたときに、コントラクトとフロントエンドを接続するもの。
event newApples(uint appleId, uint number);

//privateの宣言。定義したコンストラクター内からのみアクセス可能。
uint[] numbers;
function _addToArray(uint _number) private {
numbers.push(_number); //private関数はアンダースコアで始めるのが通例
}

//　public
//　定義されたコントラクトと継承したコントラクト、外部から呼び出すことが出来る。
//　関数に明示的に権限を設定していない場合は設定がpublicとなる。

// internal
//　宣言したcontract内、継承したcontractの中で呼び出しが可能

// external
//　外部からのみ呼び出しが可能

//view関数とpure関数
function sayHello() public view returns (string) {
//view関数ではアプリ内のデータは読み取り専用になる。
}
function _greet(string _str) private pure returns (string) {
//pure関数ではアプリ内のデータそのものにアクセスできない。

}   
}// contractの閉じタグ
```

```javascript:1125追記
// ブロックチェーンは銀行口座と同様にアカウント（口座）で構成されている。
// このアカウント（口座）には、Ether（イーサ）の残高が記録されていて、
// Ether（イーサリアムブロックチェーンで使用される通貨）を送金したり受け取ったり、
// 別のアカウントに支払うこともできる。それぞれのアカウントには銀行口座番号のようなアドレスがある。
// 参考→https://cryptozombies.io/jp/lesson/2/chapter/2

// Mappings（マッピング） データを格納する時に使う、配列のような機能。
// 基本構文
mapping(key => value) public hoge;
mapping (address => uint) favoriteApple;

// msg.sender　
// 全ての関数で利用できるグローバル変数の１つ。関数を呼び出したユーザーのaddressを参照できる。
function getApple(uint _myApple) public {
  // mappingにデータを格納する。
  favoriteApple[msg.sender] = _myApple;
}

// require 条件を満たさない場合はエラーを投げて実行を止める。
function sayName(string _name) public returns (string) {
  // _nameが"Test"と同じかどうか比較する。真でなければエラーを吐いて終了させる。
  // Solidityはネイティブで文字列比較ができないため、文字列の比較を
  // する際はkeccak256 を使ってハッシュ同士を比較する方法を使う。
  require(keccak256(_name) == keccak256("Test"));
  return "Hi!";
}
// sayName("Test")でこの関数を呼び出せた時のみ、"Hi!"と返ってくる。
// many thanks →https://cryptozombies.io/jp/lesson/2/chapter/4

// contractの継承 クラスの継承とイメージは近い
contract newOne is 継承したいcontract { }

// import 別のファイルからの呼び出しを行いたい場合に利用
import "./hoge.sol";
// 同じ階層から呼び出す時は、ファイル名の冒頭に「./」をつける

//「storage」と「memory」　Solidityには変数を格納できる場所が2つ用意されている。
// 「Storage」 はブロックチェーン上に永久に格納される変数。
// 対照的に「Memory」は一時的な変数で、外部関数をコントラクトに呼び出す際に消去される。
// thanks a lot! →https://cryptozombies.io/jp/lesson/2/chapter/7
```

```:1129追記
コントラクト（契約）について。
コントラクトはDappの中核を担う箇所で、オブジェクト指向プログラミングのクラスのように記述します。
大きなポイントとしては、コントラクトをイーサリアム上にデプロイすると、後から編集も更新もできなくなることです。
即ち、コントラクトにデプロイした最初のコードは永久にブロックチェーン上に残ることになるため、細心の注意を払って実装することを求められます。

個人的には普段使ってるエディターでコードを書いた後に、Remixでデバッグをするやり方が適していました。
```

#####こちらを参考にさせて頂きました
・[クリプトゾンビズ](https://cryptozombies.io/jp/course)（無料でSolidityを学ぶ事ができます）
・[Solidity公式ドキュメント](https://solidity.readthedocs.io/en/v0.5.12/)
・[modifierについて](https://daiki-sekiguchi.com/2018/07/31/ethereum-solidity-modifier/)


それでは、また！