Solidity by example

23477 ワード

deploy:ブロックチェーンネットワークに登録
compile:ブロックチェーンネットワークにログインする前にチェックしましたか?
1.ブロックチェーン
ブロックチェーンは、世界中で共有され、トランザクションが行われるデータベースです.
へんすう

  • local:関数で宣言し、blockchainに書き込まない

  • state:関数に宣言しblockchainに書き込む
    =>publicキーワード:制御者のみにアクセスし、変数タイプに影響しません.

  • global:blockchain関連情報(block.timestamp,msg.sender)

  • state変数を書き込みまたは更新するには、トランザクションを送信する必要があります.無料で読むことができます.
  • Gas

  • 取引双方とも値切る.gas spent * gas price

  • gas spendは、トランザクションで使用される合計gas量です.

  • gas priceはgasごとにいくら支払いますか?

  • gasの価格が高いほど、ブロックに含まれる優先度が高くなります.

  • 残りのガスは返金されました

  • gaslimit:私が設定した値

  • block gas limit:ネットワークで設定した値

  • if/else if/else

  • for/while/do while:whileはgasが切れて失敗する可能性があります
  • 2. Mapping
    keyTypeにはuint、address、bytesを含めることができます
    値タイプに制限はありません
    一度にメンバーを返すことはできません:これはPython dictionaryのようにすべてのメンバーを遍歴できないことを意味します.
    戻り値が常に設定されていない場合は、デフォルト値(最初の値を返します)
  • アドレスに任意の値を配置してremixで実行するには、どうすればいいですか?
    :実行しない値が正しい
  • contract NestedMapping {
        // Nested mapping (mapping from address to another mapping)
        mapping(address => mapping(uint => bool)) public nested;
    
        function get(address _addr1, uint _i) public view returns (bool) {
            // You can get values from a nested mapping
            // even when it is not initialized
            return nested[_addr1][_i];
        }
    
        function set(
            address _addr1,
            uint _i,
            bool _boo
        ) public {
            nested[_addr1][_i] = _boo;
        }
    
        function remove(address _addr1, uint _i) public {
            delete nested[_addr1][_i];
        }
    }
    3. Array

  • arrayを返すときにメモリを使用する必要がありますか?memoryキーワードは必須ではないでしょうか->ガスを消費しないために

  • delete arr[idx]:ガス消費

  • arr[idx]=arr[arr.length-1]->swapですか?どうしてこのようにガスを消費しないのですか?消費しないか少ないか.
  • // Solidity can return the entire array.
        // But this function should be avoided for
        // arrays that can grow indefinitely in length.
        function getArr() public view returns (uint[] memory) {
            return arr;
        }
    Enum
    最初の要素はdefault
    いつでもindexを使用して要素を指定できます
  • delete enumName;
    ->delete組み込み関数の検索
  • enum Status {
    	pending, skipped, accepted
    }
    Struct
    struct Todo {
    	string text;
        bool completed;
    }
    初期化
  • Todo(_text, false)
  • Todo({text: _text, completed:false })
  • Todo memory todo;
    todo.text = _text;
  • bool資料型はいつもfalseがdefaultですか?ㅇ
  • 更新
  • Todo storage todo = todos[_index];
  • todo.text = _text;
  • データ型の場所
  • storage : state variable. blockchainに格納
  • メモリ:関数呼び出し中にのみ存在します.
    =>関数~関数間にのみ存在する概念?このため、storageとして宣言する必要があります.memoryキーを追加すると、戻り値は
  • から消えます.
  • calldata:外部機能のみ.特殊なストレージスペース.関数パラメータを含む
  • n.関数

  • 複数返し可能

  • 共通関数はmap、array input、outputではありません

  • getter関数は、ビューまたは純粋なビューとして宣言できます.

  • view:状態変化なし

  • pure:状態は変化せず、読めません->戻り値は読めませんか?パラメータは読めますか?内部変数に触れずにパラメータのみを処理するための関数
  • エラー
  • 要求(条件)
  • は、
  • (エラー条件)
  • を返します.
  • assert():エラーが発生しないコードに使用されます.失敗した場合はエラーがあることを示し、内部エラーチェック用の
  • せいぎょ者
    関数呼び出しの前後で実行
    生成者
    契約の作成時に選択的に作成
    継承
    isで継承、多重継承可能
    上書きするには、親はvirtualキーワード、子供はoverrideキーワードを使用する必要があります.
    一番右の親は
    親の順に書くべきだ.
    アクセス制御
    function modifierデッドロック防止用
    アクセス制御プログラムは、関数の可視性を制限するために使用されます.
  • public :
  • private:内部、継承不可
  • 内部:内部、
  • 継承可能
  • external:外部のみ
    4. Interface
    他の契約と対話するために
    関数実装、コンストラクション関数、ステータス変数が設定されていません
    継承可能
    すべての関数をexternalと宣言する必要があります
    ========================

  • インタフェースのみを収集しました.solファイルを作成して使用できますか?どうしてimportを使わないことができますか?関数と宣言されたパラメータをパラメータアドレスにインポート

  • MyContractでパラメータとして受信したcounterはCounter契約アドレスㅇしか使用できません

  • MyContractの関数内部を除いて、ステータス変数のように関数外でICounterを宣言して使用することはできませんか?これは、この値が固定されているため、変化した値を取得できないことを意味します.
  • contract Counter {
        uint public count;
    
        function increment() external {
            count += 1;
        }
    }
    
    interface ICounter {
        function count() external view returns (uint);
    
        function increment() external;
    }
    
    contract MyContract {
        function incrementCounter(address _counter) external {
            ICounter(_counter).increment();
        }
    
        function getCount(address _counter) external view returns (uint) {
            return ICounter(_counter).count();
        }
    }
    payable
    関数またはアドレス用
    Ethernetの送受信
    送信
  • transfer(2300 gas, throws error)
  • send(2300 gas, returns bool)
  • call(forward all gas or set gas, returns bool)
  • call関数+再入力防止制御者の使用を推奨
    じゅしん
  • receive() external paybale : msg.データが空の
  • ロールバック()外部報酬率:
  • fallbackにはパラメータも返されていません
    1)存在しない関数または
    2)イーサにreceive()またはmsgがないことを送信する.データがなければ
    自動運転
  • emit log(gasleft());
  • event keyword;
    ->emit、eventとは何ですか?
  • 5. Call
    ていそうかんすう
    fallback()への詳細の送信に推奨

  • 既存の関数に送信するときにマッピングしますか?

  • {value:msg.value,gas:5000}call関数の特殊なフォーマット
  • // Let's imagine that contract B does not have the source code for
        // contract A, but we do know the address of A and the function to call.
        function testCallFoo(address payable _addr) public payable {
            // You can send ether and specify a custom gas amount
            (bool success, bytes memory data) = _addr.call{value: msg.value, gas: 5000}(
                abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)
            );
    
            emit Response(success, data);
        }
    6. Calling Other Contract
  • 呼び出し者が実際に3つの関数を呼び出した場合、Calleeタイプのcalleeにはどのような値が含まれますか?
    :初期契約そのもの
  • contract Callee {
        uint public x;
        uint public value;
    
        function setX(uint _x) public returns (uint) {
            x = _x;
            return x;
        }
    
        function setXandSendEther(uint _x) public payable returns (uint, uint) {
            x = _x;
            value = msg.value;
    
            return (x, value);
        }
    }
    
    contract Caller {
    
        function setX(Callee _callee, uint _x) public {
            uint x = _callee.setX(_x);
        }
    
        function setXFromAddress(address _addr, uint _x) public {
            Callee callee = Callee(_addr);
            callee.setX(_x);
        }
    
        function setXandSendEther(Callee _callee, uint _x) public payable {
            (uint x, uint value) = _callee.setXandSendEther{value: msg.value}(_x);
        }
    }
    7. DelegateCall
    メッセージコールには複数のバリエーションがあり、インクリメンタルコールについては、ターゲットアドレスのコードコールのコンテキスト、すなわちmsgで実行される.senderとmsg.valueはメッセージ呼び出しと同じですが、値は変更されません.
    これは、実行中に異なるアドレスのコードが動的にロードされることを意味する.ストレージ、現在のアドレス、残高は呼び出しの内容を参照しますが、コードは呼び出しのアドレスから取得されます.
    =>コードのみをロードします.データは「マイ見積」のデータを使用します.
    8. Library
    契約と同様ですが、ステータス変数宣言やイーサネットは送信できません.
    すべての関数は内部関数でなければなりません
    または、デプロイ後に呼び出された子供は、デプロイ前にリンクされる必要があります.
    キーワードを使うか使わないかの違いは何ですか?
    library Math {
        function sqrt(uint y) internal pure returns (uint z) {
            if (y > 3) {
                z = y;
                uint x = y / 2 + 1;
                while (x < z) {
                    z = x;
                    x = (y / x + x) / 2;
                }
            } else if (y != 0) {
                z = 1;
            }
            // else z = 0 (default value)
        }
    }
    
    contract TestSafeMath {
        using SafeMath for uint;
    
        uint public MAX_UINT = 2**256 - 1;
    
        function testAdd(uint x, uint y) public pure returns (uint) {
            return x.add(y);
        }
    
        function testSquareRoot(uint x) public pure returns (uint) {
            return Math.sqrt(x);
        }
    }
    9.エンティティファイル

  • ミントは何ですか.

  • 取引
    1つの勘定科目から別の勘定科目(同じでも空でも構いません)に送信されるメッセージです.次を参照してください.バイナリデータ(「ペイロード」と呼ぶ)とEther量も含めることができます.
    ターゲット勘定科目にコードが含まれている場合は、コードが実行され、ペイロードが入力データとして提供されます.
    宛先勘定科目が設定されていない場合(トランザクションに受信者または受信者がnullに設定されていない場合)、トランザクションは新しい見積書を作成し、前述したユーザーと「非」と呼ばれるトランザクションの数に基づいてアドレスを決定します.各「見積の生成」トランザクションの有効性は、EVMバイトコードとして実行するために使用されます.この実行データは、見積コードとして永続的に保存されます.これは、実際のコードを送信して見積書を作成するのではなく、実行時のコードを返すためにコードを送信する必要があることを意味します.

  • ストレージは、キー値で接続された256ビット文字のリポジトリです.会議でストレージをナビゲートできず、読み取りと変更にコストがかかります.参加者以外が所有するメモリを読み取りまたは書き込みできません.

  • 同期/非同期の定義

  • 呼び出しの深さは1024に制限され、これは、複雑な演算ほど再帰呼び出しではなく文を繰り返す傾向にあることを意味する.