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_;

  }

  }

相关文章
|
SQL 人工智能 自然语言处理
Copilot的优势
【2月更文挑战第13天】Copilot的优势
632 5
Copilot的优势
|
Linux
Mac使用sz/rz
Mac使用sz/rz
620 0
|
JavaScript
JS中every的简单使用
JS中every的简单使用
|
Java Shell 应用服务中间件
超详细总结docker镜像
超详细总结docker镜像
439 0
|
Web App开发 JavaScript 前端开发
JavaScript中的性能优化:代码优化技巧与性能分析工具
【4月更文挑战第22天】本文探讨JavaScript性能优化,包括代码优化技巧和性能分析工具。建议避免全局查找、减少DOM操作、使用事件委托、优化循环和异步编程以提升代码效率。推荐使用Chrome DevTools、Lighthouse和jsPerf等工具进行性能检测和优化。持续学习和实践是提升JavaScript应用性能的关键。
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
12月前
|
机器学习/深度学习 人工智能 机器人
智能体零样本解决未见过人类设计环境!全靠这个开放式物理RL环境空间
在人工智能领域,训练通用智能体以应对未知环境是巨大挑战。近期研究通过Kinetix——一个开放式物理强化学习(RL)环境空间,取得了突破。Kinetix由Michael Matthews等人提出,生成数千万个2D物理任务,训练出能零样本解决未见过环境的智能体。借助新型硬件加速物理引擎Jax2D,研究团队高效模拟数十亿环境步骤,使智能体在多样化环境中学习一般性机械属性,展现出出色的零样本和微调能力。论文地址:https://arxiv.org/pdf/2410.23208
247 3
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
Ubuntu Docker 容器
Ubuntu 22.04.3 LTS_安装Docker
Ubuntu 22.04.3 LTS_安装Docker
1589 2