堅牢性-アセンブリ

Solidityは、アセンブリ言語を使用してSolidityソースコード内にインラインアセンブリを記述するオプションを提供します。スタンドアロンのアセンブリコードを記述して、バイトコードに変換することもできます。スタンドアロンアセンブリは、Solidityコンパイラの中間言語であり、Solidityコードをスタンドアロンアセンブリに変換してからバイトコードに変換します。インラインアセンブリで使用されているのと同じ言語を使用して、スタンドアロンアセンブリでコードを記述できます。

インラインアセンブリ

インラインアセンブリコードは、Solidityコードベース内でインターリーブして、EVMをよりきめ細かく制御でき、特にライブラリ関数の作成時に使用されます。

アセンブリコードは assembly { ... } ブロック。

次のコードを試して、Solidityでライブラリがどのように機能するかを理解してください。

pragma solidity ^0.5.0;

library Sum {   
   function sumUsingInlineAssembly(uint[] memory _data) public pure returns (uint o_sum) {
      for (uint i = 0; i < _data.length; ++i) {
         assembly {
            o_sum := add(o_sum, mload(add(add(_data, 0x20), mul(i, 0x20))))
         }
      }
   }
}
contract Test {
   uint[] data;
   
   constructor() public {
      data.push(1);
      data.push(2);
      data.push(3);
      data.push(4);
      data.push(5);
   }
   function sum() external view returns(uint){      
      return Sum.sumUsingInlineAssembly(data);
   }
}

Solidity First Applicationの章に記載されている手順を使用して、上記のプログラムを実行します。

Note −展開ボタンをクリックする前に、ドロップダウンから[テスト]を選択します。

出力

0: uint256: 15