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