[前回] Web3.0検証(9)-スマートコントラクトの作成
はじめに
今回は、Blockchainのデータ構造を深掘りします。
Blockchainのデータ構造
- 生成されたブロックを最も新しいブロックの後ろにつなげる
- ブロック同士を時系列順にチェーン(鎖)のように連結
- ブロック間のリンクにより、ブロック変更や途中挿入を防ぐ
ブロックのデータ
- 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のデータ構造を確認しました。
次回は、少し複雑なスマートコントラクトを検証してみます。
お楽しみに。