[開発][BC] review for ethereum

Blockcahainのお勉強にWindowsEthereum を動かしてみるの巻 (お試し送金までの道のり編)

■全容
資材の入手と配置
プライベートネットワークの準備
Gethの起動
アカウントの作成
マイニングの準備
マイニングの実施 ← ※ 時間かかる
送金


■叩いたコマンド
│ cd C:\Geth-Win64-latest

│ geth init config/genesis.json

│ # geth --networkid "10" --nodiscover --datadir "C:\Geth-Win64-latest\data" console 2>> "C:\Geth-Win64-latest\data\node.log"
│ geth --networkid "10" --nodiscover --datadir "data" console 2>> "data\node.log"

│ personal.newAccount('password')
│ eth.getBalance(eth.accounts[0])
│ web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")

│ eth.accounts
│ personal.listAccounts

│ miner.setEtherbase(eth.accounts[0])
│ eth.coinbase
│ miner.start(2)
│ miner.stop()
│ eth.hashrate

│ eth.blockNumber
│ eth.getBlock(0)

│ # personal.unlockAccount("0x167f76f0036237497eb023fffe2a8f2f3a40073f", "password")
│ personal.unlockAccount(eth.accounts[0], "password")
│ personal.unlockAccount(eth.accounts[0])

--------------------------------------------------


■資材の入手と配置
https://build.ethdev.com/builds/Windows%20Go%20master%20branch/
Geth 最新版(Geth-Win64-latest.zip)をダウンロード (as of 2016/09/13 で ver.1.4.11)
※ Geth-Win64-latest.7z は最新版でないので注意
Zipを展開
展開されたGeth-Win64-latestフォルダをCドライブ直下に移動


環境変数を設定する場合(change directoryせずにコマンドが叩ける程度の嬉しさ)
スタート>コンピュータで右クリック>プロパティ>システムの詳細設定>詳細設定タブ>環境変数>システム環境変数>Path>編集
値欄に以下を追記して保存
;C:\Geth-Win64-latest;
※ 「C:\Geth-Win64-latest\geth.exe」としないこと


■プライベートネットワーク(ローカル)で動かす準備
configから
C:\Geth-Win64-latest\configフォルダを作成
同フォルダにgenesis.jsonを配置
genesis.jsonには以下を記載
│ {
│ "nonce": "0x0000000000000042",
│ "timestamp": "0x0",
│ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
│ "extraData": "0x0",
│ "gasLimit": "0x8000000",
│ "difficulty": "0x4000",
│ "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
│ "coinbase": "0x3333333333333333333333333333333333333333",
│ "alloc": {}
│ }
次いでデータ
C:\Geth-Win64-latest\dataフォルダを作成


Ethereumのネットワーク
ライブ・ネット(本番ネットワーク)とプライベート・ネットがある
ライブ・ネットは、2015/7/30に稼働が開始。
不特定多数のノードが参加するP2Pネットーワーク
プライベート・ネットは、
自分または自分の知るノードのみが参加するEthereumネットーワークのこと
限られた参加者のみのネットワークになる為、Etherの採掘が容易になり安全性も高まる


※Genesisファイル
ネットワークでやり取りされるブロックチェーンの最初のブロック(ブロック番号”0”)の情報を記述したファイル。
プライベート・ネットでは独自のブロックチェーンを取りとりする為、
独自のGenesisブロックを定義したGenesisファイルを用意する。


※difficulty
マイニング(ブロック生成におけるハッシュ計算)の難易度
マイニングの速度を上げたければ難易度を下げる。

※alloc
初期状態での特定のアカウントへのether割り当て。マイニングを手間が省ける。単位はwei。


■Gethをプライベート・ネットで起動
コマンドプロンプトを起動。
C:\Windows\System32>
(環境変数を設定していない場合)C:\Windows\System32>cd C:\Geth-Win64-latest
│ C:\Windows\System32>cd C:\Geth-Win64-latest


initコマンドでgenesisブロックの初期化
C:\Geth-Win64-latest>geth init config/genesis.json
※ Geth ver. 1.3.x以前 に使われていた geth --genesisオプションは1.4.xから非推奨。1.4.xでは先にinitオプションを別に実施する。
│ C:\Geth-Win64-latest>geth init eth_private_net\myGenesis.json
│ I0914 10:52:50.431302 ethdb/database.go:82] Alloted 16MB cache and 16 file handl
│ es to C:\Users\{user}\AppData\Roaming\Ethereum\chaindata
│ I0914 10:52:50.680902 cmd/geth/main.go:299] successfully wrote genesis block and
│ /or chain rule set: 3bf7629ec29c4ec5158b82e5798c95bc89562cda0a3601cb34d21f0d6a86
│ 68c0

│ C:\Geth-Win64-latest>


Gethの起動
# C:\Windows\System32>geth --networkid "10" --nodiscover --datadir "C:\Geth-Win64-latest\data"console 2>> "C:\Geth-Win64-latest\data\node.log"
C:\Windows\System32>geth --networkid "10" --nodiscover --datadir "data" console 2>> "data\node.log"
│ C:\Geth-Win64-latest>geth --networkid "10" --nodiscover --datadir "data" --mine
│ --unlock 0x7624818a50e17e65747e32e3397c455da96f9ba0 --rpc --rpcaddr "localhost"
│ --rpcport "8545" --rpccorsdomain "*" console 2>> "data\node.log"
│ Unlocking account 0x7624818a50e17e65747e32e3397c455da96f9ba0 | Attempt 1/3
│ Passphrase:
│ Welcome to the Geth JavaScript console!

│ instance: Geth/v1.4.11-stable/windows/go1.6.2
│ coinbase: 0x7624818a50e17e65747e32e3397c455da96f9ba0
│ at block: 16955 (Thu, 15 Sep 2016 08:46:45 JST)
│ datadir: data
│ modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txp
│ ool:1.0 web3:1.0

│ >




datadirオプション
 genesisブロックの初期化で指定したディレクトリと同じものを指定する
networkidオプション
 ライブネットとは別に立ち上げるネットワークのIDを整数で指定する
nodiscoverオプション
 Gethはデフォルトで(同じネットワークID)のEthereumネットワークのノード(Peer)を探し接続を試みる。
 プライベート・ネットでは未知のノードとの接続を避ける為に、本オプションの指定で自動Peer探索機能を無効にする
consoleオプション
 Gethには採掘やトランザクションの生成などを対話的に進める事が出来るコンソールがある。
 consoleサブコマンドの指定でGethの起動と同時にコンソールを立ち上げる。
 本サブコマンドを付加せずに、Gethのプロセスをbackgroudで起動させて、後からコンソールを立ち上げることも可能
 コマンドを叩いた後に、コマンドプロンプトが「>」となっているのはGethのコンソールが実行されている事を示す。




■アカウントを作成
>personal.newAccount('password')
│ > personal.newAccount('password')
│ 0x52bda8f591a705567601ed809f62cf8961c12635
│ >


>eth.accounts
│ > eth.accounts
│ ["0x7624818a50e17e65747e32e3397c455da96f9ba0", "0x5c01380f3deaa33ae8b24ea6b5c4cf
│ f057910600", "0xddc226eba91446f0d178b9b31e7d934bc718770c", "0x39d5ad9e2a9fe05714
│ 411c986af5b3c4bdfb1ef8", "0x52bda8f591a705567601ed809f62cf8961c12635"]
│ >


>personal.listAccounts
│ > personal.listAccounts
│ ["0x7624818a50e17e65747e32e3397c455da96f9ba0", "0x5c01380f3deaa33ae8b24ea6b5c4cf
│ f057910600", "0xddc226eba91446f0d178b9b31e7d934bc718770c", "0x39d5ad9e2a9fe05714
│ 411c986af5b3c4bdfb1ef8"]
│ >


残高確認
>eth.getBalance(eth.accounts[1])
│ > eth.getBalance(eth.accounts[1])
│ 5000000000000000000


単位は「wei」
「ether」に換算したい場合は
>web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
│ > web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
│ 56154.9999999999
│ >


■マイニング準備
マイニングを行った時に報酬を受け取るアカウントのアドレス(coinbase)の作成
>miner.setEtherbase(eth.accounts[0])
│ > miner.setEtherbase(eth.accounts[0])
│ TRUE
│ >


確認
>eth.coinbase
│ > eth.coinbase
│ 0x7624818a50e17e65747e32e3397c455da96f9ba0
│ >


coinbaseを変更する場合は、setEtherbaseで新しいアドレスを指定する
>miner.setEtherbase(eth.accounts[1])


■マイニング実施
いずれかがetherbaseとしてセットされていればetherの採掘が可能になる
>miner.start(1)
│ > miner.start(1)
│ TRUE
│ >
※ 引数に渡す数値は利用するスレッド数。
# さすがに全コア使うと身動きできなくなるので注意


採掘を停止したい場合
>miner.stop()
│ > miner.stop()
│ TRUE
│ >


ブロック数表示、採掘状況確認
ブロック高(ブロックチェーンにいくつブロックが連なっているか)を確認する
>eth.blockNumber
│ > eth.blockNumber
│ 0
│ >


報酬取得確認
>eth.getBalance(eth.accounts[0])
│ > eth.getBalance(eth.accounts[0])
│ 0
│ >


>eth.getBalance(eth.accounts[1])
│ > eth.getBalance(eth.accounts[1])
│ 0
│ >


>eth.getBalance(eth.accounts[2])
│ > eth.getBalance(eth.accounts[5])
│ invalid address
│ at web3.js:3887:15
│ at web3.js:4939:28
│ at web3.js:4938:12
│ at web3.js:4964:18
│ at web3.js:4989:23
│ at :1:1

│ >


全accountが残高0なのはマイニングが終わっていない為。
※最初のマイニングは数時間かかることもある
マイニング中を確認(hashrateの変動を確認)
採掘が行われていない時は、hashrateは0となる
>eth.hashrate
│ > eth.hashrate
│ 145562
│ > eth.hashrate
│ 149398
│ >


>eth.getBlock(0)
│ > eth.getBlock(0)
│ {
│ difficulty: 16384,
│ extraData: "0x00",
│ gasLimit: 268435456,
│ gasUsed: 0,
│ hash: "0x3bf7629ec29c4ec5158b82e5798c95bc89562cda0a3601cb34d21f0d6a8668c0",
│ logsBloom: "0x0000000000000000000000000000000000000000000000000000000000000000
│ 0
│ 0
│ 0
│ 0
│ 0
│ 000000000000000000000000000000000000000000000000",
│ miner: "0x3333333333333333333333333333333333333333",
│ nonce: "0x0000000000000042",
│ number: 0,
│ parentHash: "0x000000000000000000000000000000000000000000000000000000000000000
│ 0",
│ receiptRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4
│ 21",
│ sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934
│ 7",
│ size: 507,
│ stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421
│ ",
│ timestamp: 0,
│ totalDifficulty: 16384,
│ transactions: [],
│ transactionsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e"
│ 363b421",
│ uncles: []
│ }
│ >


■送金
送金元のアカウントをunlock
>personal.unlockAccount("0x167f76f0036237497eb023fffe2a8f2f3a40073f", "password")
>personal.unlockAccount(eth.accounts[0], "password")
│ > personal.unlockAccount(eth.accounts[0], "password")
│ TRUE
│ >
※Account[0] = 0x167f76f0036237497eb023fffe2a8f2f3a40073f


account[0]からaccount[1]に5etherを送金-残高ない場合
>eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ > {{from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ Account does not exist or account balance too low
│ at web3.js:3119:20
│ at web3.js:6023:15
│ at web3.js:4995:36
│ at :1:1


残高不足の状態で送金すると例外になる
※マイニング待たなくても設定ファイルをいじる手もある。
# genesis書き換え
# http://www.intellilink.co.jp/article/column/ethereum02.html


アカウントのロック解除せずに送金した場合
>eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ > {{from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ account is locked
│ at web3.js:3119:20
│ at web3.js:6023:15
│ at web3.js:4995:36
│ at :1:1



トランザクション情報の表示
>eth.getTransaction(0x2d4adfe0c992e22a9ca3103f8a4e55aaab2969942ea4a1f6fdfd16eac9e31b7a)
│ > {nsaction(0x2d4adfe0c992e22a9ca3103f8a4e55aaab2969942ea4a1f6fdfd16eac9e31b7a)
│ common: unmarshalJSON failed: hash must be exactly 32 bytes
│ at web3.js:3119:20
│ at web3.js:6023:15
│ at web3.js:4995:36
│ at :1:1

│ >


ERROR: unmarshalJSON failed: hash must be exactly 32 bytes
→引数を引用符で囲っていない為


>eth.getTransaction('0x2d4adfe0c992e22a9ca3103f8a4e55aaab2969942ea4a1f6fdfd16eac9e31b7a')
│ > {action('0x2d4adfe0c992e22a9ca3103f8a4e55aaab2969942ea4a1f6fdfd16eac9e31b7a')
│ {
│ blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000
│ """,
"

│ blockNumber: null,

│ from: 0x7624818a50e17e65747e32e3397c455da96f9ba0, "
│ gas: 90000,
│ gasPrice: 20000000000,
│ hash: "0x2d4adfe0c992e22a9ca3103f8a4e55aaab2969942ea4a1f6fdfd16eac9e31b7a",
│ input: "0x",
│ nonce: 83,
│ to: "0x5c01380f3deaa33ae8b24ea6b5c4cff057910600",
│ transactionIndex: null,
│ value: 5000000000000000000
│ }
│ >


裏でminingしながら動かすそう
│ > miner.start(1)
│ TRUE
│ > web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
│ 55309.9999999999
│ > web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
│ 0
アカウントのロック解除
│ > personal.unlockAccount(eth.accounts[0])
│ Unlock account 0x7624818a50e17e65747e32e3397c455da96f9ba0
│ Passphrase:
│ TRUE
送金
>eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ > {{from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
│ 0x2f5718fc8ab898b45377c7e7dd198ded0f595813f53ebac613e5d2b05b8e135a
トランザクション情報取得
│ > {action('0x2f5718fc8ab898b45377c7e7dd198ded0f595813f53ebac613e5d2b05b8e135a')
│ {
│ blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000
│ """,
"

│ blockNumber: null,

│ from: 0x7624818a50e17e65747e32e3397c455da96f9ba0, "
│ gas: 90000,
│ gasPrice: 20000000000,
│ hash: "0x2f5718fc8ab898b45377c7e7dd198ded0f595813f53ebac613e5d2b05b8e135a",
│ input: "0x",
│ nonce: 82,
│ to: "0x5c01380f3deaa33ae8b24ea6b5c4cff057910600",
│ transactionIndex: null,
│ value: 5000000000000000000
│ }
│ > web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
│ 55309.9999999999
│ > web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
│ 0
│ >
暫し時間おいて改めて残高確認
│ > web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
│ 55724.9999999999
│ > web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
│ 5
│ >


■参考
CryptoCompare, How to mine Ethereum on a Windows PC
https://www.cryptocompare.com/mining/guides/how-to-mine-ethereum/
Ethereum Geth コンソールコマンド一覧
http://qiita.com/toshikase/items/fa7a826db483177d1e80


■用語
Ether Ethereumで使用される内部通過
GAS 取引手数料やコントラクト:プログラムの実行手数料
アカウント EOAとContractがある
EOA Externally-owned Account, 人が使用するアカウント=トランザクションを発生させる
Contract
トランザクションを受け付けてプログラムを実行する
コントラクト ブロックチェーンの取引内に格納されたプログラム。ブロックチェーン上に保持できる
Solidity コントラクトを記述するためのJavaScriptに似た独自言語
EVM Ethereum Virtual Machine, プログラムを動かす為の仮想マシン, Ethereumのプラットフォーム
Hyperledger Project Fablicのプラットフォーム?
※ Ethereumは実装言語が多数に対しFabricはGo言語のみ(2015年時点)。

tag : ethereum Blockcahain Windows GAS Ether Wei Solidity EVM Hyperledger

2016-09-17 09:35 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud