トランザクションの詳細な送信情報を取得する方法


Dappsのいいところは取引の詳細データがブロックチェーン上に半永久的に残っている点です。

たとえばDapps提供者側のシステムがクラッシュしたとしてもすべての取引データはトランザクションとして保存されていますので、本当に重要な情報を復元する事ができます。

しかしその取引データは暗号化されているため通常確認できません。

今回はコーディングしなくてもそのトランザクションにどのようなデータを送信したかを特定する方法を記載します。

コントラクトへのトランザクションの送信情報を確認したいことは開発中はもちろん本番リリース後も発生しますので、知っておくと何らかのときに助かると思います。

手順

  1. etherscanで調べたいトランザクションのInput Dataを調べる
  2. ABIの情報を調べる
  3. ethereum-input-data-decoderツールを使って1と2の情報を入れる

1.etherscanで調べたいトランザクションのInput Dataを調べる

etherscanではトランザクションのデータ項目にInput Dataというものがあります。
このデータがコントラクトへ送信したデータの内容となりますが、このままだと何もわかりません

例としてCryptoKanojoのKanojo購入トランザクションを見てみます。

以下URLにアクセスすると
https://etherscan.io/tx/0x3cfa5bc76052d2461ae03bbee1753f078cfe77067155de5fecfaf1ced240b7ae
このようなデータが表示されていますので、このあとでデータを使用します

2.ABIの情報を調べる

コントラクトをコンパイルすると以下のようにJSON形式のABIが出力され、ABI情報の変数として保存していると思いますので、そのデータを使用します。

Kanojo.sol
$ solc Kanojo.sol --abi --bin
======= Kanojo.sol:Memo =======
Binary:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
Contract JSON ABI
[{"constant":true,"inputs":[],"name":"endTime","outputs":....
↑これを使う

3.ethereum-input-data-decoderツールを使って1と2の情報を入れる

ethereum-input-data-decoderで調べるとGitHubで公開されていますが、今回はWEBでコンパイル済みのも公開していますのでこちらを使います。
https://lab.miguelmota.com/ethereum-input-data-decoder/example/

左のABIに2のデータを、右のInput Dataに1のデータをコピペし、Decodeボタンをクリックすると、コントラクトへ送信したデータが表示されます。

以上です。

デコードして出てきたデータを加工する

これはコントラクトの処理にもよりますが、デコードして出てきたデータが16進数になっていて10進数に直さなくてはいけない場合もあります。

そういったときはX進数変換ツールなどがあるのでそれを使うと便利です。
https://hogehoge.tk/tool/number.html