关于 flare-fdc
flare-fdc 是面向 Flare 开发者的 FDC 文档技能,说明如何请求外部数据证明、获取 Merkle 证明并在合约中验证。它只提供参考指导,不提交请求或执行链上操作。
主要功能
- 01介绍 FDC 证明请求流程
- 02说明多种证明类型及用途
- 03讲解 Merkle 证明获取与验证
- 04提供合约和脚本集成模式
- 05强调外部数据需按 ABI 验证
适用场景
- 01集成外部链交易验证
- 02为合约设计证明校验逻辑
- 03实现请求、等待和取回证明的脚本
- 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 Payment | XRP、testXRP |
| XRPPaymentNonexistence | 证明在某个账本范围内,没有 XRPL Payment 符合目标地址 / 金额 / 备注 / 标签 | XRP、testXRP |
AddressValidity、EVMTransaction 和 Payment 是生产环境中最常用的类型(文档现在统计 六 种有效类型,不包括已弃用的 Web2Json);接下来的三种主要用于 FAssets;XRPL 专用类型提供了不受链限制的 Payment 类型不具备的 XRPL 原生字段(备注数据、目标标签)。
用户工作流(链下 + 链上)
- 准备请求 — 以 FDC 格式编码证明请求。使用验证器服务(例如 Flare 测试网验证器或自建服务)获取
abiEncodedRequest(包含消息完整性代码 - MIC - 和编码后的请求参数)。 - 提交 — 调用
FdcHub.requestAttestation(abiEncodedRequest),并设置value: requestFee。 - 轮次 ID — 根据区块时间戳计算:
roundId = floor((blockTimestamp - firstVotingRoundStartTs) / votingEpochDurationSeconds)(例如 90s)。从FlareSystemsManager/ 配置中获取firstVotingRoundStartTs。 - 等待最终确认 — 使用
Relay合约:isFinalized(200, roundId)(200 = FDC 协议 ID),或监听ProtocolMessageRelayed(200, roundId)。 - 获取证明 — 向 DA Layer 发送 POST 请求,包含
votingRoundId和requestBytes(与abiEncodedRequest相同)。 - 提交到合约 — 将
{ 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)。
- scripts/fdcExample/ — 各证明类型的示例:
- **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 指南和入门仓库。
其他资源
- 详细的 API、合约接口和链接:reference.md
- FDC 概览:dev.flare.network/fdc/overview
- 入门指南:dev.flare.network/fdc/getting-started
- Hardhat 指南(按类型):dev.flare.network/fdc/guides/hardhat
- Foundry 指南:dev.flare.network/fdc/guides/foundry