`

Beacon

 
阅读更多
Beacon
a.Implementation地址并不存放在Proxy合约里,而是存放在Beacon合约里,Proxy合约里存放的是Beacon合约的地址
b.在合约交互的时候,用户同样是和Proxy合约打交道,不过此时因为Proxy合约中并未保存Implementation地址,所以它要先访问Beacon合约获取Implementation地址,然后再通过delegatecall调用Implementation。
c.在合约升级的时候,管理员并不需要和Proxy合约打交道,而只需要交互Beacon合约,把Beacon合约存储的Implementation改掉就行了。
d.就是多个Proxy共享相同的Implementation、需要批量升级的场景。此时,如果想把所有Proxy都升级,那么升级Beacon就天然可以达到升级所有Proxy的效果

MyBeaconProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "hardhat/console.sol";

contract MyBeaconProxy is BeaconProxy {
    constructor(address _beacon, bytes memory _data) 
    BeaconProxy(_beacon,_data) {}
}


MyUpgradeableBeacon.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "hardhat/console.sol";

contract MyUpgradeableBeacon is UpgradeableBeacon {
    constructor(address _impl)UpgradeableBeacon(_impl){}
}


BeaconImplement.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "hardhat/console.sol";

contract BeaconImplement {
    uint public num;
    address addr;
    constructor() {
        num = 1;
        addr = msg.sender;
    }

    function fun() external {
        num = 2;
        addr = msg.sender;
        console.log("logic fun");
    }
}


BeaconImplementNew.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0;
import "hardhat/console.sol";

contract BeaconImplementNew {
    uint num;
    address addr;
    uint num2;
    constructor() {
        num = 1;
        addr = msg.sender;
    }

    function fun() external {
        num = 3;
        addr = address(this);
        num2 = 100;
        console.log("new logic fun");
    }
}


test
const { ethers } = require("hardhat")

contractProxy = "MyBeaconProxy";
contractUpgradeableBeacon = "MyUpgradeableBeacon";
contractImpl = "BeaconImplement";
contractImplNew = "BeaconImplementNew";

describe("beacon1", function () {
  it("beacon ", async function () {
    const ContractImpl = await ethers.getContractFactory(contractImpl);
    const impl = await ContractImpl.deploy();
    console.log("impl addr:",impl.address);

    const ContractImplNew = await ethers.getContractFactory(contractImplNew);
    const implNew = await ContractImplNew.deploy();
    console.log("new impl addr:",implNew.address);

    const ContractUpgradeableBeacon = await ethers.getContractFactory(contractUpgradeableBeacon);
    const upgradeableBeacon = await ContractUpgradeableBeacon.deploy(impl.address);
    console.log("upgradeableBeacon addr:",upgradeableBeacon.address);

    const ContractProxy = await ethers.getContractFactory(contractProxy);
    const data = Buffer.from('');//string转bytes
    const proxy = await ContractProxy.deploy(upgradeableBeacon.address,data);
    console.log("proxy:",proxy.address);

    const ContractProxy2 = await ethers.getContractFactory(contractProxy);
    const proxy2 = await ContractProxy.deploy(upgradeableBeacon.address,data);
    console.log("proxy2:",proxy2.address);

    console.log("通过proxy调用fun():");
    const funTx = {
        to: proxy.address,
        data: ContractImpl.interface.encodeFunctionData('fun()', [])
    }
    await ethers.provider.call(funTx)

    console.log("upgrade:")
    await upgradeableBeacon.upgradeTo(implNew.address)

    console.log("new impl:",await upgradeableBeacon.implementation());

    console.log("再次通过proxy调用fun():")
    await ethers.provider.call(funTx)

    console.log("通过proxy2调用fun():")
    const funTx2 = {
        to: proxy2.address,
        data: ContractImpl.interface.encodeFunctionData('fun()', [])
    }
    await ethers.provider.call(funTx2)

  });
});


  beacon1
impl addr: 0x5FbDB2315678afecb367f032d93F642f64180aa3
new impl addr: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
upgradeableBeacon addr: 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0
proxy: 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9
proxy2: 0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9
通过proxy调用fun():
logic fun
upgrade:
new impl: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
再次通过proxy调用fun():
new logic fun
通过proxy2调用fun():
new logic fun
分享到:
评论

相关推荐

    beacon simulator(beacon蓝牙BLE信号模拟)

    一款可以模拟BLE蓝牙的beacon信号的APP。 Beacon Simulator This app transforms your Android device into a virtual BLE beacon advertiser and transmitter. You can create your own collection of beacon ...

    扫描beacon的例子

    在Android平台上,开发一款应用程序来扫描Beacon设备是一项常见的任务,尤其在物联网(IoT)领域。本示例提供了一个具体实现,展示了如何在Android应用中进行Beacon设备的扫描和交互。首先,我们来看看“beacon js-...

    无线抓包详解——Beacon、认证.rar

    2、无线-beacon 3、无线-认证 4、无线-认证全 无线抓包分析: Beacon 包:(无线没设密码) 2、beacon有无线密码 WPA1:WPA中有CCMP(AES)、无TKIP。无RSN 切换为TKIPWPA中有TKIP。无RSN WPA2:...

    android beacon(当使用ble扫描设备时,使android手机可以被扫描到)

    在Android平台上,Beacon技术是一种基于低功耗蓝牙(Bluetooth Low Energy, BLE)的通信方式,使得设备可以作为信号发射器或接收器进行数据传输。本文将深入探讨如何在Android设备上实现BLE Beacon功能,使其在5.0及...

    beacon android示例代码

    在Android平台上进行Beacon开发,主要是利用蓝牙低功耗(Bluetooth Low Energy,BLE)技术来实现设备间的通信。"beacon android示例代码"是指一个用于演示如何在Android应用程序中集成Beacon功能的实例。Beacon设备...

    Android使用android-beacon-library接收beacon

    在Android平台上,开发基于Beacon的应用程序通常涉及使用第三方库,如`android-beacon-library`。这个库使得开发者能够轻松地检测和与不同类型的Beacons交互,包括iBeacon、AltBeacon和Eddystone等协议。下面我们将...

    Android开发Beacon应用

    在Android平台上开发Beacon应用,主要是利用蓝牙低功耗(Bluetooth Low Energy,BLE)技术来检测和通信与Beacon设备。Beacon是一种小型硬件设备,它定期广播特定的标识符,使得附近的移动设备能够接收到这些信号并...

    android-beacon-library-master

    "android-beacon-library-master" 是一个专门为Android平台开发的Beacon相关的开源库,它提供了方便的API和工具,使得开发者可以轻松地在Android应用中集成Beacon技术。Beacon是一种低功耗蓝牙设备,通常用于室内...

    BEACON

    "BEACON"是一个与字体相关的主题,但提供的信息相当有限。在IT行业中,字体通常涉及到计算机图形学、用户界面设计、排版技术以及编程语言中的文本渲染。下面,我将详细阐述字体在这些领域中的重要性和应用。 字体是...

    android-beacon-library,允许android应用程序与ble信标交互.zip

    《Android Beacon Library:开启BLE信标交互之旅》 在当今的物联网时代,蓝牙低功耗(Bluetooth Low Energy,简称BLE)技术已经广泛应用于各种设备之间的短距离通信,尤其是在移动设备和智能硬件之间。Android ...

    基于富士康云平台BEACON的5G+刀具智能生产应用解决方案

    本文介绍了基于富士康云平台BEACON的5G+刀具智能生产应用解决方案,该方案旨在利用5G技术的特性,如大带宽、低延迟和高可靠性,提升工业互联网在精密刀具生产中的应用。富士康工业互联网股份有限公司联合其他合作...

    cobalt strike笔记-常用beacon命令.pdf

    Cobalt Strike 使用的 Beacon payload 是一种被高级攻击者广泛使用的后门技术,它能够建立持久的、隐秘的控制通道,执行多种任务,从数据收集到横向移动等。下面详细介绍 Beacon payload 的一些常用命令及其实现。 ...

    BEACON产品选型手册(包含BT系列网关).pdf

    BEACON产品选型手册是为用户提供了一种深入了解BEACON系列网关的参考资料,尤其对于那些希望在大型PLC(可编程逻辑控制器)系统中寻找不占用机架槽位解决方案的工程师来说,该手册具有重要的参考价值。BEACON系列...

    Beacon Device_ble_DEMO_

    《Beacon Device_ble_DEMO_》是一款基于Delphi开发的蓝牙低功耗(BLE)示例程序,旨在演示如何与Beacon设备进行交互。这款DEMO程序为开发者提供了理解和实践BLE技术的基础,特别关注于Beacon设备的使用。在本文中,...

    802.11 Beacon包参数解析

    自己做的OMNIPEEK,以及wireshark版本beacon包解析. 两种抓包工具抓出的结果不太一样,但是可以互相补充。 这个文档可以用来了解802.11 mac层的各个参数。 802.11初学者必备。后续会慢慢丰富此文档。

    Android-Beacon-master.zip

    【Android Beacon Master】是一个基于Android Studio开发的医疗应用项目,主要目标是监控并记录社区居民的健康状况。这个项目利用了先进的技术栈和框架,旨在为用户提供一个方便、高效的健康管理平台。下面将详细...

    富士康工业互联网BEACON应用技术创新 ——绿色循环的精密智能制造

    富士康工业互联网平台BEACON是一个基于开放平台的新型工业生态系统,集成了云计算、物联网、大数据、移动互联网、智慧工厂、互联网、人工智能等新技术或新精矿。 身为全球领先的工业互联网智能制造和科技服务解决...

    Cobal_Strike踩坑记录-DNS Beacon1

    Cobal_Strike踩坑记录-DNS Beacon1

Global site tag (gtag.js) - Google Analytics