読者です 読者をやめる 読者になる 読者になる

SmartContractにトランザクションを発行した場合にBlockにどのように情報が残るのか

Ethereum

SmartContractをデプロイした場合にEthereumネットワークのBlockにどのように情報が残るのかは前回わかったので、
今度はSmartContractにトランザクションを発行した場合にEthereumネットワークのBlockにどのように情報が残るのか追ってみました。

前回の情報はこちら
garapon.hatenablog.com

つかうSmartContractとかは前回の続きで行きます。

CoinBaseアカウントに50の初期値をセット。

Tx -> Coin @ 0xe74.. mint(0x11b00fff3570ac74d66192ffc18d3621b0b3dc4e,50)

ペンディングトランザクションを見てみると、このように見えます。

> eth.pendingTransactions
[{
    data: "0x40c10f1900000000000000000000000011b00fff3570ac74d66192ffc18d3621b0b3dc4e0000000000000000000000000000000000000000000000000000000000000032",
    from: "0x11b00fff3570ac74d66192ffc18d3621b0b3dc4e",
    gas: "1800000",
    gasPrice: "50000000000",
    hash: "0xe72094e5f1b39eeb5c855b2f779bd70c2417745d4cdb0e3f7077b62cf250e478",
    nonce: "27",
    to: "0xe74698567b7b89310afa9fd869ffd5f09786a471",
    value: "0"
}]

「data」のところに通信データが埋まっていますね。

40c10f19000000000000000000000000                                 // 呼び出しメソッドバイナリ値
11b00fff3570ac74d66192ffc18d3621b0b3dc4e                         // adress
0000000000000000000000000000000000000000000000000000000000000032 // amount unit256

分解してみるとこんな感じですね。
呼び出しメソッドバイナリ値と送信先のアドレス情報「1b00fff3570ac74d66192ffc18d3621b0b3dc4e」
送信額の50が「32」という感じで16進数になっています。uint256の前に0が付き捲っているのは引数の確保バイト数だけ領域が取得されるためですね。
ちなみにuinit256の最大値は
115792089237316000000000000000000000000000000000000000000000000000000000000000
で10進数だと78桁もあり、16進数でも64桁になるので0がつきまくります。

マイニング(取引の実行)

マイニングしてから見てみると

> eth.pendingTransactions
null

ペンディングはなくなっていて、
バランスを確認すると以下のように50に増えています。

Call -> Coin @ 0xe74.. queryBalance(0x11b00fff3570ac74d66192ffc18d3621b0b3dc4e):
 50

ブロックにはどうかかれているか

> eth.getTransactionFromBlock(581)
{
  blockHash: "0xe5a005d0cb1c01937bc1156b54229a2cd5b8157f9b2948d576249d2eb5e9a509",
  blockNumber: 581,
  from: "0x11b00fff3570ac74d66192ffc18d3621b0b3dc4e",
  gas: 1800000,
  gasPrice: 50000000000,
  hash: "0xe72094e5f1b39eeb5c855b2f779bd70c2417745d4cdb0e3f7077b62cf250e478",
  input: "0x40c10f1900000000000000000000000011b00fff3570ac74d66192ffc18d3621b0b3dc4e0000000000000000000000000000000000000000000000000000000000000032",
  nonce: 27,
  to: "0xe74698567b7b89310afa9fd869ffd5f09786a471",
  transactionIndex: 0,
  value: 0
}

と見えていて。ブロックに取引情報が記載されていることがわかりました。

まとめ

SmartContractにトランザクションを発行した場合にBlockにどのように情報が残るのかというと
呼び出しメソッド、引数がすべて残るので、
SmartContractの操作履歴も、解析はめんどくさいですが、全部ロックを参照して
toが対象コントラクトのものを抽出し引数をパースしていけばすべての変化を追うことが可能ですね。