skka3134

skka3134

email
telegram

チェーンゲーム会社の面接問題

  1. チェーンゲーム会社と言われていますが、ゲームに関連することではなく、主に契約について尋ねられました。
  2. 面接:簡単な自己紹介 + 履歴書のプロジェクト + chainlink vrf の原理 + 代理契約の原理
  3. chainlink vrf の原理:Chainlink オラクルは分散型ネットワークであり、ネットワーク内には多くのオラクルノードがあります。各オラクルノードは独自のチャネルを使用してデータを取得し、取得したデータを分散型ネットワークで合意形成します。採用される合意形成方法は中央値です。ユーザーは VRF コントラクトにシードを入力し、オラクル VRF ノードはノードの秘密鍵とシードを使用してランダムな数値とプルーフを生成し、VRF コントラクトに返します。VRF コントラクトはランダムな数値の正当性をプルーフで検証し、検証に合格した場合、ランダムな数値をユーザーに返します。
  4. 代理契約の原理:ユーザーは A コントラクトと対話し、A コントラクトは B コントラクトを呼び出します。A コントラクトは代理契約であり、B コントラクトはロジック契約です。アップグレードするには、A コントラクトの内容を変更するだけで十分ですが、アップグレードのプロセスでは、A コントラクトのメモリレイアウトを変更することはできず、追加のみが可能であり、削除や変更はできません。
    image
  5. 筆記試験:権限制御 + 所有権移転 + modifier+event スイッチ + Ierc20 転送 + ホワイトリスト(ボーナス項目)+eoa(ボーナス項目)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


import "ERC721";
import "IERC20";

contract Minter is ERC721 {
    address erc20;
    address owner;

    struct Project {
        uint256 eventId;
        uint256 timeEnd;
        address payAddress;
        uint256 price;
        bool state;
        uint8 amount;
    }
    Project[] projects;

    mapping(address => bool) public whiteBool;
    mapping(uint256 => Project) mintEvents;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }

    function ownerTransfer(address owner_) onlyOwner {
        owner = owner_;
    }

    function stopEvent(uint256 k) onlyOwner {
        projects[k].state = false;
    }

    function white() onlyOwner {
        whiteBool[msg.sender] = true;
    }

    function setupEvent(
        uint256 eventId_,
        uint256 timeEnd,
        address payAddress_,
        uint256 price_,
        uint256 amount_
    ) onlyOwner {
        projects.push(
            Project(eventId_, timeEnd_, payAddress_, price_, amount_)
        );
    }

    function mint(uint256 k) public {
        require((projects[k].amount < 100, "exeed");
        require(projects[k].state = true, "not start");
        require(whiteBool[msg.sender] == true, "not white");
        require(msg.sender == tx.origin, "not eoa");
        projects[k].amount = amount + 1;
        IERC20(erc20).safeTransferFrom(
            msg.sender,
            projects[k].payAddress,
            projects[k].price * 1e18
        );
    }
}

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。