Ethereum: Raiden Networkを触ってみた！（環境構築と起動）

【本文】
---

先日、Ethereumのtestnet(Ropsten)上でRiden Network v0.1.0がテスト用に公開されたので、早速環境構築と触りだけ動作検証してみました。

【Raiden Networkとは】
---

基本的に、以下の記事を読めばある程度概要がつかめると思います。

+ 　[Ethereum版ライトニングネットワーク「Raiden」がテストネットでデプロイ(by bitcoin news)](http://btcnews.jp/522sao9b12551/)

簡単に言うと、Bitcoinで言うLightning NetworkのEthererum版のようなものです。
先に紹介した記事にもあるように大きく以下の特徴を有し、Ethererum(on-chain)が抱えるスケーラビリティの問題をoff-chain上で解決するイメージです。

**＜参考：Raiden Networkの大まかな特徴＞**
*（bitcoin newsより抜粋）*
>+ 拡張性: 取引数に応じた線形スケール（毎秒100万以上のトランザクションが可能）
+ 高速性: 取引の認証と完了が一瞬
+ 秘匿性: 個々の取引は公開台帳に記録されない
+ 相互運用性: Ethereumの標準化されたトークンAPIとの連動
+ 安い手数料: オンチェーンと比較して100万分の1以下の取引手数料
+ マイクロペイメント: 安い手数料により実現する超少額支払い

後は何と言っても、公式HP及びドキュメント、Github上のソースやGitterの投稿等を読むのがより正確な理解が進む最良の近道でしょう。

+ 　[Raiden Networkの公式HP](https://raiden.network/)

【環境構築準備】
---

今回、以下の環境を選択。

>+ OS: lubuntu(v16.10) ※軽量版Ubuntu
+ Raiden Network(v0.1.0) ※Raiden Developer Preview版の位置づけ。
+ Client: geth(v1.6.7) ※当初はgethをメインとする予定だが、後にParityへ変更。
+ Client: Parity(v1.7.0) ※チェーン同期は、圧倒的にgethより優れている。
+ それ以外: solidity,pyethapp,python,pip,node.js,web3, etc...

環境構築については、Raiden Networkの公式ドキュメントが一番参考になるものの、実際にはGitterやその他の情報をネット上で探す必要がある。
（※環境構築面で日本語で書かれたものは皆無（多分。。。）なので、基本的には英語サイトが中心となる。（※それも少ない印象。））

+ [Raiden Networkのインストール方法（※公式ドキュメント）](http://raiden-network.readthedocs.io/en/stable/overview_and_guide.html#installation)

注）
パブリックのtestnet(Ropsten)はgethだとチェーン同期に恐ろしく時間が掛かるというか、そもそも同期できるかも怪しいので、Parityをお薦めする。
（※Raiden Network起動の前提はチェーン同期されていること。）
なお、ParityからでもgethにattachすることでParity経由でgethコンソールを操作可能な為、gethに慣れている方はこちらの方法も検討しても良いかも。
（※gethはtestnetでは意外と嵌りポイント。）

【環境構築】
---

環境構築する上で必要最低限の情報は既出の[公式ドキュメント](http://raiden-network.readthedocs.io/en/stable/overview_and_guide.html#installation)に記載されているため、基本的には端折る。

**1. Ethereum Clientのインストール**
開発者向けを使用するので、"Dependencies"から始める。
ここでは、geth(go-ethereum)とParityをともにインストールする。

**2. solidityとpyethappのインストール**
これも必要となるので、インストールしておく。

**3. Raiden Networkのインストール**
公式ドキュメントにインストールコマンドが掲載されている。

**4.python,pipのインストール及びvirtualenvの作成**
ここはインストールや設定方法に少し慣れが必要かも。。。

**5.その他インストール・設定**
node.jsやweb3、その他必要に応じてインストールや設定。

自分はParityでチェーン同期させた後、Parity経由でgeth起動の方法を選択することにしたが、以下のサイトがヒントになった。

+ [Ethereum Parity fast sync for Ropsten testnet(by Ian Monk)](http://www.ziggify.com/blog/ethereum-parity-fast-setup-ropsten-testnet/)

【Raiden Network起動】
---

ここも慣れが必要かも。（※特に初めてEthereumのパブリック向けtestnetを使用する場合。）

**1. Parityをtestnet(Ropsten)で起動**

>```
$  parity  --geth --force-ui --chain ropsten --bootnodes "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303,enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303"
>```

Parity起動後、チェーン同期が始まるので終わるまで待つ。
（※早ければ30分強。約1時間程度）

**2. Parityよりgethをattach**
　（※新たにLinuxコンソールを開いてから、以下のコマンド入力）
>```
$ geth attach
>```

**3. gethコンソール上で新規アカウント発行**

>```
>> personal.newAccount()
>```

**4. アカウント宛にテスト用ETHを頂戴する**
以下のサイトより、アカウントを入力し頂戴すると3ETHくらいテスト用にくれます。
（※当然、あくまでtestnetのものでmainnetでは使用できないETHですがw）

[Ethereum Ropsten Faucet](http://faucet.ropsten.be:3001/)

なお、チェーン同期するまではアカウントにETH残高は反映されない。
mainnetで慣れている人は問題ないが、本当に貰えているか不安になる場合もあるかと思う。その場合、以下のサイトでアカウントをキーで検索すると、自分のアカウントにETH残高が反映されているか確認できる。

+ [Etherscan(Ropsten版)](https://ropsten.etherscan.io/)

**5. Raiden Network起動**

>```
>$ raiden --keystore-path ~/.ethereum/testnet/keystore/ --console
>```

注）チェーン同期はParityだが、最終的にはgeth起動させているので、geth側のtestnet用アカウントのプライベートキーを指定する。

環境構築がうまく行っていれば、以下のメッセージが出力され、index値:0とアカウントのロック解除用pwd入力を求められる。

>```
Welcome to Raiden, version 0.1.0+git.rf2c4667!
INFO:raiden.network.sockfactory	trying to find uPnP port mapper... 
WARNING:raiden.network.upnpsock	multiple upnp providers found num_providers=3
ERROR:raiden.network.upnpsock	could not query your lanaddr reported=
INFO:raiden.network.sockfactory	uPnP not available, trying STUN for port mapping... 
The following accounts were found in your machine:
[  0] - 'testnetで発行したアカウント'
Select one of them by index to continue: 0
Enter the password to unlock 'testnetで発行したアカウント': 
>```

※なお、チェーン同期が完了していない場合、大抵は以下のエラーが出力される。

>```
raiden.exceptions.AddressWithoutCode
>```

うまく行くとこんな感じ

>```
（一部省略）
The Raiden API RPC server is now running at http://XXX.XXX.XXX.XXX:XXXX/.
See the Raiden documentation for all available endpoints at
http://raiden-network.readthedocs.io/en/stable/rest_api.html
Entering Console
Tip:
	use `raiden` to interact with the raiden service.
	use `chain` to interact with the blockchain.
	use `discovery` to find raiden nodes.
	use `tools` for convenience with tokens, channels, funding, ...
	use `denoms` for ether calculations
	use `lastlog(n)` to see n lines of log-output. [default 10] 
	use `lasterr(n)` to see n lines of stderr. [default 1]
	use `help(<topic>)` for help on a specific topic.
	type `usage()` to see this help again.
Python 2.7.12+ (default, Sep 17 2016, 12:08:02) 
Type "copyright", "credits" or "license" for more information.
IPython 4.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
In [1]: 
>```

【ERC20-TOKEN（トークン）発行】

取り敢えず、トークン発行までできているのでついでに紹介。

>```           
In [1]: token_address = tools.create_token(initial_alloc=1000, name="tomohata", symbol="TOH", decimals=2)
Successfully created and registered the token 'tomohata'.
In [2]: token_address
Out[2]: 'baa4589a1a49f722293360e352fed692e741442d'
In [3]: 
>```

実際に発行されたトークンはEtherscan(Ropsten版)で確認できる。

（**図1**）
![2017-09-17-010955_1176x822_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/167054/40f85c00-94ad-0947-dac9-7fdeb7cb5d10.png)


【終わりに】
---
実際には、Raiden Network上でトークンを発行しそれをマイクロペイメントとして利用したりすることで、off-chain上でスケーラビリティを改善すること等が期待できる、文字通りEthererum版レイヤー2の技術と言えます。
Ethereumでは、Raiden Networkの他にも同じくスケーラビリティ問題に取り組むPlasmaのリリースも控えています。（※OmiseGoの前提となる技術でもある。）
おそらく、Lightning Network(Bitcoin)やRaiden Network及びPlasma（Ethereum)の存在は暗号通貨を通じた決済や為替の分野での革命的とも言えるインパクトのあるものではないかと考えられます。

ブロックチェーン及び暗号通貨はまだ未熟な部分も多いですが、これからも進化し続けていくのではないかと考えています。

自分自身、これからも継続してブロックチェーン技術の学びと学んだことの共有をしていければ、と考えています。
何よりも技術面をしっかりと抑えることが今、求められていることではないかと思います。

*'Baby is growing up!'*
(by Joseph Lubin)