Solidityチュートリアル

Solidityは、イーサリアムブロックチェーン上でdApp(分散型アプリケーション)を開発するためのオブジェクト指向の高級言語です。.

ブロックチェーンは、ノードと呼ばれるコンピューターのピアツーピアネットワークであり、ネットワーク内のすべてのデータとコードを共有します。.

したがって、ブロックチェーンに接続されているデバイスの場合、ネットワーク内のノードであり、ネットワーク内の他のすべてのコンピューターノードと通信します(ローカルマシンでEthereumノードをセットアップする方法については後のチュートリアルで説明します).

これで、ブロックチェーン上のすべてのデータとコードのコピーができました。中央サーバーはもう必要ありません.

イーサリアムとは?

最も単純なイーサリアムは、開発者が分散型アプリケーションを構築および展開できるようにするブロックチェーンテクノロジーに基づくオープンソフトウェアプラットフォームです。.

ビットコインブロックチェーンはデジタル通貨(ビットコイン)の所有権を追跡するために使用されますが、イーサリアムブロックチェーンは分散型アプリケーションのコードの実行に焦点を当てています.

イーサリアムブロックチェーンでは、ビットコインをマイニングする代わりに、マイナーはネットワークに燃料を供給する暗号トークンの一種であるイーサリアムを獲得するために働きます。取引可能な暗号通貨に加えて、Etherはアプリケーション開発者がEthereumネットワーク上の取引手数料とサービスの支払いにも使用します.

ブロックにトランザクションを含めるために鉱夫の料金を支払うために使用される2番目のタイプのトークンがあります。これはガスと呼ばれ、スマートコントラクトの実行ごとに、鉱夫にガスを入れるように誘うために、一定量のガスを一緒に送信する必要がありますブロックチェーン.

基本から始める

Solidityのコードは契約にカプセル化されています.

イーサリアムブロックチェーンを使用すると、スマートコントラクトと呼ばれるものを使用してブロックチェーン上のイーサリアム仮想マシン(EVM)でコードを実行できます.

スマートコントラクトは、アプリケーションのすべてのビジネスロジックが存在する場所です。すべての変数と関数はコントラクトに属し、これがすべてのプロジェクトの開始点になります。.

スマートコンタクトは、JavascriptとCの組み合わせのように見えるSolidityと呼ばれるプログラミング言語で書かれています.

リミックスIDE

Remixは、Solidityスマートコントラクトを作成し、それらをデプロイして実行できるオンラインツールです。.

に行くだけ https://remix.ethereum.org ブラウザからコーディングを開始できます.

ご覧のとおり、SolidityとVyperのどちらかを選択できます。どちらもスマートコントラクトを作成するための言語であり、VyperはPythonに似ており、Solidityはjavascriptに似ています.

どちらも、JavascriptやTypescriptのように、EVMバイトコードにコンパイルできます。 Solidityを選択しています.

左側にはファイルエクスプローラーがあります。デフォルトでは、基本的な構文をデモするためだけに2つの.solファイルがあります(ballot.solはスマートコントラクト、ballot_test.solはそのスマートコントラクトをテストするためのスクリプトです).

そのプラスボタンをクリックするだけで、最初のスマートコントラクトのコーディングを開始できます.

すべてのSolidityソースコードは「バージョンプラグマ」で始まる必要があります—このコードが使用するSolidityコンパイラのバージョンの宣言です。これは、コードを壊す可能性のある変更を導入する可能性のある将来のコンパイラバージョンの問題を防ぐためです。.

次のようになります。

プラグマの堅牢性^ 0.4.25;

(0.4.25を超えるSolidityバージョンの場合)

または

プラグマの堅牢性 >= 0.5.0 < 0.6.0;

(Solidityバージョンが0.5.0〜0.6.0の場合)

次に、予約語を入力して契約を作成します 契約する .solファイルの名前(コントラクト名をファイルの名前と一致させることが重要です。理由については後で説明します)。私たちの場合には,

契約MyFirstContract {

}

コンパイルしましょう。左側のコンパイルタブに移動して、大きなコンパイルボタンをクリックするだけです。コードに問題がある場合は、ここにエラーと警告が表示されます(Solidityに思いやりを持ってください、それはまだ「若い言語」です).

現在の契約では、実際には何もしていないため、すべて問題ありません。.

今、私はあなたに何かを示すためだけに意図的にエラーを生成します。そのドロップダウンメニューからコンパイラを手動で選択できます.

たとえば、0.4.26バージョンを選択しましょう。ここで、再度コンパイルします。これで、「コンパイラがまだロードされていません」というエラーが表示されます。.

これは、0.5.0を超えるバージョンのコンパイラで動作するようにプラグマで指定したためです。コンパイラのバージョンをもう一度変更するだけで、エラーはなくなります.

さて、今すぐコーディングしましょう!

構文を理解するために、単純な「Hello world」コードから始めて、関数を取得および設定します。.

Solidityの意味でのコントラクトは、Ethereumブロックチェーンの特定のアドレスに存在するコード(その機能)とデータ(その状態)のコレクションです。.

まず、たとえばメッセージと呼ばれる状態変数を定義しましょう。そのタイプは文字列になります.

get関数は変数メッセージの値を返し、set関数は変数メッセージに新しい値を割り当てます.

関数の入力方法?

まず、予約語 関数 次に、特定の関数とパラメーターの名前、その後 .

関数myFunction()は(bool){を返します

trueを返します。

}

機能はすることができます 公衆 または 民間. 関数がパブリックの場合、コントラクト外で呼び出すことができます。関数がプライベートの場合、スコープは制限されており、現在のコントラクトからのみ呼び出すことができます(たとえば、他の関数から).

すべての関数可視性指定子のリストは次のとおりです。

  • 公衆:外部および内部に表示されます(ストレージ/状態変数のゲッター関数を作成します)
  • 民間:現在の契約でのみ表示されます
  • 外部:外部からのみ表示(関数の場合のみ)–つまり、メッセージ呼び出しのみ(this.func経由)
  • 内部:内部でのみ表示

機能はすることができます ピュア, 見る, または 支払い可能. 関数がブロックチェーンにデータを書き込まない場合、ビュー関数はガスを消費しないため、ビューにすることを強くお勧めします.

すべての関数修飾子のリストは次のとおりです(状態変数、イベント、イベント引数の修飾子もありますが、後で説明します)。

  • ピュア:状態の変更またはアクセスを禁止します.
  • 見る:状態の変更を禁止します.
  • 支払い可能:通話と一緒にEtherを受信できるようにします.

関数が値を返す場合は、予約語で指定する必要があります 戻り値 次に、通常の角かっこで囲んで、関数が返すタイプを指定します。私たちの場合、それは文字列になります(文字列である変数メッセージを返すため)

関数が値を返さない場合は、 戻り値 ステートメント.

状態変数にアクセスするために、接頭辞は必要ありません この. 他の言語で一般的であるように.

そのため、一般的な方法は、アンダースコア構文を使用して関数の引数を記述することです。 (_メッセージ). この規則は、プライベートメソッドと変数が_で始まるJavascriptに由来します。.

明確にするために、コードはアンダースコアなしで正常に機能しますが、コードを使用するとよりクリーンになります.

予約語に気付くでしょう 記憶 私たちのコードで。メモリなしでコードを記述し、プラグマを0.5未満のバージョンに設定すると*正常に動作しますが、コンパイラを0.5以上に変更すると* EVMはコンパイルエラーを生成します.

なぜこれが起こるのですか?

さて、イーサリアム仮想マシンには、アイテムを保存できる3つの領域があります.

  • 最初は ストレージ, すべての契約状態変数が存在する場所。すべてのコントラクトには独自のストレージがあり、関数呼び出し間で永続的であり、使用するのに非常に費用がかかります.
  • 2番目は 記憶, これは一時的な値を保持するために使用されます。 (外部)関数呼び出しの間に消去され、より安価に使用できます.
  • 3つ目は スタック, これは小さなローカル変数を保持するために使用されます。ほぼ無料で使用できますが、保持できる値は限られています。.

ほとんどすべてのタイプで、使用するたびにコピーされるため、保存場所を指定できません。.

ただし、配列または構造体を操作する場合、および文字列を含む最新バージョンからも、コンパイラーはストア領域を指定するように強制します.

したがって、コードは次のようになります。

pragma solidity ^ 0.5.0;

契約MyFirstContract {

文字列メッセージ;

関数get()パブリックビューreturns(文字列メモリ){

メッセージを返します。

}

関数セット(文字列メモリ_メッセージ)public {

メッセージ= _message;

}

}

一部のSolidity開発者は、コードをよりクリーンにするために、これらの可視性指定子を別々の行に分割することに注意してください。したがって、get関数は次のように記述できます。

関数get()

公衆

見る

戻り値(文字列)

{{

メッセージを返します。

}

関数の記述方法はあなた次第です.

今すぐ契約をまとめてテストしましょう.

コンパイルするには、以下の手順を繰り返します(.solをコンパイルします ボタンまたは cmd / ctrl + S キーボードから、それは自動的に再コンパイルされます)

実際にどのように機能するかを確認するには(コンパイルしてもエラーが発生しない場合)、コントラクトをデプロイする必要があります.

これを行うには、左からその[Deployment]タブに移動し、環境の場合は[JavaScriptVM]を選択して、[Deploy]ボタンをクリックします。.

デプロイ後、コントラクトからメソッドを確認できるようになりました。画面のその部分だけに注目しましょう.

2つのボタンがあることがわかります( & セット)2つのパブリック関数用。それらのいずれかがプライベートである場合、ここでは表示されません.

getボタンをクリックすると、EVMはget関数を実行します.

それがどのように機能したか見てみましょう.

空の文字列があります。良くない、ひどいではない。しかし、なぜ?そもそもメッセージ変数を初期化していないからです.

ちょっと一息。リミックスターミナルを紹介してほしい。コードエディタの下にあり、ここですべてのトランザクションを追跡して、正常に実行されたかどうかを確認したり、デバッグしたり、詳細(トランザクションハッシュなど)を確認したりできます。.

今のところ、2つの成功したトランザクションがあります。 1つは契約の展開であり、コストがかかります(ただし、心配しないでください。現在はすべてが仮想化されています)。2つ目はCall of our 見る 関数.

では、戻ってみましょう。ここで集合関数を呼び出すとどうなりますか?

関数を実行するには、引数_message(「HelloWorld」など)を渡し、トランザクションボタンを押す必要があります。ターミナルでトランザクションの成功を追跡できます.

それでは、get関数をもう一度呼び出しましょう。今、それは私たちのメッセージを返します.

コードにいくつかの改善を加えましょう。変数メッセージを初期化しませんでした。これをやろう.

契約MyFirstContract {

文字列メッセージ= "こんにちは世界!";

関数get()パブリックビューreturns(文字列メモリ){

メッセージを返します。

}

関数セット(文字列メモリ_メッセージ)public {

メッセージ= _message;

}

}

メッセージが「Helloworld!」になり、get関数を初めて呼び出したときに、空の文字列が返されないことに注意してください。.

これをテストするには、コントラクトをコンパイルする必要があります(cmd / ctrl + S).

次に、それを再度デプロイします。 (変更を加えたため)コントラクトの新しいインスタンスを作成し、それをブロックチェーンで公開する必要があります.

以前のバージョンをエディターから(もちろん仮想ブロックチェーンからではなく)削除し、[デプロイ]ボタンをもう一度押します。今すぐget関数を呼び出しましょう.

いいね!今すぐ集合関数を呼び出しましょう.

そしてまた取得.

涼しい.

メッセージを 絶え間ない.

今の私たちのコード:

プラグマの堅牢性^ 0.5.0;

契約MyFirstContract {

文字列定数メッセージ= "こんにちは世界!";

関数get()パブリックビューreturns(文字列メモリ){

メッセージを返します。

}

関数セット(文字列メモリ_メッセージ)public {

メッセージ= _message;

}

}

コンパイルしようとすると、集合関数でエラーが発生します。これは、定数の値を変更できないためです.

私たちは今その定数を取り除くでしょう.

このように変数を初期化することはエラーではありませんが、コンストラクターで初期化する方がはるかに優れています。 Solidityでコンストラクターを作成するには、次のようにします。

コンストラクター()public {

//何かをする…

}

コンストラクターは、スマートコントラクトのデプロイ中に呼び出されるもう1つの関数です。私たちのコードは少し異なって見えますが、同じように機能します.

プラグマの堅牢性^ 0.5.0;

契約MyFirstContract {

文字列メッセージ;

コンストラクター()public {

メッセージ= "こんにちは世界!";

}

関数get()パブリックビューreturns(文字列メモリ){

メッセージを返します。

}

関数セット(文字列メモリ_メッセージ)public {

メッセージ= _message;

}

}

必要に応じて、再度コンパイルしてテストすることができます.

最後に、状態変数の可視性を変更できます。状態変数を作成する場合 公衆 つまり、契約外から価値を主張できるということです.

Solidityは、パブリック状態変数ごとに、通常の関数(getter関数のようなもの)として呼び出すことができる同じ名前のメソッドを作成します。.

つまり、get関数を削除して、変数メッセージを次のように宣言するだけです。 公衆, 私たちのコードは同じように機能し、はるかにクリーンになり、メインネットワークに1日デプロイするのにかかるコストが少なくなります.

コードが大きいほど、実行に必要なガスが多くなり、dAppの実行コストが増加します。.

スマートコントラクトを開発するときは、次のことを行う必要があります。

  • 効率的 –消費されるガス量は低くする必要があります
  • 正確 –スマートコントラクトをデプロイすると、変更することはできず、24時間年中無休で公開されます。コードのすべての行(バグを見つけてdAppを悪用できるハッカーを想像してください)

今日の最終的なコードは次のようになります。

プラグマの堅牢性^ 0.5.0;

契約MyFirstContract {

文字列パブリックメッセージ;

コンストラクター()public {

メッセージ= "こんにちは世界!";

}

関数セット(文字列メモリ_メッセージ)public {

メッセージ= _message;

}

}

デプロイしてテストしてみましょう.

そのメッセージボタンが表示されます。状態変数メッセージが公開されているために作成されています.

これを呼び出すと、コンストラクターによって初期化されている値(「Helloworld!」)が返されるはずです。.

いいね。集合関数を今すぐテストしましょう.

Solidityを学ぶ方法?

Solidity自体は非常に単純な言語ですが、Solidityの優れた開発者になるには、Ethereumですべてがどのように機能するかを理解する必要があります。.

  • Solidityは、ECMAScript(javascript)と同様の構文を持つ高級プログラミング言語です。.
  • EVMバイトコードにコンパイルされます。これはEVMだけが理解できるものです。.
  • コンパイラはSolcと呼ばれます.

この単純な契約を例として取り上げましょう。

プラグマの堅牢性^ 0.5.0;

契約例{

uint a = 10 + 5;

}

そのような単純な。それではコンパイルしましょう。ターミナルの契約詳細に行くと、たくさんの情報を見ることができます.

この場合、コンパイルされたコードは次のとおりです。

0x6080604052600f600055348015601457600080fd5b5060358060226000396000f3fe6080604052600080fdfea165627a7a72305820bf75c57b7d8745a79baee513ead21a9eb8b075896f8e4c591c8916574d317c750029

これらの長い値は、バイトコードとも呼ばれる最終コントラクトの16進表現です。 EVMはバイトコードのみを理解します.

しかし、何か問題が発生した場合、たとえばバイトコードをデバッグできないなどのエラーが発生します。.

オペコード

バイトコードより上の言語はオペコードです。オペコードは低水準プログラミング言語です。 SolidityとOpcodeは、たとえばCやアセンブリ言語に似ています.

したがって、失敗したトランザクションをデバッグする必要がある場合は、オペコードをデバッグします.

Solidityとデバッグについて知っておくべきことの1つは、非常に難しいことです。しかし不可能ではないので、それに飛び込みましょう.

これは、サンプルコントラクトのオペコードです。

0プッシュ160

02 PUSH1 40

04 MSTORE

05 PUSH1 0f

07 PUSH1 00

09ストア

10 CALLVALUE

11 DUP1

12 ISZERO

13 PUSH1 14

15ジャンピ

16 PUSH1 00

18 DUP1

19リバート

20ジャンプデスト

21 POP

22 PUSH1 35

24 DUP1

25 PUSH1 22

27 PUSH1 00

29コードコピー

30 PUSH1 00

32リターン

33無効

34 PUSH1 80

36 PUSH1 40

38 MSTORE

39 PUSH1 00

41 DUP1

42リバート

43無効

44 LOG1

45 PUSH6 627a7a723058

52 SHA3

53無効

54 PUSH22 c57b7d8745a79baee513ead21a9eb8b075896f8e4c59

77無効

78 DUP10

79 AND

80ジャンピ

81無効

82バランス

83 PUSH29 750029

オペコードは、プログラムの低レベルの人間が読める形式の命令です。すべてのオペコードには、16進数の対応物があります。 MSTORE です 0x52.

EVMはスタックマシンです。これは、LIFO構造(後入れ先出し)に基づいています。簡単にするために、電子レンジでパンのスライスを積み上げることを想像してください。最後に入れたスライスが最初に取り出したスライスです.

通常の算術では、方程式を次のように記述します。

10 + 2 * 2

足し算の前に掛け算をするので答えは14です.

スタックマシンでは、LIFOの原則で動作します。

2 2 * 10 +

つまり、最初に2をスタックに入れ、次に2を入れ、次に乗算アクションを入れます。その結果、スタックの上に4が置かれます。次に、4の上に10の数字を追加し、最終的に2つの数字を足し合わせます。スタックの最終値は14になります.

スタックにデータを置く行為はPUSH命令と呼ばれ、スタックからデータを削除する行為はPOP命令と呼ばれます。上記の例で見られる最も一般的なオペコードはPUSH1であることは明らかです。これは、1バイトのデータをスタックに入れることを意味します。.

したがって、この命令:

PUSH1 0x60

「0x60」の1バイト値をスタックに入れることを意味します。偶然にも、PUSH1の16進値も「0x60」です。必須ではない「0x」を削除すると、このロジックをバイトコードで「6060」と書くことができます。.

もう少し進んでみましょう.

PUSH1 0x60 PUSH1 0x40 MSTORE

MSTORE(0x52)は2つの入力を受け取り、出力を生成しません。上記のオペコードは次のことを意味します。

PUSH1(0x60):0x60をスタックに入れます.

PUSH1(0x40):0x40をスタックに入れます.

MSTORE(0x52):0x60のメモリスペースを割り当て、0x40の位置に移動します.

結果のバイトコードは次のとおりです。

6060604052

実際、このマジックナンバー「6060604052」は、スマートコントラクトがブートストラップする方法であるため、ソリディティバイトコードの先頭に常に表示されます。.

さらに複雑なことに、0x40または0x60は実数40または60として解釈できません。これらは16進数であるため、40は実際には64(16¹x4)に相当し、60は10進数で96(16¹x6)に相当します。.

つまり、「PUSH1 0x60 PUSH1 0x40 MSTORE」が実行しているのは、96バイトのメモリを割り当て、ポインタを64バイトの先頭に移動することです。スクラッチスペース用に64バイト、一時メモリストレージ用に32バイトになりました。.

EVMには、データを保存する場所が3つあります。まず、スタック内。上記の例のように、PUSHオペコードを使用してデータをそこに保存しました.

次に、MSTOREオペコードを使用するメモリ(RAM)で、最後に、SSTOREを使用してデータを格納するディスクストレージです。データをストレージに保存するために必要なガスは最も高価であり、データをスタックに保存することは最も安価です.

ここで、このチュートリアルのSolidityコードに戻り、予約語について学んだことを要約します。 記憶 たとえば、コンパイラが文字列の格納方法を指定するように強制する方法.

バイトコードといくつかのオペコードの基本についてのみ説明しました.

スマートコントラクトの作成を開始するためにオペコードを知る必要はありません!

一方、EVMエラー処理はまだ非常に原始的であり、問​​題が発生したときにオペコードを確認するのに便利です。.

結論

この最初のレッスンには、実際のコーディングよりも少し理論がありますが、初心者にとって、イーサリアムでどのように機能するかを知ることは非常に重要です。次のチュートリアルでは、さらに興味深いコードを記述し、Ethereumブロックチェーンに独自のトークンをデプロイする方法を学びます。.

それまで &#128075;

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me