🚀

Solidityを"完全に理解した"気になるZenn

2023/05/31に公開

Solidityとは?

Solidity(ソリディティ)とは、Ethereum(イーサリアム)の共同創設者である、ギャビン・ウッドが、ブロックチェーン上でのデータの処理を行う、EVM(Ethereum Virtual Machine)と呼ばれる仮想マシン上で動作するチューリング完全な高水準言語として開発されたものです。

EVM上で動く他の言語は?

Solidityの他に、「Vyper」、「Yul」、「Fe」があります。

Solidity Vyper Fe Yul
言語タイプ 高水準 高水準 高水準 中間
類似言語 JavaScript Python Python -
発案者 ギャビン・ウッド 不明 クリストフ・バーグドルフ 不明
チューリング 完全 不完全 不明 不明

参考文献:スマートコントラクト言語
https://ethereum.org/ja/developers/docs/smart-contracts/languages/

Solidityを書くのにおすすめのEditer

  • Remix (初心者/デプロイしてすぐ関数を実行したいユーザーにおすすめ)
  • VScode (中級者/CIでコントラクトを操作したいユーザーにおすすめ)

Hello World

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

contract hello {
    function helloWorld() public returns(string memory){
        return "Hello World!";
    }
}

(解説)先頭2行の謎の呪文

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

1行目がライセンス表記
2行目がSolidityのバージョン制限
今回の場合は、ライセンスが「Unlicense」なのでライセンス無しの、Solidityのバージョンが0.8.18以上であることがわかります。

(解説)他言語のクラスに相当するコントラクト

contract hello {
//中身
}

コントラクトの指定は、他の言語のいうところのclassに対応するイメージです。

(解説)関数

function helloWorld() public returns(string memory){
    return "Hello World!";
}

fuction {関数名}() {関数修飾子} returns({返り値の型} {..ext}){}
のような形で設定していきます。

主な関数修飾子

  • public : コントラクト内とコントラクト外から呼び出し可能
  • private : コントラクト内のみ呼び出し可能
  • external: コントラクト外のみ呼び出し可能
  • view: 読み込みのみ
  • pure: 読み込みも書き込みもできない

またよく使うSolidityにおける型

  • address
  • uint256
  • bool
  • string

Name Recorder

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;

contract NameRecorder {
    string name;

    constructor(string memory _newName){
        name = _newName;
    }

    function setName(string memory _newName) external {
        name = _newName;
    }

    function getName() external view returns(string memory) {
        return name;
    }
}

(解説)デプロイするタイミングで実行されるconstructor

constructor(string memory _newName){
    name = _newName;
}

constructorはコントラクトのデプロイ時に実行される処理です。

(解説)外部からしか呼ばれないexternal関数

function setName(string memory _newName) external {
    name = _newName;
}

このset関数はstring型の_newName変数(関数内で完結する際は前にアンダーバーを入れるのが慣例)を、コントラクト変数であるname変数に代入する処理が行われる。外部からしか呼ばれない想定なので、関数修飾子にexternalをつけている。

(解説)読み込みしか使わないview関数

function getName() external view returns(string memory) {
    return name;
}

NameRecorderコントラクトをブロックチェーン上で実行する

事前準備

  • metamaskは導入済み(入ってない人はこちら)
  • metamaskでテストネットが見れる(テストネットが見えない人はこちら)
  • mumbaiでmaticを持ってる(持ってない人はこちら)

1.Remix上でデプロイ

①デプロイの画面で「inject Provider Metamask」に変更
②コンストラクターの引数を追加して「transact」ボタンを押す
③Metamask上のUIで実行

④作成したコントラクトアドレスをコピー

2.polyscan上でverify

以下にアクセス
https://mumbai.polygonscan.com/address/ + 作成したコントラクトのアドレス

①タブから「contract」を選択
②「Verify and Publish」を選択

③画像と同じように設定項目を入力して「Continue」を選択

④デプロイしたSolidityのコードを入力
⑤Constructorが既に入っていれば、何もせず、入っていない場合は、ABI-encoderを用いて、追加
⑥ロボット判定を通り
⑦Verify

3.polyscanからのコントラクトの実行

読み込み

書き込み

これでいつでも誰でも、デプロイしたコントラクトの名前を変更できるようになりました。

Solidityの活用

Solidityは以下のようなところで用いられます。

  • NFTの発行
  • FT(仮想通貨)の発行
  • Defiの開発
  • Gamefiの開発
  • 分散型データベースの開発

に対して、今回はフロントエンドをRemixやPolyscanに任せて、Solidityを用いた名前を変更するDappsを開発したようなイメージです。これらを改良することで、大規模なサービスやプロジェクトを作ることができると思います。

Discussion