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。 。 。 .
- 设入地 vars
ETH_RPC_URL, (中文(简体) ),PRIVATE_KEY财务报告和审定财务报表ETHERSCAN_API_KEY如果需要核查合同. - 设定
DEPLOY_CONFIG_PATHenv var 到文件系统中指向部署配置的路径. - 与
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 运行到特定文件.