playground

The world is a playground.

Ethereum の function call データフォーマット

  • マルチシグウォレットを使用して他のスマートコントラクトのメソッドを実行したりするのに必要なので調べたよ
  • Solidity で書かれたスマートコントラクトに次のようなメソッドがある場合で説明します
  • 以下の countUp() とか countDown() を実行するためにはどういったトランザクションを作って送ればいいか、という話
pragma solidity ^0.4.19;

contract Count {
    uint256 public count;
    
    function countUp() public {
        count = count + 1;
    }
    
    function countDown() public {
        count = count - 1;
    }
    
}
  • function call のデータについて、最初の4バイトはシグネチャと呼ばれる次のフォーマットにした関数のプロトタイプのようなものを Keccak256 でハッシュ化したものを使うとのこと。
  • 引数は型のみを使用します。
  • 引数の型はカンマで区切ります。
funtionName(type1,type2,...)

上記の countUp() の場合、Node.js で書くとつぎのような感じで、Keccak256 のハッシュが得られるので、最初の 4bytes 0x0bd8599e がトランザクションに含むべきデータになります。

const Web3 = require('web3');

console.log(Web3.version);
// => 1.0.0-beta.34

const signature = 'countUp()';
const hash = Web3.utils.keccak256(signature);
console.log(hash);
// => 0x0bd8599e08d359240ca8194d54975e0eda037fe2109af0514fc9505f2cfc9407
  • 引数をとる場合については時間がなくなってしまったのでまた今度書きます。
  • 今回はいつにもまして乱文になってしまった..