諸事情により、実験的に steemit で軽く記事を書いていこうと思います。
ということで、まずは比較的キャッチーなネタである Solidity v0.5.0 Breaking Changes の中から気になったものをピックアップしていくシリーズでもやってみようかなと。続くかなこれ。不安です。
今回は、keccak256() の引数についてです。
サンプルコード
v0.4.25
Warning は出ますが、複数の引数を渡せました。
keccak256(...) returns (bytes32)
実際のコードは以下のような感じになります。
pragma solidity ^0.4.25;
contract Old {
function f() public pure returns(bytes32) {
byte b = 0x00;
uint8 i = 0;
string memory s = "zero";
return keccak256(b, i, s);
}
}
f() の実行結果は以下のようになります。
0x8189e29de3da4d4f173407fc89da994321d99458b5ed5bb8f99c98a7161e2955
v0.5.0
以下のように、bytes 1 つしか渡せないようになりました。
keccak256(bytes memory) returns (bytes32)
よって、上記 v0.4.25 のサンプルコードと同じ結果を得るためには、以下のように abi.encodePacked() してから渡す必要があります。既によく見かけるコードですね。
pragma solidity >0.4.99 <0.6.0;
contract New {
function f() public pure returns(bytes32) {
byte b = 0x00;
uint8 i = 0;
string memory s = "zero";
return keccak256(abi.encodePacked(b, i, s));
}
}
f() の実行結果は以下のようになります(先ほどと同じです)。
0x8189e29de3da4d4f173407fc89da994321d99458b5ed5bb8f99c98a7161e2955
補足
v0.5.0 では、上記に関連した以下のような変更も入っていますので、ご注意ください。
keccak256()だけでなく、以下の function も引数がbytes1 つになりました.call().delegatecall().staticcall()sha256()ripemd160()
keccak256()のエイリアスだったsha3()は使えなくなりました