morito

個人的に勉強したことのメモを投稿していく技術ブログ。最近はWebアプリ開発と量子コンピュータの勉強をしてます。

【Ethereum】トランザクションのinputデータをdecodeする方法

コントラクト呼び出しのトランザクションの中身が気になって、いろいろ調べたので記録しておきます。
Ethereumのトランザクション構造は下図のようになっています。

f:id:sakanamori:20190202170008p:plain
Ethereumトランザクション構造
この中でもコントラクトに送信するDataの部分を見ていきます

今回使用したプログラムはERC20規格のトークコントラクトです。

pragma solidity ^0.4.24;
//Coinコントラクト----------------------
contract KilmyCoin {
  //状態変数の宣言
  string public name;                             // トークンの名前
  string public symbol;                           // トークンの単位
  uint8 public decimals;                          // 小数点以下の桁数
  uint256 public totalSupply;                     // トークンの総量
  mapping (address => uint256) public balanceOf;  // 各アドレスの残高

  //イベント通知
  event Transfer(address indexed from, address indexed to, uint256 value);

  //コンストラクタ
  function KilmyCoin(uint256 _supply, string _name, string _symbol, uint8 _decimals) {
    balanceOf[msg.sender] = _supply;
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    totalSupply = _supply;
  }

  //送金
  function transfer(address _to, uint256 _value) {
    //不正送金チェック
    if (balanceOf[msg.sender] < _value) throw;
    if (balanceOf[_to] + _value < balanceOf[_to]) throw;

    //送信アドレスと受信アドレスの残高を更新
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
    //イベント通知
    Transfer(msg.sender, _to, _value);

  }
}

 送信したトランザクションとその結果は下の図のとおりです。アドレスを引数にして所持トークンの量が返ってきています。ちなみに、今回の作業は全てRemixのJavascriptVM上で行いました。

f:id:sakanamori:20190202164122p:plain
トランザクション送信とoutput

さらに、下の図はRemixのログで確認したトランザクションの詳細である。

f:id:sakanamori:20190202160200p:plain
Remix上で確認したトランザクションの詳細

ここでinputとdecoded inputという項目があります。

inputは上の図だと省略されているのですが、略さずに書くとこのような16進数になります。

0x70a08231000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c

後半のca35b7d915458ef540ade6068dfe2f44e8fa733cはトランザクションの引数として渡したアカウントアドレスですね。

そしてinputの内容はなんなのか?どうやってdecodeするのかという問題は
「Ethereum input data」でググった結果すぐに解決しました。

下のリンク先のサイトではコントラクトのABIとInputの16進数を入力するとdecodeしてinput dataを出力してくれます。そして、この出力結果がトランザクションコントラクト送信データの中身だと考えられます。
lab.miguelmota.com
GitHub - miguelmota/ethereum-input-data-decoder: Ethereum smart contract transaction input data decoder


f:id:sakanamori:20190202171203p:plain
解析結果

上の図が解析結果なのですが、見てわかるように、引数として渡したデータ以外にも、関数の名前と引数の型の情報が付加されていました。
これらの情報はコントラクトのABIコードから定義されるようです。ABIコードはコントラクトの仕様書のようなものです。今度、コントラクトの発行の手順についてもABI仕様を絡めて記事にしていきたいと思います。