Skip to content

Latest commit

 

History

History
166 lines (102 loc) · 9.91 KB

File metadata and controls

166 lines (102 loc) · 9.91 KB

通用可升级代理

通用可升级代理(Universal Upgradeable Proxy Standard,简称 UUPS)是一种智能合约升级模式,允许区块链应用在不影响用户和数据的情况下,灵活升级合约逻辑。UUPS 是由 OpenZeppelin 提出的标准,与 透明代理模式 类似,但有一些简化和不同的实现方式。

UUPS 模式的核心概念

在 UUPS 模式下,合约的逻辑合约本身负责升级,而不是通过单独的代理合约来管理升级过程。UUPS 模式将升级的逻辑嵌入到逻辑合约中,代理合约只负责转发调用。这种方式降低了代理合约的复杂性,使得部署和维护更为简便。

UUPS 和透明代理的主要区别

  1. 升级逻辑的位置

    • 透明代理模式:升级逻辑通常放在代理合约中,代理合约负责指向新的逻辑合约地址。
    • UUPS 模式:升级逻辑由逻辑合约自己管理,即逻辑合约中包含一个升级函数,可以在需要时指向一个新的逻辑合约。
  2. 合约结构

    • 透明代理通常有两个合约:代理合约(Proxy)和逻辑合约(Implementation)。
    • UUPS 则将升级功能内置在逻辑合约中,代理合约的功能简化为仅仅转发调用,升级时由逻辑合约执行自己升级的操作。

UUPS 工作原理

  1. 代理合约(Proxy Contract)

    • 代理合约在 UUPS 中仍然存在,但其职责仅限于转发调用,即使用 delegatecall 将用户的调用转发到当前的逻辑合约。代理合约本身没有升级逻辑。
  2. 逻辑合约(Implementation Contract)

    • 逻辑合约包含具体的业务逻辑,并且还包含了一个用于升级的函数。在 UUPS 中,升级函数是由逻辑合约自己实现的,常见的实现方法是通过 OpenZeppelin 的 upgradeTo 函数来指定新的逻辑合约地址。
  3. 升级流程

    • 当管理员或合约拥有者希望升级合约时,他们会调用逻辑合约中的 upgradeTo 函数,将逻辑合约的地址指向一个新的合约地址。
    • 新的逻辑合约会接管后续的业务逻辑处理,而代理合约仍然保持数据存储不变。

UUPS 的优点

  1. 简化的代理合约:UUPS 模式将升级逻辑放在逻辑合约中,使得代理合约更为简单,减少了合约的复杂性。

  2. 降低 Gas 成本:由于代理合约的功能简化,UUPS 模式相比透明代理可以节省一定的 Gas 成本,特别是在大量使用代理的情况下。

  3. 灵活性:UUPS 提供了较高的灵活性,允许逻辑合约在未来进行自由升级,同时不影响现有的数据存储。

UUPS 的潜在风险

  1. 升级逻辑安全性:由于逻辑合约中包含升级功能,如果升级逻辑编写不当,可能会导致安全问题,例如意外的权限泄露或逻辑错误。

  2. 存储布局风险:与透明代理一样,UUPS 模式要求在升级时保持存储布局一致,否则可能会导致数据丢失或错误。因此,升级时需要特别小心处理存储结构。

  3. 管理权限:由于管理员可以调用升级函数,UUPS 也面临着管理权限的安全性问题。如果管理员权限被滥用,可能会被恶意者利用来升级到有漏洞的逻辑合约。

UUPS 的使用场景

  • 长期协议维护:DeFi 协议和其他长期运行的区块链应用,可以通过 UUPS 模式进行合约逻辑的灵活升级,而不会影响用户和数据。

  • 迭代开发:在项目初期频繁需要调整逻辑的情况下,UUPS 提供了简便的升级方式,无需重新部署数据存储部分。

  • 修复漏洞:如果发现合约中的业务逻辑存在漏洞,UUPS 模式允许快速修复,并通过逻辑合约的升级功能引入新的版本。

UUPS 升级示例

假设你有一个 UUPS 合约,它包含了 upgradeTo 函数来执行升级:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";

contract MyUpgradeableContract is UUPSUpgradeable, OwnableUpgradeable {
    
    string public message;

    function initialize() public initializer {
        __Ownable_init();
        message = "Hello, World!";
    }

    function setMessage(string memory newMessage) public {
        message = newMessage;
    }

    // 这个函数用于升级合约逻辑
    function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
}
  • 合约中继承了 UUPSUpgradeable,使其具备升级能力。
  • 通过 upgradeTo,管理员可以指向新的逻辑合约地址,而不需要重新部署或改变存储。

总结

通用可升级代理(UUPS)是一种高效的合约升级模式,允许开发者将升级逻辑集成在逻辑合约中,同时保持代理合约的简洁性。相比透明代理模式,UUPS 减少了 Gas 消耗和合约复杂度,但也需要谨慎处理存储布局和权限管理等安全问题。

多签钱包

多签钱包(Multisignature Wallet,简称多签)是指一种需要多个私钥持有者共同授权才能执行操作的加密货币钱包。与传统的单签名钱包(即只需要一个私钥持有者签署交易)不同,多签钱包的安全性更高,因为它要求多个方的共同签名,才能完成特定的交易或操作。

多签钱包的基本原理

多签钱包的核心概念是使用一个钱包地址来管理资金,但这个地址背后有多个授权方,只有达到预设的授权人数才能执行交易。这种机制可以确保钱包的安全性,特别是在需要多个可信任方共同管理资金的场景中。

典型的多签设置

多签钱包通常采用 m-of-n 的形式:

  • m 代表执行交易所需的最小签名数。
  • n 代表参与管理钱包的总人数。

例如,2-of-3 的多签钱包意味着共有3个人有权限管理该钱包,至少需要2个人的签名才能执行交易。

多签钱包的工作流程

  1. 创建钱包

    • 多签钱包由多个用户共同创建,生成一个共享地址。每个参与者会提供一个私钥或公钥,作为共同管理者之一。
  2. 发起交易

    • 当某一方希望发起交易时,需要其他授权方进行签名。只有当满足最低签名数量(如 2-of-3)时,交易才会被网络广播并执行。
  3. 签名和广播

    • 一旦达到规定的签名数,交易就会被签署并广播到区块链网络。区块链网络验证签名的有效性后,交易才会被确认。

多签钱包的应用场景

  1. 企业资金管理

    • 企业常常使用多签钱包来管理公司资金,确保没有任何一名员工或管理者可以单独控制资金。例如,企业的财务需要至少两名高管的签字才能批准大额转账。
  2. 去中心化组织(DAO)

    • 在去中心化自治组织(DAO)中,多签钱包常用于管理资金池或协议资产,以确保所有资金操作都经过多个利益相关方的同意。
  3. 交易所和托管服务

    • 一些交易所或托管平台为了提升资金安全,会使用多签钱包来保护存储的用户资产,防止单一私钥的丢失或被盗。
  4. 私人资产保护

    • 个人用户也可以使用多签钱包来增加自身资产的安全性。例如,某人可以设置一个 2-of-3 的多签钱包,分发三个密钥给自己、家人或可信赖的朋友。这样,即便其中一把私钥丢失,也不会导致资金丢失。

多签钱包的优缺点

优点:

  1. 更高的安全性:多签钱包显著提高了资金的安全性,因为即便一把私钥被盗,黑客也无法转移资金。

  2. 权限分离和共同管理:多个签名者共同管理资金,确保没有一方可以单独做出决定,减少了内部腐败或误操作的风险。

  3. 防止私钥丢失:由于需要多个签名,单个私钥丢失不会导致资金无法访问。

缺点:

  1. 复杂性增加:多签钱包的设置和操作比普通单签钱包更复杂,需要协调多个参与者。

  2. 操作不便:需要多个签名才能执行交易,这可能会导致操作延迟,特别是在紧急情况下。

  3. 信任风险:尽管多签提高了安全性,但如果多个私钥持有者勾结,仍然可能造成资金的恶意转移。

多签钱包的技术实现

在不同的区块链网络上,多签钱包的实现方式可能有所不同。例如:

  • 比特币:比特币网络通过原生脚本支持多签钱包,通常使用 P2SH(Pay-to-Script-Hash)地址来实现多签机制。

  • 以太坊:在以太坊上,多签钱包通常通过智能合约实现。用户可以部署一个多签钱包合约,定义需要的签名数量和参与者地址。常见的以太坊多签钱包包括 Gnosis Safe 和 ConsenSys 的 MultiSig Wallet。

多签钱包的实际案例

  1. Gnosis Safe

    • Gnosis Safe 是以太坊上非常流行的多签钱包,常用于 DAO 和 DeFi 项目中。它支持灵活的多签设置,并与多种去中心化应用(DApp)集成。
  2. BitGo

    • BitGo 提供的多签钱包服务广泛用于机构投资者,帮助他们安全地存储和管理数字资产。BitGo 的多签方案允许多个用户管理一个钱包,提升了安全性。
  3. Ethereum Foundation

    • 以太坊基金会使用多签钱包来管理其资金,确保关键决策需要多个成员的共同签署,以防止单人控制大量资产。

总结

多签钱包是一种有效提升资金安全性的工具,特别适合需要多方共同管理资产的场景,如企业资金管理、去中心化组织治理、交易所托管等。通过要求多个私钥持有者共同签名,它显著降低了单点故障和资金被盗的风险,同时确保了合约和交易的透明性和共识性。