- マルチシグウォレットを使用して他のスマートコントラクトのメソッドを実行したりするのに必要なので調べたよ
- 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
-
例えば、上記のコントラクトのアドレスが、
0xe126016d061369cd23de92475d04fb762b663a97
だとしたら、countUp() を実行したい場合、つぎのようなトランザクションを送る -
to:
0xe126016d061369cd23de92475d04fb762b663a97
-
value: 0
-
data: 0x0bd8599e
-
実際にためしてみたtx: https://ropsten.etherscan.io/tx/0x32b415366043be03300d2fcd1acb8f3dce1f8234fa86b204f6d68e9b7c20b642
-
引数をとる場合については時間がなくなってしまったのでまた今度書きます。
-
今回はいつにもまして乱文になってしまった..
Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_の_function_call_データフォーマット