スマートコントラクトプログラミング言語であるSolidityの条件分岐(if構文)について記載します。
Solidityの条件分岐
プログラムを書いていると、与えられた条件の中から一つを採用しなければならない状況が発生することが良くあります。
このような条件分岐をせまられた場合、プログラムが正しい判断を下し正しいアクションを実行できるようにする条件文を使用する必要があります。
Solidityでは異なる条件に基づいて異なるアクションを実行するための条件文をサポートしています。
今回はSolidityの条件分岐処理であるif.else 文について説明します。
ifステートメント
if文は、Solidityが条件付きで判断を下し、文を実行するための基本的な制御文です。
基本的なifステートメントの構文は次のとおりです-
構文
1 2 3 |
if (条件) { 条件が真の場合、この処理が実行される } |
ifの条件の結果の値が真である場合、{}で指定されたステートメントが実行されます。
条件が負の場合、どのステートメントも実行されません。ほとんどの場合、意思決定を行う際に比較演算子を使用します。
Solidityでのif 文がどのように機能するかの参考として下記ソースコードを確認してみてください。
このコードでは、aとbの値の加算を行い、if文で合計値が10と等しいか確認するコントラクトとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract IfStatementTest { //aとbのローカル変数を定義し、加算を行うaddValueファンクション function addValue() public pure returns(string memory){ uint a = 5; uint b = 5; uint result = a + b; return checkValue(result); } //aとbのローカル変数の加算が10になるかif構文でチェックするcheckValueファンクション function checkValue(uint _i) internal pure returns (string memory) { if (_i == 10) { // if構文 return "Value is 10"; } return "Value is not 10"; } } |
上記ソースコードをコンパイル、Deployし、addValueファンクションを呼び出すと下記結果が返ってきます。
if…elseステートメント
if…else構文は、Solidityがif構文よりもより制御された方法で処理を実行できるようにする条件分岐処理です。
基本的なif elseステートメントの構文は次のとおりです-
構文
1 2 3 4 5 |
if (条件) { 条件が真の場合、この処理が実行される } else { 条件が負の場合、この処理が実行される } |
ifの条件の結果の値が真の場合、’if’ブロック内{}の指定されたステートメントが実行されます。
条件が負なら、else ブロックの中の指定されたステートメントが実行されます。
Solidityでのif else構文がどのように機能するかの参考として下記ソースコードを確認してみてください。
このコードでは、aとbの値の比較を行い、if else構文でどちらが大きいか確認するコントラクトとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract IfStatementTest { //aとbのローカル変数を定義し、値を設定するsetValueファンクション function setValue() public pure returns(string memory){ uint a = 5; uint b = 6; return checkValue(a,b); } //aとbのローカル変数のどちらが大きいかif-else構文でチェックするcheckValueファンクション function checkValue(uint _x,uint _y) internal pure returns (string memory) { string memory result = "Not checked"; if (_x > _y) { // if else構文 return "a is bigger than b"; } else { return "a is not bigger than b"; } return result; } } |
上記ソースコードをコンパイル、Deployし、setValueファンクションを呼び出すと下記結果が返ってきます。
if…else if… ステートメント
if…else if…構文は if…else の発展形で、Solidity が複数の条件から正しい判断を下すためのものです。
if-else-if ステートメントの構文は次のとおりです-
構文
1 2 3 4 5 6 7 8 9 |
if (条件1) { 条件1が真の場合、この処理が実行される } else if (条件2) { 条件2が真の場合、この処理が実行される } else if (条件3) { 条件3が真の場合、この処理が実行される } else { 上記条件どれにも当てはまらない場合、この処理が実行される } |
ステートメント(複数可)は、真の条件に基づいて実行され、いずれの条件も真でない場合は、elseブロックが実行されます。
Solidityでのif..elseif..else構文がどのように機能するかの参考として下記ソースコードを確認してみてください。
このコードでは、aとbとcの値の比較を行い、if..elseif..else構文でどの値が一番大きいか確認するコントラクトとなっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract IfStatementTest { //ローカル変数a,b,cを定義しif,elseif,else構文でチェックを行うファンクション function checkValue() public pure returns(string memory) { uint a = 1; uint b = 2; uint c = 3; string memory result; if( a > b && a > c) { // if else構文 result = "a is bigger than b and c"; } else if( b > a && b > c ){ result = "b is bigger than a and c"; } else { result = "c is bigger than a and b"; } return result; } } |
上記ソースコードをコンパイル、Deployし、checkValueファンクションを呼び出すと下記結果が返ってきます。
最後に
今回紹介したSolidityの仕様やコードをRemix IDEやHardhatで実際に実行やテストをして確認してみましょう。
実際に動かしたり、テストすることで理解が深まるかと思います。
hardhatのインストール手順
HardhatでスマートコントラクトのDeploy手順