Ethereumノウハウ

Ethereumについてのメモ

##gethに接続
```console
$ geth --testnet --fast --networkid 12345 --datadir ~/eth_data --nodiscover --rpc --rpccorsdomain "*" --rpcport 8545 --rpcaddr "localhost" --rpcapi "web3,eth,net,personal" console 2>> ~/eth_data/geth_err.log
```

###バックグラウンド起動でgethに接続

最後に&をつける

###既に起動しているgethプロンプトを開く
```console
$ geth --datadir "~/eth_data" attach ipc:~/eth_data/geth.ipc
```

##アカウント
EOA(Externally Owned Account）とContact Accountの2種類がある

###EOA
任意に操作するユーザー用アカウント

###Contact Account
トランザクションに応じて処理が行われるアカウント。EOAによりContractの処理が呼ばれ、保持データが変わる。

###アカウントの作成
```
> personal.newAccount("hogehoge1")
```
パスワードを指定。パスワードを忘れると復元する手段はない。

###アカウント一覧
```js
> eth.accounts
["0x95d0ab3bcb76b3a56d4cd0c5289cccdf972c3766", "0xc39e22c8907ef0982753f0d0ed47c9abd1c4679f"]`
```

###コインベース
```js
> eth.coinbase
```
1つ目のアカウント。マイニングで報酬を受取るアカウント。

###採掘開始
```js
> miner.start()
```

###採掘中止
```js
> miner.stop()
```

###採掘状況の確認
```js
> eth.blockNumber
118
```
採掘したブロック数が返される

###採掘中かどうか
```js
> eth.mining
true
```

###ブロック情報
```js
> eth.getBlock(20)
{
  difficulty: 131968,
  extraData: "0xd783010802846765746887676f312e392e34856c696e7578",
  gasLimit: 131620495,
  gasUsed: 0,
  hash: "0xbc4a240d033051bc26f1f756b847fa93daa5d5e920b57f40d723b5473163002a",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x95d0ab3bcb76b3a56d4cd0c5289cccdf972c3766",
  mixHash: "0x9b7924b0733ef8eff23e283c04ddd17dbb76284476b00978014d18b6d597e9dc",
  nonce: "0x33d81415781d1db1",
  number: 20,
  parentHash: "0x1eb4061cc665ae248b3968a15d9b58bf8ba36ad676c8223ff9f4f7db2c4d9873",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 536,
  stateRoot: "0x4eef1c1ed228cd3647ac5803e516c950966b1637e6d6de66cfeaf389131edd0c",
  timestamp: 1523721735,
  totalDifficulty: 2646336,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```

###残高
```js
> eth.getBalance(eth.accounts[0])
3.615e+21
```
###口座のアンロック
```js
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x95d0ab3bcb76b3a56d4cd0c5289cccdf972c3766
Passphrase: 
true
```

アンロックの時間のデフォルトは300秒。0を指定すると無限になる。

```js
> personal.unlockAccount(アドレス, "パスワード", "アンロックの時間(秒)")
```

API経由でもアンロックする場合は、personalを–rpcapiに入れる

```console
$ geth --unlock 0 --rpc --rpcapi "admin,eth,personal"
```

###送金
```js
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(3.5, "ether")})
"0x9deec8faff406b7ae0142032a367fe72572449e58ddf85b597c035041ca7ac23"
```
トランザクションIDが返される
**採掘を実行中でないとトランザクションが実行されない**

###トランザクション情報
```js
> eth.getTransaction('0x9deec8faff406b7ae0142032a367fe72572449e58ddf85b597c035041ca7ac23')
{
  blockHash: "0x4d5808eab4f5c5a24bc93c5ae3c59d74554f265b5500991b7d6b3c94941ab51d",
  blockNumber: 759,
  from: "0x95d0ab3bcb76b3a56d4cd0c5289cccdf972c3766",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x9deec8faff406b7ae0142032a367fe72572449e58ddf85b597c035041ca7ac23",
  input: "0x",
  nonce: 0,
  r: "0x198b0598cc2768eadd7a4cbe2b23c18d1e9c3ba6cfe913033fbdfdd6db438892",
  s: "0x45b196f32354c65263b2479fb1b9ae8435f4aaa9fb6a2ddb78fbe80e5b623c56",
  to: "0xc39e22c8907ef0982753f0d0ed47c9abd1c4679f",
  transactionIndex: 0,
  v: "0x1c",
  value: 3500000000000000000
}
```

##JavaScript

JSでイーサリアムネットワークに接続するには、イーサリアムが開発しているweb3jsを使う。
2018年5月1日で1.0はβ版。安定版は0.20.X。1.0はpromiseベースで開発されており、ブラウザではFirefoxくらいでしかまだ対応されていないawaitなどの最新JSを使う想定でつくられている。

安定版をの0.20.0をインストールする場合

```shell
$ npm install web3@0.20.0
```

最新版をインストールする場合

```shell
$ npm install web3
```

test.js

```js
var Web3 = require('Web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
var _account = web3.personal.newAccount("mysecret");
console.log(_account)
```
```console
$ node test.js 
0x9419ac384e8980a8a7e361dbc95c7da7620a408b
```

##Solidity
イーサリアムプラットフォーム用の独自言語。
イーサリアムネットワークに送受信されるEthereum Virtual Machine Code(EVM Code)に変換される。

###Solidityコンパイラのインストール
ubuntu

```console
$ sudo add-apt-repository ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install solc
```
Mac

```console
brew update
brew upgrade
brew tap ethereum/ethereum
brew install solidity
brew linkapps solidity
```

##プラズマ・キャッシュ
取引所がこの技術を導入している場合、取引所がハッキングされてもユーザーの資産が保護される。
ユーザーがイーサを取引所に預けると、取引所は同じ価値を持つプラズマのコインを生成する。
このプラズマを他の所有者が引き出そうとすると、所有者に警告がいく。
ユーザーが取引履歴を証明できれば、不正な取引を防止できる。

##ABI
Application Binary Interfaceの略。solidtyで記述されたsolファイルをコンパイルしたJSONのコード。

###etherの単位

| 単位 | ether |
|:--|:--|
| wei（最小） | 0.000000000000000001ether |
| kwei | 0.000000000000001ether |
| mwei | 0.000000000001ether |
| gwei（shannon） | 0.000000001ether |
| szabo | 0.000001ether |
| finney | 0.001ether |
| ether | 1ether |
| kether | 1000ether |
| mether | 1000000ether |
| gether | 1000000000ether |
| tether | 1000000000000ether |

#トラブルシューティング

##マイニングが進まない
eth.miningがtrueになってない場合はマイニング開始をされていません。miner.start()をするかgeth起動時にマイニング指定が必要です。
gethをテストネット指定して起動しないとマイニングがなかなか進みません。テストネット指定するにはgeth起動時に--testnetのオプションを指定します。