エンティティ構文の概要


SPDX License Identifier

  • インテリジェント契約の信頼性を高め、著作権の問題を解消するために、エンティティコードの上部にSPDXライセンスを明記してください.
  • // SPDX-License-Identifier: MIT
  • https://spdx.org/licenses/SPDXライセンスリスト.
  • pragmaキーワード


  • 特定のコンパイラのバージョンをマークします.

  • pragmaキーワードはすべてのソースファイルにある必要があります.

  • 他のファイルをインポートしてもpragmaは自動的にロードされないため、単独で作成する必要があります.

  • バージョンルールはnpm構文と同じです.

  • 特定バージョン以上のpragmaを使用する場合、^が追加されます.
  • pragma solidity 0.8.7; 
    pragma solidity ^0.8.7; // 0.8.7 버전 이상

    import

  • JavaScriptと同じです.
  • import 'file' as 'good' from 'file';
    import {func1, func2} from 'file'

    見積の作成

    contract name {
    	...
    }

    変数データ型


  • デフォルトのデータ型にはbool、int、uint、固定バイト配列、addressオブジェクトが含まれます.

  • 記号(+/-)がある場合はuintを使用してintを表し、記号を持たない0以上の値はuintを使用します.

  • intとuintの後にuint 8のような数値を8の倍数として追加し、変数のサイズをビット単位で指定できます.
    🍇 int 16は、−32768〜32767の間の整数を表すことができる.
    🍇 uint 16は、0〜65535の間の整数を表すことができる.

  • 使用するビットが小さいほど、ガス代が低くなります.

  • 固定バイト配列は、バイト1〜32を使用し、固定サイズの配列を宣言することができる.
  • bytes2 isOn = 'on';
    isOn[0]; // 'o'
    isOn[1]; // 'n'

  • アドレスオブジェクトはOxで始まり、最大40ビットの16進数からなる文字列を値とします.

  • アドレスオブジェクトのサイズは20バイトです.

  • アドレスは、主に勘定科目残高を返す関数balance()関数と、イーサを転送するtransfere()関数で使用されます.

  • solidity 0.8版以上でaddressは送金できないアドレス値です.
    🥩 スマート契約では、特定のアドレス値に送金するために支払う必要があります.
  • uint160 num = '임의의 값';
    address addr = address(num);
    address payable send_address = payable(addr); // 송금 가능 주소
  • 見積書を買掛住所に変換することもできます
  • contract A  {  
    	// 이더를 받을 수 있는 컨트랙트
    	constructor () payable { }
    } 
    
    address payable addr = address(A);  
    // address(A)는 adress payable 형식의 주소값을 반환한다
    contract B { 
    	// 이더를 받지 않는 컨트랙트
    	constructor () { }
    }
    
    address addr = address(B); 
    // address(B)는 adress 형식의 주소값을 반환한다
    
    address payable addr_payable = payable(addr); 
    // payable()을 사용해 address payable 형식의 주소값을 만들 수 있다.

  • 機能的には売掛金を貼ることもできます.

  • エンティティ・データの領域は2つあります.
  • 🍔 memoryはプログラムの実行時にのみ値を記憶し、プログラムが終了すると値が失われます.
    ex.関数内部の状態変数
    🍔 storageはブロックチェーンに記録され、その値は永続的に保持されます.
    ex.契約グローバル変数
    uint memory count = 100;
    uint storage age = 32;

  • 配列、文字列、構造体、マッピングなどの参照型データ型.

  • 動的配列と静的配列宣言
  • uint[10] arrayName1; // 정적
    uint[] arrayName2; // 동적

  • エンティティの動的配列では、pushでデータを追加できます.

  • マッピングとは異なり、配列は長さ(length)を求めることもできます.

  • popを使用して最後の要素を削除するか、deleteを使用して必要なインデックスの値を0またはnullに設定できます.
    🍦 厳密にはdeleteは削除されないのでlengthのサイズは変わりません.
  • arrayName2.push("new data 1");
    arrayName2.push("new data 2");
    
    uint len = arrayName2.length; 
    
    arrayName2.pop();
    delete arrayName2[0];
    
  • publicが配列を宣言すると、getterメソッドが自動的に生成されます
  • uint[] public userAge;
  • stringはバイトに等しいが、長さ(length)とpush()はない.
  • string name = 'Hi man';
  • 構造体宣言は次のとおりです.
  • struct Person {
        address account;
    	string name;
        uint8 age;
    }
    
    // 사용하기
    Person kim = Person("0x주소", "kim", 35);
    
  • mapping格納データ領域にkey-value形式で格納データ
  • // 키 데이터 타입 => 값 데이터 타입
    mapping(uint => address) public userAddress;
    
    userAddress[키] = 값;
  • グローバル変数にはblock、msg、tx、thisが含まれます.
  • 🍙 blockにはブロックに関する情報があります.
    ex. blockhash, coinbase, gaslimit, number, timestamp
    🍙 msgは、交渉を開始するトランザクションコールまたはメッセージコールに関する情報を有する.
    ex. gasleft(), data, sender, gas, value
    🍙 txにはトランザクションデータがあります.
    ex. gasprice, origin
    🍙 これは現在の見積書を参照できます.
    (暗黙的に現在の見積アドレスに変換されます)

    じょうたいへんすう

  • 値は、牽引メモリに永続的に格納される変数である.
  • contract C {
      uint storedData;
      uint storedData = 1;
    }

    ステータス変数アクセスレベル


  • internal:変数であり、その差分と継承された差分しか使用できません.

  • public:コンパイラはpublic状態変数にgetter関数を作成します.getter関数を使用して、外部プロファイルまたはクライアントコードから共通変数にアクセスできます.
    (もちろん、契約に共通のステータス変数を直接使用することもできます)

  • private:同じContractメンバーにのみアクセスできます.
  • ステータス変数は定数で宣言できます。

    uint constant age = 5;

    関数宣言

    function func1 (int _a, uint8 _b, string _name){
    	~~~
    }
    
    // 반환이 있을 때
    function func1 (int _a) returns (uint c){
    	~~~
        uint c = 100;
    }
    
    function func1 (int _a) returns (uint){
    	~~~
        uint c = 100;
        return c;
    }
  • 先頭の関数パラメータ名とグローバル変数の違いが慣例
  • 関数のアクセスレベル


  • public:内部、外部、クライアントコードから呼び出すポーリング値です.

  • external:外部コーディネータまたはクライアントコードから呼び出すことができ、コーディネータ内部で呼び出すことはできません.

  • internal:Contractメンバーと継承されたContractからのみ呼び出すことができます.

  • private:コーディネータのみを呼び出すことができます.
    🍉 private関数の名前は最初から慣例です.
  • function _getName () private view returns (string){
    	return name;
    }

    viewで表される関数は状態を変えない読み取り専用関数です。


    pureが表す関数は,格納中に変数を読み出したり書き込みしたりしない関数である.


    未払金が表示されている関数は利息を受け入れることができます。


    関数シェイプの概要

    function (<parameter types>) {internal | external | public | private} [pure | constant | view | payable] [(modifiers)] [returns (<return types>)]
    

    コンストラクション関数でリトラクトを作成すると、リトラクトの状態を初期化できます。

    contract C {
    
        address public account;
        
        constructor(address _account) init {
            account = _account
        }
    }

    self-destruct(contract作成者アドレス);ロケットを消すことができる。


    関数変更者、修飾子

  • modifierは、関数に変更を適用できるようにします.
    🍡 変更者は、関数が実行される前に、要件が満たされているかどうかを確認できます.
  • // 변경자는 _;로 작성한다.
    
    uint public count;
    
    modifier counting {
    	count++;  // 함수가 실행되기 전 실행된다.
    	_;  // 함수 실행
    	count--; // 함수가 실행된 후 실행된다
    }
    
    function func1() public counting {
    	if(count < 10){
        	~~~
        }
    }
    

    isで契約を引き継ぐことができます。

  • 多重継承も可能です.
  • contract Child is Parent1, Parent2, Parent3 {
    	~~~
    }

    revertとrequire、assertを使用してerrhendlingを行うことができます。

  • revertはこの関数を終了し、エラーを返します.
  • revert("에러 발생")

  • requireとassertは設定した条件が真であることを確認した後、条件が偽である場合、エラーを返します.

  • requireはif revertのようにゲートウェイデーモンとして機能します.
    🍚 ゲートウェイデーモンとは、条件が満たされた場合にのみ実行されるロールです.

  • assertはrequireと同じ使い方ですが、assertは未使用のガスを呼び出し元に戻し、供給されたガスをすべて消費して状態を元の状態に戻しません.
  • require(count <= 10, "10회 초과 에러 발생");
    // 조건이 참이면 진행, 거짓이면 에러를 리턴한다.

    enum

    // 다음과 같이 선언할 수 있다.
    enum feeling {
    	good, bad, soso
    }
    
    // 변수로 할당
    feeling now = feeling.soso;
    
  • enumのデータは、0から順に各値(index)の割り当てを開始する.
  • event


  • イベントは、結果が発生すると、その会議からdAppクライアントまたは別の会議に送信されます.

  • イベントキーを使用してイベントを設定し、場合によってはemitキーを使用してイベントを実行します.

  • イベントが発生すると、トランザクションに記録されます.
  • contract C {
    	event Transfer(address from, address to, unit256 value);
        
        function act(address to, address amount){
        	emit Transfer(msg.sender, to, amount);
        }
    }

    Keccak256


  • solidityは、Keccak 256を有するハッシュ関数を内蔵している.

  • 入力stringをランダム256ビット16進数にマッピングします.

  • また、Keccak 256により整数を生成することもできる.
  • keccak256("hi");
    
    uint rand = uint(keccak256("hi")); // uint로 형변환

    せいけいかん

    uint coke = 500;
    uint16 cake = 6000;
    
    uint16 totalPrice1 = coke + cake; // 에러가 발생
    uint16 totalPrice2 = uint16(coke) + cake; // 에러가 발생하지 않는다
    

    エンティティで、インタフェースは使用する関数の形式を宣言します。実際の関数の内容はContractで使用されます。


    リファレンスソース:コードステータス