Ethereum のコンセプトは「ブロックチェーン上でアプリケーションを動かす」という事ですが、
ブロックチェーンをでアプリケーションが動くイメージ出来なかったので、触ってみようと。
まずは基本的なブロックチェーンをローカル環境にで動かすところから、、、という内容になっています。
参考にしたのは、「はじめてのブロックチェーンアプリケーション」という本です。
(古本で500円で購入できました。)
ブロックチェーンをローカル環境で作成する
Contents
Geth(Go Ethereum) をインストール
ノードを1つインストールすれば、ローカル環境でブロックチェーンを構築できます。
Ethereum との違いはノードがたくさんあるか、1つだけか、の違いです。(多分)
というわけで、Go Ethereum というやつをインストールします。
Windows 版 Go Ethereum をダウンロード
Go Ethereum トップページ:
ダウンロード先:
https://geth.ethereum.org/downloads/
「Geth XX for Windows」をクリックしてインストーラーをダウンロード。
インストール
ダウンロードしたEXE ファイルを実行してインストールを開始します。
まずは「Agree」します。
今回は、Development tools にチェックいれました。
インストールフォルダの指定です。
終了したら、Close をクリックしてインストーラーを閉じます。
環境変数をチェックしてみる。
ETHEREUM_SOCKET が追加されているくらいでした。
ブロックチェーンの起動
ブロックチェーンを起動というよりは、Geth を実行してブロックチェーンを生成するノードを起動する感じです。
geth コマンド
Go Ethereum をインストールすると、geth コマンドが使用できるようになります。
USAGE:
geth.exe [global options] command [command options] [arguments...]
例:geth version :Geth のバージョンを確認。
作業フォルダの作成と指定(任意)
作業フォルダの指定は、ノードの動作に直接関係ありません。
ブロックチェーン関連のファイルが生成される場所をコントロールできる事と、
(指定しない場合は、<USERS>\AppData\Roaming\Ethereum に生成。)
読み込みファイルなどここにまとめておけば、ファイルパス指定が簡潔になるなどのメリットもあります。
作業フォルダを作成して、コマンドプロンプトを開く。
Windows 11 の場合は右クリックメニューから、
Windows 10 の場合は【shift キー】 + 右クリックメニューからコマンドプロンプトを呼び出せます。
コマンドプロンプトを開いてから、cd コマンドで移動してもOK。
Genesis(ジェネシス)ファイルの作成
ジェネシスファイルはブロックチェーンの最初のブロックを生成する為のファイルです。
Documentation の「Useing Geth」に Genesis.json のサンプルと説明があります。
https://geth.ethereum.org/docs/interface/private-network
ブロックチェーンの最初のブロック(ジェネシス・ブロック)を定義するファイルを作成。
Genesis.json
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"ethash": {}
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {}
}
ブロックチェーンの初期化
作業フォルダ内にgenesis.json を保存し、下記を実行してブロックチェーンを初期化。
(作業フォルダとか指定しない場合は、フルパスでgenesis.json を指定。)
geth --datadir data init genesis.json
ブロックチェーンの構成
こんな感じでファイルとフォルダが構成されます。
test-data
│ genesis.json
│
└─data
├─geth
│ │ LOCK
│ │ nodekey
│ │
│ ├─chaindata
│ │ │ 000001.log
│ │ │ CURRENT
│ │ │ LOCK
│ │ │ LOG
│ │ │ MANIFEST-000000
│ │ │
│ │ └─ancient
│ │ └─chain
│ │ bodies.0000.cdat
│ │ bodies.cidx
│ │ bodies.meta
│ │ diffs.0000.rdat
│ │ diffs.meta
│ │ diffs.ridx
│ │ FLOCK
│ │ hashes.0000.rdat
│ │ hashes.meta
│ │ hashes.ridx
│ │ headers.0000.cdat
│ │ headers.cidx
│ │ headers.meta
│ │ receipts.0000.cdat
│ │ receipts.cidx
│ │ receipts.meta
│ │
│ └─lightchaindata
│ │ 000001.log
│ │ CURRENT
│ │ LOCK
│ │ LOG
│ │ MANIFEST-000000
│ │
│ └─ancient
│ └─chain
│ bodies.0000.cdat
│ bodies.cidx
│ bodies.meta
│ diffs.0000.rdat
│ diffs.meta
│ diffs.ridx
│ FLOCK
│ hashes.0000.rdat
│ hashes.meta
│ hashes.ridx
│ headers.0000.cdat
│ headers.cidx
│ headers.meta
│ receipts.0000.cdat
│ receipts.cidx
│ receipts.meta
│
└─keystore
ブロックチェーンの起動
書き込み先になるブロックチェーンが初期化できたので、このブロックチェーンを指定して、ノードを動かしていきます。「–networkid XXXX」のところでチェーンのID を指定しています。
genesis.json の「”chainId”: 12345,」のところです。
geth --networkid 12345 --nodiscover --maxpeers 0 --datadir data console 2>>test.log
- –networkid 12345 → ネットワークID を指定。
- –nodiscover → 他のノードの検索されない。
- –maxpeers 0 → 接続するノードの最大数。
- –datadir data → 使用するデータの指定。
- console → コンソールを起動。
- 2>>test.log → ログファイルの指定。(Geth のオプションではないです。)
※ログファイルを指定しないと、ノードのからのログが直接画面に表示されます。
コンソールが起動する。
ログは下記のように作成されます。
画面のサイズに合わせてなんでしょうけど、改行が入ってしまってます。
(notepad++ の tail -f でモニタしています。)
アカウント作成
新規で作成:personal.newAccount(“password1”)
コマンドを使用して、アカウントを作成します。
パスワードを引数にして、以下のように実行。
personal.newAccount("password1")
アカウントが作成されました。この英数字の羅列がアカウントを示しています。
後で検証に使うため、もう1アカウント作成します。
作成したアカウントは、配列の値のように指定できるので、この羅列を覚える必要はないです。
コマンドプロンプトを閉じて、一旦終了。
ノードも終了している。
アカウントの確認。
コンソールではなく、Geth のコマンドで確認してます。
一旦コンソールを抜けて、ブロックチェーンを停止してから実行します。
geth --datadir data account list
以下のような感じでアカウントのリストがかえって来ます。
Account #0: {636f627061f6379edd3784e6ae91f3f203ac8681} keystore://C:\Users\uniuni\Documents\test-data\data\keystore\UTC--2022-09-22T19-12-08.260629500Z--636f627061f6379edd3784e6ae91f3f203ac8681
Account #1: {5f4a0cd4d91543690db90f9afb4494b621a4e91b} keystore://C:\Users\uniuni\Documents\test-data\data\keystore\UTC--2022-09-22T19-17-16.717423600Z--5f4a0cd4d91543690db90f9afb4494b621a4e91b
keystone ・・・の記述は、アカウント作成時に生成された、これ↓ を指しています。
下図のような内容のファイルです。
マイニング
前項を参考に、ブロックチェーンをコンソール付きで起動します。
マイニングを実行する前に、現在の現状を確認しておきます。
マイニング報酬を受け取るアカウントの確認
マイニング した時の、eth を受け取るアカウントを確認する。
eth.coinbase
宛先を切り替える場合。
miner.setEtherbase(eth.accounts[1])
アカウント[0]→ アカウント[1]へ変更。
所持ETH(イーサ)を確認
アカウントそれぞれが持っているETH を確認。
eth.getBalance(eth.accounts[0])
現在のブロック数を確認
eth.blockNumber
マイニング を開始する
miner.start(1)
「1」は実行するノードの数。
マイニング中のログ。
この辺り、発掘した感じ。
マイニングをストップ。
ストップを実行するまでマイニングを続けます。
miner.stop()
マイニング中かどうか確認と、ハッシュレートを確認して、マイニングを停止していることを確認。
eth.mining
eth.hashrate
どれくらいマイニングしたか、現在のブロック数を確認してみる。
eth.blockNumber
99 ブロック!結構増えてました。
ディフィカルティが低いので、かなりサクサク進むのでしょうね。
そしてお楽しみの報酬確認。
eth.getBalance(eth.accounts[0])
めっちゃ増えてました。
単位がETH なら大金持ちですが、残念ながら単位はwei です。(1ETH =10^18 wei )
まあ、それでもすごい額ですけどね。ローカル環境のETH だから意味ないけど。
変換コマンド
単位をwei からイーサに変換。
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
99ブロックの報酬なので、1ブロックで2ETH の報酬ですね。
イーサをアカウント間で送金する
先にアカウントのロックを解除。
personal.unlockAccount(eth.accounts[0],"password1")
イーサリアムでトランザクションを送信するのは有料なので、送信側のアカウントのロックを解除してからトランザクションを送信。
イーサを送信するアカウント(from 側)のロックを解除しないとエラーになる。
送金トランザクションを送信。
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10,"ether")})
ログの出力。
送金できているか確認。
すぐには増えなくて、マイニングを実行してブロックチェーンに書き込む必要がある。
個人のブロックチェーンなんで^^
送信トランザクションを作ったときに発行されるナンバーから、トランザクションを確認する。
eth.getTransaction("0x431d31f83ddec874c88442104f20d90ed1def42607efd5bb4128d11d4a71aa7b")
2行目:ブロックナンバーがない(null)→ まだブロックチェーンに書き込まれていない。
マイニング後はブロックナンバーが入っているのでブロックチェーンに書き込まれているのがわかる。
未処理のブロックの確認。
eth.pendingTransactions
マイニング後は表示されない。
ガス代の確認。
ブロックは215個生成されているので、430ETH が発掘されています。
アカウント0 が送信したETH は90ETH あるので、足すとマイニングしたETH と同額になります。
本来はガス代が減るのですが、ガス代はマイニングしたノードに報酬として渡されるため、
送信者とマイナーが同じアカウントならプラスマイナスでゼロになるわけです。
アカウント1から送金してみると、送信したETH とともに、ガス代も減っているのがわかる。
アカウント0 の所持ETH の「21000000000000」がマイニング報酬ですね。
マイニングとコンソールを別々のプロセスで実行する。
ブロックチェーンを起動するときに、マイニングを有効します。
HTTP 接続も有効しておくと、別のプロセスからコンソールにアクセスできます。
geth --networkid 12345 --maxpeers 0 --datadir data --mine --miner.threads 1 --http 2>>test2.log
- –mine:マイニングを有効にする。
- –miner.threads 1:マイニングに使用するスレッド数を指定する。
- –http:サーバー接続を有効化する。
- その他、前回のコマンドと同じ。
このままこのウィンドウは放置です。
別のプロセスからブロックチェーンに接続する
別ウィンドウを開き、下記のコマンドで、このプロセスに接続してコンソールを使用します。
geth attach rpc:http://localhost:8545
マイニングとコンソールが別のプロセスで動いています。
現在ブロックチェーンの中で、マイニングが実行されていることを確認。
そのまま使えそうになりコマンドとかもあるね。
JSON-RPC Server で接続する機能もあるようですが、Windows 環境ではコマンドがうまく動作してなさそうなので、パス。
編集後記てきなやつ
とりあえず、基本的なブロックチェーンに触れてみましたって感じですね。
やっぱり、実際に触らないとイメージがつかめない。
参考書籍
はじめてのブロックチェーンアプリケーション ~Etherum によるスマートコントストラクト開発入門~
ブロックチェーン上で動くオリジナル仮想通貨を作る!
はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門【電子書籍】[ 渡辺篤 ] 価格:3,300円 |
以上です。
ピンバック: 【用語整理】暗号資産(仮想通貨)とトークンについて – .zapping