Solidityを"完全に理解した"気になるZenn
Solidityとは?
Solidity(ソリディティ)とは、Ethereum(イーサリアム)の共同創設者である、ギャビン・ウッドが、ブロックチェーン上でのデータの処理を行う、EVM(Ethereum Virtual Machine)と呼ばれる仮想マシン上で動作するチューリング完全な高水準言語として開発されたものです。
EVM上で動く他の言語は?
Solidityの他に、「Vyper」、「Yul」、「Fe」があります。
Solidity | Vyper | Fe | Yul | |
---|---|---|---|---|
言語タイプ | 高水準 | 高水準 | 高水準 | 中間 |
類似言語 | JavaScript | Python | Python | - |
発案者 | ギャビン・ウッド | 不明 | クリストフ・バーグドルフ | 不明 |
チューリング | 完全 | 不完全 | 不明 | 不明 |
参考文献:スマートコントラクト言語
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コントラクトをブロックチェーン上で実行する
事前準備
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