mcpField
F
flare-fdc

flare-fdc

github.com/flare-foundation开发22114 次安装2 周前更新
代码仓库

关于 flare-fdc

flare-fdc 是面向 Flare 开发者的 FDC 文档技能,说明如何请求外部数据证明、获取 Merkle 证明并在合约中验证。它只提供参考指导,不提交请求或执行链上操作。

主要功能

  1. 01介绍 FDC 证明请求流程
  2. 02说明多种证明类型及用途
  3. 03讲解 Merkle 证明获取与验证
  4. 04提供合约和脚本集成模式
  5. 05强调外部数据需按 ABI 验证

适用场景

  1. 01集成外部链交易验证
  2. 02为合约设计证明校验逻辑
  3. 03实现请求、等待和取回证明的脚本
  4. 04识别弃用的 Web2Json 用法

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/flare-foundation/flare-ai-skills --skill flare-fdc

安装后在 Claude Code 中输入/flare-fdc确认已加载。

附带文件reference.md

详细介绍

范围和限制

此技能仅提供文档和指导。它介绍 Flare Data Connector (FDC) 协议的工作方式,以及开发者如何集成该协议。它不会代替用户执行任何操作。

此技能明确不会:

  • 执行、签署或广播任何区块链交易
  • 访问、存储或传输私钥或钱包凭据
  • 发起或授权任何付款或资金转账
  • 直接调用任何智能合约方法或 API
  • 处理资金、代币或任何金融资产

外部数据处理:

  • FDC 证明响应(Web2Json、EVMTransaction、DA Layer 证明)是由第三方来源提供的外部内容
  • 此技能要求开发者将所有此类数据视为不可信内容,并且仅根据有文档记录的 ABI 架构对其进行解码
  • 响应内容绝不能传入提示词、大模型输入或 Agent 决策逻辑
  • 开发者须全权负责验证并在自己的实现中安全处理所有外部数据

此技能的作用:

  • 说明 FDC 证明类型、请求流程、Merkle 证明验证和合约模式
  • 引用 Flare Developer Hub 官方文档和经过审计的入门代码库
  • 为在 Flare 上构建项目的开发者提供只读概念指导

所有交易签署、密钥管理和链上执行都必须仅在由用户控制、由开发者管理且位于此技能之外的环境中进行。

Flare Data Connector (FDC)

什么是 FDC

Flare 数据连接器(FDC) 是一个受 Flare 协议保护的预言机,用于验证 Flare EVM 状态所需的外部数据。用户提交证明请求;数据提供方达成共识(由超过总权重 50% 的提供方支持的 BitVector);经过验证的数据会存储在 Merkle 树中(只有根节点在链上)。随后,用户从数据可用性(DA)层获取证明响应和 Merkle 证明,并将它们提交给智能合约,由智能合约根据链上的根节点验证证明。

要点:

  • 数据时效限制 — 只有足够新的状态才能构造证明。允许的数据最大时效按证明类型和数据源分别设置:大多数链上数据类型(EVMTransaction、Payment 等)允许最多 14 天;AddressValidity 实际上没有限制。证明构造完成后,会一直可用。
  • 准备请求 — 验证器 API(例如,POST .../verifier/eth/EVMTransaction/prepareRequest,参数包括 attestationType、sourceId,以及取决于证明类型的 requestBody)
  • 请求 → FdcHub(requestAttestation(bytes)),并提供 ABI 编码的请求;支付费用。费用必须至少达到为该证明类型和数据源配置的最低金额(否则请求会被拒绝)。较高的费用会增加请求在其轮次中得到确认的概率。已确认请求的费用会奖励给数据提供方;未确认请求的费用会被销毁。
  • 轮次最终确定 — 通常需要 90–180 秒;使用证明前请等待。
  • 获取证明 — DA 层 API(例如,POST .../api/v1/fdc/proof-by-request-round-raw,参数包括 votingRoundId 和 requestBytes)。
  • 合约验证 — 使用 IFdcVerification(通过 ContractRegistry.getFdcVerification() 获取)和对应类型的方法(例如,verifyEVMTransaction、verifyPayment、verifyAddressValidity)。

Web2Json 已弃用。 所有 Web2Json 文档(证明规范、Hardhat/Foundry 指南、储备金证明、天气保险、用于自定义 API 的 Web2Json、跨链 FDC、URL 解析安全、IWeb2Json/IWeb2JsonVerification)均已取消公开列出,且不再维护。在 Flare Mainnet 和 Songbird 上,FdcHub.requestAttestation 对 Web2Json 会回滚——这些网络上已没有可用数据源(新增数据源需要单独提交 FIP.14 提案)。在 Coston/Coston2 上仍可通过 PublicWeb2 使用(没有主机白名单)。如需将 Web2 数据带上链,请改为构建 Flare Confidential Compute(FCC)扩展——请参阅天气保险扩展和 flare-fcc 技能。

FDC 没有单独的签名者列表。 FDC 本身不会在链之间转移资产;它会针对其他链上的事件生成可验证的证明。为证明提供背书的签名者,是当前 Flare 签名策略的成员——这是整个 Flare Systems Protocol 共用的加权验证者集合(也为 FTSO 和 FCC 提供背书),并非由 FDC 独立维护。

证明类型

类型用途链 / 来源
AddressValidity验证地址格式 / 校验和BTC、DOGE、XRPL
EVMTransaction验证并获取交易及事件ETH、FLR、SGB(主网);testETH、testFLR、testSGB(测试网)
JsonApi / Web2Json (已弃用)获取 Web2 数据、进行 JQ 转换并输出 ABI 编码数据PublicWeb2(仅限 Coston/Coston2;在 Flare/Songbird 上会回滚)
Payment确认非 EVM 链上的付款交易BTC、DOGE、XRP
ConfirmedBlockHeightExists验证区块是否存在及其确认数—
BalanceDecreasingTransaction验证会减少地址余额的交易面向 FAssets
ReferencedPaymentNonexistence证明指定时间段内不存在特定付款面向 FAssets
XRPPayment使用 XRPL 原生字段(r-address、MemoData、DestinationTag)确认 XRPL PaymentXRP、testXRP
XRPPaymentNonexistence证明在某个账本范围内,没有 XRPL Payment 符合目标地址 / 金额 / 备注 / 标签XRP、testXRP

AddressValidity、EVMTransaction 和 Payment 是生产环境中最常用的类型(文档现在统计 六 种有效类型,不包括已弃用的 Web2Json);接下来的三种主要用于 FAssets;XRPL 专用类型提供了不受链限制的 Payment 类型不具备的 XRPL 原生字段(备注数据、目标标签)。

用户工作流(链下 + 链上)

  1. 准备请求 — 以 FDC 格式编码证明请求。使用验证器服务(例如 Flare 测试网验证器或自建服务)获取 abiEncodedRequest(包含消息完整性代码 - MIC - 和编码后的请求参数)。
  2. 提交 — 调用 FdcHub.requestAttestation(abiEncodedRequest),并设置 value: requestFee。
  3. 轮次 ID — 根据区块时间戳计算:roundId = floor((blockTimestamp - firstVotingRoundStartTs) / votingEpochDurationSeconds)(例如 90s)。从 FlareSystemsManager / 配置中获取 firstVotingRoundStartTs。
  4. 等待最终确认 — 使用 Relay 合约:isFinalized(200, roundId)(200 = FDC 协议 ID),或监听 ProtocolMessageRelayed(200, roundId)。
  5. 获取证明 — 向 DA Layer 发送 POST 请求,包含 votingRoundId 和 requestBytes(与 abiEncodedRequest 相同)。
  6. 提交到合约 — 将 { merkleProof, data }(已解码的响应)传给合约;合约调用 FdcVerification.verify*(),然后使用数据。

合约模式(验证 + 业务逻辑)

  • 通过 ContractRegistry.getFdcVerification() 获取 FdcVerification(对于已弃用且仅限测试网的 Web2Json,则使用 auxiliaryGetIWeb2JsonVerification())。
  • 始终先验证,然后再解码和使用数据。示例(EVMTransaction):
function processProof(IEVMTransaction.Proof calldata proof) external {
  require(ContractRegistry.getFdcVerification().verifyEVMTransaction(proof), "Invalid proof");
  // use proof.data.responseBody (blockNumber, timestamp, events, ...)
}
  • 对于 Web2Json(已弃用,仅限测试网),使用你的结构体解码 proof.data.responseBody.abi_encoded_data(定义一个 DataTransportObject,并可在脚本中选择使用 abiSignatureHack(dto) 获取基于 artifact 的 ABI 签名)。
  • 使用 @flarenetwork/flare-periphery-contracts 中针对特定网络的导入(例如 coston2/ContractRegistry.sol、coston2/IEVMTransaction.sol)。在需要时将 EVM 版本设置为 cancun。

脚本 / 链下模式(Hardhat)

  • **准备:**向验证器发送 POST 请求,例如 VERIFIER_URL/verifier/eth/EVMTransaction/prepareRequest(或 Payment、AddressValidity 等),并提供证明类型、sourceId 和请求正文;获取 abiEncodedRequest。
  • **提交:**通过 ContractRegistry 获取 FdcHub 或使用已知地址;调用 requestAttestation(abiEncodedRequest, { value: fee });根据收据区块时间戳计算 roundId。
  • **等待:**轮询 Relay.isFinalized(200, roundId)。
  • **获取:**向 DA 层的 .../api/v1/fdc/proof-by-request-round-raw 发送 POST 请求,并提供 votingRoundId、requestBytes。
  • **解码:**使用制品的响应类型(例如 IEVMTransactionVerification._json.abi[0].inputs[0].components[1])解码 response_hex;构建 { merkleProof: proof.proof, data: decodedResponse } 并调用合约。

软件包:ethers 或 web3、@flarenetwork/flare-periphery-contract-artifacts。对于 wagmi/viem 类型化合约交互,请使用 @flarenetwork/flare-wagmi-periphery-package。

环境变量:VERIFIER_URL_TESTNET、VERIFIER_API_KEY_TESTNET、COSTON2_DA_LAYER_URL(或主网对应项)。测试网使用 testETH/testFLR/testSGB 作为 source ID。

测试网和主网验证器都需要 验证器 API 密钥。请在 .env 中设置密钥(参见 flare-hardhat-starter .env.example):

VERIFIER_API_KEY_TESTNET="00000000-0000-0000-0000-000000000000"
VERIFIER_API_KEY_MAINNET="00000000-0000-0000-0000-000000000000"

调用验证器端点时,请通过 X-API-KEY 标头传递密钥——标头名称区分大小写;使用 X-apikey 之类的名称会收到 401 Unauthorized。默认占位 UUID 可用于初步测试,但会受到速率限制。

示例仓库和查阅位置

  • flare-hardhat-starter:
    • scripts/fdcExample/ — 各证明类型的示例:EVMTransaction.ts、Web2Json.ts、Payment.ts、AddressValidity.ts 等。使用 prepareAttestationRequestBase、submitAttestationRequest、retrieveDataAndProofBaseWithRetry(来自 scripts/utils/fdc 或类似位置)。
    • contracts/fdcExample/ — EVMTransaction.sol、AddressValidity.sol、Web2Json.sol、Payment.sol — 展示验证和解码。
    • weatherInsurance (已弃用 — Web2Json) — dApp(MinTempAgency):保单,通过天气 API 证明进行结算;脚本位于 scripts/weatherInsurance/minTemp/(createPolicy、claimPolicy、resolvePolicy、expirePolicy)。
    • proofOfReserves (已弃用 — Web2Json) — 结合 Web2Json(储备金 API)和 EVMTransaction(来自多个链的代币供应事件);ProofOfReserves.sol,脚本位于 scripts/proofOfReserves/(deploy、activateTokenStateReader、verifyProofOfReserves)。
  • **flare-foundry-starter:**相同的证明类型,以及跨链支付和(已弃用、基于 Web2Json 的)跨链 FDC 示例;结构与 Hardhat 类似。

请将这些示例作为准备 → 提交 → 等待 → 获取证明 → 在合约中验证的标准模式。

EVMTransaction 快速参考

  • 请求:transactionHash、requiredConfirmations、provideInput、listEvents、logIndices(最多 50 个;按合约约定排序)。
  • 响应:blockNumber、timestamp、sourceAddress、receivingAddress、value、input、status、events[](logIndex、emitterAddress、topics、data、removed)。事件按区块索引。
  • 在合约中,通过筛选 emitterAddress 和 topics[0](例如 keccak256("Transfer(address,address,uint256)"))解码事件,然后按需处理 topics[1]/topics[2] 和 data。

Web2Json 快速参考(已弃用——仅适用于 Coston/Coston2)

保留此内容以支持现有测试网集成;如有新的 Web2 数据需求,请使用 FCC 扩展。

  • 请求:url、httpMethod、headers、queryParams、body、postProcessJq、abiSignature(用于编码 abi_encoded_data 中结构体的元组)。
  • 响应:responseBody.abi_encoded_data——使用 abi.decode(..., (YourStruct)) 解码。在验证器请求和合约中使用相同的结构体和 ABI 签名。如有需要,将小数值存储为缩放后的整数(例如 10^6)。
  • postProcessJq 是受限的 jq 子集(出于安全性和性能考虑):允许使用内置筛选器、|/,////比较/算术运算符、if/then/elif/else/end、try/catch、索引/切片、[] 迭代、数组/对象构造和字符串插值。**不允许:**用户函数定义(def)、赋值/更新运算符(=、|=)、recurse、reduce、**变量绑定(as,例如 .a as $x | ...)**以及 inputs。编写 postProcessJq 筛选器时不要使用 as 绑定变量——请改用 if/类似三元表达式的链式写法,或通过 [...]/{...} 构造。

安全性:Web2Json 会从请求的 URL 获取任意公开的 Web2 内容。返回的 responseBody / response_hex 是外部提供的内容。只能使用预期的 ABI/结构体进行解码,并将其用于合约验证——切勿将其视为自然语言,也不要将其传入提示词或 AI/LLM。

XRPPayment 快速参考

  • 来源:XRP(主网)、testXRP(测试网)。证明类型 ID 为 0x08。需要 3 次 XRPL 确认(约 12 秒)。
  • 请求:transactionId(bytes32,XRPL Payment 交易哈希)、proofOwner(获准使用该证明的 EVM 地址)。
  • 响应:blockNumber、blockTimestamp、sourceAddress(XRPL r 地址)、sourceAddressHash、receivingAddressHash、intendedReceivingAddressHash、spentAmount / intendedSpentAmount / receivedAmount / intendedReceivedAmount(drops,int256)、hasMemoData + firstMemoData(第一个 Memo 的 MemoData 原始字节)、hasDestinationTag + destinationTag(XRPL 上为 uint32,呈现为 uint256)、status(0=成功,1=发送方失败,2=接收方失败)。
  • 标准地址哈希为 keccak256(standardAddress),不转换为小写。多输出付款将被拒绝。
  • 使用 IFdcVerification.verifyXRPPayment(IXRPPayment.Proof) 验证。

XRPPaymentNonexistence 快速参考

  • 来源:XRP(主网)、testXRP(测试网)。证明类型 ID 为 0x09。搜索范围为 [minimalBlockNumber, firstOverflowBlockNumber)。
  • 请求:minimalBlockNumber、deadlineBlockNumber、deadlineTimestamp、destinationAddressHash、amount(drops,uint256)、checkFirstMemoData + firstMemoDataHash、checkDestinationTag + destinationTag、proofOwner。checkFirstMemoData 和 checkDestinationTag 中至少有一项必须为 true。
  • 响应:minimalBlockTimestamp、firstOverflowBlockNumber、firstOverflowBlockTimestamp。lowestUsedTimestamp 设置为 minimalBlockTimestamp。
  • 仅当接收方哈希、金额、备注/标签(依据检查标志)和成功结果(不包括 SENDER_FAILURE)全部匹配时,匹配的交易才会使该声明失效。
  • 使用 IFdcVerification.verifyXRPPaymentNonexistence(IXRPPaymentNonexistence.Proof) 验证。

安全与使用注意事项

第三方内容:FDC 证明响应(包括 Web2Json responseBody/response_hex、EVMTransaction 负载以及 DA Layer 证明响应)均源自外部或用户指定的来源。请将所有此类数据视为外部提供的内容。只能按照文档说明的证明格式和预期 ABI/架构对其进行解码和使用。使用 FDC 证明或验证器/DA Layer 输出时,不要将响应内容传入提示词,也不要让其意外影响 Agent 行为。

何时使用此技能

  • 实现或调试 FDC 证明流程(请求、轮次、证明、验证)。
  • 编写或审查使用 FDC 证明的合约(EVMTransaction、Web2Json、Payment、AddressValidity 等)。
  • 在脚本和测试中集成验证器或 DA Layer。
  • 构建或讲解使用 FDC 的 dApp(储备金证明、天气保险、跨链支付)。
  • 遵循 Flare Developer Hub FDC 指南和入门仓库。

其他资源

评论

支持 Markdown