BTC
ETH
HTX
SOL
BNB
View Market
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

Soilidity とは何かを読む: スマート コントラクトを実装するための高レベル プログラミング言語

ChinaDeFi
特邀专栏作者
2021-12-03 09:30
この記事は約5778文字で、全文を読むには約9分かかります
Ethereum 仮想マシン用に設計されたコントラクト指向の高レベル プログラミング言語。
AI要約
展開
Ethereum 仮想マシン用に設計されたコントラクト指向の高レベル プログラミング言語。

最初のレベルのタイトル

堅牢性とは何ですか?

Solidity は、スマート コントラクトを実装するためのコントラクト指向の高レベル プログラミング言語です。 Solidity はイーサリアム仮想マシン用に設計されています。

堅牢性 = = = スマート コントラクト。

pragma solidity >=0.5.0 <0.6.0; 

contract HelloWorld { 

}

上記のコードでは、コードが 0.5 ~ 0.6 の任意のバージョンと互換性があることを考慮してバージョンを提供しています。 「HelloWorld」というコントラクトも作成しました。

最初のレベルのタイトル

状態変数と整数

contract Example { 

// This will be stored permanently in the blockchain 

uint myUnsignedInteger = 100; 

string name = "vivek"

}

Uint データ型は符号なし整数です。負ではないはずです。

最初のレベルのタイトル

データの種類

値のタイプ:

ブール値(true/false)、整数(int/uint)、アドレス(イーサリアムアドレスのサイズ)、文字列、列挙型

参照タイプ:

最初のレベルのタイトル

Addition: x + y 

Subtraction: x — y, 

Multiplication: x * y 

Division: x / y 

Modulus / remainder: x % y (for example, 13 % 5 is 3, because if you divide 5 into 13, 3 is the remainder)

Exponential Operation uint x = 5 ** 2; // equal to 5² = 25

構造

最初のレベルのタイトル

struct Person { 

uint age; 

string name;

配列

配列

データの集まりを配列と呼びます。固定配列と動的配列の2種類。

// Array with a fixed length of 2 elements: 

uint[2] fixedArray;

// another fixed Array, can contain 5 

strings: string[5] stringArray;

// a dynamic Array — has no fixed size, can keep growing: 

uint[] dynamicArray;

構造体と配列を組み合わせることができます。構造体を作成し、構造体の配列を作成します。これは、Java のようなオブジェクト指向パラダイムにおけるオブジェクトとオブジェクトの配列に似ています。

pragma solidity >=0.5.0 <0.6.0; 

contract StudentFactory { 

  struct student { 

     string name; 

      uint roll; } student[] public students; // creates an array named students of student type objects

最初のレベルのタイトル

function eatHamburgers(string memory _name, uint _amount) public { }

関数宣言

値によるおよび参照による

eatHamburgers(“vitalik”, 100);

最初のレベルのタイトル

プライベート/パブリック機能

function _eatHamburgers(string memory _name, uint _amount) private { 

}

慣例により、プライベート関数はアンダースコアで始まります。

内部/外部キーワード

文章

外部は公共と同様です。この関数は、この関数を宣言する連絡先を除くすべての契約によって呼び出すことができます。

最初のレベルのタイトル

関数での戻り値

function sayHi() public view/pure returns (string memory) { 

return “Hi”;

}

これらの関数は、pure/view としてマークできます。渡されたデータにアクセスすることさえできない関数を純粋としてマークします。関数がデータを変更せず、データを表示するだけの場合、その関数はビューとしてマークされます。

最初のレベルのタイトル

イベント

uint8 a = 5; 

uint b = 6;

// line below throws an error because a*b returns a uint, not uint8: 

uint8 c = a * b;

// we have to typecast b as a uint8 to make it work: 

uint8 c = a * uint8(b);

イベント

文章

// declare the event 

event NotifyOnFrontend(uint x); 

function add(uint _x, uint _y) public returns (uint) { 

  uint result = _x + _y; 

//fire an event to let the frontend know the function was called 

  emit NotifyOnFrontend(result); 

  return result; 

}

最初のレベルのタイトル

YourContract.NotifyOnFrontend(function(error, result) { 

// do something with result 

})

地図

地図

mapping (address => uint) public accountBalance;

これは、配列や構造体などの整理されたデータを保存するもう 1 つの方法です

これを使用して、ブロックチェーンに複数のオブジェクト (データ) を保存できます。チェックの例は次のとおりです。

例:

contract Example { 

    struct UserInfo { 

          unit age; string dob;

    mapping(string => UserInfo) allusers;

function setUserInfo(string _name, uint _age, string _dob) public {
   allusers[_name].age = _age;
   allusers[_name].dob = _dob;
}

function getUserInfo(string name) public view returns(uint, string) { 

     return (allusers[name].age, allusers[_name].dob); 

 } 

}

例:

setuserInfo("Vivek",26, 25/05/1995) setuserInfo("Supu", 23, 01/09/1998)

これらの値を取得するには、名前を渡すだけです。

getUserInfo("Vivek"); // 26 25/05/1995 

getuserInfo("Supu"); // 24 01/09/1998

最初のレベルのタイトル

これらの変数は、msg.sender などのすべての関数で使用できます。私たちが作成する Solidity プログラムは、所有者によって呼び出される必要があります。送信者のアドレスは msg.sender グローバル変数に保存されます。

require

最初のレベルのタイトル

function sayHi(string memory name) public returns (string memory) { /Compares if _name equals “Vivek” Throws an error and exits if not true. Solidity doesn’t have native string comparison, so we compare their keccak256 hashes to see if the strings are equaq / 

require(keccak256(abi.encodePacked(name)) == keccak256(abi.encodePacked(“Vivek”)));

// If it’s true, proceed with the function: 

return “Hi!”;

sayHi(“Vivek”) // executes successfully 

sayHi(“Supu”) // throws an error

したがって、require は、関数を実行する前に特定の条件が true である必要があることを検証するのに非常に役立ちます。

継承する

場合によっては、非常に長いコントラクトを作成する代わりに、コード ロジックを複数のコントラクトに分割してコードを整理した方がよい場合があります。

contract Animal {

   function catchphrase() public returns (string memory) { 

      return “Animal”;

  } 

} contract Cat is Animal {

   function anotherCatchphrase() public returns (string memory) { 

    return “Cat is an Animal”;

}

}

import

最初のレベルのタイトル

これは通常、Solidity プロジェクトでコードベースが処理される長さです。

最初のレベルのタイトル

ストレージとは、ブロックチェーン上に永続的に保存される変数を指します。メモリ変数は一時的なもので、コントラクトへの外部関数呼び出しの間に削除されます。コンピュータのハードドライブとメモリのようなものだと考えてください。

最初のレベルのタイトル

ブロックチェーンネットワーク内の他のコントラクトと対話する

これについては別の記事を書きます。それでは、短くしてください。

contract GetNumber { 

   function getNum(uint _num) public returns(uint){ 

     return _num; 

}

他のコントラクトと対話するために、オブジェクトのようなインターフェイスを宣言します。コントラクトを作成し、その中で別のコントラクトから呼び出したり使用したりする関数を宣言します。関数は単なるスケルトンであり、本体は含まれません。

contract NumberInterface { 

  function getNum(uint _num) public returns(uint); 

}

コントラクトがあり、上記の getNum 関数を使用するとします。これを行うには、プロジェクト内にコントラクトを作成し、getNum 関数スケルトン (関数本体なし) を宣言します。

コントラクトがイーサリアムにデプロイされると、コントラクトは不変になります。つまり、変更できません。コントラクトにデプロイされた最初のコードは、ブロックチェーン上に永久に残ります。これが、Solidity においてセキュリティが非常に重要である理由の 1 つです。コントラクト コードにバグがある場合、後でパッチを適用する方法はありません。修正を加えた別のスマート コントラクト アドレスの使用を開始するようにユーザーに指示する必要があります。

最初のレベルのタイトル

関数修飾子

これは、他のユーザーが契約を破るのを防ぎながら、DApp の重要な部分を更新するのに役立ちます。私が扱ったユースケースの 1 つは、ユースケースを実行する前にステートメントを検証する場合です。

gas

ユーザーはイーサリアムネットワーク上で契約を実行するためにガス料金を支払います。ガスはエーテル (イーサリアムの通貨) で計算されます。関数の総ガス コストは、すべての個別の操作の総ガス コストと等しくなります。

最初のレベルのタイトル

ストレージの詳細

ストレージ メモリはブロックチェーンに永続的に書き込まれます。世界中の何千ものノードがこのデータをハードドライブに保存する必要があり、ブロックチェーンが成長するにつれて、このデータの量は時間の経過とともに増加します。したがって、これを行うには代償が伴います。

したがって、データが永続的に保存されないようにできる限りメモリ タイプを使用し、コストを節約することをお勧めします。 Solidity では、ループはストレージを使用するよりも安価になります。したがって、for ループではできるだけメモリを使用します。 for ループは計算コストが高いため、これは Java、Python などの言語で行われることとは正反対です。

最初のレベルのタイトル

構文は Javascript に似ています。

for (uint i = 1; i <= 10; i++) { // body }

修飾子に対処する

文章

支払い機能は、Solidity と Ethereum を非常に優れたものにしているものの一部であり、Ether を受け取ることができる特別なタイプの機能です。通常の Web サーバーで API 関数を呼び出す場合、関数の呼び出しと同時にドルを送信することはできません。また、ビットコインを送信することもできません。

これにより、関数を実行するためにコントラクトに料金を支払うなど、非常に興味深いロジックが可能になります。

知らせ:

最初のレベルのタイトル

トークン

基本的に、トークンは誰がどのくらいの量のトークンを所有しているかを記録する単なる契約であり、ユーザーが自分のトークンを他のアドレスに転送できるようにするいくつかの機能があります。

最初のレベルのタイトル

Assert は require に似ており、false の場合はエラーをスローします。 assert と require の違いは、require は関数が失敗したときにユーザーの残りのガスを返金しますが、assert は返金しないことです。

Metamask

これは Chrome および Firefox 用のブラウザ拡張機能で、ユーザーが Ethereum アカウントと秘密鍵を安全に管理し、これらのアカウントを使用して Web3.js を使用して Web サイトと対話できるようにします。

最初のレベルのタイトル

最初のレベルのタイトル

Web3Js

文章

Source:https://medium.com/coinmonks/learn-all-about-solidity-ethereum-45d709c4de77

ETH
スマートコントラクト
Odaily公式コミュニティへの参加を歓迎します
購読グループ
https://t.me/Odaily_News
チャットグループ
https://t.me/Odaily_CryptoPunk
公式アカウント
https://twitter.com/OdailyChina
チャットグループ
https://t.me/Odaily_CryptoPunk