はじめに
今回のレポートはいつもとは少し趣向を変えて、サロンに寄せられた質問のうち、他の方にとっても学びになると思われるものをレポートにして共有します。
本記事は、過去にコンセンサス・ベイスが主宰していたオンラインサロンの記事です。記事は2017年~2018年にかけて執筆されたため、一部は、既に古くなっている可能性があります。あらかじめご了承ください。
もう実際にEthereumのテストネット上で何か作っているようなレベルの方であれば、質問①で紹介している「プライベートチェーンに他のノードを参加させる方法」や、「プライベートチェーンでのコンセンサスアルゴリズムの変更は可能か?」などのトピックは面白いかもしれません。
また、これから学習を始める初心者の方であれば、質問③でプログラミング経験がまだなく、これからチャレンジしていきたいという方の疑問にもお応えしておりますのでご一読いただければと思います。(これは別で独立したシリーズの記事にする予定です。)
質問① Ethereumのプライベートネットワークについて
Ethereum技術者養成企画にて、Ethereumのプライベートネットワークの作成についてインストラクトしていただいておりますが、Ethereumプライベートネットワーク以下についてご教授ください:
Q.Ethereumプライベートチェーンに他のノードを参加させる(他の複数ノードに接続させる)方法を教えてください。
(具体的なコマンドというよりも概念的手順をご教授いただきたいです)
A:Ethereumのプライベートチェーンにノードを追加するのは、下記の2通りの方法があります。
①admin.addPeer()メソッド
gethの起動後、addPeer()メソッドを使ってノードを参加させる方法です。
addPeer()メソッドに対し、下記の形式で追加するノードの公開鍵とIP、ポート番号を渡してやります。
admin.addPeer("enode://f4642fa65af50cfdea8fa7414…..0@33.4.2.1:30303")
// admin.addPeer("enode://pubkey@ip:port")
②接続するpeerをstatic-nodes.jsonファイルに記述する
もうひとつのやり方として、static-node.jsonという設定ファイルに接続するノードを記載しておく方法があります。
こちらもaddPeer()同様に、追加するノードの情報を”pubkey@ip:port”の形式で記載しておきます。この場合、gethの再起動が必要になるかと思われます。
[
"enode://f4642fa65af50cfdea8fa7414…..0@33.4.2.1:30303",
"enode://pubkey@ip:port"
]
参考URL:https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network#user-content-static-nodes
Ethereumで複数ノードをつなげてプライベートネットワークを作ってみる
Q.Ethereumプライベートチェーン上でコントラクトを起動するためにGasが必要かと思いますが、Gasはどのように手に入れるのでしょうか。プライベートチェーンではマイニング報酬はないという認識のため御聞きしました。
A. Gasというよりプライベートチェーン用のEtherかと思いますが、Etherをどう手に入れるかは、2つ方法があります。
genesis.jsonに初期のアドレスとそこに付与したいEtherの数量を書くか、マイニングをしてEtherの報酬貰うか、のどちらかです。
①genesis.jsonに記述する方法
下記のように、ジェネシスブロックを作成する際のgenesis.jsonの”alloc”の部分に、”address”: { “balance” : amount } ,の形式で、Etherをあらかじめ付与しておくアドレスと残高を記載しておきます。
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200000000",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
参考URL:https://github.com/ethereum/go-ethereum/wiki/Private-network#user-content-creating-the-genesis-block
②マイニングをして割り当てる方法
また、プライベートチェーンでもマイニングして報酬を指定したアドレスに割り当てることができます。
プライベートチェーンでのマイニング手順(Gethの場合)は、サロン過去記事にて解説しているものがありますので、あわせてご覧ください。
「ローカル環境でのマイニングとトランザクションについて」
https://docs.google.com/document/d/1zia0ytZhricE6vgmBXQl6r-pznkNdEw1DU8Of3IUoy0/edit?usp=sharing
Q.Ethereumプライベートチェーンにおけるコンセンサスアルゴリズムはパブリックのそれと同じアルゴリズムが適用されますでしょうか?それともプライベート上はいかようにでも変えられますか?
A:パブリックと同じものを使ってもいいし、プライベート用に別のものを使っても良いです。
プライベートで利用されるコンセンサス・アルゴリズムは複数あり(PoW, PoS, Tendermint, PoAなど)、プライベートのブロックチェーンの実装も複数あります(HydraChain, Quorum, Hypeledger Burrow, Ethermintなど)。
それぞれ特徴がかなり異なるので、用途によってどれを使うべきかを検討して採用するのが一般的です。
質問② イーサリウム上で発行されるトークンについて
Q.イーサリアムについて、OmiseGo, Golem, Augar, Aragonその他数多くのトークンがありますが、これらはすべて同一の一本のイーサリアムチェーンに乗っかっているのでしょうか?
トークン毎に個別のチェーンがあるのか、だいたい全ては一本のチェーンにまとまっているのか、その辺りをお伺い出来たら幸いです。
A.ERC20を利用するなどしてイーサリアムのチェーン上で発行されたトークンについては、おっしゃる通り同一のイーサリアムチェーン上に乗っていることになります。
また、イーサリアム以外でもWaves、omni、counterparty、NEMなどトークン発行のプラットフォームとしての機能を持つプロダクトは存在し、それらを利用したトークンも存在しています。
それ以外にも、例えばLitecoinはBitcoinのソースを元に独自の変更を加えたもので、イーサリアムとも他のプラットフォームとも共有していない独自のチェーンを持っています。
(なお、質問であげていただいた個別のトークンがどのチェーンに乗っているかは、こちらのページのリストをご覧いただくか(https://etherscan.io/tokens)それぞれのWhitepaperなどでご確認いただければと思います)
Q. クリプトキティは重いから別のチェーンに移動されたという話しを聞いたことがあるのですが、そうなのでしょうか。
A. 現状のイーサリアムのブロックチェーン上で動いていると認識しています。
質問③ プログラミング経験がない場合の学習方法
Q. プログラムの知識技術がほぼ0です。これから勉強していこうと思いますが、何から手をつけていけば良いでしょうか?良い教材などありましたら教えてください!
A.最終的にどこまで行きたいかにもよりますが、下記のようなことから学習されてはいかがでしょうか?
ブロックチェーンの全体像をつかむ(レイヤーを理解する)
まずは、ブロックチェーンの全体像をざっくり把握するのが重要です。
それについて、GincoMagazineの記事が非常にわかりやすくまとまっているので、まずはこちらに目を通してみてください。
・ブロックチェーンの全体像を掴むための2つのレイヤー観https://magazine.ginco.io/post/kisochishiki_blockchain_ecosystem/
上の記事にある通り、ブロックチェーン関連の話題は、主に「技術開発」「ビジネス・事業」「政治・規制」「市況・投資」の4つのレイヤー(層)に分けられます。
世に溢れるブロックチェーンの話題が多すぎて、何から手をつけたらいいかわからなかったり、なんの話をしているかついていけなくなった時は、その話が上記のどのレイヤーのものなのか把握することが重要になります。
ブロックチェーンの話をうまく整理し理解すべく、自分の頭の中に基準となる「地図」を持っておきましょう。
ブロックチェーンの基礎知識を頭に入れる
まず、ブロックチェーンとは、ビットコインとは何か?という基本的なところを押さえるのに、下記の書籍に目を通されるといいでしょう。
・ビットコインはどのようにして動いているのか
次に、技術的なことをもう少し深く解説してある「Mastering Bitcoin」もぜひご覧ください。
・Mastering Bitcoin
なお、Mastering BitcoinはPDFがWebで無料公開されています。https://bitcoinbook.info/wp-content/translations/ja/book.pdf
まずはこちらのPDFから入るのもいいですが、しっかり学ぶなら紙の本を手元に置いておくと便利だったり、著者に報酬を支払って読む方が気分もいいかと思いますので、いずれ購入されるのをおすすめします。
実際に手を動かしてプログラミングしてみる
最近では、無料でプログラミングを学べる初心者向けのサイトが充実してきています。
初心者向けで、かつ無料でプログラミングが学習できるサイトとして、まずは下記のProgate(プロゲート)あたりから始めてみてはいかがでしょうか。
https://prog-8.com/languages/javascript
言語はいろいろなものがありますが、プログラミングを始めるための準備がほぼ不要なこと、比較的容易に扱えることから、まずはJavascriptから学んでみるといいでしょう。
またprogateは途中で有料になってしまうようなので、課金したくなければドットインストールというサイトに移行するのもいいでしょう。
https://dotinstall.com/lessons/basic_javascript_v2
こちらは自分で実行環境を用意する必要がありますが、多くの講座が無料で開放されています。
webアプリケーションの設計や動作の仕組みを学ぶ
ブロックチェーンエンジニアとなれば、そのうちDapps開発などする機会もあると思います。
とはいえ、経験ゼロでWebアプリはそれなりに大変ですので、下記のような用語(Webアプリの設計思想や構造など)をなんとなく知っておいた上で、実際に開発の経験を積まれるといいでしょう。
・クライアント・サーバーシステム
http://www.aibsc.jp/joho/otasuke_m/basic/08/02.html
・フロントエンド、サーバーサイド、(DB)
https://qiita.com/shuntaro_tamura/items/e1a20e33c57c71679688
・RDBMS、NoSQL(KVS)
NoSQLとは?RDBMSと比較しながら分かりやすく解説
・MVC、MVP、MVVM
https://qiita.com/shinkuFencer/items/f2651073fb71416b6cd7
ネットワークの基礎的な知識を学ぶ
P2P、ピア、ノード、TCP/IP、ポート、DNS、IPアドレスといったネットワークの基本的な用語の意味はわかるようになっておくといいでしょう。
暗号理論について学ぶ
公開鍵暗号、共通鍵暗号
公開鍵暗号、共通鍵暗号方式は現代の通信技術の根幹となる部分ですので、概要をぜひ押さえておいてください。
・4枚の図解でわかる公開鍵暗号
https://persol-tech-s.co.jp/corporate/security/article.html?id=26
・PKIと公開鍵暗号方式・共通鍵暗号方式・鍵長とは?
https://jp.globalsign.com/knowledge/pki_keycryptosystem.html
ハッシュ関数
ハッシュ関数もブロックチェーンの根幹を成す技術です。どんなものかは知っておきましょう。
・ハッシュ関数とは!ビットコインの仕組みを理解するために
ハッシュ関数とは!ビットコインの仕組みを理解するために
余計わからなくなった、絶望的な気分になった方へ
「知っておいてください!」とだけ言って色々な情報を投げてしまいましたが、おそらくこれらだけ並べられても全部は理解できないと思います。
野球をやったことも見たこともない人に、野球のルールやバットの振り方のコツなんかをいきなり説明するのがほぼ無意味であるように、IT関連の数々の用語や技術についても、実際に自分で何か作ってみないとピンとこない物が多々あります。
サロンメンバー増加に伴い、今後は初心者向けの記事やフォローアップの企画も出していく予定ですので、まずはここで挙げた書籍を読み、簡単なプログラミングに親しんでおいていただければと思います。
質問④ Browser-solidityの画面が表示されない
Q.https://github.com/ethereum/browser-solidity/tree/gh-pagesよりBrowser-solidtyをDLし、Download.zip解凍後、index.htmlを押下するのですが、ブラウザ上でSolidityが起動できません(真っ白な画面になる)。この事象が起こり得る原因お判りでしょうか。なお、Gethは起動した状態でindex.htmlを押下しております。
A.Browser-solidityではなく、最新版のRemixを試してみてください。
現在、Browser-solidityjはRemixと名前が変わりました。今後は旧Browser-Solidityはアップデートされないようですので、下記のGithubから最新のRemixをダウンロードして使ってみてください。
https://github.com/ethereum/remix-ide
なお、Remixを導入する前にまずはお試ししたいという方は、以下のページで動作を見ることができます。
https://remix.ethereum.org