Parity によるスマートコントラクトの開発

Ethereum クライアントとして性能には定評があり、また最近では multisig wallet の実装にバグがあったことも話題となった Parity を使った開発について紹介します。ノードを立てスマートコントラクトを記述しテストネット(Kovan)にデプロイします。環境としては Mac か Linux を前提とします。あえて Windows でやるには vmware などで Linux をインストールしてください。

# Parity のインストール

## パッケージから行う場合

Mac と Ubuntu では以下の方法で Parity をインストールできます。

```bash
curl https://get.parity.io -Lk | bash
```

## ソースからビルドする場合

### Rust のインストール

[Install Rust](https://www.rust-lang.org/en-US/install.html)を見てください。インストール後 PATH に ~/.cargo/bin を追加します。

```bash
export PATH=$HOME/.cargo/bin:$PATH
```

### Parity のビルド

Ubuntu 16.04 では以下のパッケージをインストールする必要がありました。

```bash
sudo apt-get install libudev-dev libssl-dev
```

Centos 7 では以下のパッケージをインストールします。

```bash
sudo yum install libudev-devel openssl-devel
```

Linux のディストリビューションに合わせて必要なパッケージをインストールしてください。Mac では MacPorts か Homebrew などを使ってください。

Parity のソースを取ってきてビルドします。

```bash
git clone https://github.com/paritytech/parity.git
cd parity
cargo build --release
```

ビルドに成功すれば target/release/parity が生成されています。初回実行時はかなり時間がかかります。

# Parity の起動と初期設定

## テストネット Kovan との同期

Parity を起動して Kovan のブロックチェーンと同期します。(パッケージからインストールした場合は target/release/ を付ける必要はありません。)

```bash
target/release/parity --chain kovan --no-warp
```

ネットワークの状況やディスクの性能にもよりますがとても時間がかかるので寝る前にでもやって放置しておきましょう。なお Parity を終了させたい時は Ctrl-C か kill を使います。

## 管理画面を開く

管理画面には web ブラウザーでアクセスします。なぜか Safari だとうまくいかないようで Chrome か Firefox を使ってください。ブラウザーを開き http://localhost:8180/ にアクセスします。最初に welcome 画面が出てくるはずです。Next をクリックすると免責条項についての説明に移りますので問題がなければ accept をチェックして Next をクリックします。

## アカウントの作成

次にアカウントを作成します。アカウント名とパスワードを2回入力して Next を押します。ここではアカウント名を Alice としておきます。次の画面でアカウントのアドレスと復帰用のフレーズが出てきます。復帰用のフレーズをどこか安全な場所に保存しておいてください。赤い線が引かれていると思いますのでそこに "I have written down the phrase" と入力します。Next を押すと次の画面で復帰用のフレーズを聞いてきます。メモした内容をそのまま貼り付けます。Create を押すとアカウントが作成されます。Close を押すとアカウント画面になります。ここでナビゲーションの吹き出しが出てきてさらに Chrome なら拡張をインストールするかどうか聞いてきますがとりあえずスキップします。この時点でこんな感じの画面になっているはずです。

![kovan2.jpg](https://qiita-image-store.s3.amazonaws.com/0/66903/645de567-ccb4-c8cb-0da5-50b3e06428ea.jpeg)

テスト用にもう一つアカウントを作ります。画面の +ACCOUNT → NEW ACCOUNT → NEXT と押してさっきと同じようにやります。今度のアカウント名は Bob とします。

# テスト用マネーの取得

スマートコントラクトをデプロイするのにお金(ETH/wei)がかかるのでゲットします。ただし Kovan は Proof of Authority の方針で運営されておりマイニングをする必要がなく、マイニングで ETH を獲得することはできません。ETH を取得するには以下のようにします。この方法は github のアカウントが必要です。

1. [Gist](https://gist.github.com) に新しいページを作り自分の Ethereum アカウントのアドレスを貼り付ける。
2. そのページの URL をコピーして以下の `address=` 以降の部分を置き換えて curl を叩く。

```bash
curl http://github-faucet.kovan.network/url --data "address=https://gist.github.com/[github_username]/[gist_hash]"
```

数秒くらいで自分のアカウントに 1 ETH 送られてくるはずです。

![kovan3.jpg](https://qiita-image-store.s3.amazonaws.com/0/66903/633b6c9d-07f8-b221-2f36-8b9e9b20b068.jpeg)

なおこの方法によるETHの取得は24時間で1回だけ行えます。2回目以降も同じ gist の URL が使えます。なお、たまにこのサーバーが落ちていることがあるようで、その時はちょっと待つか、または [Gitter](https://gitter.im/kovan-testnet/faucet) で ETH をくれと言うと親切な人が送ってくれます。
この節の内容は https://github.com/kovan-testnet/faucet に基づいています。私はこの中で紹介されている SMS verification による方法も試してみましたが日本からではどうもうまくいかないようです。

# Solidity によるスマートコントラクトの作成

ここでは単純に ETH を指定されたアカウントに振り込むだけのアプリケーションを作ります。SETTINGS をクリックして Contracts にチェックを入れてください。画面上部に CONTRACTS メニューが追加されていますのでクリックします。次に CONTRACTS のサブメニューの DEVELOP をクリックします。左側の領域に以下のプログラムを打ち込んで COMPILE をクリックします。

```js
pragma solidity ^0.4.16;

contract Sample {
    function send(address target) payable {
        target.transfer(msg.value);
    }
}
```

コンパイルに成功したら DEPLOY をクリックします。contract name に Sample と入力して CREATE をクリックします。ここでもう一度、確認の画面が現れます。Ethereum ではコントラクトをデプロイするのに ETH を消費するためその確認をしているのです。問題なければ Alice のパスワードを入力し CONFIRM REQUEST をクリックします。

![kovan4.jpg](https://qiita-image-store.s3.amazonaws.com/0/66903/5b6fb4d0-f9a8-2b86-05e6-423a44997ac3.jpeg)

しばらくすると transaction が mine されたと報告されるはずです。

# スマートコントラクトの実行

画面上部の CONTRACTS メニューをクリックすると今デプロイした SAMPLE コントラクトが表示されると思います。このコントラクトをクリックし EXECUTE をクリックします。

![kovan5.jpg](https://qiita-image-store.s3.amazonaws.com/0/66903/dd5af819-616f-9b87-171f-91b899d2fad2.jpeg)

この画面は Alice が send という関数を実行しようとしていることを表しています。target address をクリックして Bob を選びます。transaction value は 0.1 にします。入力したら POST TRANSACTION をクリックします。また確認画面が現れますので Alice のパスワードを入力して CONFIRM REQUEST をクリックします。ACCOUNTS のメニューで確認してみましょう。

![kovan6.jpg](https://qiita-image-store.s3.amazonaws.com/0/66903/52ce1119-92f9-faff-1bbe-b8aee69d1dc6.jpeg)

Alice から Bob に 0.1ETH の送金が行われたことが分かります。