macにgethをインストールして、private netでコマンドを実行してみる。

この記事では、macOS High Sierra 10.13.6を使っています。
Ethereumの環境構築をして、プライベートネットで動かす方法についてまとめてみます。
今回はクライアントとして、[geth](https://github.com/ethereum/go-ethereum/wiki/geth)の1.8.20-stableを利用してます。

## 1. macにgethをインストール
```
brew tap ethereum/ethereum
brew install ethereum

// バージョン確認
geth version

Geth
Version: 1.8.20-stable
〜省略〜
```

## 2. データ用のディレクトリを作成する
```
mkdir /path/to/home/eth_private_net
```

## 3. genesis.json(初期ブロック)を作成
```
cd /path/to/home/eth_private_net
vim genesis.json 
```

``` genesis.json
{
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x00",
    "alloc": {},
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x00",
    "gasLimit": "0x1312d00"
}
```

## 4. 初期化処理を実行
```
geth --datadir /path/to/home/eth_private_net init /path/to/home/eth_private_net/genesis.json
```

## 5. geth起動
```
geth --networkid "10" --nodiscover --datadir "/path/to/home/eth_private_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" console 2>> /path/to/home/eth_private_net/geth_err.log


// 下記が出力されたらOK
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.20-stable/darwin-amd64/go1.11.2
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>
```

## 6. コマンド実行

### アカウント作成
```
> personal.newAccount("test")
"0x1c5dcf3fb4614a82adcf09bc194365a127ff272a"
```

### アカウントリスト確認
```
> eth.accounts
["0x1c5dcf3fb4614a82adcf09bc194365a127ff272a"]
```

### index指定でアカウント確認
```
> eth.accounts[0]
"0x1c5dcf3fb4614a82adcf09bc194365a127ff272a"
```


### coinbaseアカウント(mining報酬を受取るアカウント)の確認
```
> eth.coinbase
"0x1c5dcf3fb4614a82adcf09bc194365a127ff272a"
```

### genesisブロックの確認
```
> eth.getBlock(0)
{
  difficulty: 0,
  extraData: "0x00",
  gasLimit: 20000000,
  gasUsed: 0,
  hash: "0x76d747ec34337ec5677b1aba554769485e160663eee3c63486400bddc21a5e65",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 505,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 0,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```

### マイニング開始
```
> miner.start(2)
null
```
### マイニングステータス確認
```
> eth.mining
true
```

### アカウント残高確認
```
> eth.getBalance(eth.accounts[0])
0

// 少し待つ
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
80
```

### 送金テスト用にアカウントを作成
```
> personal.newAccount("test")
0x581206828d6faf24fc8b842d0d3544da5c180210
```

### 送金
```
// 送金元のアカウントロックを解除
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x1c5dcf3fb4614a82adcf09bc194365a127ff272a
Passphrase: // personal.newAccountで作成した際のパスワードを指定。この例では、「test」
true

// 送金
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
"0x906ccd91621ac73f6221a2a8ffe825c18199ca6708d4ee5fa5f73b4c9c9ca779" //txid

// 少し待つとアカウント残高が反映される
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
5
```

### トランザクション確認
```
> eth.getTransactionReceipt("0x906ccd91621ac73f6221a2a8ffe825c18199ca6708d4ee5fa5f73b4c9c9ca779")
{
  blockHash: "0x86279ca24cd8b163ebdf22cf7ae656389278c0dcd133bc99c0ffe4558b7e9cc2",
  blockNumber: 55,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  from: "0x1c5dcf3fb4614a82adcf09bc194365a127ff272a",
  gasUsed: 21000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  root: "0x810497dd7957105d8262f21a71af0d84e30d72bd6c267946d44b7519242e34a9",
  to: "0x581206828d6faf24fc8b842d0d3544da5c180210",
  transactionHash: "0x906ccd91621ac73f6221a2a8ffe825c18199ca6708d4ee5fa5f73b4c9c9ca779",
  transactionIndex: 0
}
```
### マイニング停止

```
> miner.stop()
```


## 参考書籍
- [堅牢なスマートコントラクト開発のためのブロックチェーン[技術]入門](https://www.amazon.co.jp/%E5%A0%85%E7%89%A2%E3%81%AA%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E6%8A%80%E8%A1%93-%E5%85%A5%E9%96%80-%E7%94%B0%E7%AF%AD-%E7%85%A7%E5%8D%9A/dp/4774193534/ref=sr_1_1?ie=UTF8&qid=1545468272&sr=8-1&keywords=%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80)

## 参考サイト
- https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console 
- https://book.ethereum-jp.net/first_use/installing_geth.html