@eth-optimism/contracts-bedrock

中文文档
0.17.3发布于 2024/05/30MIT零依赖近 30 天下载 34.9万

乐观光谱合同

中文使用文档
文档目录19 节
  1. 目录
  2. 结构概览
  3. 核心L1智能合同
  4. 核心L2智能合同
  5. 智能合同代理
  6. 外部用法
  7. 统一使用OP堆栈合同
  8. 在 JavaScript 中使用 OP Stack 合同
  9. 已部署地址
  10. 捐款
  11. 贡献指南
  12. 样式指南
  13. 部署
  14. 配置
  15. 执行
  16. 部署单一合同
  17. 测试
  18. 测试设置
  19. 静态分析

OP 存储智能合同

这个包包含了OP Stack的L1和L2智能合同. 包件内所载合同的详细规格见 specs.opimism.io (英语)。 。 。 . 有关这些合同的高级资料可见于这一研究中,也见于 优化开发者 Docs。 。 。 .

目录

结构概览

页:1:以下架构图中的智能合同名是与源代码的链接. 点击他们!

核心L1智能合同

下面你将会找到一个建筑图,描述OP Stack的核心L1智能合同. 被认为是"周边"而非OP Stack系统运行核心的智能合同分别被描述.

graph LR
    subgraph "External Contracts"
        ExternalERC20(External ERC20 Contracts)
        ExternalERC721(External ERC721 Contracts)
    end

    subgraph "L1 Smart Contracts"
        BatchDataEOA(<a href="https://etherscan.io/address/0xff00000000000000000000000000000000000010">Batch Inbox Address</a>)
        L1StandardBridge(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/L1StandardBridge.sol">L1StandardBridge</a>)
        L1ERC721Bridge(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol">L1ERC721Bridge</a>)
        L1CrossDomainMessenger(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol">L1CrossDomainMessenger</a>)
        L2OutputOracle(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/L2OutputOracle.sol">L2OutputOracle</a>)
        OptimismPortal(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/OptimismPortal.sol">OptimismPortal</a>)
        SuperchainConfig(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/SuperchainConfig.sol">SuperchainConfig</a>)
        SystemConfig(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L1/SystemConfig.sol">SystemConfig</a>)
    end

    subgraph "User Interactions"
        Users(Users)
    end

    subgraph "System Interactions"
        Batcher(Batcher)
        Proposer(Proposer)
        Guardian(Guardian)
    end

    subgraph "Layer 2 Interactions"
        L2Nodes(Layer 2 Nodes)
    end

    Batcher -->|publish transaction batches| BatchDataEOA
    Proposer -->|propose state outputs| L2OutputOracle
    Guardian -->|remove invalid state outputs| L2OutputOracle

    ExternalERC20 <-->|mint/burn/transfer| L1StandardBridge
    ExternalERC721 <-->|mint/burn/transfer| L1ERC721Bridge

    L1StandardBridge <-->|send/receive message| L1CrossDomainMessenger
    L1ERC721Bridge <-->|send/receive message| L1CrossDomainMessenger
    L1CrossDomainMessenger <-->|package/send/receive message| OptimismPortal
    L1StandardBridge -.->|query pause state| SuperchainConfig
    L1ERC721Bridge -.->|query pause state| SuperchainConfig
    L1CrossDomainMessenger -.->|query pause state| SuperchainConfig
    OptimismPortal -.->|query pause state| SuperchainConfig

    OptimismPortal -.->|query config| SystemConfig
    OptimismPortal -.->|query proposed states| L2OutputOracle

    Users <-->|deposit/withdraw ETH/ERC20| L1StandardBridge
    Users <-->|deposit/withdraw ERC721| L1ERC721Bridge
    Users -->|prove/execute withdrawal transactions| OptimismPortal

    L2Nodes -.->|fetch transaction batches| BatchDataEOA
    L2Nodes -.->|verify output roots| L2OutputOracle
    L2Nodes -.->|fetch deposit events| OptimismPortal

    classDef extContracts stroke:#ff9,stroke-width:2px;
    classDef l1Contracts stroke:#bbf,stroke-width:2px;
    classDef l1EOA stroke:#bbb,stroke-width:2px;
    classDef userInt stroke:#f9a,stroke-width:2px;
    classDef systemUser stroke:#f9a,stroke-width:2px;
    classDef l2Nodes stroke:#333,stroke-width:2px
    class ExternalERC20,ExternalERC721 extContracts;
    class L1StandardBridge,L1ERC721Bridge,L1CrossDomainMessenger,L2OutputOracle,OptimismPortal,SuperchainConfig,SystemConfig l1Contracts;
    class BatchDataEOA l1EOA;
    class Users userInt;
    class Batcher,Proposer,Guardian systemUser;
    class L2Nodes l2Nodes;

核心L1智能合同的说明

  • 这个 Batch Data Address 上文(a)和(b)段所述在希腊语中强调)为 没有 智能合同,而只是任意选择的账户,被认为没有已知的私人钥匙。 此账户通常被选为账户 0xFF0000....<L2 chain ID> 地点 <L2 chain ID> 是正在发布数据的第2层网络的链式ID。 例如,对于OP Mainnet,选择这个账户作为 0xFF00000000000000000000000000000000000010然而,这不是一项严格要求,一些OP Stack链条可能没有遵循这项公约.
  • 坐在后面的聪明合同 Proxy 合同为 在BLUE中突出显示。参考 智能合同代理 ,以了解这些代词是如何设计的.
    • 这个 L1CrossDomainMessenger 合约在后面 ResolvedDelegateProxy 合同,旧版OP Stack中使用的遗留代理合同类型。 此代理类型只用于 L1CrossDomainMessenger 以保持后向兼容性.
    • 这个 L1StandardBridge 合约在后面 L1ChugSplashProxy 合同,旧版OP Stack中使用的遗留代理合同类型。 此代理类型只用于 L1StandardBridge 合同以保持后向兼容性.

核心L2智能合同

在这里,你会找到一个建筑图 描述核心 OP Stack 智能合同,这些合同在L2链本身存在.

graph LR
    subgraph "Layer 1 (Ethereum)"
        L1SmartContracts(L1 Smart Contracts)
    end

    subgraph "L2 Client"
        L2Node(L2 Node)
    end

    subgraph "L2 System Contracts"
        L1Block(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L1Block.sol">L1Block</a>)
        GasPriceOracle(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/GasPriceOracle.sol">GasPriceOracle</a>)
        L1FeeVault(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L1FeeVault.sol">L1FeeVault</a>)
        BaseFeeVault(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/BaseFeeVault.sol">BaseFeeVault</a>)
        SequencerFeeVault(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/SequencerFeeVault.sol">SequencerFeeVault</a>)
    end

    subgraph "L2 Bridge Contracts"
        L2CrossDomainMessenger(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol">L2CrossDomainMessenger</a>)
        L2ToL1MessagePasser(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol">L2ToL1MessagePasser</a>)
        L2StandardBridge(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L2StandardBridge.sol">L2StandardBridge</a>)
        L2ERC721Bridge(<a href="https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/L2/L2ERC721Bridge.sol">L2ERC721Bridge</a>)
    end

    subgraph "Transactions"
        DepositTransaction(Deposit Transaction)
        UserTransaction(User Transaction)
    end

    subgraph "External Contracts"
        ExternalERC20(External ERC20 Contracts)
        ExternalERC721(External ERC721 Contracts)
    end

    subgraph "Remaining L2 Universe"
        OtherContracts(Any Contracts and Addresses)
    end

    L2Node -.->|derives chain from| L1SmartContracts
    L2Node -->|updates| L1Block
    L2Node -->|distributes fees to| L1FeeVault
    L2Node -->|distributes fees to| BaseFeeVault
    L2Node -->|distributes fees to| SequencerFeeVault
    L2Node -->|derives from deposits| DepositTransaction
    L2Node -->|derives from chain data| UserTransaction

    UserTransaction -->|can trigger| OtherContracts
    DepositTransaction -->|maybe triggers| L2CrossDomainMessenger
    DepositTransaction -->|can trigger| OtherContracts

    ExternalERC20 <-->|mint/burn/transfer| L2StandardBridge
    ExternalERC721 <-->|mint/burn/transfer| L2ERC721Bridge

    L2StandardBridge <-->|sends/receives messages| L2CrossDomainMessenger
    L2ERC721Bridge <-->|sends/receives messages| L2CrossDomainMessenger
    GasPriceOracle -.->|queries| L1Block
    L2CrossDomainMessenger -->|sends messages| L2ToL1MessagePasser

    classDef extContracts stroke:#ff9,stroke-width:2px;
    classDef l2Contracts stroke:#bbf,stroke-width:2px;
    classDef transactions stroke:#fba,stroke-width:2px;
    classDef l2Node stroke:#f9a,stroke-width:2px;

    class ExternalERC20,ExternalERC721 extContracts;
    class L2CrossDomainMessenger,L2ToL1MessagePasser,L2StandardBridge,L2ERC721Bridge l2Contracts;
    class L1Block,L1FeeVault,BaseFeeVault,SequencerFeeVault,GasPriceOracle l2Contracts;
    class UserTransaction,DepositTransaction transactions;
    class L2Node l2Node;

核心L2智能合同的说明

  • 被强调为"L2系统合同"的合同,作为链导过程的一部分被自动更新或变换. 用户通常不会直接变更这些合同,除非 FeeVault (c) 任何用户可能触发将收取的费用撤回到预先确定的退出地址的合同.
  • 坐在后面的聪明合同 Proxy 合同为 在BLUE中突出显示。参考 智能合同代理 ,以了解这些代词是如何设计的.
  • “L2 Bridge Contracts”的用户互动从这个图中省略了,但基本上沿用了结构图中描述的用户互动 核心L1智能合同。 。 。 .

智能合同代理

大多数L1和L2智能合同 OP Stack链今天坐后 Proxy 合同本身由a/ ProxyAdmin 合同. 这个 ProxyAdmin 合同由某些人控制 owner 地址可以是任何EOA或智能合同. 下面你会找到一个图表来解释典型代理合同的行为.

graph LR
    ProxyAdminOwner(Proxy Admin Owner)
    ProxyAdmin(<a href="https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/ProxyAdmin.sol">ProxyAdmin</a>)

    subgraph "Logical Smart Contract"
        Proxy(<a href="https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/Proxy.sol">Proxy</a>)
        Implementation(Implementation)
    end

    ProxyAdminOwner -->|manages| ProxyAdmin
    ProxyAdmin -->|upgrades| Proxy
    Proxy -->|delegatecall| Implementation

    classDef l1Contracts stroke:#bbf,stroke-width:2px;
    classDef systemUser stroke:#f9a,stroke-width:2px;
    class Proxy l1Contracts;
    class ProxyAdminOwner systemUser;

外部用法

统一使用OP堆栈合同

OP Stack智能合同向国家预防机制发布,可通过下列方式安装:

npm install @eth-optimism/contracts-bedrock.

参见 优化开发者 Docs 以获取关于如何使用此软件包的更多信息.

在 JavaScript 中使用 OP Stack 合同

Contract ABIs和地址以单独的包形式发布给国家预防机制,可通过下列方式安装:

npm install @eth-optimism/contracts-ts

参见 优化开发者 Docs 以获取关于如何使用此软件包的更多信息.

已部署地址

见 优化开发者 Docs 这些智能合同的地址 OP Mainnet和OP Sepolia.

捐款

贡献指南

对OP Stack的贡献始终受到欢迎. 请参看 捐款额 关于如何为OP Stack智能合同做出贡献的更多信息.

样式指南

OP Stack智能合同应当按照 (简体中文). md 在此仓库中找到 . 保持一致的代码风格使得代码更容易被审查和维护,最终使开发过程更加安全.

部署

使用 foundry 带有 hardhat-deploy 相容层. 当合同部署时, 将临时文件写入磁盘,然后将其格式化为 hardhat-deploy 通过调用另一个脚本来调用样式文物 .

地址载于 deployments 目录将根据后端的链式id被读入脚本. 要手动定义脚本中使用的地址集,请设置 CONTRACT_ADDRESSES_PATH 进入当地一条道路 文件系统指向一个充满密钥值对的 JSON 文件,其中密钥为合同名称和 数值是地址。 这和JSON的文件很合用 superchain-ops。 。 。 .

配置

创建或修改文件 <network-name>.json 内部 deploy-config 文件夹. 使用环境 var DEPLOY_CONFIG_PATH 在运行时使用特定配置文件.

自定义气体托肯

Custom Gas Token特性是麻省理工学院许可的OP Stack的一个Beta特性. 虽然它已收到核心贡献者的初步审查,但它仍在测试中,可能存在错误或其他问题.

执行

在部署合同之前,您可以使用 runWithStateDiff() 产生内部输出的函数签名 snapshots/state-diff/。 。 。 . 通过执行 : forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY。 。 。 .

  1. 设入地 vars ETH_RPC_URL, (中文(简体) ), PRIVATE_KEY 财务报告和审定财务报表 ETHERSCAN_API_KEY 如果需要核查合同.
  2. 设定 DEPLOY_CONFIG_PATH env var 到文件系统中指向部署配置的路径.
  3. 与 forge script -vvv scripts/Deploy.s.sol:Deploy --rpc-url $ETH_RPC_URL --broadcast --private-key $PRIVATE_KEY 通过 --verify 旗下可自动与 Etherscan 验证部署.

部署单一合同

部署单一合同的所有职能是: public 意思是说 --sig 参数到 forge script 可用于 以部署单一合同为目标.

测试

测试设置

固态单元测试使用相同的密码来设置生产中使用的状态. 同样的L1部署脚本用于部署L1内存测试合同 并且L2状态的设置使用相同的L2起源生成代码,用于生产,然后通过铸造 vm.loadAllocs 作弊码。 这有帮助 减少维持多种方式来建立国家的间接费用,并增加合同部署的“实际”方式的覆盖面.

L1合同地址为: deployments/hardhat/.deploy l2 测试状态在 .testdata 目录。 L1 地址用于创建 L2 状态 并且可以将已死地址拉入L2状态,导致测试失败. 如果 L1 部署顺序不同, 可能会出现 Stale 地址 由于一些合同是使用 CREATE运行 pnpm clean 如果测试因不明原因失败,则重新运行.

静态分析

contracts-bedrock 用途 剪线 作为其主要的静态分析工具. 斯利特将作为CI的一部分对公关进行查处,并将报告新的调查结果,作为对公关的评论. 如果出现Repo设置中配置的中度或更高度的新发现, CI 将会失败 > 代码安全分析 > 代码扫描 > 保护规则设置.

CI中有两个对应的工作:一个叫"Slither Analysis",一个叫"Code sclassing results / Slither". 如果斯利特成功运行,前者将永远通过,如果有任何中等或更严重的新发现,后者将失败.

现有发现见repo的安全标签 > 代码扫描 节. 您可以使用 pr:{number} 过滤器, 如 pr:9405。 。 。 .

对于每个发现,要么在本地进行修复并推进新的承诺,要么通过PR评论的UI予以驳回.

注意您可以通过运行在本地运行 slider slither .,但因为它并不包含 GitHub 的三分结果,所以会很吵. 相反,你应该跑 slither ./path/to/contract.sol 运行到特定文件.

版本与发布记录

@eth-optimism/contracts-bedrock 共发布 213 个版本,首次发布于 2022/06/03;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.17.3latest2024/05/302 年前
0.0.0-develop-20240529164718develop2024/05/302 年前
0.0.0-develop-202405290339252024/05/292 年前
0.0.0-develop-202405290057062024/05/292 年前
0.0.0-develop-202405290008292024/05/292 年前
0.17.22024/04/022 年前

其他发布通道:canary → 0.0.0-20230711223728,will → 0.0.0-will-20230915154458,develop → 0.0.0-develop-20240529164718。

关于 @eth-optimism/contracts-bedrock 的常见问题

@eth-optimism/contracts-bedrock 是什么?

乐观光谱合同

如何安装 @eth-optimism/contracts-bedrock?

在项目目录运行 npm install @eth-optimism/contracts-bedrock,或使用 pnpm add / yarn add / bun add。

@eth-optimism/contracts-bedrock 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/eth-optimism__contracts-bedrock 是否存在。

@eth-optimism/contracts-bedrock 可以商用吗?

@eth-optimism/contracts-bedrock 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@eth-optimism/contracts-bedrock 的下载量有多少?

根据 npm 官方下载统计,@eth-optimism/contracts-bedrock 在 2026/10/14 – 2026/11/12 这 30 天内被下载 349,099 次,日均约 11,637 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@eth-optimism/contracts-bedrock 还在维护吗?

最新版本 0.17.3 发布于 2024/05/30(2 年前);至今共发布 213 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/06/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。