[#4 Crypto Zombies]ゾンビバトルシステム


✍🏻 エンティティの概念
関数コントローラ
アクセス制御者
  • private:調整中の他の関数からのみ呼び出す
  • internal:privateと同様ですが、その契約を引き継ぐ契約から
  • を呼び出すこともできます.
  • external:場外通話のみ
  • public:内部および外部からのコール
  • ステータスコントローラ
  • view:この関数を実行してもデータは保存/変更されません
  • pure:この関数は、ブロックチェーンにデータを格納せず、ブロックチェーンからデータを読み込まない
  • 両方とも外部から呼び出されると、ガスが全く消費されない場合、他の関数で内部呼び出されると、ガスが消費されます.
    カスタムコントロール
  • onlyOwneraboveLevelは同じです!
  • これらの制御者がどのように影響するかを決定するために、関数で論理を構成できます
  • これらのコントローラは、次のように1つの関数で使用できます.
    function test() external view onlyOwner anotherModifier { /* ... */ }
    Payables Controls(ファンクションControls)
    汚れ汚れ汚れはエーテルを受け取ることができる特殊な関数タイプです!
  • paymentは、イーサを受信できる特殊な関数タイプです.
  • イーサネットのお金、データ、契約コード自体がイーサネット上に存在するため、関数を実行しながら契約に支払うことができます.
  • これにより、関数を実行するために契約に一定の金額を支払う構造を作成できます.
    contract OnlineStore {
      function buySomething() external payable {
        // 함수 실행에 0.001이더가 보내졌는지 확실히 하기 위해 확인
        require(msg.value == 0.001 ether);
        // 보내졌다면, 함수를 호출한 자에게 디지털 아이템을 전달하기 위한 내용 구성
        transferThing(msg.sender);
      }
    }
    ここで、msg.valueは、Contract Loaderがどれだけのデータを送信したかを決定する方法であり、etherはデフォルトで含まれる単位である.
    ここで起こったことは、web3.js(DAPPのJavaScriptフロントエンド)で次の関数を実行する人がいる場合に発生します.
    // `OnlineStore`는 이더리움 상의 컨트랙트를 가리킨다고 가정한다.
    OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})
    valueフィールドを参照して、JavaScript関数が呼び出されたときに、そのフィールドを通じてどれだけetherが送信されるかを決定します.
    注意:関数がpayableと表示されず、試写画像に示すようにイーサを送信すると、関数はトランザクションを拒否します.
    💸 オブジェクト
    ATMを送信すると、ATMのイーサアカウントはイーサに格納され、そこに閉じ込められます.したがって、契約からイーサを抽出する関数を作成する必要があります.
    契約からイーサを抽出する関数は、次のように記述できます.
    contract GetPaid is Ownable {
      function withdraw() external onlyOwner {
        owner.transfer(this.balance);
      }
    }
    💡 Ownableimportのオファーを使用したと仮定します.
    伝達関数の使用
  • ownerイーサは、関数を使用して特定のアドレスに送信することができる.
  • そしてonlyOwnerは、見積書に保存されているすべてのtransferを返します.もし100人のユーザーが私の契約のために1イーサを支払ったら、this.balance100はもっと高くなります.
  • 잔액は、関数を使用して特定のイーサネットアドレスにお金を送信することができる.
  • たとえば、ある人がプロジェクトに追加料金を支払った場合、イーサはthis.balanceを返す関数を作成することもできます.
  • uint itemFee = 0.001 ether;
    msg.sender.transfer(msg.value - itemFee);
  • または買い手と売り手との契約において、売り手の住所をtransferに保存し、誰かが売り手の品物を購入した場合、買い手から受け取った費用を彼に渡すこともできる.msg.sender
  • これにより、誰にも制御されない分散市場を創造することができます!
    🪅 イーサネットでの乱れの作成
    😂 Soledityでは、乱水を安全に生成できない……!
    keccak 256による整数の生成(無効...)
    keccak 256を使用して整数を生成する方法
  • solidityで整数を作成する最良の方法はkeccak 256ハッシュ関数を使用することである.
  • 乱数は以下のように生成できる
    // Generate a random number between 1 and 100:
    uint randNonce = 0;
    uint random = uint(keccak256(now, msg.sender, randNonce)) % 100;
    randNonce++;
    uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
    この例では、storageのタイムスタンプ値、seller.transfer(msg.value)のインクリメントnowが受信されます(同じ入力で、同じハッシュ関数を複数回実行することはできません).
    その後、msg.senderを使用してこれらの入力を任意のハッシュ値に変換し、変換されたハッシュ値をnonceに変換し、keccakを使用して最後の2桁の数字のみを受信する.これにより、uint間の完全な整数が得られる.
    keccakが使用できない理由
    この方法は不誠実なノードの攻撃を受けやすい.
    Ethernet認証プロセス

  • イーサー坊では、contractの関数を実行すると、% 100通知ネットワークのノード0과 99またはtransactionノードとして実行されます.

  • その後、ネットワーク内のノードは複数のトランザクションを収集し、計算が非常に複雑な数学的問題하나を先に解いてみます.

  • その後、これらのトランザクション・グループは、それらの여러(PoW)とともにネットワーク上に配置される작업 증명.

  • あるノードがPoWを解放すると、他のノードはそのPoWの解放を停止し、そのノードが送信したトランザクション・リストが有効であることを確認します.

  • 有効な場合は、ブロックを受け入れ、次のブロックの解凍を開始します.
  • これは私たちの構造関数を脆弱にします.
    処理可能なトランザクション

  • コイン投げの試合を使うと仮定します.正面が現れるとお金が2倍になり、反対側が現れると、誰もが失います.前後ビューを決定する際には,上に見た乱関数を用いると仮定する.(random>=50はフロントビュー、random<50はバックビュー).

  • ノードを実行している場合は、共有せずに작업 증명トランザクションを通知するしかありません.(1つ以上のノードに実行を通知するだけ)

  • その後、私が勝ったことを確認するために、コイン関数を実行することができます.
  • もし私が負けたら、解凍中の次のブロックにトランザクションを含まないことを選択してください.
  • 私は無限に繰り返して、私が最終的にコインに勝って、次のブロックを解いて、私はそこから利益を得ることができます.
  • では、エーテル坊では、どのようにして安全に卵子を作るのでしょうか.
    ブロックチェーンのすべての内容はすべての参加者に公開されます.これは解決しにくい問題であり、解決方法はいろいろあります.StackOverflow

  • 1つの方法は、_블록_を使用して、イーサネットブロックチェーンの外部の構造関数にアクセスすることである.(内部で作成するのではなく、外部乱関数をインポート!)
  • 나의 노드:イーサネット外部からデータを受信するセキュリティ方法の1つ

  • Oracleを使用してブロック・チェーンの外に安全な数値を作成するチェーンで使用