Web3.0検証(10)-Blockchainのデータ構造

##### [前回] [Web3.0検証(9)-スマートコントラクトの作成](https://qiita.com/mingchun_zhao/items/54185ea0325c5f3e6772)

## はじめに

今回は、Blockchainのデータ構造を深掘りします。

## Blockchainのデータ構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/ded5dff6-08f6-2101-7de4-9a708911bc3e.png)

- 生成されたブロックを最も新しいブロックの後ろにつなげる
- ブロック同士を時系列順にチェーン(鎖)のように連結
- ブロック間のリンクにより、ブロック変更や途中挿入を防ぐ

### ブロックのデータ

- hash
    - ブロックの一意識別子(デジタルフィンガープリント)
- parentHash
    - 1つ前のブロックのhash
- transactions
    - ネットワーク内で発生した一定時間/一定量のトランザクションレコードを保存
    - トランザクションの時間とシーケンスを記録/確認
    - 検証済みのトランザクション証明により改ざんを防ぐ
 
### Blockchainの改ざんが難しい理由

Blockchainのデータ構造に答えがあるようです。

- ブロックのハッシュ値
    - 新しいブロックには、自分と一つ前のブロックのハッシュ値が記録される
- ブロックのナンス(nonce)値
    - 使い捨ての32ビット値、ナンスに応じて後続ブロックで使用するハッシュ値が変化
- ブロックのトランザクションレコードを改ざんしたら、ハッシュ値が変更される
    - それをごまかすには、後続の全ブロックのハッシュ値変更が必要で、事実上不可能

## Blockchainに使用される技術

- P2P(ピアツーピア)型通信
    - 個々のコンピュータなど端末(ノード)を対等かつ直接つなぎ、ネットワークを構築する通信方式
    - Blockchainは、中央サーバや管理者が存在しないP2P技術を利用しデータ分散
        - 特定端末が攻撃を受けたり故障したりしてもデータ保持可能

- コンセンサスアルゴリズム
    - P2Pネットワークで採用されるコンセンサスアルゴリズム
    - 中央集権的な管理者が存在しないBlockchainで、参加者全員が台帳データを共有し、合意形成を行う仕組み
    - 例: PoW(プルーフオブワーク)
        - マイニングによって必要な計算を成功させた人がデータを承認し、新ブロックをブロックチェーンに書き込む仕組み

- スマートコントラクト
    - 契約の締結や履行をBlockchain上で自動的に実行する仕組み
    - スマートコントラクトによる実行履歴はBlockchainに記録され、契約の透明性を担保

## 検証: Blockchainのリスト構造を確認

- Gethをバックグラウンド起動
```
$ nohup geth --networkid 1234 --port 30303 --nodiscover --datadir $HOME/eth_private_net/data1 2>> $HOME/eth_private_net/data1/geth_error.log &
```

- Gethにアタッチ
```
$ geth attach $HOME/eth_private_net/data1/geth.ipc
```

- マイニングスタート
```
> miner.start()
null
> eth.mining
true
```

- GenesisブロックのblockNumberを確認
```
> eth.blockNumber
64
```

- ブロック番号0,1,2の中身を確認
```
> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```
```
> eth.getBlock(1)
{
  difficulty: 131072,
  extraData: "0xd883010a12846765746888676f312e31382e31856c696e7578",
  gasLimit: 134086657,
  gasUsed: 0,
  hash: "0x4018c1171e62e2439e67e07f5ef6097d5f4c8b780ae4148ee89ae5b750cd9f3c",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x92aad50ffefa0cf6a15ad9b924c98abd3296e05a",
  mixHash: "0xe8ca9dc789de3f3d381c5055e08001ff3a1bdf9940267f3fa91d1a481570befa",
  nonce: "0x006d26bebbba5b70",
  number: 1,
  parentHash: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 537,
  stateRoot: "0xe606c0d34e69c007d91121d381588711b691576517fc15be6807368ee0b2010e",
  timestamp: 1651968812,
  totalDifficulty: 147456,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```
```
> eth.getBlock(2)
{
  difficulty: 131136,
  extraData: "0xd883010a12846765746888676f312e31382e31856c696e7578",
  gasLimit: 133955714,
  gasUsed: 0,
  hash: "0x7afe3450c5ce7b2e6ed51e2e845614a21feed13f045d44b3b87f53fb2d452fcd",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x92aad50ffefa0cf6a15ad9b924c98abd3296e05a",
  mixHash: "0x584015095b31999e56cd7f8c993a62065c23332c08735467aac42bbfebd7f643",
  nonce: "0x0b8396a20a3def89",
  number: 2,
  parentHash: "0x4018c1171e62e2439e67e07f5ef6097d5f4c8b780ae4148ee89ae5b750cd9f3c",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 537,
  stateRoot: "0x52675a32dae3e3bae2c1dbd8ef7ccd87e6f7453b9bb738a12e61ae7d7962faee",
  timestamp: 1651968814,
  totalDifficulty: 278592,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
```

各ブロックの`hash`と`parentHash`値から、
三つのブロックがリンクされていることを確認できます。

`Block 0` -> `Block 1` -> `BLock 2`

### gethプロセスの操作ファイルを確認

- gethプロセスIDを確認
```
$ pidof geth
44
```
- 上記pidを指定しlsofコマンド実行
```
$ sudo lsof -p 44
COMMAND PID USER   FD      TYPE             DEVICE   SIZE/OFF   NODE NAME
geth     44 zhao  cwd       DIR               8,16       4096    664 /home/zhao
geth     44 zhao  rtd       DIR               8,16       4096      2 /
geth     44 zhao  txt       REG               8,16   44546232 184975 /home/zhao/go-ethereum/build/bin/geth
geth     44 zhao  mem       REG               8,16 1082130312 181215 /home/zhao/.ethash/full-R23-290decd9548b62a8
geth     44 zhao  mem       REG               8,16 1073739912 181208 /home/zhao/.ethash/full-R23-0000000000000000
geth     44 zhao  mem       REG               8,16    2029560  41497 /usr/lib/x86_64-linux-gnu/libc-2.31.so
geth     44 zhao  mem       REG               8,16    1369352  41503 /usr/lib/x86_64-linux-gnu/libm-2.31.so
geth     44 zhao  mem       REG               8,16     157224  43300 /usr/lib/x86_64-linux-gnu/libpthread-2.31.so
geth     44 zhao  mem       REG               8,16     191472  38548 /usr/lib/x86_64-linux-gnu/ld-2.31.so
geth     44 zhao    0w      CHR                1,3        0t0      3 /dev/null
geth     44 zhao    1w      REG               8,16     157549    212 /home/zhao/nohup.out
geth     44 zhao    2w      REG               8,16    5513056 181149 /home/zhao/eth_private_net/data1/geth_error.log
geth     44 zhao    3uW     REG               8,16          0 174178 /home/zhao/eth_private_net/data1/geth/LOCK
geth     44 zhao    4u  a_inode               0,12          0  17512 [eventpoll]
geth     44 zhao    5r     FIFO               0,11        0t0  17634 pipe
geth     44 zhao    6w     FIFO               0,11        0t0  17634 pipe
geth     44 zhao    7uW     REG               8,16          0 174195 /home/zhao/eth_private_net/data1/geth/chaindata/LOCK
geth     44 zhao    8r  a_inode               0,12          0  17512 inotify
geth     44 zhao    9u  a_inode               0,12          0  17512 [eventpoll]
geth     44 zhao   10r     FIFO               0,11        0t0  18468 pipe
geth     44 zhao   11w     FIFO               0,11        0t0  18468 pipe
geth     44 zhao   12w      REG               8,16      11058 174202 /home/zhao/eth_private_net/data1/geth/chaindata/LOG
geth     44 zhao   13w      REG               8,16     302282  86685 /home/zhao/eth_private_net/data1/geth/chaindata/000042.log
geth     44 zhao   14w      REG               8,16        674  86696 /home/zhao/eth_private_net/data1/geth/chaindata/MANIFEST-000043
geth     44 zhao   15uW     REG               8,16          0 181133 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/FLOCK
geth     44 zhao   16u      REG               8,16          6 181169 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/hashes.ridx
geth     44 zhao   17u      REG               8,16          3 181173 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/hashes.meta
geth     44 zhao   18r      REG               8,16    1764304  86640 /home/zhao/eth_private_net/data1/geth/chaindata/000041.ldb
geth     44 zhao   19r      REG               8,16    1803806  39935 /home/zhao/eth_private_net/data1/geth/chaindata/000044.ldb
geth     44 zhao   20u      REG               8,16          0 181176 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/hashes.0000.rdat
geth     44 zhao   21w      REG               8,16          0   1376 /home/zhao/eth_private_net/data1/geth/transactions.rlp
geth     44 zhao   22uW     REG               8,16          0 181190 /home/zhao/eth_private_net/data1/geth/nodes/LOCK
geth     44 zhao   23u      REG               8,16          6 181177 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/bodies.cidx
geth     44 zhao   24u      REG               8,16          3 181178 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/bodies.meta
geth     44 zhao   25w      REG               8,16       8620 181191 /home/zhao/eth_private_net/data1/geth/nodes/LOG
geth     44 zhao   26w      REG               8,16         70   2980 /home/zhao/eth_private_net/data1/geth/nodes/000035.log
geth     44 zhao   27u      REG               8,16          0 181182 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/bodies.0000.cdat
geth     44 zhao   28u      REG               8,16          6 181183 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/receipts.cidx
geth     44 zhao   29u      REG               8,16          3 181186 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/receipts.meta
geth     44 zhao   30u      REG               8,16          0 181187 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/receipts.0000.cdat
geth     44 zhao   31u      REG               8,16          6 181143 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/diffs.ridx
geth     44 zhao   32u      REG               8,16          3 181159 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/diffs.meta
geth     44 zhao   33u      REG               8,16          0 181160 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/diffs.0000.rdat
geth     44 zhao   34u      REG               8,16          6 181161 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/headers.cidx
geth     44 zhao   35u      REG               8,16          3 181162 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/headers.meta
geth     44 zhao   36u      REG               8,16          0 181166 /home/zhao/eth_private_net/data1/geth/chaindata/ancient/headers.0000.cdat
geth     44 zhao   37w      REG               8,16        594   5711 /home/zhao/eth_private_net/data1/geth/nodes/MANIFEST-000036
geth     44 zhao   38r      REG               8,16        181   2978 /home/zhao/eth_private_net/data1/geth/nodes/000027.ldb
geth     44 zhao   39r      REG               8,16        162   2977 /home/zhao/eth_private_net/data1/geth/nodes/000034.ldb
geth     44 zhao   40r      REG               8,16        162 181137 /home/zhao/eth_private_net/data1/geth/nodes/000031.ldb
geth     44 zhao   41r      REG               8,16        162   9836 /home/zhao/eth_private_net/data1/geth/nodes/000028.ldb
geth     44 zhao   42u     IPv6              18472        0t0    TCP *:30303 (LISTEN)
geth     44 zhao   43u     unix 0x0000000031954d03        0t0  18477 /home/zhao/eth_private_net/data1/geth.ipc type=STREAM
geth     44 zhao   44u     unix 0x000000009ad181f9        0t0  17637 /home/zhao/eth_private_net/data1/geth.ipc type=STREAM
geth     44 zhao   45r      REG               8,16 1073739912 181208 /home/zhao/.ethash/full-R23-0000000000000000
geth     44 zhao   46r      REG               8,16 1082130312 181215 /home/zhao/.ethash/full-R23-290decd9548b62a8
```

`chaindata`ディレクトリや`nodes`ディレクトリに、
必要ファイルが格納されているようです。

## おわりに

Blockchainのデータ構造を確認しました。
次回は、少し複雑なスマートコントラクトを検証してみます。
お楽しみに。

##### [次回] [Web3.0検証(11)-MeteorでDapp開発(1)](https://qiita.com/mingchun_zhao/items/77d1687690e13853e923)