Edited at

Ethereum ことはじめ

More than 1 year has passed since last update.


はじめに

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


環境準備

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

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