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

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, 桥只要保证总资产的帐对的上就可以.
arbitrum 资产桥合约的更多相关文章
- Bytom储蓄分红合约解析
储蓄分红合约简介 储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润.用户可以在准备期内(dueB ...
- 去中心化金融-Lec3
区块链 (什么是区块链?)区块链提供了一种无需可信的参与方,能够让多个参与方实现合作的方式(若存在可信的第三方,则不需要区块链:但是金融系统中往往没有可信的第三方) 终端用户工具:user inter ...
- PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...
- ethereum/EIPs-1271 smart contract
https://github.com/PhABC/EIPs/blob/is-valid-signature/EIPS/eip-1271.md Standard Signature Validation ...
- Bytom交易说明(账户管理模式)
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 该部分主 ...
- Bytom 储蓄分红 DAPP 开发指南
储蓄分红DAPP 储蓄分红合约简介 储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润.用户可以在 ...
- 以太坊 layer2: optimism 源码学习 (一)
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- Bytom资产发行与部署合约教程
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 发行资产 ...
- Hyperledger Fabric Chaincode for Operators——实操智能合约
什么是Chaincode(智能合约)? chaincode是一个程序,它是使用Go语言编写的,最终在Java等其他编程语言中实现了指定的接口.chaincode运行在一个被背书peer进程独立出来的安 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例
目录 目录 1.什么是 Mist 2.Mist 在哪里下载? 3.Mist 有哪些依赖? 4.如何安装 Mist? 4.1.安装 Mist 依赖工具包 4.2.安装 Mist 4.3.启动 Mist, ...
随机推荐
- 算法学习-Dancing Links X
Dancing Links X 舞蹈链. 实质为用循环十字链在图上将所有"1"的位置链起来 构造较为巧妙,且极易理解,本题为 DLX 模板(精确覆盖问题) DLX 算法的题目做法一 ...
- 心得小结,关于注重加强MCU下调试能力的意识
这两个月没有怎么更新博文,最近换工作了,根据新工作安排,大半年内都做MCU开发(就不要叫单片机了,太老土了). 入职新工作了,需重构拳头产品的软件,所以每天加班加点. 单片机与linux应用开发,开发 ...
- Linux操作系统和文件系统、常见命令(下)
C语言的绝大部分内容应该记录在以.c作为拓展名的文件里,这种文件叫做C语言的源文件 C语言程序里还包括以.h作为拓展名的文件,这种文件叫头文件(只有极少数的内容可以记录在头文件里) C语言程序里可以使 ...
- 2款.NET开源且免费的Git可视化管理工具
Git是什么? Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发.Git最初是由Linux开发者Linus Torvalds创建的,它具有高效.灵活.稳定等优 ...
- Java使用snmp协议采集服务器信息
Java使用snmp协议采集服务器信息 一.snmp简介 SNMP是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及Hubs等)的一种标准协议,它是一种应用层协议. ...
- Android Systrace 基础知识 -- Systrace 简介
1. 正文 Systrace 是 Android4.1 中新增的性能数据采样和分析工具.它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Ke ...
- linux tracepoint增加
引入tracepoint的背景 当需要获取内核的debug信息时,通常你会通过以下printk的方式打印信息: void trace_func() { //-- printk("输出信息&q ...
- 十三载求索续风华,数智化扬帆启新航 | 万字长文回顾DTC 2024
4月13日下午,为期两天的第十三届数据技术嘉年华(DTC 2024)在北京新云南皇冠假日酒店圆满落下帷幕.本次大会由中国数据库联盟与墨天轮社区联合主办,以"智能·云原生·一体化--DB与AI ...
- iOS中NSBundle使用小结
bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,文本文件,属性列表,语言包,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle ...
- v-if 为什么不能和 v-for 一起使用 ?
当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,通过v-if 移动到容器元素,不会再重复遍历列表中的每个值.取而代之的是,我们只检查它一次,且不会在 v-if 为否的时候运算 v- ...