对这个东西感兴趣只要是最近有人说他们的stg token走势不错,另一个是这东西跨链在nft也能使用,就是全然一个跨链底层通用协议,而且又是去中心化很安全之类的,于是打算研究看下
研究方法主要是看下他们家的白皮书后,再结合找下实际使用例子来理解
白皮书里第7页这个图应该大家在网上见的比较多

里面说的就是不同链上有他们部署的endpoint,链下有oracle和relayer
有个说明点,像上图里的第5步,是链上指向链下,whitepaper里面一般也用调用的说法,站我角度来对传统API理解来说,其实链上不可能直接调用链下,只有链上emit事件,链下监听事件这样做法。但为了好说明方便理解,才用了调用这个说法?
whitepaper里面的内容我就不多说了,主要是说下结合链上的使用,看下这里面的流程,链上的使用,目前我就看他们官方的stargate finance 跨链桥案例,下面是一个调用的案例
https://etherscan.io/tx/0x544edf450de5b75500ccbe09f381c47e00f78300f2fc2c7d8e2e5198aef103be From: 0xc72a28bdd92cb2adac25d824a8f4ba92030245f2 To: Contract 0x8731d54e9d02c286767d56ac03e8037c07e01e98 TRANSFER 0.004029833237867575 Ether From 0x8731d54e9d02c286767d56ac03e8037c07e01e98 To 0x296f55f8fb28e498b858d0bcda06d955b2cb3f97 TRANSFER 0.004029833237867575 Ether From 0x296f55f8fb28e498b858d0bcda06d955b2cb3f97 To 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 TRANSFER 0.004029833237867575 Ether From 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 To 0x5b19bd330a84c049b62d5b0fc2ba120217a18c1c TRANSFER 0.000366348476169779 Ether From 0x5b19bd330a84c049b62d5b0fc2ba120217a18c1c To 0xc72a28bdd92cb2adac25d824a8f4ba92030245f2
Bridge https://etherscan.io/address/0x296f55f8fb28e498b858d0bcda06d955b2cb3f97#code
Endpoint https://etherscan.io/address/0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675#code
UltraLightNode https://etherscan.io/address/0x5b19bd330a84c049b62d5b0fc2ba120217a18c1c#code
这里面我看了下涉及到了上面几个合约,Bridge算是layerzero里面的dapp应用ua了,结合tenderly,看到里面从上到下对ep的send的调用,是ep到uln,到达最后uln后,的代码如下:
{ relayer.notifyRelayer(chainId, uaConfig.outboundProofType, _adapterParams);
// (b) emit payload and the adapterParams if any
{
bytes memory encodedPayload = abi.encodePacked(nonce, ua, _destination, _payload);
emit Packet(chainId, encodedPayload);
// (c) notify the oracle
ILayerZeroOracle(uaConfig.oracle).notifyOracle(chainId, uaConfig.outboundProofType, uaConfig.outboundBlockConfirmations);
}
}
根据里面的注释,也能有个粗略的理解了最后是emit了payload,也通知了relayer和oracle。
我猜想这时候 oracle 专注监控着他的合约发起的事件,这样可以实时知道他关注的数据,这样站在更高角度来说,也有点类似链上调用了oracle api了。不过看代码有点奇怪,实体 payload 数据其实是在uln里面emit出来的,notifyOracle 调用的时候 只简单的数据 所以orcale还是监控uln的事件来获取的吧?notifyOracle只是告知有事件了,取数据还是要到ul来取
顺便说下,他这个layerzero里面可以支持ua配置,设置一些参数,像设置你自己的oracle和relayer,还是比较灵活的
uln合约里面的uaconfig结构 ApplicationConfiguration memory uaConfig = getAppConfig(_chainId, _ua); "inboundProofLibraryVersion":3 "inboundBlockConfirmations":20 "relayer":"0xcb566e3b6934fa77258d68ea18e931fa75e1aaaa" "outboundProofType":1 "outboundBlockConfirmations":15 "oracle":"0x41c69c8ffb4049fc393ed68ec0ce66c37f8cf7a0"
最后的oracle和relayer合约不开源,同时也不知道链下的relayer程序源码,不过按官方意思是每个dapp都能运行自己的relayer,这也是官方当初的设计.官方说他们的relayer这个代码以后更完善后考虑开源
上面讨论的流程其实只是单边src发起的代码流程分析,现在得看下目标链上的执行
根据交易参数,发现交易是跨到arb上的,这时候到arbscan上可以看到接收的token交易是 https://arbiscan.io/tx/0xc4f14e786a389dcb549590f9a7936c2261491debc721fd4ffd94b2c47b820b88
不过好像到账只有9998刀,手续费差不多消耗了12刀?
可惜他们的arb上的合约没开源,无法分析,tenderly也没支持。这个就先到这吧,我回头找笔能跨到有开源合约的交易分析下。
不过通过这笔交易,发现里面的调用者和合约地址是各个链通用的,马蹄上也有这2个地址,不过在以太主网对不上,好在调用者是一样,所以根据调用者,也能找到心太主网的合约地址是
0xcb566e3b6934fa77258d68ea18e931fa75e1aaaa
随手挑一笔交易 继续分析
https://etherscan.io/tx/0x1dcc750a91ccd50eca4484ce778e8d7d7517adbae53f32b487f35e4336f29460
https://snowtrace.io/tx/0x2e469742c375d295be34c2b53ac9fffcee0e4e72d51146d47757dd7bfce39bc1
这笔的交易是从avax跨到eth的,源交易如下:

这笔跨链跨到eth,gas用了74刀,到手的u也只有14547,这又少了7刀,所以这笔总费用差不多81刀,另外layerzero那边gas消耗了33刀,所以这笔交易支付给了layer0 相关费用达到了差不多50刀,不过这是主网,也确实差不多这费用。好了,不说其它的,分析代码流程

通过函数调用分析,确实是调用了uln里面的validateTransactionProof函数,按官方那个图,这个函数的调用是由relayer来调用的,这里面会有结合oracle提供的hash数据来检验源链是不是真的存在一笔跨链的交易。
我看了这块代码,跨链交易的payload数据是根_lookupHash存在haslookup里面的,是通过updatehash函数保存的,这个函数是oracle负责调用的,但白皮书好像是说oracle只提供block header hash,replayer提供proof和data,这块和代码有点对不上。
不过整体上算跑通了,对于目标链端的执行就是relayer调用uln合约的valid函数,里面触发了校验源交易是否存在,是否comfirm了,通过后,就调用对应的ep,ep最后调用上层的dapp(ua).这块分层设计和白皮书是对的上的
(题外话:当时粗略看了 ep,uln代码设计,还想着setconfig接口是开放,可以自由设置,不过最后是设置了后也没用,影响不了原项目,想影响原项目就是得在validproof接口成功的时候,能调用原项目的receive接口 但如果是自个设置config的话,里面的dstaddress是取的当时setconfig调用时的msg.sender,所以没用,只有dstaddress是stargate的合约地址才能影响到原项目)
