MMM排单互助智能合约开发系统部署技术

简介: 目前实现的方式根据存储区分有各种各样的模式,但是都离不开一个最底层的机制,就是使用delegatecall的特性去实现可升级的合约,达到合约可持续优化更改的效果

  智能合约通俗点说就是写在区块链上面的代码,代码里面编写着严谨完善的规则,一旦某个用户满足了合约里面的规则条件,就会触发里面的代码,执行某个方法。

  为什么要使智能合约达到可升级

  智能合约的特点之一就是部署到链上之后不能修改,这一机制使得合约的交互方都可以信任合约。但也带来了一系列的问题,并且如果已部署的合约发现漏洞,也是无法修复的。假如发现了bug,必须修复,那如何处理?就是使用合约达到可升级优化才能满足需求

  升级合约的机制原理

  什么是合约升级

  使已经部署上链的合约做到可优化可更改,例如链上的业务逻辑代码和状态变量达到可增删改的功能.

  2.合约升级的实现机制原理

  目前实现的方式根据存储区分有各种各样的模式,但是都离不开一个最底层的机制,就是使用delegatecall的特性去实现可升级的合约,达到合约可持续优化更改的效果.

  delegatecall介绍

  目前调用合约的方式主要有三种

  call

  delegateCall

  staticCall

  共同点:都是去调用执行目标合约地址的方法

  区别:delegateCall的执行环境和call和staticCall相反,正因为这样所以可利用这种特性实现可升级,在用户层面上无感知。

  实现可升级的ERC20合约

  编写InitializedProxy代理合约,此合约主要作用是转发和存储数据.

  继承openzeppelin的StorageSlotUpgradeable合约,用于插槽工具类。

  //SPDX-License-Identifier:GPL-3.0

  import" openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol";

  pragma solidity>=0.7.0<0.9.0;

  contract InitializedProxy{

  //address of logic contract

  //slot bytes32(uint256(keccak256('EIP1967.PROXY.CONFTI.IMPLEMENTATION'))-1)

  bytes32 internal constant _IMPLEMENTATION_SLOT=0x5f62ce3c9aebd463c7a36ab1b244d2bb94f07a2c13889b3b687940ebc467b9b3;

  //========Constructor=========

  constructor(

  address logic,

  bytes memory initializationCalldata

  ){

  require(logic!=address(0),"Proxy::Wrong proxy contract address");

  StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value=logic;

  //Delegatecall into the logic contract,supplying initialization calldata

  (bool _ok,bytes memory returnData)=

  logic.delegatecall(initializationCalldata);

  //Revert if delegatecall to implementation reverts

  require(_ok,string(returnData));

  }

  //========Fallback=========

  fallback()external payable{

  address _impl=StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;

  assembly{

  let ptr:=mload(0x40)

  calldatacopy(ptr,0,calldatasize())

  let result:=delegatecall(gas(),_impl,ptr,calldatasize(),0,0)

  let size:=returndatasize()

  returndatacopy(ptr,0,size)

  switch result

  case 0{

  revert(ptr,size)

  }

  default{

  return(ptr,size)

  }

  }

  }

  //========Receive===

  receive()external payable{}//solhint-disable-line no-empty-blocks

  function upgradeVersion(address newAddress_)public{

  StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value=newAddress_;

  }

  }

相关文章
|
8月前
|
弹性计算 人工智能 固态存储
2026阿里云轻量应用服务器全解析:轻量特性、费用价格、功能优势及问题解答FAQ
2026阿里云轻量应用服务器全面升级:全系标配200Mbps峰值带宽、五大新规格族、开箱即用、免运维。38元/年起,支持WordPress、AI工具等一键部署,适合个人博客、小程序后端及跨境建站,新老用户同享优惠。
1339 13
|
8月前
|
存储 Kubernetes 安全
NFS Subdir Provisioner 实现K8S动态PV供应
本文介绍基于原生NFS与NFS Subdir External Provisioner的K8S动态存储方案,通过Ubuntu 24搭建NFS服务器,实现自动创建PVC专属子目录,避免数据混叠。部署简单、维护成本低,适用于90%中小规模K8S集群,含完整配置步骤与安全建议。
500 1
|
Linux 数据安全/隐私保护 芯片
自动连点器一秒10000下怎么设置的?
万次/秒连点器实现原理与技术方案
|
8月前
|
人工智能 NoSQL Serverless
[最佳实践] Serverless架构下的Agent编排:智能体来了(西南总部)AI Agent指挥官的冷启动优化与状态持久化指南
本文将复盘 智能体来了(西南总部) 技术团队的一套生产级架构。他们通过将 AI Agent 指挥官 与 AI 调度官 拆解为细粒度的函数,利用 NAS 挂载、镜像加速 解决冷启动,利用 Tablestore 实现状态外置,构建了一套“睡后收入”级的低成本 Agent 架构。
|
Linux 编译器 数据处理
探索Linux中的`ld`命令:链接器的奥秘
`ld`是Linux中的链接器,将编译后的目标文件链接成可执行或共享库。作为GNU Binutils的一部分,它处理符号引用、重定位,支持多种文件格式和库类型。常用参数包括`-o`指定输出文件,`-l`链接库,`-L`指定搜索路径。编译器驱动程序常用于简化链接过程。理解符号解析、选择静态/动态链接及管理库版本是使用`ld`的关键。使用`--verbose`调试链接问题,并考虑优化选项。
|
安全 NoSQL MongoDB
XJ-Survey:这个让滴滴日均处理1.2亿次问卷请求的开源系统,今天终于公开了它的架构密码!
嗨,大家好,我是小华同学。今天为大家介绍一款由滴滴开源的高效调研系统——XJ-Survey。它功能强大,支持多类型数据采集、智能逻辑编排、精细权限管理和数据在线分析,适用于问卷、考试、测评等场景。采用 Vue3、NestJS 等先进技术栈,确保高性能与安全性。无论是企业还是个人,XJ-Survey 都是你不可错过的神器!项目地址:[https://github.com/didi/xiaoju-survey](https://github.com/didi/xiaoju-survey)
684 15
|
安全 前端开发 云计算
Waline:一款开源、安全、简介的评论系统
阿里云计算巢提供了一键部署waline的功能,无需下载代码或安装复杂依赖,通过简单步骤即可搭建waline —— 一款带后端的极简风评论系统。
Waline:一款开源、安全、简介的评论系统
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
|
安全 Oracle 关系型数据库
看完这篇 教你玩转渗透测试靶机Vulnhub——Bluemoon: 2021
看完这篇 教你玩转渗透测试靶机Vulnhub——Bluemoon: 2021
1376 0