Skip to content

Latest commit

 

History

History
65 lines (51 loc) · 5.6 KB

EIP3668.md

File metadata and controls

65 lines (51 loc) · 5.6 KB

EIP-3668 跨链读取-安全的链外数据获取

EIP-3668: CCIP Read: Secure offchain data retrieval

CCIP:Cross-Chain Interoperability Protocol

作者信息: nick.eth(Lead developer of ENS & Ethereum Foundation alum)

EIP英文      EIP中文

https://ethereum-magicians.org/t/durin-secure-offchain-data-retrieval/6728

动机:通过定制化的协议来实现链外(跨链)数据检索/存储(基于链上数据最小化存储原则)

  • 意味着我们需要的很多数据都需要从链外获取,而链外获取的标准以及安全性是一个挑战,例如NFT tokenuri

典型用例:在非ETH主网上使用ENS解析服务

  • 这个EIP在我开始最初看的时候也是有点懵 还以为是chainlink提交的标准,直到知道作者是ENS的开发人员之后才明白提交此EIP的最原始动机:希望在任意EVM兼容链中离线或者链上使用ENS

系统角色:

  1. 用户客户端
  2. 链上合约(evm兼容链)
  3. 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实现起来逻辑大概是:
      1. ENS在polygon上面部署ENS副本(不包含任何数据,也就是不包含任何解析数据)
      2. 用户在polygon上面使用ENS的时候本地调用polygon中ENS的EIP3668函数,调用后本地客户端会获取到ENS官方的http网关连接方式,用户本地客户端通过网关获取到json数据后再发送到polygon链上EIP3668验证端点函数,如果验证通过则表示此网关返回的数据为官方返回的数据,且数据未被篡改
      3. 用户把网关经过polygon的ENS合约验证的json格式化后提交到polygon中ENS合约中,ENS合约验证无误后即把最新的ENS解析数据存储在polygon链上(仅仅如果有修改才需要提交,因为提交本身使用gas成本的)