以太坊 layer2: optimism 源码学习(二) 提现原理
作者:林冠宏 / 指尖下的幽灵。转载者,请: 务必标明出处。
GitHub : https://github.com/af913337456/
出版的书籍:
本次是系列文章,这是第二篇。第一篇在: 以太坊 layer2: optimism 源码学习 (一)
目录:
- 为什么存在提现动作
- 提现的原子性
- 提现的调用链
- 源码中的提现实现
- 下一篇核心组件
Relayer的源码实现
为什么存在提现动作?
OP 本质是个大型的 DApp,我们要使用它,就要先从以太坊的主网充值 Token 进去,充值的原理及其源码分析在第一篇文章中。
用户在 OP 里面进行了系列的交易动作后,需要把 Token 转回到主网,才能与其他的 DApp 的交互或主网转账。因此对应地,OP 提供了提现 Token 到主网的功能。
提现的原子性
虽然在 OP 中的交易都直接发生在 OP 的网络中,比如转账的地址是 OP 网络中的以太坊地址。但是所有的交易都会被同步到以太坊主网中,与 OP 的合约发生实际的主网交互。这就意味着,地址所在 OP 中 Token 余额的变化也会导致主网上的余额变化。这一点见第一篇文章中的 OP 原理介绍。
提现的调用链
用户是提现发起的对象,提现遵循下面的步骤:
- 用户向 OP 的
Sequencer发起提现交易; - 这笔交易是一次合约调用交易,指向
L2StanderBridger.sol中的withdraw函数; withdraw函数中会构造最后在主网合约中发起真正提现的函数数据;- 交易被 OP 网络正常打包;
- 交易被
Batch-Submitter提交到主网CTC合约,走正常的挑战机制; - 挑战期过后,
Relayer为此交易生成证明,调用 L1 上的L1CrossDomainMessenger.relayMessage函数,使之完成合约检查然后在内部调用目标合约,最终在 L1 完成 L2 交易的最终目的,用户的 Token 在 L1 地址上得到了提现; - 提现闭环。
源码中的提现实现
首先是 L2 上的 withdraw 函数,如下图所示,参数细节描述在图中。要知道同个地址的私钥是一样的,意味着用户在 OP 的地址,在主网上,一样是这个私钥所拥有所有权。

withdraw 函数组装 L1 合约上的目标最终提现函数。如下图所示,留意这句重点 IL1StandardBridge.finalizeETHWithdrawal.selector,和充值流程中的 deposit.selector 是异曲同工的做法。

最终 Relayer 会调用到的 L1CrossDomainMessenger.relayMessage 函数,在这个函数里面,就会把前面包装的,对应到 L1StandardBridge.sol 合约中的 finalizeETHWithdrawal 函数给执行掉。实现最终的提现。如下图所示。

上图 relayMessage 函数中,_target 就是合约 L1StandardBridge.sol,_message 就是被 L2StanderBriger.sol 的提现函数中包装的数据,如下:
message = abi.encodeWithSelector(
IL1StandardBridge.finalizeETHWithdrawal.selector,
_from,
_to,
_amount,
_data
);
这个 message 就是对应 relayMessage 函数中的 _message。最终执行到 L1StandardBridge.sol 中的 finalizeETHWithdrawal 函数,其源码如下:

下一篇核心组件 Relayer 的源码实现
以太坊 layer2: optimism 源码学习(二) 提现原理的更多相关文章
- 以太坊 layer2: optimism 源码学习 (一)
作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. 掘金:https://juejin.im/user/1785262612681997 博客:http://www.cnblogs.com/ ...
- Dubbo源码学习(二)
@Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...
- Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题
Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题 相关文章: Dubbo源码学习文章目录 前言 主要是前一阵子换了工作,第一个任务就是解决目前团队在 Dubbo 停机时产生的问题 ...
- python 协程库gevent学习--gevent源码学习(二)
在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...
- Vue源码学习二 ———— Vue原型对象包装
Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...
- Solidity合约记录——(一)如何寻找以太坊真实Solidity源码
在自主学习Solidity智能合约的过程中,第一份入手资料无疑是官方文档.感谢前辈们还能提供出文档的中文翻译,作为我入门的第一手资料:文末附上有用的学习链接{持续更新中} 阅读完基础文档同时上手合约后 ...
- [spring源码学习]二、IOC源码——配置文件读取
一.环境准备 对于学习源码来讲,拿到一大堆的代码,脑袋里肯定是嗡嗡的,所以从代码实例进行跟踪调试未尝不是一种好的办法,此处,我们准备了一个小例子: package com.zjl; public cl ...
- SocketServer源码学习(二)
SocketServer 中非常重要的两个基类就是:BaseServer 和 BaseRequestHandler在SocketServer 中也提供了对TCP以及UDP的高级封装,这次我们主要通过分 ...
- Thrift源码学习二——Server层
Thrift 提供了如图五种模式:TSimpleServer.TNonblockingServer.THsHaServer.TThreadPoolServer.TThreadSelectorServe ...
随机推荐
- Java随谈(六)## 我们真的理解 Java 里的整型吗?
我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...
- 解决python 导入selenium 库后自动化运行成功但是报错问题
本章节开始进入自动化的基础教学了,首先我们要对我们的工具有一定的熟练使用程度,做自动化常用的工具一个是搭建 RobotFramework自动化框架,另外一个便是我们最常用的python 工作原理是比较 ...
- 将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令
将 Ubuntu 16.04 LTS 的 Unity 启动器移动到桌面底部命令: gsettings set com.canonical.Unity.Launcher launcher-positio ...
- HMS Core 视频编辑服务开放模板能力,助力用户一键Get同款酷炫视频
前言 短视频模板,是快捷创作短视频的一种方式,一般由专业设计师或模板创作人制作,用户只需替换视频模板中的部分素材,便可生成一支与模板一样的创意视频.这种省时省力.无需"烧脑"构思创 ...
- 开发工具-SSMS官方下载地址
更新记录 2022年6月10日 完善标题. SQL Server Management Studio官方下载地址 https://docs.microsoft.com/en-us/sql/ssms/d ...
- 一篇文章带你深入浅出Vuex
在写Vuex之前,我们先用一个简单的例子来实现一个小demo 大家都知道Vue的父传子用在很多场景,比如像这样: 父组件: <template> <div id="app& ...
- 使用dockerfile部署springboot应用
本章简单展示如何最短时间 把springboot应用打包成镜像并创建成容器. 准备工作: 1.安装docker ,保证执行docker version没有问题 2.拉下来一个jdk镜像 docker ...
- DAST 黑盒漏洞扫描器 第六篇:运营篇(终)
0X01 前言 转载请标明来源:https://www.cnblogs.com/huim/ 当项目功能逐渐成熟,同时需要实现的是运营流程和指标体系建设.需要工程化的功能逐渐少了,剩下的主要工作转变成持 ...
- bat-windows系统激活
激活命令 slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D slmgr -skms kms.03k.org slmgr -ato slmgr -dlv 激活异常处理方法 ...
- 一种让运行在CentOS下的.NET CORE的Web项目简单方便易部署的自动更新方案
一.项目运行环境 项目采用的是.NET5开发的Web系统,独立部署在省内异地多台CentOS服务器上,它们运行在甲方专网环境中(不接触互联网),甲方进行业务运作时(一段时间内)会要求异地服务器开机上线 ...