Ethereum
ブロックチェーン

はじめに

を参考に学習している作業メモ&社内勉強会共有資料です。↑の資料のほうが詳しいのであしからず。

環境準備

macOS Sierra を想定。geth をインストール。

$ brew tap ethereum/ethereum
$ brew install ethereum

プライベートネットへの接続

作業ディレクトリを掘ります。

$ mkdir eth_private_net
$ cd eth_private_net

genesis ファイルを作成

myGenesis.json
{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

genesis ブロックの初期化をする。

$ geth --datadir ~/eth_private_net init ~/eth_private_net/myGenesis.json

geth を起動する。

$ geth --networkid "15" --nodiscover --datadir "~/eth_private_net" console 2>> ~/eth_private_net/geth_err.log

Welcome to the Geth JavaScript console!

instance: Geth/v1.8.3-stable/darwin-amd64/go1.10.1
 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

ここまででコンソールに繋げた。今回はインタラクティブなモード。genesisBlock の情報を取得してみる。

> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0x7b2e8be699df0d329cc74a99271ff7720e2875cd2c4dd0b419ec60d1fe7e0432",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

アカウント作成〜マイニング

アカウントを2つ作成してみる(詳しくは参考資料を)

> eth.accounts
[]
> personal.newAccount("passwd")
"0xfd5d0c2d260d388fe08dbe730c015e7e85af90f0"
> eth.accounts
["0xfd5d0c2d260d388fe08dbe730c015e7e85af90f0"]
> personal.newAccount("passwd_2")
"0xe42a4935f8fda50d967d0ad96802036d1b16bac9"

アカウントの確認をしてみる。

> eth.accounts
["0xfd5d0c2d260d388fe08dbe730c015e7e85af90f0", "0xe42a4935f8fda50d967d0ad96802036d1b16bac9"]

マイニング報酬を受け取るアカウントの確認。

> eth.coinbase
"0xfd5d0c2d260d388fe08dbe730c015e7e85af90f0"

マイニングの開始から確認、終了まで。しばらくすると blockNumber が増えます。これがブロックの生成。eth.mining で現在マイニング中か否かがわかる。true がマイニング中。

> miner.start()
>  eth.blockNumber
0
>  eth.blockNumber
1
> eth.mining
true
> miner.stop()
true

生成したブロック情報の確認。

> eth.blockNumber
15
> eth.getBlock(15)
{
  difficulty: 131904,
  extraData: "0xd983010803846765746888676f312e31302e318664617277696e",
  gasLimit: 132265053,
  gasUsed: 0,
  hash: "0xabd697ff56697a8eaca9e0ba4f1c88158761cb05c8b0d060de6bde081cd24bd0",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xe42a4935f8fda50d967d0ad96802036d1b16bac9",
  mixHash: "0x09b8270cd30f8b04754c6008a7315fc7e64ff4a0979109eb872cd41b5ad4003b",
  nonce: "0x29bb612187878d79",
  number: 15,
  parentHash: "0x582e2a2c612993a5fa2bb03597f52fb53dc97514a8cf56311cd9641d0d840eda",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 538,
  stateRoot: "0x2ad66b7e8f93ae8a2e94ba01cd2b44af9d45b6682cc51282c631c498607bafbc",
  timestamp: 1523875569,
  totalDifficulty: 1988288,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

マイニング報酬の確認。

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

上記の単位は wei なので eth に変換するには以下。

> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
75

送金

送金をしてみます。[1] -> [0] へ 5eth を想定。アカウントのアンロックから。

> eth.accounts
["0xfd5d0c2d260d388fe08dbe730c015e7e85af90f0", "0xe42a4935f8fda50d967d0ad96802036d1b16bac9"]
> eth.getBalance(eth.accounts[1])
75000000000000000000
> personal.unlockAccount(eth.accounts[1])
Unlock account 0xe42a4935f8fda50d967d0ad96802036d1b16bac9
Passphrase:
true

送金コマンド。トランザクションIDが返却される。このとき miner.start() でマイニングしておくこと。

> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(5, "ether")})
"0x18b725a93a9168efcb6019f4ee7d2ef1c3896528fbfd6803e2da29ff7c215f1b"

アカウントを確認する。残高が減っているので送られていることがわかる。

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

逆もあるが、同様なので省略。