try catch and ...release
ページ
ホーム
Chromeアプリ開発Tips
公開アプリ
Ubuntu
Linuxコマンド
#!/bin/bash
ブロックチェーンと暗号通貨
2016年12月9日金曜日
Ethereum の Private Testnet をローカルに構築して Ether を送金するところまで
Ethereum の Private な Testnet 環境をローカル開発用に構築する手順をメモ。 アドレス(アカウント)を2つ作って Ether (Ethereum上のNative通貨) を送金するところまでやってみます。 今回は Ethereumクライアントに `go-ethereum` (`geth`) を使いました。
## 目次 (index) + [環境](#environment) + [Gethのインストール](#install-geth) + [アドレス(アカウント)を作成](#create-account) + [作成したアドレスのPrivate Keyを知る](#know-private-key) + [Private Testnet用のGenesisファイルを作成](#create-genesis-json) + [ブロックチェーンを初期化](#geth-init) + [Gethを起動](#run-geth) + [Geth で Console を起動](#geth-console) + [Geth Console から Ether を送金](#send-ether) + [外部JSファイルの利用](#load-script) + [次回](#next) [⤒](#index) ## 環境 (environment) - OS: *Ubuntu 16.04.1 LTS (x86_64s)* - Ethereumクライアント: *Geth v1.5.4-stable-b70acf3c* 今回は Testnet 用のデータフォルダに *~/.ethereum_private_testnet/* を指定します: ``` $ mkdir ~/.ethereum_private_testnet/ $ cd ~/.ethereum_private_testnet/ ``` [⤒](#index) ## Gethをインストール (install-geth) ``` $ sudo apt-get install software-properties-common $ sudo add-apt-repository -y ppa:ethereum/ethereum $ sudo apt-get update $ sudo apt-get install ethereum # インストールできたか確認: $ geth -v ... VERSION: 1.5.4-stable-b70acf3c ... ``` [⤒](#index) ## アドレス(アカウント)を作成 (create-account) テスト用にアドレスを2つ作ってみます: ``` $ cd ~/.ethereum_private_testnet/ # keystore (Private Key情報の保存先) を指定してアドレス作成: $ geth --keystore=./keystore/ account new Your new account is locked with a password. Please give a password. Do not forget this password. Passphrase: <パスフレーズを入力> Repeat passphrase: <もう一回パスフレーズを入力> Address: {4a1c11eaec40197beb6e8607ee61953e7d6d8731} $ geth --keystore=./keystore/ account new Your new account is locked with a password. Please give a password. Do not forget this password. Passphrase: <パスフレーズを入力> Repeat passphrase: <もう一回パスフレーズを入力> Address: {5855a19b64e1068a1edc39bb817647e16a1c57e7} ``` 以下の2つのアドレスが作成されました: - 4a1c11eaec40197beb6e8607ee61953e7d6d8731 - 5855a19b64e1068a1edc39bb817647e16a1c57e7 **!注意!:** **アドレスを作成した時のパスフレーズは絶対に忘れないようにしましょう。** [⤒](#index) ## 作成したアドレスのPrivate Keyを知る (know-private-key) [アドレス作成時](#create-account)に`--keystore`で指定したディレクトリの配下にアドレス毎のPrivate Key情報が格納されています。ファイル名のフォーマットは `UTC--日時--アドレス` となっています: ``` $ ls ~/.ethereum_private_testnet/keystore UTC--2016-12-04T20-03-50.381751825Z--4a1c11eaec40197beb6e8607ee61953e7d6d8731 UTC--2016-12-04T20-04-50.631180356Z--5855a19b64e1068a1edc39bb817647e16a1c57e7 ``` **!注意!:** `keystore`配下のデータはPrivate Key情報なので扱いは慎重に。**他人に絶対公開してはいけませんし、かといって消してしまうとそこで全てが終了です。二度と復元できません。**バックアップの際にはこの`keystore`フォルダを必ず含めましょう。 [⤒](#index) ## Private Testnet用のGenesisファイルを作成 (create-genesis-json) Ethereumネットワークを稼働させる前に、`.ethereum_private_testnet`配下に Private Testnet 用の `genesis.json` ファイルを作成します。これは同一ネットワークで共有する初期ブロックを定義するファイルです。`alloc{...}`の箇所を設定することで、特定のアドレスに初期残高を設定することもできます(が、今回は難易度の低いマイニングでガンガン増やすので利用しません)。 genesis.json: ``` { "nonce" : "0x0000000000000099", "alloc" : {}, "coinbase" : "0x0000000000000000000000000000000000000000", "difficulty" : "0x20000", "extraData" : "", "gasLimit" : "0x2fefd8", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00" } ``` **!注意!** `genesis.json`内の`nonce:`は自分のネットワーク用にランダムな値に変更してください。これは他のネットワークからの誤接続を防ぐためです。 参考 [Operating a private network](https://github.com/ethereum/go-ethereum#operating-a-private-network) [⤒](#index) ## ブロックチェーンを初期化 (geth-init) genesis.jsonが作成できたら、次にブロックチェーンを初期化します: ``` $ cd ~/.ethereum_private_testnet/ $ geth --datadir=./ init ./genesis.json I1209 17:15:21.139327 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /home/akirattii/.ethereum_private_testnet/geth/chaindata I1209 17:15:21.142822 ethdb/database.go:176] closed db:/home/akirattii/.ethereum_private_testnet/geth/chaindata I1209 17:15:21.143167 ethdb/database.go:83] Allotted 128MB cache and 1024 file handles to /home/akirattii/.ethereum_private_testnet/geth/chaindata I1209 17:15:21.155134 cmd/geth/main.go:255] successfully wrote genesis block and/or chain rule set: 5cd52073bd083d264fa7ad080727edc546b9d06a3e22f0c1b88d81d3dd1089f0 ``` [⤒](#index) ## Gethを起動 (run-geth) 初期化に成功したら、いよいよGethの起動。 以下のオプションで起動します: - `datadir`: ブロックチェーンなどの保存先フォルダ=**~/.ethereum_private_testnet/** - `dev`: **開発モード有効** - `mine`: **マイニング有効** - `minerthreads=1`: マイナースレッド数=**1** - `nodiscover`: 他Nodeから見つからない設定 - `etherbase`: マイニング報酬受け取りアドレス=**0x4a1c11eaec40197beb6e8607ee61953e7d6d8731** ``` $ cd ~/.ethereum_private_testnet/ $ geth --datadir=./ --dev --mine --minerthreads=1 --nodiscover --etherbase=0x4a1c11eaec40197beb6e8607ee61953e7d6d8731 ``` [⤒](#index) ## Geth で Console を起動 (geth-console) 別ターミナルを立ち上げて、 ``` $ cd ~/.ethereum_private_testnet/ $ geth attach ./geth.ipc # アドレス一覧を確認: > eth.accounts ["0x4a1c11eaec40197beb6e8607ee61953e7d6d8731", "0x5855a19b64e1068a1edc39bb817647e16a1c57e7"] # coinbaseアドレスを表示: > eth.coinbase "0x4a1c11eaec40197beb6e8607ee61953e7d6d8731" # coinbaseアドレスが保持する残高を確認: > eth.getBalance("0x4a1c11eaec40197beb6e8607ee61953e7d6d8731") 335000000000000000000 ``` Note: `getBalance`で`coinbase`アドレス(マイニング報酬受け取り用のアドレス)に既に残高が入っているのが確認できますが、これはPrivate Testnetでのマイニングが継続的に成功しているためです。 [⤒](#index) ## Geth Console から Ether を送金 (send-ether) ``` # まず、送信先アドレス(もうひとつのアドレス)の残高を確認: > eth.getBalance("0x5855a19b64e1068a1edc39bb817647e16a1c57e7") 0 # そして、Etherを送金する前に送金元アドレス(今回はcoinbaseアドレス)をアンロック: > personal.unlockAccount(eth.coinbase) Unlock account 0x4a1c11eaec40197beb6e8607ee61953e7d6d8731 Passphrase: true # いよいよ、coinbaseアドレスからもうひとつのアドレスへ1Ether(10^18 wei)送金: > eth.sendTransaction({from: eth.coinbase, to: '0x5855a19b64e1068a1edc39bb817647e16a1c57e7', value: web3.toWei(1, "ether")}) "0x26bff7e277761e9741fc3a4f6672ff7b46f28c7d16a6bbe553cb3a30ca528400" # トランザクション結果を確認: > eth.getTransaction("0x26bff7e277761e9741fc3a4f6672ff7b46f28c7d16a6bbe553cb3a30ca528400") { blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000", blockNumber: null, from: "0x4a1c11eaec40197beb6e8607ee61953e7d6d8731", gas: 90000, gasPrice: 20000000000, hash: "0x26bff7e277761e9741fc3a4f6672ff7b46f28c7d16a6bbe553cb3a30ca528400", input: "0x", nonce: 0, r: "0xb0eacb077651cb245eac1c2f5d4c57d5b95970922a64c4c49a672c94d99621d5", s: "0x566959f1573d5726a6e6608a7f43de17a53cb6adad9c93bad4716b9f6cdf19cc", to: "0x5855a19b64e1068a1edc39bb817647e16a1c57e7", transactionIndex: null, v: "0x1b", value: 1000000000000000000 } # 送信先アドレス(もうひとつのアドレス)の残高を再確認: > eth.getBalance("0x5855a19b64e1068a1edc39bb817647e16a1c57e7") 1000000000000000000 <= 無事、10^18wei(1Ether)が入金されていました。 ``` Note: ローカル環境のPrivate Testnetの場合、Geth起動時にマイニングをONにしておかないとTransactionがブロックに取り込まれないので注意。 Ethereum の Private Testnet の構築から Ether の送金までの手順は以上となります。 [⤒](#index) ## おまけ: 外部JSファイルの利用 (load-script) 外部のJSファイルを読み込んで、Geth Console 上で利用することもできます。 例えば、全アドレスの残高を取得する関数 `checkAllBalances()` を外部JSファイル `./gethload.js` に作成してみます: gethload.js: ``` function checkAllBalances() { var totalBal = 0; for (var acctNum in eth.accounts) { var acct = eth.accounts[acctNum]; var acctBal = web3.fromWei(eth.getBalance(acct), "ether"); totalBal += parseFloat(acctBal); console.log(" eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether"); } console.log(" Total balance: " + totalBal + " ether"); }; ``` Geth Consoleから外部JS `./gethload.js` を使ってみましょう: ``` ### 外部JSを読み込んで: > loadScript("./gethload.js") true ### JS内の checkAllBalances 関数を実行: > checkAllBalances() eth.accounts[0]: 0x4a1c11eaec40197beb6e8607ee61953e7d6d8731 balance: 1979 ether eth.accounts[1]: 0x5855a19b64e1068a1edc39bb817647e16a1c57e7 balance: 1 ether Total balance: 1980 ether ``` 便利ですね。 他にも色々と応用できそうです。 [⤒](#index) ## 次回 (next) 次回は、今回作った Private Testnet を利用して、[簡単な Dapp (Decentralized Application) を作成](https://trycatchand.blogspot.jp/2016/12/ethereum-dapp-helloworld.html)してみたいと思います。 [⤒](#index)
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿