Skip to content

Latest commit

 

History

History
113 lines (69 loc) · 8.47 KB

File metadata and controls

113 lines (69 loc) · 8.47 KB

可升级合约

可升级合约(Upgradeable Contracts)是指在区块链中能够在部署后进行修改或升级的智能合约。通常情况下,智能合约一旦部署在区块链上便是不可更改的,这确保了其安全性和不可篡改性。然而,许多实际应用中,合约需要能够修复漏洞、添加新功能或进行性能优化,因此引入了“可升级合约”模式。

可升级合约的基本原理

可升级合约的核心思想是将合约的逻辑与其数据存储分离,这样可以只更新业务逻辑部分,而保持存储数据不变。

1. 逻辑合约与代理合约

可升级合约通常使用一种代理模式(Proxy Pattern),其中有两个主要部分:

  • 逻辑合约(Implementation Contract):这个合约包含业务逻辑代码,可以通过部署新的合约来替换和升级。
  • 代理合约(Proxy Contract):这个合约负责接收用户的调用,并将调用转发到逻辑合约。代理合约也负责存储所有的数据,确保即使逻辑合约发生变化,数据仍然保持一致。

2. 存储布局不变性

为了确保升级时数据不丢失,可升级合约的设计需要保持存储布局不变。代理合约管理存储,而逻辑合约负责业务逻辑,所以在升级时,新的逻辑合约必须与原来的存储结构兼容。

3. 通过代理合约实现升级

代理合约使用delegatecall将用户的调用委托给逻辑合约。通过delegatecall,逻辑合约中的代码在代理合约的存储上下文中执行,因此逻辑合约的代码可以操作代理合约中的数据。

4. 升级过程

当需要升级逻辑时,可以部署一个新的逻辑合约,并通过代理合约的管理者将代理合约指向新的逻辑合约地址,而无需修改代理合约本身。这种方式让系统在保留原有数据的基础上,灵活地升级业务逻辑。

常见的可升级合约模式

  1. 透明代理模式(Transparent Proxy Pattern)

    • 在透明代理模式中,代理合约的管理者只有在管理合约时才能与代理交互,而普通用户的调用不会受到影响。为了防止管理者调用delegatecall,合约会检查调用者是不是管理者,从而决定如何处理函数调用。
  2. 通用升级标准(UUPS)(Universal Upgradeable Proxy Standard)

    • UUPS 是一种轻量级的升级模式,逻辑合约自己包含升级函数,实现更简单的代理和升级流程。

使用可升级合约的场景

  1. 协议的长期维护和更新

    • 去中心化金融(DeFi)项目或其他链上协议可能需要随着时间推移添加新功能或修复漏洞。通过可升级合约机制,项目方能够灵活应对这些需求,而不需要从头部署新合约。
  2. 安全漏洞修复

    • 如果智能合约存在安全漏洞,团队可以通过可升级合约来进行修复,而不是放弃原有合约或要求用户迁移到新合约。
  3. 迭代开发

    • 在项目的初期阶段,可能会频繁进行迭代开发,可升级合约可以避免频繁的重新部署和数据迁移工作。

优缺点

优点:

  • 灵活性:允许合约在链上进行升级,不影响已有的数据和用户。
  • 数据保持性:代理合约存储数据,在升级时不会影响数据存储。
  • 安全修复:如果发现合约漏洞,可以通过升级及时修复。

缺点:

  • 复杂性增加:可升级合约的设计和部署相较于普通智能合约更复杂,特别是存储布局的兼容性问题需要谨慎处理。
  • 安全风险:如果管理权限出现问题,可能被恶意者利用从而更改合约逻辑,导致资金或数据的安全性问题。
  • Gas 费增加:由于代理模式引入了额外的转发调用,执行合约时的Gas消耗可能会增加。

总结

可升级合约为区块链应用提供了很大的灵活性,能够在无需重新部署的情况下升级业务逻辑、修复漏洞或添加新功能。虽然引入了更多的复杂性和安全风险,但通过合理的架构和权限管理,可以让智能合约的生命周期更长、更稳定。

透明代理

透明代理模式(Transparent Proxy Pattern)是一种用于可升级智能合约的代理模式,旨在分离合约逻辑和存储,并提供一种方式在区块链上安全地升级合约逻辑,同时保持用户的体验不变。

透明代理的核心概念

透明代理模式的关键思想是,普通用户的调用应该透明地通过代理合约直接转发到逻辑合约,而不需要意识到代理的存在。而代理合约的管理者(管理员)则有能力升级逻辑合约,但不能干扰普通用户的调用。该模式通过确保管理者的权限和用户的调用路径分离,来实现合约升级的安全性和透明性。

透明代理的主要组成部分

  1. 代理合约(Proxy Contract):

    • 这是用户实际与之交互的合约,负责存储数据并将所有对业务逻辑的调用通过 delegatecall 转发给逻辑合约。代理合约可以被升级,而无需改变数据存储。
  2. 逻辑合约(Implementation Contract):

    • 包含实际的业务逻辑。逻辑合约可以被替换成一个新的合约,以引入新的功能或修复漏洞。
  3. 管理者权限(Admin Privileges):

    • 管理者有权限通过专门的函数来升级逻辑合约的地址,但是不能干扰普通用户的调用。代理合约在接收到调用时,会检查调用者是不是管理者。如果是普通用户,代理将直接转发调用;如果是管理者,管理者只能调用与升级相关的特殊函数,而不能影响普通逻辑。

透明代理的工作原理

透明代理模式通过以下方式工作:

  1. 普通用户调用: 当普通用户调用代理合约时,代理合约使用 delegatecall 将用户的调用传递给逻辑合约。delegatecall 是一种特殊的 Ethereum 虚拟机(EVM)调用方式,它会使用代理合约的存储和上下文来执行逻辑合约中的代码。这样,用户的调用在逻辑合约中执行,但数据保存在代理合约中。

  2. 管理者调用: 当管理者调用代理合约时,代理合约会检测到调用者是管理者,并将该调用限制为与合约升级相关的函数,比如更改逻辑合约的地址。管理者无法调用普通的业务逻辑函数,以避免引发安全风险。

为什么称为“透明”代理

之所以叫“透明代理”,是因为对普通用户来说,代理的存在是透明的,他们与合约的交互与直接调用逻辑合约没有区别。用户无需关心背后是否存在代理机制,也不需要知道合约升级的过程,整个调用体验保持一致。

透明代理的优势

  1. 用户透明性:普通用户调用代理合约与调用普通合约的体验完全相同,无需意识到合约是如何升级的。

  2. 安全性:管理者权限受到严格限制,管理者只能执行升级操作,无法干扰普通用户的业务逻辑调用。这样减少了因为管理权限滥用导致的安全风险。

  3. 可升级性:通过代理模式,开发者可以随时升级业务逻辑,而不影响已经部署在链上的数据和用户调用。

透明代理的使用场景

  1. 长期项目维护:很多项目需要不断迭代、升级合约逻辑,比如去中心化金融(DeFi)协议、NFT 市场等,通过透明代理可以在保持数据和用户不变的前提下,进行功能升级。

  2. 漏洞修复:如果已经部署的合约被发现有漏洞,透明代理允许在不影响现有用户和数据的情况下进行修复。

  3. 迭代开发:当项目处于开发初期或测试阶段,可能需要频繁更新业务逻辑。通过透明代理,开发者可以方便地部署新的合约逻辑。

透明代理的缺点

  1. 复杂性增加:相较于普通的智能合约,透明代理模式增加了开发和维护的复杂性,需要额外处理 delegatecall 和存储布局的兼容性问题。

  2. Gas 成本增加:因为代理合约需要通过 delegatecall 转发调用,这会带来额外的 Gas 成本。

总结

透明代理是一种广泛使用的可升级合约模式,能够安全、有效地将合约逻辑与存储分离。通过限制管理者权限,保证普通用户的调用体验不受干扰,同时提供了灵活的合约升级能力。