eip1967可升级合约数据流分析2023-03-12

注:

  • 仅作技术交流,禁止商用
  • 如有侵权,请联系删除

目录

  • 背景
  • 概述
  • eip1967实现
  • 易混概念——对比eip1167

背景

  • 智能合约的定义(contract)
    根据区块链可编程的特点,人们可以将合同变成代码的形式放到区块链上,并在约定的条件下自动执行
  • 智能合约能做什么
    DEX, Defi, GameFi, erc20等同质化代币(usdt), erc721等非同质化代币(NFT)
  • 为什么需要合约升级
    升级业务逻辑
    升级数据结构
    保留原始数据
  • 合约升级的几个标准方案
    eip897
    eip1967
    eip1822

概述

合约升级方案发展
  • 原始的合约更新:对原有合约地址数据做一个快照,将原有合约地址上的数据完整拷贝到新地址上,需要扫链等,工作量大
  • 可升级代理合约方案:用户访问proxy合约,实际方法由logic合约实现。数据存储在proxy合约中
  • 经过一段时间的发展,目前eip1967是使用最广泛的可升级代理合约方案,同时open zeppelin官方推荐使用eip1822方案

手动升级方案——usdt以太坊版本

概述:

  • 数据存储在当前合约
  • 升级后需要迁移数据

缺点:

  • 数据迁移代价太大
  • 开发逻辑繁琐


    原始合约数据存储

    合约升级接口判定

可升级代理合约方案——简介

架构

eip1967可升级架构

关键技术

  • storage slot合约存储结构

    • 合约存储冲突(clashing)
  • 合约fallback机制

    • 减少proxy合约和logic合约的方法冲突
  • delegatecall代理调用

    • 调用logic合约方法修改本地(proxy合约)数据
  • admin用户对于普通请求的访问

    • 引入proxyAdmin合约

代理合约知识储备——合约数据存储常见概念

可升级代理合约方案——proxy合约slot数据

读取logic合约地址

logic合约地址slot存储

说明

proxy合约中需要存储至少2个关键信息,并且不能和逻辑合约上的数据冲突,所以通过读取slot的方式从proxy合约中获取数据。类似于c语言的 地址指针 和地址指针指向的数据

  • implemention_slot
    - 存储logic合约的地址
  • admin_slot
    - 有权限对合约进行升级的地址

举例

假设proxy合约的用slot0存储implemention的logic合约地址,那么logic合约的slot0的数据如何读取?

可升级代理合约方案——合约fallback机制

proxy合约fallback流程

fallback函数定义

  • 每一个合约有且仅有一个没有名字的函数。
  • 这个函数无参数,也无返回值。
  • 如果调用合约时,没有匹配上任何一个函数(或者没有传哪怕一点数据),就会调用默认的回退函数。

proxy合约实现

  • proxy合约几乎不提供任何方法
    • 除合约升级接口,其他所有访问都转交给fallback
  • fallback调用的时候,校验调用者身份
    • admin用户也能正常访问logic合约方法

可升级代理合约方案——合约delegatecall代理调用

proxy合约delegatecall的使用

说明

  • 在proxy合约的请求处理中,通过delegatecall函数,运行对应的logic合约的方法代码
  • 在当前合约上下文中运行
  • 最终修改的是当前合约(proxy合约)的数据
  • delegatecall实现原理:evm虚拟机的实现中替换目标合约运行的上下文环境(geth为例)

eip1967可升级合约架构核心数据流

完整数据流

说明

  • 普通用户数据流
  • admin用户数据流
  • proxyAdmin合约
    • 有权限进行合约升级的用户(admin)也能访问逻辑合约方法

流程

  • 用户 --> proxy合约
  • 用户 --> proxyAdmin合约 --> proxy合约

易混概念——eip1167方案是什么

eip1167方案

易混概念——eip1967的beacon方案

eip1967的beacon方案
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容