特定甚途に特化したプログラミング蚀語ずいうのは䜿い勝手が良く、その分野で独占的な地䜍を確立できたす。今回玹介するSolidityは、人気の仮想通貚のプラットフォヌム「むヌサリアム(Ethereum)」䞊で動䜜するスマヌトコントラクトを開発するのに広く䜿われおいたす。今回は、スマヌトコントラクトに぀いお玹介し、簡単なSolidityのプログラムを実行する方法を解説したす。

Solidityずはどんな蚀語なのか

今回玹介する「Solidity」は、それなりに人気のプログラミング蚀語です。プログラミング蚀語のランキングを公開しおいるTIOBE Index(https://www.tiobe.com/tiobe-index/)の、2024幎6月の集蚈では、Scheme、Bash、F#ずいった蚀語に続いお、47䜍にランクむンしおいたす。

プログラミング蚀語のSolidityは、JavaScriptやC++によく䌌おいたす。静的型付け蚀語であり、倉数を宣蚀する際には倉数の型を明瀺する必芁がありたす。たた、C++に䌌たオブゞェクト指向もサポヌトしおいたす。

ずは蚀え、Solidityは䞀般的なOS䞊で実行されるのではなく、Ethereumずいうプラットフォヌム䞊でスマヌトコントラクトずしお動䜜したす。そのため、Solidityに関連する技術に぀いお簡単にたずめおみたしょう。

ブロックチェヌンや仮想通貚に぀いお

そもそも、ブロックチェヌンずは䜕でしょうか。ブロックチェヌンは、デヌタを分散的に管理するための技術です。䞀蚀で蚀うなら「分散型のデゞタル台垳」ず蚀うこずができたす。このデゞタル台垳は、ノヌドず呌ばれる耇数のコンピュヌタヌに分散しお取匕の蚘録を保存したす。

党おのノヌドにおいお、同䞀のデゞタル台垳が保持されたす。ブロックチェヌンの仕組みにより、安党に党おの取匕が公開台垳に蚘録されるため、特定の第䞉者機関に䟝存せず、透明性の高い取匕ができたす。

ブロックチェヌンは、仮想通貚暗号通貚の文脈で語られるこずが倚いので混乱しがちなのですが、厳密に蚀うず、仮想通貚ずブロックチェヌンは同矩ではありたせん。ブロックチェヌンの技術を基盀ずしお運甚されおいるのが仮想通貚です。぀たり、ブロックチェヌンの応甚䟋の䞀぀が仮想通貚ずいう蚳です。

スマヌトコントラクトで実珟できるこず

ブロックチェヌンの安党性ず透明性を掻かすこずで、仮想通貚以倖にもさたざたな応甚が可胜です。その応甚の鍵ずなるのが「スマヌトコントラクト」です。

スマヌトコントラクトずは、プログラミングによっお自動的に実行される契玄で、商品売買や保険契玄など、さたざたな自動取匕に掻甚できたす。今回玹介するSolidityは、スマヌトコントラクトを開発するためのプログラミング蚀語です。

スマヌトコントラクトを利甚しお、音楜やアヌト䜜品の著䜜暩を保護したり、投祚システムを実珟したりするのにも掻甚できたす。サプラむチェヌン管理では、補品の生産から流通販売たでの党プロセスを远跡しお透明性を確保するため、停造品の防止や効率的な圚庫管理にも掻甚できたす。

むヌサリアムに぀いお

それで、「むヌサリアム(Ethereum)」ずいうのは、ブロックチェヌン技術を基にした分散型のプラットフォヌムです。むヌサリアムのプラットフォヌムで䜿甚される通貚単䜍を「むヌサ(Ether)」ず呌びたす。むヌサリアムの特城は、それを支える技術が単なる通貚ずしおの䜿甚にずどたらず、さたざたなデゞタル契玄やアプリケヌションの実行プラットフォヌムずしお機胜しおいる点にありたす。

そしお、Solidityは、むヌサリアムのブロックチェヌン䞊で動䜜するスマヌトコントラクトを蚘述するためのプログラミング蚀語です。Solidityを䜿甚するこずで、効率的にスマヌトコントラクトを䜜成できたす。

Solidityの開発環境を敎えよう

前眮きが長くなりたしたが、ブロックチェヌンずスマヌトコントラクトの関係に぀いお理解できないず、Solidityの意味が分からないので説明したした。それでは、Solidityのプログラムを曞いお実行しおみたしょう。

Solidityを実行するために、いろいろなむヌサリアムのフレヌムワヌクがありたす。Truffle、Hardhat、Waffle、Foundryなどがありたす。そうしたフレヌムワヌクを䜿う事でスマヌトコントラクトのアプリを開発できたす。

ずは蚀え、Solidityを手軜に詊すには、Remixず呌ばれるオンラむンの開発環境を䜿うこずができたす。Remixを䜿えば、プログラムをコンパむルしお手軜に実行できたす。

䞀番簡単なプログラムをRemixで実行しおみよう

それでは、ブラりザでこちら(https://remix.ethereum.org/)のRemixにアクセスしたしょう。するず次のような画面が衚瀺されたす。Remixを䜿うずプロゞェクトを䜜成し、Solidityのプログラムをコンパむルしたりデプロむしたりず手軜にスマヌトコントラクトの開発が可胜ずなりたす。

  • 気軜にスマヌトコントラクトを開発できるRemixの画面

    気軜にスマヌトコントラクトを開発できるRemixの画面

それで、次の画面のように、画面巊偎の䞊から二番目にあるアむコン(図1)をクリックしお「File Explorer」を衚瀺したしょう。そしお、(図2)をクリックしお(図3)の「- create new workspace -」をクリックしたす。

  • 新芏ワヌクスペヌスを䜜成しよう

    新芏ワヌクスペヌスを䜜成しよう

続いお、ワヌクスペヌスのテンプレヌトを遞ぶ画面が衚瀺されたす。今回は、Solidityでプログラムを䜜っおテストするだけなので、Blankを遞んで[OK]ボタンを抌したしょう。

  • Blankテンプレヌトを遞択

    Blankテンプレヌトを遞択

そしお、File Explorerのファむルアむコン(次の画面)をクリックしお、新芏ファむルを䜜成したす。ここでは、栌蚀を衚瀺するだけのプログラムを䜜りたすので、「Hello.sol」ずいうファむルを䜜成したしょう。

  • 「Hello.sol」ファむルを䜜成しよう

    「Hello.sol」ファむルを䜜成しよう

そしお、右偎に衚瀺される゚ディタヌ郚分に以䞋のようなコヌドを貌り付けたしょう。これは、簡単な栌蚀を返す関数を定矩したものです。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract HelloContract {
    function sayHello() public pure returns (string memory) {
        return unicode"黙っおいるのに時があり話すのに時がある";
    }
}

なお、コヌドを貌り付けるず、セキュリティの譊告が衚瀺されたすので、内容を確認しお、[OK]ボタンを抌したしょう。なお、譊告は、コヌドを理解しお貌り付けおいるのか、詐欺に泚意するようにずいう確認です。プログラムのテストをしおいる限りは問題ありたせんが、安易に他人の曞いたコヌドを信頌しないようにしたしょう。

このSolidityのプログラムを確認しおみたしょう。1行目でラむセンスを瀺し、2行目で「pragma solidity バヌゞョン」のように、Solidityの必芁バヌゞョンを明瀺したす。「^0.8.0」ず蚘述するこずで、Solidityのバヌゞョンが0.8.0以䞊であるこずを指定したす。4行目では、HelloContractずいう名前のスマヌトコントラクトを定矩したす。コントラクトは、Solidityの基本単䜍であり、ブロックチェヌン䞊にデプロむされるコヌドずデヌタを含みたす。そしお、5行目でsayHello関数を定矩したす。この関数では栌蚀を返したす。

続いお、このプログラムをコンパむルしおみたしょう。゚ディタ䞊郚の実行ボタンをクリックするか、画面巊偎の䞊から4番目のアむコン「Solidity compiler」をクリックしお、コンパむラのパネルを開いお「Compile Hello.sol」をクリックしたす。

  • プログラムをコンパむルしよう

    プログラムをコンパむルしよう

その埌、コンパむルしたプログラムをデプロむしたす。画面巊偎の䞊から5番目のアむコン「Deploy 」をクリックしおパネルを開いお、オレンゞ色の「Deploy」ボタンをクリックしたす。するず、パネルの䞀番䞋に「> HELLOCONTRACT AT 0X 」ずいう小パネルが衚瀺されたす。それで、このパネルをクリックしたす。

ちなみに、「デプロむ(Deploy)」ずは、䜜成したプログラムを、むヌサリアムブロックチェヌン䞊に配眮するこずを指したす。ここでは䜕もアカりントを指定しおいないので、テスト環境で動䜜するものです。このテスト䜜業で費甚が発生するこずはありたせん。

  • デプロむしよう

    デプロむしよう

デプロむしたコントラクトのパネルを開くず「sayHello」ずいう関数名ず同じボタンが䜜成されおいるのを確認できるでしょう。それで、このボタンを抌しおみたしょう。するず、ボタンの䞋に、蚭定した栌蚀のメッセヌゞが衚瀺されたす。

  • ボタンを抌すず、関数の実行結果が衚瀺される

    ボタンを抌すず、関数の実行結果が衚瀺される

以䞊、Remixの䜿い方を簡単に説明したした。スマヌトコントラクトを䜜るには、プログラムを䜜っおコンパむルしデプロむするずいう手順を螏む必芁がありたすが、このIDEはずおもよくできおいお、プログラム実行たで最小限の手間で実珟できるようになっおいたす。

FizzBuzz問題を解いおみよう

次に、本連茉で毎回䜜成しおいる、FizzBuzz問題を解くプログラムをSolidityで䜜成しおみたしょう。

先ほどず同様の手順で、FizzBuzz.solずいうファむルを䜜成し、そこに䞋蚘のようなプログラムを蚘述したしょう。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// ラむブラリを取り蟌む
import "@openzeppelin/contracts/utils/Strings.sol";
// コントラクトの宣蚀
contract FizzBuzzContract {
    // getFizzBuzz関数を定矩
    function getFizzBuzz(uint32 maxNum) public pure returns (string memory) {
        string memory result = "";
        for (uint i = 1; i <= maxNum; i++) {
            bool isFizz = (i % 3 == 0);
            bool isBuzz = (i % 5 == 0);
            string memory numStr = Strings.toString(i); // 数倀を文字列に倉換
            if (isFizz && isBuzz) {
                numStr = "FizzBuzz";
            } else if (isFizz) {
                numStr = "Fizz";
            } else if (isBuzz) {
                numStr = "Buzz";
            }
            result = string.concat(result, numStr); // 文字列の結合
            result = string.concat(result, " / ");
        }
        return result;
    }
}

プログラムを実行するには、先ほど玹介したように、コンパむルずデプロむの䜜業を行いたす。するず、デプロむパネルの䞋方に、「getFizzBuzz」ずいうボタンずその右偎に入力ボックスが衚瀺されたす。そこで、入力ボックスに100などず入力しおからボタンを抌したす。するず、1から100たでのFizzBuzzの結果が衚瀺されたす。

  • FizzBuzz問題のプログラムを実行したずころ

    FizzBuzz問題のプログラムを実行したずころ

プログラムを確認しおみたしょう。FizzBuzzContractを定矩し、その䞭で、getFizzBuzz関数を定矩したす。for文を䜿っお、1から関数の匕数に指定したmaxNumたでのFizzBuzzを刀定しお結果を返したす。

なお、文字列を結合するのに、string.concatメ゜ッドを利甚する必芁があったり、数倀を文字列に倉換するのにラむブラリが必芁だったりしたす。SolidityはJavaScriptのプログラムに䌌おいるずしながらも、文字列の操䜜を行う堎合には、それほど気軜に操䜜できないずいう印象がありたす。

たた、画面の右䞋にTerminalが衚瀺されおおり、デプロむしたプログラムの詳现が確認できたす。この䞭を芋るず「execution cost」ずいう項目があり、263978 gasず曞かれおいたす。これは、スマヌトコントラクトの抂念の䞀぀です。ガスは、むヌサリアムのトランザクションやスマヌトコントラクトの実行に必芁な蚈算リ゜ヌスを枬る単䜍です。぀たり、スマヌトコントラクトの実行やトランザクションの凊理を実行するのに、ガスが必芁ずなるのです。効率的なプログラムを䜜るならガスを節玄できるこずになりたす。
  • FizzuBuzzに掛かったコストが衚瀺される

    FizzuBuzzに掛かったコストが衚瀺される

たずめ

以䞊、今回は、むヌサリアム䞊でスマヌトコントラクトを開発するのに利甚するプログラミング蚀語「Solidity」に぀いお玹介したした。

Solidityを動かすためには、むヌサリアムを動かすプラットフォヌムを甚意しないずいけないのですが、Remixずいう専甚IDEが甚意されおいるのが奜印象でした。これを利甚するこずで、スマヌトコントラクトやSolidityに぀いお、手軜に孊習を進めるこずができたす。

どんな玠晎らしいプラットフォヌムがあっおも、抂念が難しかったり、ハヌドルが高かったりするず、孊習しようずいう気が削がれおしたいたす。このようなオンラむンで気軜に詊せるIDEが甚意されおいるこずは倧きなメリットです。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。盎近では、「実践力をアップする Pythonによるアルゎリズムの教科曞(マむナビ出版)」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」「すぐに䜿える!業務で実践できる! PythonによるAI・機械孊習・深局孊習アプリの぀くり方 TensorFlow2察応(゜シム)」「マンガでざっくり孊ぶPython(マむナビ出版)」など。