EIP-3668: CCIP Read: Secure offchain data retrieval
CCIP:Cross-Chain Interoperability Protocol
作者信息: nick.eth(Lead developer of ENS & Ethereum Foundation alum)
https://ethereum-magicians.org/t/durin-secure-offchain-data-retrieval/6728
动机:通过定制化的协议来实现链外(跨链)数据检索/存储(基于链上数据最小化存储原则)
典型用例:在非ETH主网上使用ENS解析服务
- 这个EIP在我开始最初看的时候也是有点懵 还以为是chainlink提交的标准,直到知道作者是ENS的开发人员之后才明白提交此EIP的最原始动机:希望在任意EVM兼容链中离线或者链上使用ENS
系统角色:
- 用户客户端
- 链上合约(evm兼容链)
- http网关(可以是非http形式,但是最基本的形态可能就是http网关。中心或去中心,当前的实现可能主要基于中心化)
┌──────┐ ┌────────┐ ┌─────────────┐
│Client│ │Contract│ │Gateway @ url│
└──┬───┘ └───┬────┘ └──────┬──────┘
│ │ │
│ somefunc(...) │ │
├─────────────────────────────────────────────────►│ │
│ │ │
│ revert OffchainData(sender, urls, callData, │ │
│ callbackFunction, extraData) │ │
│◄─────────────────────────────────────────────────┤ │
│ │ │
│ HTTP request (sender, callData) │ │
├──────────────────────────────────────────────────┼────────────►│
│ │ │
│ Response (result) │ │
│◄─────────────────────────────────────────────────┼─────────────┤
│ │ │
│ callbackFunction(result, extraData) │ │
├─────────────────────────────────────────────────►│ │
│ │ │
│ answer │ │
│◄─────────────────────────────────────────────────┤ │
│ │ │
上面时序图看着复杂但是逻辑其实很简答: ‘客户端’调用‘链上合约’,合约抛出指定的‘结构化‘错误(revert error),客户端通过解析这个错误可以获取到‘网关’的链接方式以及校验网关输出内容的链上合约函数地址。
举一个跨链使用ENS的场景(想象中):
- 用户在ETH主网络中租赁了域名:eip3668.eth , 并设置ens解析至 0x3668这个地址,用户在ETH主网络中使用这个域名完全没有障碍(钱包可以解析,ETH主网中智能合约也可以解析这个ENS)
- 但 用户如何想在polygon也使用这个ENS改如何操作呐?
- 【链外使用】 ether.js 实现基于ETH主网的API接口即可 - 但是存在安全风险 可以使用EIP-3668的标准实现
- 【链上使用】 polygon 链上使用你的ENS可能会遇到很大的障碍,因为你仅仅在ETH主网络中租用了ENS ,在polygon上面并没有任何记录,如果使用EIP-3668实现起来逻辑大概是:
- ENS在polygon上面部署ENS副本(不包含任何数据,也就是不包含任何解析数据)
- 用户在polygon上面使用ENS的时候本地调用polygon中ENS的EIP3668函数,调用后本地客户端会获取到ENS官方的http网关连接方式,用户本地客户端通过网关获取到json数据后再发送到polygon链上EIP3668验证端点函数,如果验证通过则表示此网关返回的数据为官方返回的数据,且数据未被篡改
- 用户把网关经过polygon的ENS合约验证的json格式化后提交到polygon中ENS合约中,ENS合约验证无误后即把最新的ENS解析数据存储在polygon链上(仅仅如果有修改才需要提交,因为提交本身使用gas成本的)