1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[前回] Web3.0検証(9)-スマートコントラクトの作成

はじめに

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

Blockchainのデータ構造

image.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: []
}

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

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)
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?