keccak256() in Solidity v0.5.0

Words
169
Reading
1 min
Listen
Play
8y

cover.001.png

諸事情により、実験的に 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 も引数が bytes 1 つになりました
    • .call()
    • .delegatecall()
    • .staticcall()
    • sha256()
    • ripemd160()
  • keccak256() のエイリアスだった sha3() は使えなくなりました
keccak256() in Solidity v0.5.0 | Ecency