はじめに

最近、ブロックチェーンという技術がマスコミや新聞で話題になっていますが、この記事では、「自分のプライベートブロックチェーン(=自分だけがアクセス可能なブロックチェーン)を設定する方法」を紹介したいと思います。今後スマートコントラクト(契約手順をプログラム化し、自動的に実行)が普及していく中で、少しでも参考になればと思います。

プライベートブロックチェーンを設定する

Gethをインストールする

Gethはクライアントのアプリで、Ethereum(管理者のいないP2Pシステムで様々なサービスを実現するための基盤)のブロックチェーンネットワークとの取引、スマートコントラクト、マイニングなどを実行することができます。様々なOSに対応しているので、ご自身の環境にあったバージョンをダウンロードしてください。私はMac OSを使っているので、Homebrew経由でインストールしました。

brew tap ethereum/ethereum
brew install ethereum

Ubuntu/Linuxの場合なら、

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:thereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

 

マイナーのアカウントを作成

ブロックチェーン上で行われた取引の記録作業を「マイニング(Mining)」と呼び、その記録作業を行う人々のことを「マイナー(Miner)」または「採掘者」と呼びます。マイナー達はノードとして接続されている自身のコンピュータを使って、いくつもの取引をまとめた「ブロック」を生成します。マイナーは自分のコンピュータの計算能力を台帳への記録作業に提供する代わりに、記録に成功すると報酬としてビットコインを受け取ることができます。

ブロックチェーンをマイニングするためには、マイナーのアカウントが必要です。一つのアカウントにつき、公開鍵・秘密鍵また秘密鍵を保護するためのパスワードが必要です。

  • 公開鍵:ブロックチェーンの上に公開されるもの。公開鍵からEthereumのウォレットアドレスを派生することができて、ウォレットアドレスはアカウントを特定するものです。
  • 秘密鍵:取引をサインするための鍵。自分で発行した取引を秘密鍵で暗号・サインして、システムは私達の公開鍵を使い、本人が発行された取引かどうか確認・参照することができます。

全部gethのデータはdatadirというフォルダに保存されます。この記事では、~/lab/ethereum_vibloというフォルダを使います。デフォルトフォルダは以下のようになります。

  • Mac: ~/Library/Ethereum
  • Linux: ~/.ethereum
  • Windows: %APPDATA%\Ethereum

プライベートブロックチェーンを設定するために、以下のようにdatadirを指定します。

[nguyen.anh.tien@TienNA ~]$ geth account new --datadir ~/lab/ethereum_viblo/
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat passphrase: 
Address: {646cb67fa5f121e4ed674d9dbef8f1b177f20c3f}

注意:パスワードを忘れないようにしてください

以上で、マイナーのアカウント設定は完了。

Genesis Block(ジェネシスブロック)を作成

どんなものでも「始まり」は存在します。ブロックチェーンの始まり、つまり1番最初のブロックは「ジェネシスブロック」と呼ばれます。次のブロックは前のブロックを参照しています(前のブロックのハッシュを保存・計算など)。Ethereumの場合、ジェネシスブロックが生成されたのは2015年07月20日です。以下のようにジェネシスブロックを作成することができます(まるで神様みたいにw)

geth -datadir ~/lab/ethereum_viblo/ init ~/lab/ethereum_viblo/sample_genesis.json

 sample_genesis.jsonの内容

{
    "config": {
        "chainId": 22,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "0x400",
    "gasLimit": "0x2100000",
    "alloc": {
        "646cb67fa5f121e4ed674d9dbef8f1b177f20c3f": 
         { "balance": "0x1337000000000000000000" }     
    }
}

設定の説明:

  • chainid:自分のブロックチェーンのIDになります。実際にEthereumのネットワークは1つではなく、複数のネットワークが存在します。最も知られているネットワークはMainnetという(は1)、他にテスト用のネットワークやEthereumバージョンごとのネットワークもあり、例えば:morden /expanse mainnet (2), ropsten (3), rinkeby (4), rootstock mainnet (30), rootstock testnet (31), kovan (42), ethereum classic mainnet (61), ethereum classic testnet (62)もある。プライベートチェーンのデフォルトIDは1337で、今回22をIDとして使います。
  • homesteadBlock:0になると、Ethereumのhomesteadバージョンを使うことになります。Ethereumは2017年10月16日にbyzantiumバージョンにアップグレードしています。
  • eip155Block:0になると、このブロックチェーンはEIP 155のプロトコルやクライアントAPIのセットをサポートしています。
  • difficulty:採掘難易度とは、ディフィカルティーとも呼ばれ採掘(マイニング)によりブロックを生成する(ナンスを算出する)難易度のことである。ボロックタイムに影響する変数です。ブロックチェーンが実施した後、変更できないため、注意が必要です。Ethereumが使って入る計算式はこちらに説明があります。
  • gasLimit:ガスの値段になります。EthereumではコマンドがEVM(Ethereum仮想マシン)の上に実行され、 計算すると、相対のガス量を費やす。最低のガスを提供しないと途中で、実施の失敗が起こる恐れがあり、無駄遣いになってしまいます。そのため、取引を作成する時、gasLimit、つまり、取引を実施するため最大の払うガス量です。この場合、gasLimitはブロックにある全ての取引の合計を指定します。
  • alloc:こちらの設定によって、事前にEtherを配ることができます。今回、マイナーのアカウントに大量のEtherを与えます。
[nguyen.anh.tien@TienNA ~]$ geth -datadir ~/lab/ethereum_viblo/ init ~/lab/ethereum_viblo/sample_genesis.json
INFO [12-24|14:00:11] Allocated cache and file handles         database=/Users/nguyen.anh.tien/lab/ethereum_viblo/geth/chaindata cache=16 handles=16
INFO [12-24|14:00:11] Writing custom genesis block 
INFO [12-24|14:00:11] Successfully wrote genesis state         database=chaindata                                                hash=28c28d…f61fe8
INFO [12-24|14:00:11] Allocated cache and file handles         database=/Users/nguyen.anh.tien/lab/ethereum_viblo/geth/lightchaindata cache=16 handles=16
INFO [12-24|14:00:11] Writing custom genesis block 
INFO [12-24|14:00:11] Successfully wrote genesis state         database=lightchaindata

マイニングを開始

geth --mine --rpc --networkid 22 --datadir ~/lab/ethereum_viblo
  • networkidに22を指定します。
  • –mine:このプロセスをマイニングします。
INFO [12-24|14:00:47] IPC endpoint opened: /Users/nguyen.anh.tien/lab/ethereum_viblo/geth.ipc 
INFO [12-24|14:00:47] HTTP endpoint opened: http://127.0.0.1:8545 
INFO [12-24|14:00:47] Transaction pool price threshold updated price=18000000000
INFO [12-24|14:00:47] Starting mining operation 
INFO [12-24|14:00:47] Commit new mining work                   number=1 txs=0 uncles=0 elapsed=162.215µs
INFO [12-24|14:00:47] Mapped network port                      proto=udp extport=30303 intport=30303 interface="UPNP IGDv1-IP1"
INFO [12-24|14:00:47] Mapped network port                      proto=tcp extport=30303 intport=30303 interface="UPNP IGDv1-IP1"
INFO [12-24|14:00:51] Successfully sealed new block            number=1 hash=b92000…e97356
INFO [12-24|14:00:51] 🔨 mined potential block                  number=1 hash=b92000…e97356
INFO [12-24|14:00:51] Commit new mining work                   number=2 txs=0 uncles=0 elapsed=1.161ms
INFO [12-24|14:00:52] Successfully sealed new block            number=2 hash=3f8c39…176a1f
INFO [12-24|14:00:52] 🔨 mined potential block                  number=2 hash=3f8c39…176a1f
INFO [12-24|14:00:52] Commit new mining work                   number=3 txs=0 uncles=0 elapsed=118.542µs
  • rpc:HTTP-RPCを有効にします。http://127.0.0.1:8545にアクセスして、こちらのノードの経由で、プライベートチェーンと操作することができます。
  • 他のパラメーターrpcaddrrpcportrpccorsdomain

 

Gethにコンソール実施

ノードと操作する時、コンソールを付けられる。

geth --datadir ~/lab/ethereum_viblo attach ipc:/Users/nguyen.anh.tien/lab/ethereum_viblo/geth.ipc

アカウントリストや残高を確認

[nguyen.anh.tien@TienNA ~/lab/ethereum_viblo]$ geth --datadir ~/lab/ethereum_viblo attach ipc:/Users/nguyen.anh.tien/lab/ethereum_viblo/geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.3-stable/darwin-amd64/go1.9.2
coinbase:  0x646cb67fa5f121e4ed674d9dbef8f1b177f20c3f
at block: 506 (Sun, 24 Dec 2017 14:11:06 +07)
 datadir: /Users/nguyen.anh.tien/lab/ethereum_viblo
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> eth.accounts
["0x646cb67fa5f121e4ed674d9dbef8f1b177f20c3f"]
> eth.getBalance("0x646cb67fa5f121e4ed674d9dbef8f1b177f20c3f")
2.3232355729235784806170624e+25

 

デスクトップのEthereum Walletの設定

こちらからダウンロードして、インストールしてください。実行する時、rpcを指定して、プライベートチェーンへ接続することができます。

Mac OSXの場合

/Applications/Ethereum\ Wallet.app/Contents/MacOS/Ethereum\ Wallet --rpc ~/lab/ethereum_viblo/geth.ipc

 

現在、マイナーのアカウントしかなくて、マイニングしているため、残高が上がっています。

新しいアカウントを作成、「Primary」を名付けて、マイナーのアカウントから100000ETHを振り込んでみましょう。メニューから「Add Account」を押して、秘密鍵のパスワードを入れば完了です。

取引も簡単にできます。

手数料の調整で、取引を早めに確認させることもできます。

Confirmationは取引を承認したノートの数で、ビットコインの場合なら、普段2つのConfirmationが必要だと言われています。マイナーのコンソールログを確認して、

INFO [12-24|14:36:43] 🔨 mined potential block                  number=1528 hash=cc63dc…fe8bf7
INFO [12-24|14:36:43] Commit new mining work                   number=1529 txs=0 uncles=0 elapsed=264.992µs
INFO [12-24|14:36:44] Submitted transaction                    fullhash=0xa434de87ebb268ecaafa993476bb3e9810310e756b114f23817dc59db3e09d17 recipient=0xadF5D014d795606C64BD18fb286D4095a6248e22
INFO [12-24|14:36:45] Successfully sealed new block            number=1529 hash=d2581f…84158d
INFO [12-24|14:36:45] 🔗 block reached canonical chain          number=1524 hash=327eab…d9b130
INFO [12-24|14:36:45] 🔨 mined potential block                  number=1529 hash=d2581f…84158d
INFO [12-24|14:36:45] Commit new mining work                   number=1530 txs=1 uncles=0 elapsed=1.842ms

 

ブラウザのMetaMaskウォレットの設定

MetaMask、Ethereumを用いる分散型アプリケーション(DApps)にアクセスしやすくするためのプラグインで、 あらゆるウェブサイトのJavascript のコンテキストに対して、EthereumのWeb3 APIを提供し、 それによって分散型アプリがブロックチェーンのデータをブラウザから読むことができるようになります。

設定方法

  • Chrome Web Storeからダウンロード:https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn
  • 暗号化のパスワードを設定、seed wordsを他のところへバックアップします。
  • リストから、localhost 8545を選ぶ。その為、マイナーのプロセスを実施する時、--rpccorsdomain "*" --rpcapi "web3,eth,net" を指定する必要があります。

アカウント作成

新しい2つのアカウントを作成、例えば:

  • MetaMask 1: 0xd45B8846cAB7c9aEf15D5f9Cc0aac281d9A42117
  • MetaMask 2: 0xE65Dc3305a26d91bc8FfAEd0db6f65DA3b1906C2

仮にマイナーのアカウントからデスクトップのEthereum WalletでMetaMask 1に200,000ETH、MetaMask 2に400,000ETHを振り込んでみましょう。

そして、MetaMask 2からMetaMask 1へ100 ETHを振り込みます。

MetaMaskウォレットをEthereum Walletへインポート

上記の2つのアカウントをEthereum Walletの方に使いたい場合、ブラウザから秘密鍵をエクスポートし、Ethereum Walletのキーストアへインポート。例え、MetaMask 2の秘密鍵は以下のよう

91c10cf66c99909e08074860471b5068ecb3dbbe90d88d7e3f4fe25ff5c91028

上記の内容が含まれているmetamask2_private.keyというファイルを作成して、以下のようにインポートします。

[nguyen.anh.tien@TienNA ~/lab/ethereum_viblo]$ geth account import metamask2_private.key -datadir ~/lab/ethereum_viblo/
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat passphrase: 
Address: {e65dc3305a26d91bc8ffaed0db6f65da3b1906c2}

 

Blockchain Explorerをインストール

取引の詳細やブロックチェーンの状況を把握するため、EthereumにはEtherscanがあり、プライベートチェーンなら、Ethereum Block Explorerというツールがあります。

git clone https://github.com/carsenk/explorer
npm install
npm start

ブラウザでhttp://localhost:8000/へアクセス

残高を確認

 

最後に

プライベートチェーンを作成し、サンプル取引も実施し、この環境で、Ethereumの詳細やSolidity言語やスマートコントラクトを実験できると思います。

 

参考