Frax Finance ¤
中文 🇨🇳
中文 🇨🇳
  • Frax生态系统概述
  • FXS&VEFXS
  • Frax Shares (FXS)
  • veFXS
  • Gauge系统
  • FXS分配
  • FXS 智能合约及地址
  • 治理
    • Frax 治理概述
    • 工作原理
    • 高级概念
    • Fraxtal 快照投票
  • FRAX V1 初始版本
    • 初始设计
    • 质押合约
    • FRAX ABI & 代币地址
    • Frax V1 池 ABI & 地址
    • 核心 Frax 多重签名
  • FRAX V2 - 算法化市场操作 (AMO)
    • AMO Overview
    • AMO 铸币器
    • 抵押品投资者
    • Curve
    • Uniswap v3
    • FRAX贷款 (Lending)
    • 去中心化比率 (DR)
  • FRAX V3 - 100% 抵押率及更多
    • 概览
    • Fraxtal
    • AMOs
    • RWAs
    • sFRAX
    • FXBs
    • sFRAX 代币合约地址
    • sFRAX & FXB 多签
  • 跨链桥接
    • Fraxferry
    • LayerZero x Stargate
    • Fraxtal 桥
  • Frax 价格指数(FPI)
    • 概览(CPI 锚定 & 机制)
    • Frax 价格指数股份 (FPIS)
    • FPIS代币分配
    • 追踪CPI预言机(Oracle)
    • FPI 控制器池
    • veFPIS
    • FPIS 转换 / FPIS 锁仓
    • FPI 和 FPIS 代币地址
    • FPI 多签
  • Frax Swap
    • 概览
    • 技术方案
    • Fraxswap合约地址
  • FRAXLEND
    • Fraxlend概览
    • 核心概念
    • 借款
    • 贷款
    • 高级概念
      • 头寸健康度&清算
      • 利率
      • 金库账户(Vault Account)
  • ABI & Code
  • Fraxlend 多签
  • FRAX ETHER
    • 概览
    • frxETH和sfrxETH
    • 技术方案
    • 赎回机制
    • frxETH V2
    • frxETH和sfrxETH 代币地址
    • frxETH多签
  • BAMM
    • 概览
  • FRAX预言机
    • Frax 预言机概览
    • 工作原理
    • 高级概念
    • Fraxtal Merkle 证明预言机
  • 教程&FAQ
    • FAQ
    • 质押
    • Uniswap迁移 / Uniswap V3
    • Fraxswap / FPI
  • 杂项
    • 所有合约地址
    • 漏洞赏金
    • 杂项与机器人地址
    • API
  • 其他
    • 审计
    • 媒体工具包 /Logos
Powered by GitBook
On this page

Was this helpful?

Export as PDF
  1. FRAX预言机

Fraxtal Merkle 证明预言机

Previous高级概念NextFAQ

Last updated 6 months ago

Was this helpful?

Fraxtal Merkle 预言机(Fraxtal-MOs)是一类预言机,利用 eth_getProof RPC 方法在以太坊 L2(如 Fraxtal)上证明 L1 状态。

概览

Fraxtal-MOs 利用四个关键合约来验证和传输状态。

预部署合约,用作 L2 上 L1 区块哈希的注册表。

合约用于验证给定的区块头与通过 FraxchainL1Block 合约中继的 L1 区块哈希。该合约负责存储状态根哈希以及 L1 时间戳。

合约执行状态根验证。根据通过 eth_getProof RPC 方法离线构建的默克尔证明,该合约将验证并提取“证明”的存储槽值到 L2 区块链。这些“证明”的值随后被传递给预言机本身。

传递这些“证明”值的过程是无信任的,任何人都可以提交与给定以太坊 L1 地址的预先批准的槽对应的有效默克尔证明。

合约接受来自 MerkleProofPriceSoure 合约的“证明” L1 数据。

对于 sFrax 和其他 ERC4626 保险库,这些“证明”的值定义了 L1 上保险库代币价值累积函数的当前斜率。

这些预言机公开以下函数,以允许用户查询相关资产的价格:

    /// @dev Adheres to chainlink's AggregatorV3Interface `latestRoundData()`
    /// @return _roundId The l1Block corresponding to the last time the oracle was proofed
    /// @return _answer The price of Sfrax in frax
    /// @return _startedAt The L1 timestamp corresponding to most recent proof
    /// @return _updatedAt Equivalent to `_startedAt`
    /// @return _answeredInRound Equivalent to `_roundId`
    function latestRoundData()
        external
        view
    returns (
        uint80 _roundId, 
        int256 _answer, 
        uint256 _startedAt, 
        uint256 _updatedAt, 
        uint80 _answeredInRound
    )
/// @return _pricePerShare The current exchange rate of the vault token 
///                        denominated in the underlying vault asset
function pricePerShare() public view 

架构

将 L1 数据传输/证明到 L2 的过程:

步骤 1: 在 L2 上证明 L1 的区块头。

步骤 2: 提交预定义 L1 地址和存储槽的存储证明。

演示客户端

以下代码应作为生成上述 Fraxtal 智能合约接受的函数参数的示例。 有关 RPC 方法的文档:eth_getBlockByNumber 和 eth_getProof生成 L1 区块头的代码。

生成 L1 区块头的代码

async function getHeaderFromBlock(provider, blockL1) {
    let block = await provider.send("eth_getBlockByNumber", [blockL1, false])
    let headerFields = [];
    headerFields.push(block.parentHash);
    headerFields.push(block.sha3Uncles);
    headerFields.push(block.miner);
    headerFields.push(block.stateRoot);
    headerFields.push(block.transactionsRoot);
    headerFields.push(block.receiptsRoot);
    headerFields.push(block.logsBloom);
    headerFields.push(block.difficulty);
    headerFields.push(block.number);
    headerFields.push(block.gasLimit);
    headerFields.push(block.gasUsed);
    headerFields.push(block.timestamp);
    headerFields.push(block.extraData);
    headerFields.push(block.mixHash);
    headerFields.push(block.nonce);
    headerFields.push(block.baseFeePerGas);
    if (block.withdrawalsRoot) {
        headerFields.push(block.withdrawalsRoot);
    }
    if (block.blobGasUsed) {
        headerFields.push(block.blobGasUsed);
    }
    if (block.excessBlobGas) {
        headerFields.push(block.excessBlobGas);
    }
    if (block.parentBeaconBlockRoot) {
        headerFields.push(block.parentBeaconBlockRoot);
    }
    convertHeaderFields(headerFields);
    let header = ethers.utils.RLP.encode(headerFields);
    return header
}

生成存储证明的代码

        let blockToProof = "0x"+blockL1.toHexString().substring(2).replace(/^0+/, "");

        let sfrax_proof = await mainnetProvider.send("eth_getProof", 
        [
            // L1 address to generate proofs for
            SFRAX_MAINNET,
            // Slots to proof 
            [
                "0x0000000000000000000000000000000000000000000000000000000000000002",
                "0x0000000000000000000000000000000000000000000000000000000000000009",
                "0x0000000000000000000000000000000000000000000000000000000000000008",
                "0x0000000000000000000000000000000000000000000000000000000000000006",
                "0x0000000000000000000000000000000000000000000000000000000000000007"
            ], 
            blockToProof
        ]);
    
        // Format the proof info returned from `eth_getProof`
        let proof: Proof = {} as Proof;
        proof._accountProofSfrax = sfrax_proof.accountProof;
        proof._storageProofTotalSupply = sfrax_proof.storageProof[0].proof;
        proof._storageProofTotalAssets = sfrax_proof.storageProof[1].proof;
        proof._storageProofLastDist = sfrax_proof.storageProof[2].proof;
        proof._storageProofRewardsPacked = sfrax_proof.storageProof[3].proof;
        proof._storageProofRewardsCycleAmount = sfrax_proof.storageProof[4].proof;

        let txn = await proover.addRoundDataSfrax(
            SFRAX_L2_ORACLE,
            blockL1.toString(),
            proof
        )

已部署的合约

Description
Oracle
MerkleProofPriceSource

sFrax/Frax

sfrxEth/frxEth

FPI/USD

Screenshot 2024-09-23 at 11.04.48 AM
Screenshot 2024-09-23 at 11.05.00 AM

FraxchainL1Block
StateRootOracle
MerkleProofPriceSource
FraxtalERC4626TransportOracle
0x1b680f4385f24420d264d78cab7c58365ed3f1ff
0xe25d8aaa6df41b94a415ee39ccee0df6673b9bdb
0xEE095b7d9191603126Da584a1179BB403a027c3A
0xabca0b314d15B3e28F24AC0ee84A63001d1b44Db
0x0f50beeE2d2506634b1e6230F3867e30763CbB02
0x8fc7425Cd36D7e4605650198099e4539238e9c37