arbitrum 资产桥合约

资产桥的作用

Rollup 的主要流程中,实际上不包含资产桥,也就是说即使没有资产桥,L2依然能正常运行但是此时L1与L2在数据上是完全独立的两条链,L1不理解L2上的数据(L1只保存L2压缩后的数据,不理解数据),L2上也不知道L1上发生了什么(只能拿到区块高度等一些基本信息)。完全可以把L2做是另外一条链。

在这种情况下如果需要做资产转移,就和普通的一层链之间的资产转移没什么区别.

而有了自己实现的资产桥就不一样,因为实际上L2的数据都是通过L1上的inbox(sequencer inbox)合约保存的,所以当我们在inbox合约中解析数据,L1上就可以看到L2上的部分数据
虽然这会增加L1上的手续费,但是这样可以降低跨链带来的安全性问题(跨链过程本质上是在L1上的inbox合约中,其他逻辑则完全嵌套在L2的主用逻辑中,也就是跨链的安全性=整个L2的安全性=aribtrum的any-trust模型)

arbitrum 的快箱&慢箱

在介绍资产桥之前,我们先来区分一下arbitrum的快箱和慢箱。

快箱 (Sequencer Inbox)

快箱是L2交易的入口(写入sequencer的交易最终会在L2上被处理,sequencer的处理实际上还没进入L2)
在Sequencer inbox中交易会迅速被validator打包(validator的打包逻辑就是在在inbox中拿数据,来打包)

慢箱(inbox)

慢箱中的交易是L1往L2上发送的交易,通过慢箱,我们可以在L1上改变L2的世界状态.

慢箱的实际价值有两个

  • L1向L2发送数据是,L2不需要验证L1的数据,L1的数据只能通过inbox进入L2,对数据的校验都发生在L1的inbox合约中

  • 抗审查,因为L2的所有交易都是由sequencer打包的,而sequencer是一个中心化的节点,sequencer可以对L2上的交易进行恶意的审查从而拒绝部分交易(sequencer 不能修改交易内容,因为他没有指定账户的私钥).此时可以通过L1上的inbox合约强行把交易写入L2(实际上最终也是写入sequencer inbox),L2的区块是validator在Rbolck中确定的(sequencer不同意也无所谓),当交易通过慢箱写入L2后,sequencer只能接受这个交易(否则会因为与L2的状态不一致导致失去部分功能)

资产桥的运作

知道慢箱的处理逻辑之后,我们可以来看看资产桥是怎么运作的.

资产桥分为两种处理逻辑,L1到L2(充值),L2到L1(提现),当然arbitrum的资产桥不只是能做资产转移的操作,实际上也可以完成calldata的跨链操作(把calldata传递到L2指定的合约)

充值过程

在讨论充值问题之前,我们需要考虑下面几个

  • ETH怎么铸造?
  • ERC20怎么处理?
  • L2上没有对应的ERC20合约怎么办?自动部署,还是交易直接失败?
  • 怎么控制L2铸造的权限,L2上的代币最终是可以提现在L1上的,如果随便铸造,跟L1对不上账怎么办?
  • 铸造的时候L2手续费暴涨,铸造失败怎么办?

arbitrum 的资产桥是典型的锁定-铸造 销毁-解锁模型,L1上锁定的代币,L2上怎么铸造.

gateway

要回答这些问题,我们先来看一下arbitrum的资产桥模型 gateway

arbitrum gateway

gateway实现了L1 <--> L2资产合约的映射(ETH也使用合约的方式来映射)

arbitrum提供来了一些标准的ERC20 template,正常情况下,如果L1上的资产合约也是标准的ERC20,那么arbitrum会自动在L2上部署一个相同的ERC20合约(可能详细功能不同,但是能实现ERC20的逻辑),而这个映射出来的ERC20 通过gateway做权限验证,也就是只有gateway合约能在这个合约中铸造和销毁,这样保证了L1和L2上的账能对的上.

插一个小知识,arbitrum链上的交易手续费是使用ETH来支付的,但arbitrum本身不产生ETH(这点我不是很确定),所以在使用arbitrum之前,需要从以太坊上冲一些ETH到arbitrum上,这个充值交易的手续费在L1上支付,注意这里不是代付,是在交易到达L2后直接在L1中的msg.value中扣除。涉及到L1 <--> L2交易一个非常麻烦的问题 -- 手续费处理。这里就不详细展开

retryable 可重试票据

可重试票据主要是用来解决L2上铸造失败的情况,L1上充值交易发送到L2上之后,可能因为L2上手续费超过 用户愿意支付的手续费阈值(在L1上发送充值交易时指定的)时可能导致交易的失败。这时候交易已经记录到L2上只是执行失败(calldata还在),用户可以在L2上手动重试,手动重试不能改变calldata,但是手续费是在重试交易中一起支付的。L1 -> L2的可重试票证只会保存7天,7天之后,资产将会永久的锁定在L1上(可以续费延期).

正常情况L1上的充值操作不需要用户去L2上触发铸造,L2会自动完成铸造.L2 -> L1就不行,必须去L1上手动提现,当然相对而言L2 -> L1的票据是永久有效的,用户不需要急着提现

ok,我们已经知道了资产桥的架构,现在来看一下充值的详细过程

充值过程,用户调用L1 inbox合约中的createRetryableTicket方法创建可重试票据,指定L2上的接受者地址,token地址,手续费等,

inbox会将L1的资产锁定的L1上对应资产的gateway合约中,并将L2上的铸造请求的ticket写入sequencer inbox合约中

L2 订阅到sequencer inbox 中的铸造请求后会找到对应的gateway合约(这部分工作是gateway router做的),铸造代币

如果L2自动铸造失败,这是用户可以在L2 上手动重试,或者在L1上完成手动重试(避免排序器审查)

提现流程

在理解充值流程后,提现就很容易理解了

提现的过程实质上是操纵gateway合约完成代币销毁,并生成票据,将票据写回到L1上

这里简单解释一下写回操作:

写回操作是通过arbitrum的outbox实现的,由validator来调用L1上的outbox合约将数据写回到L1,但是写回操作并不直接执行这些数据,只是记录数据,最后的执行需要用户手动去触发,这也是为什么提现操作不会自动在L1上进行(目前猜测是因为L2->L1不好控制手续费,所以没有在这里做自动执行,并且,自动执行相当于是L2自动修改L1的状态,实际上是比较不可控的)

当充值操作写回到L1的outbox之后,用户就可以在L1上解锁资产

Q: 我冲了10WETH 可以提现20WETH吗?
这是可以的,如果你在L2上赚钱了(多赚了10WETH),只要L2提供的票据说你销毁了20WETH, 那么在L1上就会给你解锁20WETH, 桥只要保证总资产的帐对的上就可以.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853232.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙NEXT开发案例:经纬度距离计算

【引言】 在鸿蒙NEXT平台上,我们可以轻松地开发出一个经纬度距离计算器,帮助用户快速计算两点之间的距离。本文将详细介绍如何在鸿蒙NEXT中实现这一功能,通过简单的用户界面和高效的计算逻辑,为用户提供便捷的服务。 【环境准备】 • 操作系统:Windows 10 • 开发工具:De…

C语言中0为假,正数和负数均为真

001、[b20223040323@admin2 test]$ ls test.c [b20223040323@admin2 test]$ cat test.c #include <stdio.h>int main(void) {int i,j,k; ## 三个变量 负数、正数和0i = -5;j = 8;k = 0;if(i){puts("xxxx");}if(j){puts("yyyy");}if(k){puts(&qu…

2024-2025-1(20241321)《计算机基础与程序设计》第十二周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十二周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.…

Jmeter接口测试-图片验证码的识别

Jmeter接口测试-对图片验证码的识别Jmeter接口测试-对验证码的识别 ## 大概说一下思路,以及方法,我的接口接口的返回值是img/base64编码的,我采用的是OCR Server识别,获取返回值,图片保存到本地,再图片转码base64,之后携带数据请求OCR识别。(网上的办法是接口这种base6…

yolo导出,动态batch,固定图片尺寸

当使用export,dynamic=True时,batch和尺寸都是动态的。若想只有batch动态

如何在PbootCMS中实现自动清理runtime缓存?

要在PbootCMS中实现自动清理runtime缓存,可以按照以下步骤操作:编辑控制器文件:打开文件 /apps/home/controller/ExtLabelController.php。 找到以下代码:php// 测试扩展单个标签 private function test() {$this->content = str_replace({pboot:userip}, get_user_ip()…

如何修改自动清理脚本的清理间隔时间?

如果你想修改自动清理脚本的清理间隔时间,可以在控制器文件中调整 expire_time 的计算方式。以下是具体步骤:编辑控制器文件:打开文件 /apps/home/controller/ExtLabelController.php。 找到以下代码:php// 自动会话清理脚本 public function clean_session() {check_dir(R…

如果修改权限后仍然提示“会话目录写入权限不足”,应该如何处理?

如果您已经按照建议修改了PbootCMS相关目录的权限,但仍然收到“会话目录写入权限不足”的提示,可能是由于以下几个原因导致的:服务器配置问题:某些服务器可能有特殊的权限管理机制,例如SELinux或AppArmor。这些机制可能会限制Web服务器对某些目录的写入权限,即使您已经设…

帝国CMS灵动标签调用栏目内容排除某些栏目方法

使用灵动标签中的条件来排除特定栏目内容 示例代码:[e:loop={0,20,5,1,id not in(7,9,15,16),newstime DESC}] <a href="<?=$bqsr[titleurl]?>"><?=$bqr[title]?></a> [/e:loop]通过 id not in(7,9,15,16) 条件排除指定的栏目ID【遇到问…

zblog函数GetCategoryByID:通过分类ID获取分类对象数据

函数位置:zblogphp.php文件,大约3300行。函数参数:$id:整数类型,要获取数据的分类ID。函数输出:返回一个对象,包含指定分类的所有值。示例:if ($zbp->GetCategoryByID(1)->ID != 0) {// 存在ID是1的分类echo $zbp->GetCategoryByID(1)->Name; }其他数据值:…

为什么在PbootCMS后台上传的缩略图会变得模糊?

在使用PbootCMS后台发布内容时,如果上传的缩略图变得模糊,这通常是由于PbootCMS默认的图片尺寸限制所致。PbootCMS为了保证网站的加载速度和性能,默认设置了缩略图的最大宽度和高度。当上传的图片超过这些限制时,系统会自动压缩图片,导致图片质量下降,从而显得模糊。以下…

Z-BlogPHP免输入密码登陆工具(重置密码为12345678)

代码仅供参考, 上传网站根目录, 可以将密码重置为12345678。 使用重置的简易密码登录后台, 可以在用户管理栏目重置相设置的密码 <?php require ./zb_system/function/c_system_base.php; //$zbp->Load();if (isset($_GET[uid]) && isset($_GET[resetpw])) …