特定用途に特化したプログラミング言語というのは使い勝手が良く、その分野で独占的な地位を確立できます。今回紹介する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のプログラムをコンパイルしたりデプロイしたりと手軽にスマートコントラクトの開発が可能となります。
それで、次の画面のように、画面左側の上から二番目にあるアイコン(図1)をクリックして「File Explorer」を表示しましょう。そして、(図2)をクリックして(図3)の「- create new workspace -」をクリックします。
続いて、ワークスペースのテンプレートを選ぶ画面が表示されます。今回は、Solidityでプログラムを作ってテストするだけなので、Blankを選んで[OK]ボタンを押しましょう。
そして、File Explorerのファイルアイコン(次の画面)をクリックして、新規ファイルを作成します。ここでは、格言を表示するだけのプログラムを作りますので、「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の結果が表示されます。
プログラムを確認してみましょう。FizzBuzzContractを定義し、その中で、getFizzBuzz関数を定義します。for文を使って、1から関数の引数に指定したmaxNumまでのFizzBuzzを判定して結果を返します。
なお、文字列を結合するのに、string.concatメソッドを利用する必要があったり、数値を文字列に変換するのにライブラリが必要だったりします。SolidityはJavaScriptのプログラムに似ているとしながらも、文字列の操作を行う場合には、それほど気軽に操作できないという印象があります。