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链上的合约,实现过程为:
- 调用以太坊上的Telepathy Router 合约的
send
函数:
function send(
uint32 destinationChainId, bytes32 destinationAddress, bytes calldata data
)
-
Proof of Consensus
当交易固化后,Telepathy Operator 会生成区块头共识的证明,主要验证Validators的签名,并提交到Telepathy 轻客户端;
-
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 链上请求以太坊上的数据,实现过程为:
-
调用
oracle.requestCrossChain
函数,例如:telepathyOracle.requestCrossChain( address(mainnetContractAddress), abi.encodeWithSelector(IERC721.ownerOf.selector, _tokenId), address(myCallbackAddress) );
- 处理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
版。
网友评论