美文网首页
Telepathy 协议

Telepathy 协议

作者: 雪落无留痕 | 来源:发表于2023-09-03 00:28 被阅读0次

    Telepathy是基于Proof of consenus 的互操作协议,即采用zkSnarks 生成源链状态的有效性证明,并在上目标链的执行环境中运行,在目标链上保存源链的区块头,进而可以在目标链上证明源链的状态(账户余额,存储,交易, 事件)等。

    Telepathy核心在于采用zkSnark 电路验证以太坊验证者签名,从而可以采用智能合约的形式在其它EVM链上部署以太坊轻客户端,可以实现以下三种功能:

    • 从以太坊向其它链实现链链消息传递,用于跨链桥或跨链治理等;
    • 从其它EVM链上请求以太坊的数据;
    • 允许在执行层访问以太坊共识层的数据。

    目前支持3个源链(Mainnet, Gnosis, Goerli)和8个目标链 (Mainnet, Arbitrum, Avalanceh, Binance, Gnosis, Goerli, Optimism, Polygon), 已上线测试网。

    Telepathy协议

    Telepathy 的核心主要是验证以太坊共识中验证者的签名,通过智能合约实现轻客户端,实现以太坊和其它链的互操作性。

    假如Alice 想从以太坊上发起一笔交易,调用Gnosis链上的合约,实现过程为:

    1. 调用以太坊上的Telepathy Router 合约的send函数:
    function send(
        uint32 destinationChainId, bytes32 destinationAddress, bytes calldata data
    )
    
    1. Proof of Consensus

      当交易固化后,Telepathy Operator 会生成区块头共识的证明,主要验证Validators的签名,并提交到Telepathy 轻客户端;

    2. Telepathy 监听到以太坊上Router合约的事件,会生成对应的Merkle 证明,然后处理接收到的数据:

    //验证证明;
    executeMessageFromLog(
        bytes calldata srcSlotTxSlotPack,
        bytes calldata messageBytes,
        bytes32[] calldata receiptsRootProof,
        bytes32 receiptsRoot,
        bytes[] calldata receiptProof,
        bytes memory txIndexRLPEncoded,
        uint256 logIndex
    )
    
    //调用目标链上函数:
    handleTelepathy(uint32 sourceChainId, address sourceAddress, bytes memory data)
    

    ZK电路

    主要采用Circom, 基于Groth16证明系统,主要有两个电路:

    • Step 电路:主要是向轻客户端添加新的区块头,验证验证者的BLS12-381聚合签名;
    • Rotate 电路:对于每27个时,需要生成证明更新 sync commitee, 即验证者集。

    状态查询

    Telepathy 构建了一个证明者(Attestors)网络, 用于在L2上查询 L1上的数据,例如L2上的Defi协议可以获取L1 Chainlink L1上的数据,或者根据用户在L1上的NFT, 在L2上获取奖励。

    查询的数据主要是view 类型的智能合约数据;

    查询结果的准确性主要由>2/3的Attestors签名保证。

    发送请求需要支付一定的费用。

    应用示例

    Cross-Chain Message

    主要消息从源链到目标链,其中发送示例为:

    contract TelepathySenderExample {
        address TELEPATHY_ROUTER = 0x41EA857C32c8Cb42EEFa00AF67862eCFf4eB795a;
        ITelepathyRouter router = ITelepathyRouter(TELEPATHY_ROUTER);
    
        function sendMessageWithTelepathy() external {
            uint16 destinationChainId = 100;
            // A contract I deployed on Gnosis Chain
            address destinationAddress = 0x690B9A9E9aa1C9dB991C7721a92d351Db4FaC990;
            router.send(
                destinationChainId,
                destinationAddress,
                bytes("Hello world!")
            );
        }
    }
    

    接收过程为:

    contract TelepathyRecipientExample is ITelepathyHandler {
        address TELEPATHY_ROUTER = 0x41EA857C32c8Cb42EEFa00AF67862eCFf4eB795a;
        ITelepathyRouter router = ITelepathyRouter(TELEPATHY_ROUTER);
        // The contract I deployed on Ethereum
        address sourceChainContract = 0x71C7656EC7ab88b098defB751B7401B5f6d8976F;
        
        event SentMessage(uint32 srcChain, address srcSender, bytes message);
     
        function handleTelepathy(
            uint32 _sourceChainId, address _senderAddress, bytes memory _data
        ) external {
            require(msg.sender == address(router));
            require(_senderAddress == sourceChainContract);
    
            emit SentMessage(_sourceChainId, _senderAddress, _data);
    
            return ITelepathyHandler.handleTelepathy.selector;
        }
    }
    

    目前消息传递由Succinct官方的relayer 完成。

    Ethereum Data Oracle

    允许开发者从其它EVM 链上请求以太坊上的数据,实现过程为:

    1. 调用oracle.requestCrossChain 函数,例如:

      telepathyOracle.requestCrossChain(
          address(mainnetContractAddress),
          abi.encodeWithSelector(IERC721.ownerOf.selector, _tokenId),
          address(myCallbackAddress)
      );
      
    1. 处理oracle返回的请求,需要实现handleOracleResponse 函数:
    abstract contract OracleCallbackBase is IOracleCallbackReceiver {
        error NotFromOracle(address sender);
    
        address private _oracle;
    
        constructor(address oracle) {
            _oracle = oracle;
        }
    
        function rawHandleOracleResponse(
            uint256 nonce,
            bytes memory responseData,
            bool responseSuccess
        ) external override {
            if (msg.sender != _oracle) {
                revert NotFromOracle(msg.sender);
            }
            handleOracleResponse(nonce, responseData, responseSuccess);
        }
    
        function handleOracleResponse(
            uint256 nonce,
            bytes memory responseData,
            bool responseSuccess
        ) internal virtual;
    }
    

    Ethereum Consensus Oracle

    允许从执行层获取共识层的数据,目前还处在beta 版。

    参考

    https://docs.telepathy.xyz/

    https://www.succinct.xyz/

    https://github.com/succinctlabs/

    相关文章

      网友评论

          本文标题:Telepathy 协议

          本文链接:https://www.haomeiwen.com/subject/xadfvdtx.html