ブロックチェーンをプライベートで試してみた

ブロックチェーンをプライベートで試してみた

環境
  • OS
    • ubuntu17.10
  • 試したブロックチェーンアプリ
    • ethereum(1.7.3-stable-4bb3c89d)
  • wallet
    • simple-ether-wallet(node.js/meteor)
  • sa

  • ブロックチェーンの保管場所
    • /home/yosshi/eth_private_net/
プライベートネットでのセットアップ
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update -y
sudo apt-get install ethereum
cd /home/yosshi
mkdir eth_private_net
vi eth_private_net/myGenesis.json
---
{
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "difficulty": "0x400",
  "alloc": {},
  "coinbase": "0x3333333333333333333333333333333333333333",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x",
  "gasLimit": "0x8000000",
  "config": {}
}
---

geth --datadir /home/yosshi/eth_private_net/ init /home/yosshi/eth_private_net/myGenesis.json
...
< 略>
INFO [01-18|20:57:58] Successfully wrote genesis state         database=lightchaindata                                 hash=6231b0…a0300b
...

geth --networkid "10" --nodiscover --datadir "/home/yosshi/eth_private_net" console 2>> /home/yosshi/eth_private_net/geth_err.log
> eth.getBlock(0)
{
  difficulty: 1024,
  extraData: "0x",
  gasLimit: 134217728,
  < 略>
  miner: "0x3333333333333333333333333333333333333333",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  < 略>
}
※コマンドは途中まで入力してtabキーで補完、候補表示ができます。
アカウント作成
> eth.accounts
[]

> personal.listAccounts
[]

> personal.newAccount("testpassword01")
"0x7f6823f9fb73e6caddcfcb2774fa33f922b885f1"

> personal.newAccount("testpassword02")
"0x02c3af22f67232bf689e4ff39dd2bd527da21d7f"

> eth.accounts
["0x7f6823f9fb73e6caddcfcb2774fa33f922b885f1", "0x02c3af22f67232bf689e4ff39dd2bd527da21d7f"]

> eth.coinbase
"0x7f6823f9fb73e6caddcfcb2774fa33f922b885f1"
※最初に作ったアカウントが採掘を行う際にその報酬を紐付けるEOA(Externally Owned Account)となっている(変更可)
  ex.
  > miner.etEtherbase(eth.accounts[1])
採掘
採掘開始
> miner.start()
null
※通常はtrueと表示されるようですが、私の環境ではnullとなりました。

採掘数を確認
> eth.blockNumber
2

採掘停止
> miner.stop()
true

取得したログを確認
cat /home/yosshi/eth_private_net/geth_err.log 

報酬が与えられている
> eth.getBalance(eth.accounts[0])
10000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
10

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

※coinの単位
通常はweiで表示される

  • 1 ether $$=$$ 10^3 finney
  • 1 ether $$=$$ 10^6 szabo
  • 1 ether $$=$$ 10^18 wei
外部ツールからAPI的にアクセスさせる
geth --networkid "10" --nodiscover --datadir "/home/yosshi/eth_private_net" \
     --mine --unlock 0x7f6823f9fb73e6caddcfcb2774fa33f922b885f1 \
     --rpc --rpcaddr "127.0.0.1" --rpcport "8545" --rpccorsdomain "*" \
     console 2>> /home/yosshi/eth_private_net/geth_err.log
---
Unlocking account 0x7f6823f9fb73e6caddcfcb2774fa33f922b885f1 | Attempt 1/3
Passphrase: 
Welcome to the Geth JavaScript console!
< 略>
  • ※オプションの意味
    • –nodiscover : ピアを自動接続させない
    • –maxpeers 1 : 隣接接続数の最大を定義。左記例は1
    • –network 10 : 1,2,3以外を設定する。プライベートネット識別用
サンプルウォレットアプリ
git clone https://github.com/a-mitani/simple-ether-wallet
cd simple-ether-wallet
npm install
meteor

ブラウザで http://localhost:3000/ にアクセスする

他のノードとつなぐ
  • 端末Aのアドレス : 192.168.1.108
  • 端末Bのアドレス : 192.168.1.110

最初は接続ホストなし

> net.peerCount
0

接続先情報もなし

> admin.peers
[]

ノードの情報を表示する(端末A/B両方確認しておく)

> admin.nodeInfo.enode
"enode://67d9469234048eb9e051ad1488dc686d47d31c9469acb6ee9c191e86e2fade22e38a19cb59b3b04ef0323fdd986e685ccc354429a1bb7b89adacd67cf02dec74@[::]:30303?discport=0"

※ @[::]:30303の部分が @IPアドレス:ポート番号。[::]はIPv6のlocalhostの意味。

端末Aで端末Bを登録

> admin.addPeer("ecnode://..BのnodeInfo...@192.168.1.110:30303?discport=0")

端末Bで端末Aを登録 (実際は端末AでBを登録したら両方ともnet.peerCountは1だしadmin.peersにも相手が登場したので以下実行していない)

> admin.addPeer("ecnode://..AのnodeInfo...@192.168.1.108:30303?discport=0")
参考

https://github.com/ethereum/go-ethereum/wiki/Installing-Geth