- 浏览: 721837 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1043)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (52)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
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
MyUpgradeableBeacon.sol
BeaconImplement.sol
BeaconImplementNew.sol
test
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
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
发表评论
-
TypeError:ethers_1.getAddress
2024-04-29 10:45 10package.json 添加:"@nomicfou ... -
solidity
2023-02-25 14:23 12一.solidity 1.EVM 不是基于寄存器的,而是基于栈 ... -
solidity
2023-02-25 14:23 11一.solidity 1.EVM 不是基于寄存器的,而是基于栈 ... -
solidity
2023-02-25 14:23 116一.solidity 1.EVM 不是基于寄存器的,而是基于栈 ... -
Address
2023-02-23 10:54 5// contracts/Box.sol // SPDX ... -
Address
2023-02-23 10:50 104// contracts/Box.sol // SPDX ... -
UUPS
2023-02-17 16:16 129a.Proxy直接把所有的请求都通过delegatecall丢 ... -
Transparent
2023-02-16 15:44 106Transparent: a.如果Proxy合约发现自己被Pr ... -
string转bytes
2023-02-16 11:04 166const data = Buffer.from(''); ... -
hardhat命令
2023-02-13 09:58 2071.前置准备,运行一个新项目 mkdir my-project ... -
multicall
2023-01-31 20:11 143multicall的solidity调用与ethers.js调 ... -
检查是否是721
2023-01-31 15:18 91// SPDX-License-Identifier: M ... -
EVM操作码
2023-01-25 10:33 1892.栈和内存操作码 2.1 POP:取出栈顶元素 2.2 PU ... -
计算合约地址
2023-01-19 11:27 168EVM会根据发送者地址和nonce经过RLP编码后再进行kec ... -
标准修饰符
2023-01-18 17:03 841.internal:类似c++中的protected,通过J ... -
ABI编码函数
2023-01-17 10:40 1961. abi.encode()returns(bytes):对 ... -
数据位置
2023-01-17 10:24 1051.函数参数包括返回的参数默认是memory 2.局部变量默认 ... -
随机数
2023-01-17 10:06 108https://www.paradigm.xyz/2023/0 ... -
extcodesize
2023-01-16 11:16 201extcodesize取出的byte code长度,若长度大于 ... -
Elevator
2023-01-13 10:48 92Elevator.sol // SPDX-License- ...
相关推荐
BEACON
一款可以模拟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 ...
2、无线-beacon 3、无线-认证 4、无线-认证全 无线抓包分析: Beacon 包:(无线没设密码) 2、beacon有无线密码 WPA1:WPA中有CCMP(AES)、无TKIP。无RSN 切换为TKIPWPA中有TKIP。无RSN WPA2:...
车载自组织网(vehicular Ad hoc networks,VANETs)中的车辆通过周期交互beacon实现信息共享,从而提高交通安全,然而VANETs无线网络特性系统易遭受多类攻击,特别是对beacon的传输攻击,即干扰beacon的传输,其...
Solutions architects of all types―venture capitalists, founders, CEOs, strategists, product managers, CTOs, business developers, and programmers―will learn about the following from reading Beacon ...
android下beacon 开发示例程序
Android使用android-beacon-library接收beacon
android扫描beacon设备例子,例子中使用html显示ui,应用扫描到设备后,通知页面。 本例子中把beacon设备扫描简单封装了一下,功能包括发现设备,更新设备,设备丢失败检查等。
基于富士康云平台BEACON的5G+刀具智能生产应用解决方案
Cobal_Strike踩坑记录-DNS Beacon1
android-beacon-libary的使用android-beacon-libary的使用android-beacon-libary的使用android-beacon-libary的使用android-beacon-libary的使用android-beacon-libary的使用android-beacon-libary的使用android-...
This document describes the air interface of the Metropolitan Beacon System (MBS) system. MBS provides a high precision, reliable, consistent positioning system indoors and in urban canyons, ...
Spybot Anti-Beacon是由Spybot官方专门针对Windows开发的一款简单实用,功能强大的win10隐私保护软件。其实,在我们日常使用电脑的时候,Windows会向Microsoft发送个人身份信息,跟踪您的系统用途,为您提供个性化...
802.11_beacon帧结构
自己做的OMNIPEEK,以及wireshark版本beacon包解析. 两种抓包工具抓出的结果不太一样,但是可以互相补充。 这个文档可以用来了解802.11 mac层的各个参数。 802.11初学者必备。后续会慢慢丰富此文档。
android beacon 开发库 可以放心使用,里面包含源代码和测试代码
.cobaltstrike.beacon_keys
Delphi Beacon demo program file
了解BEACON系列网关产品,不占PLC机架槽位,并且应用在大型PLC系统等场合,国内估计应用的不多,相似产品太广,可以代替prosoft或者ANYBUS
Beacon对蓝牙低功耗(BLE)芯片提出挑战.pdf