Open7

Solidityドドド初心者(自分)向け備忘メモ

EverydayNewbieEverydayNewbie

まず一般的なWeb開発とSolidity等を用いたスマートコントラクト(DApps)開発の違い

■一般的なWeb
フロントエンド ー バックエンド ー DB

■DApps
フロントエンド ー バックエンド( ー 必要に応じてDB(これも分散型のDBあり)) ー スマートコントラクト ー ブロックチェーン

例えばReactとかモダンのフレームワークをイメージするとわかりやすいかも、
今まで書いてきたコードで、例えば「ユーザーがクリックしたときにデータ引っ張ってきて画像表示する」
とかしていたのが「ユーザーがクリックしたときに、スマートコントラクト叩いて、スマートコントラクトの結果に応じて画像を表示する」に変わる

スマートコントラクトは、要はよくあるプログラム。
ブロックチェーン上で動くプログラム。
「ブロックチェーン上で動く」の意味は、ブロックチェーン上では俗にいう仮想通貨やNFTのやり取りが発生し、スマートコントラクトは雑に言うと、それらを操作できるようなプログラム。

例えば、100トークンユーザーが支払う事でNFT一個自動生成(もちろん予め決めたパターンとかで)してユーザーのアドレスに送る。
とか、こういったトークンを受け取る(支払ってもらう)という行為や、NFTを作って渡すという行為を定義するやつ。
例えば、作られたNFTは100トークン払ってくれたユーザーのものである。と定義するコードも書いたりするし、その所持者以外そのNFTを操作できないとかもコードで書いていく。

EverydayNewbieEverydayNewbie

https://cryptozombies.io/jp/course
あ、その前に、あれこれスマートコントラクトの学習記事や本を読む前に、
CryptoZombies触れてみたほうが良いかも
自分はオライリーのスマートコントラクト開発から入ったけど、CryptoZombiesのほうが断然入門者、初心者向きだった。
オライリーの方は、どちらかと言うと入門者向けに見えてある程度Solidity理解あったほうがスムーズ。
※てかテスト駆動開発とかいきなりやり始めるし、未経験の人からすると、このコード、フレームワーク、ツールはどれ用?のやつ?って最初混乱すると思う。

EverydayNewbieEverydayNewbie

ブロックチェーン上のプログラムの実行環境には大きく2つある。
EVMとWASM。
EVMが俗に言うイーサリアムの実行環境で、EVM上で動くものを書くときにはSolidityが必要。
WASMは最近どんどん話題性が高まっているウェブアッセンブリーというやつ、簡単に言うと、今まで開発経験ある人の馴染みの深い言語(RustとかRustとかRustとか、、、)でスマートコントラクトがかけるよい。というやつ。しかも速い。

今はEVMがまだまだ主流だがここ1年位でWASM(しかもRust)のプレゼンスがだいぶ高まってきた、賢人たちが言うには、将来はWASMだ!!!!
とのこと。

今から学び始めた初学者は、自分もそうだが、じゃあ初っ端からRust学んだほうが良くね?これから主流になるし、しかもRustってめちゃくちゃHOTな言語だよね!?って思い至って、Rustに手を付けようとするかも知れないけど、手を付けたが地獄。
しばらくスマートコントラクトの勉強は出来ない。と思ったほうが良いくらい、Rustは正直初学者にはハードル高い。
しかも、それでスマートコントラクトというブロックチェーン上のあれこれをするプログラムを書くわけだから余計よくわからんってなる。

自分がそうなった。

で、おすすめとしては、
まずはSolidityでしっかりスマートコントラクト開発の基礎を学ぶ(これからはWASMだ!Rustだ!と言うが、しばらくはまだSolidity行ける)

ある程度慣れてきたら、Rustに切り替える。
が良いかも。

全てが初めてだと、正直これは言語のお作法?それともそういう文法?それともスマートコントラクトのお作法?それともフレームワーク的な?と区分けして理解していく必要があるがそこが沼る可能性が高い。
Solidityはその点、スマートコントラクトのスマートコントラクトによるスマートコントラクトの言語(意味不明)なので、ハードルが低いとも言える。

EverydayNewbieEverydayNewbie

超基本的なこととして、コントラクトの所有権を明確に記載すること
自分で書くよりも
OpenZeppelinのライブラリ使おう
https://openzeppelin.com/

OpenZeppelin = スマートコントラクトのセキュアなライブラリ

EverydayNewbieEverydayNewbie

関数修飾子 modifier
正直関数修飾子って単語の意味が不明なのだが、
使い方を見ている感じ、ある関数の動きをmodifierで定義した条件?制約?で制限というか変更できる感じ

このケースの場合、modifierではオーナーしかだめ!みたいな意味を定義している
※msg.senderはもはや覚えゲー、このコントラクト?を送信した?アドレスを指す
ownerはどこかで宣言して、おそらくmsg.senderを入れているはず。

modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}
// ↑Ownableコントラクトの中身を部分的に抜き出してここに記載しているから、このままでは動かいない


contract MyContract is Ownable {
  event LaughManiacally(string laughter);

  //`onlyOwner`の使い方を確認せよ:
  function likeABoss() external onlyOwner {
    LaughManiacally("Muahahahaha");
  }
}
EverydayNewbieEverydayNewbie

関数修飾子メモメモ
■呼び出せる呼び出せない系
private : 同じコントラクト内のみから呼び出される。継承先も呼び出せない。
internal : 同じコントラクト及び継承先も呼び出せる。外からは無理。
external : むしろ同じコントラクト内では使えない。
public : 何でもOK〜

■ブロックチェーンへの影響系
view : ブロックチェーンになんの影響もありまてん。見るだけ。
pure : もはやブロックチェーン関係ありません。データをチェーンに書き込みもしないし、読み込みもしない。

EverydayNewbieEverydayNewbie

スマートコントラクトとトークンの関係
両方ともコントラクトです。
ブロックチェーン上での動きをプログラミングする→スマートコントラクトの実装
仮想通貨(トークン)のやり取りをしたい→例えばERC721(=NFT)の規格に従って作るコントラクト
みたいな感じ

コントラクトは継承することができるので、ERC721規格を定義しているコントラクトを継承し、そのコントラクトの中でERC721の規格に従ってトークンをやり取りするコーディングをする。みたいな。

ちなみにSolidityは、イメージ
Javascriptにオブジェクト志向足し合わせて、若干C言語ぽいのを混ぜた感じ
だからなんか癖がある