☰
DataHaven AVS 智能合约指南:基于 EigenLayer 的验证者生命周期、跨链奖励与罚没实现
2026/9/27 9:34:17 网站建设 项目流程
  • 区块链
  • 存储
  • Web3

【免费下载链接】datahaven

An EVM compatible Substrate chain, powered by StorageHub and secured by EigenLayer

项目地址:https://gitcode.com/gh_mirrors/da/datahaven
点击查看免费下载

导读

本文以 contracts/README.md 为主线,系统讲解 DataHaven 作为由 EigenLayer 保护的 EVM 兼容 Substrate 链时,其 AVS 智能合约层的设计、开发、配置与部署。你将掌握DataHavenServiceManager如何管理验证者注册、通过 Snowbridge 处理跨链奖励、执行罚没,以及如何在 Anvil 本地与 Hoodi 测试网两条路径上完成部署。

背景与定位

DataHaven 是一条由 StorageHub 驱动、由 EigenLayer 保障安全的 EVM 兼容 Substrate 链。其合约层实现的是 Actively Validated Service(AVS)逻辑,核心职责包括:

  • 管理操作者(operator / validator)的注册生命周期;
  • 通过 Snowbridge 桥接接收跨链奖励指令;
  • 依据链上惩罚事件执行 EigenLayer 侧的罚没。

项目结构

contracts/ ├── src/ │ ├── DataHavenServiceManager.sol # Core AVS service manager │ ├── middleware/ # RewardsRegistry, Snowbridge helpers │ ├── interfaces/ # Contract interfaces │ └── libraries/ # Utility libraries ├── script/ # Deployment & setup scripts ├── lib/ # External dependencies (EigenLayer, Snowbridge, OpenZeppelin) └── test/ # Foundry test suites

当前仓库中该结构的实际布局为:

路径内容
contracts/src/DataHavenServiceManager.sol核心 AVS 服务管理器,继承ServiceManagerBase模式并实现IAVSRegistrar
contracts/src/interfaces/IDataHavenServiceManager.sol全部接口、事件与错误定义
contracts/src/libraries/DataHavenSnowbridgeMessages.solSCALE 编码的消息构造库
contracts/src/libraries/MerkleUtils.solMerkle 工具库
contracts/script/deploy/部署脚本(Local/Live 两条路径)
contracts/lib/EigenLayer、Snowbridge、forge-std 等外部依赖
contracts/test/Foundry 测试套件

Key Components

  • DataHavenServiceManager(contracts/src/DataHavenServiceManager.sol):核心合约,负责操作者生命周期,继承ServiceManagerBase模式(以OwnableUpgradeable+ 透明代理实现,并通过IAVSRegistrar与 EigenLayerAllocationManager集成)。
  • RewardsRegistry(src/middleware/RewardsRegistry.sol):跟踪验证者表现并通过 Snowbridge 分发奖励。需要说明的是,当前仓库contracts/src/下并未包含middleware/目录,实际奖励分发逻辑位于DataHavenServiceManager.sol的submitRewards函数(经RewardsCoordinator提交)。

开发

环境要求

需要安装 Foundry。编译与测试命令:

# Build and Test forge build forge test # Regenerate TS bindings (after contract changes) cd ../test && bun generate:wagmi
  • forge build依据 contracts/foundry.toml 中的 remappings(eigenlayer-contracts/、snowbridge/、forge-std/、OpenZeppelin 升级版等)解析依赖,使用 Solidity 0.8.28 编译,开启优化器(optimizer_runs = 200)。
  • forge test运行 contracts/test/ 下的测试套件,覆盖消息编码(MessageEncoding.t.sol)、操作者地址映射(OperatorAddressMappings.t.sol)、奖励提交(RewardsSubmitter.t.sol)、罚没(Slashing.t.sol)、Snowbridge 集成(SnowbridgeIntegration.t.sol)、验证者集合选择与提交(ValidatorSetSelection.t.sol、ValidatorSetSubmitter.t.sol)。
  • bun generate:wagmi在 test/ 目录中通过 test/package.json 的generate:wagmi脚本(wagmi generate)重新生成 TS 绑定(test/contract-bindings/)。

配置

部署参数(EigenLayer 地址、初始验证者、所有者等)定义在contracts/config/<network>.json。配置加载链位于 contracts/script/deploy/DeployParams.s.sol:

  • 网络名称通过环境变量NETWORK指定(默认anvil),配置文件路径为config/<NETWORK>.json;
  • 也可用AVS_OWNER_ADDRESS、DEV_MODE等环境变量覆盖部分配置;
  • 所有配置字段的结构定义在 contracts/script/deploy/Config.sol 中。

⚠️重要警告:不要直接编辑Config.sol或DeployParams.s.sol,它们只负责从 JSON 加载配置。部署前必须确保contracts/config/hoodi.json与目标环境匹配。

配置参考:contracts/config/example.jsonc

该文件为带注释的示例(Solidity 的 JSON 解析器不支持 JSONC,使用前必须删除所有注释并改扩展名为.json)。关键字段:

EigenLayer 相关参数

参数示例值说明
pausers/unpauser地址数组 / 单地址暂停机制的角色(PauserRegistry 用)
rewardsUpdater0x90F7...b906负责在 RewardsCoordinator 更新奖励 Merkle 根的链下服务账户
calculationIntervalSeconds86400奖励 Merkle 根的计算间隔(秒)
maxRewardsDuration6048000可追溯应用的最大奖励时长
maxRetroactiveLength7776000可追溯奖励最大长度
maxFutureLength2592000可预支的未来奖励时长
genesisRewardsTimestamp1710979200首次计算奖励的时间戳
activationDelay7200发布根与可申领之间的延迟(秒)
globalCommissionBips1000全局默认操作者分佣(10%)
executorMultisig/operationsMultisig地址治理/运维多签
minWithdrawalDelayBlocks50提款完成前的最小区块延迟
deallocationDelay50取消分配完成的区块延迟
allocationConfigurationDelay75分配配置生效的区块延迟
delegationManager、strategyManager、avsDirectory、rewardsCoordinator、allocationManager、permissionController地址Hoodi 测试网已有 EigenLayer 合约地址(本地部署无需配置)
beaconChainGenesisTimestamp1695902400信标链创世时间,用于 slot↔timestamp 换算

AVS 参数

参数示例值说明
avsOwner地址Service Manager 的 owner
snowbridgeInitiator地址授权发起奖励计算的账户(EigenLayer 分发路径用;目前项目直接通过 Agent 发送奖励)
validatorSetSubmitter地址授权提交验证者集合消息的账户
validatorsStrategies地址数组验证者可质押的策略;beaconChainETHStrategy(虚拟地址0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0,所有网络相同)代表原生信标链 ETH。Hoodi 测试网另有 stETH(0xf8a1...5fe0)、WETH(0x2457...420d);主网策略见 contracts/config/example.jsonc 注释

Snowbridge 参数

参数示例值说明
randaoCommitDelay4relayer 调用submitInitial与commitPrevRandao之间的最小区块数;生产环境应设为MAX_SEED_LOOKAHEAD
randaoCommitExpiration24超过 delay 后,relayer 必须在多少区块内调用commitPrevRandao,防止无限重掷骰子
minNumRequiredSignatures2Randao commit 所需的最小签名数,BFT 安全下为ceil(validators * 2/3)
startBlock1初始 BEEFY 区块号,BeefyClient 只接受大于它的 commitment
messageOrigin32 字节关联到 Agent 的 origin,即被允许提交奖励 Merkle 根或罚没的 Agent 合约
initialValidatorSetId/nextValidatorSetId0/1初始与下一组 BEEFY 验证者集 ID(来自 DataHaven 链上Beefy.ValidatorSetId)
initialValidatorHashes/nextValidatorHashesbytes32 数组由 BEEFY authority 公钥keccak256(ethereum_address)推导

已有网络的配置示例

  • contracts/config/anvil.json:本地部署使用,EigenLayer 部分仅需 pausers 等参数(核心合约由DeployLocal全新部署);
  • contracts/config/testnet-hoodi.json(stagenet-hoodi.json 类似):引用 Hoodi 测试网已部署的 EigenLayer 合约地址(DelegationManager、StrategyManager、AVSDirectory、RewardsCoordinator、AllocationManager、PermissionController),并配置了真实 BEEFY 验证者集(initialValidatorSetId: 2303、startBlock: 1381173、minNumRequiredSignatures: 5)与三条验证者策略(beaconChainETH、stETH、WETH);
  • contracts/config/mainnet-ethereum.json:主网配置模板(README 声明当前仅支持hoodi,尚无主网部署)。

部署

存在两条部署路径:Local(Anvil)与Testnet(Hoodi)。两者都会安装DataHaven AVS 合约(ServiceManager、RewardsRegistry)与Snowbridge(BeefyClient、Gateway、Agent),区别仅在于 EigenLayer 的设置方式。

Local(Anvil)

DeployLocal.s.sol 会完整引导一套 EigenLayer 核心部署(DelegationManager、StrategyManager、AVSDirectory、RewardsCoordinator、AllocationManager、PermissionController、EigenPodManager、EigenStrategy、策略合约等),并部署 DataHaven AVS 与 Snowbridge。

anvil forge script script/deploy/DeployLocal.s.sol --rpc-url anvil --broadcast

从源码看,DeployLocal继承了 DeployBase.s.sol 的共享流程_executeSharedDeployment():

  1. _setupEigenLayerContracts:部署 ProxyAdmin、PauserRegistry、EmptyContract,随后部署各核心合约的代理与实现,并通过upgradeAndCall初始化;
  2. 本地模式还会铸造TestToken(ERC20PresetFixedSupply,总量 1,000,000 ether)并部署StrategyBaseTVLLimits策略,且_fundServiceManagerWithTokens会将 500,000 tokens 转入 ServiceManager 用于奖励分发;
  3. 部署 Snowbridge(BeefyClient、AgentExecutor、Gateway 代理、Rewards Agent);
  4. 部署DataHavenServiceManager代理并初始化;
  5. 将部署结果写入 contracts/deployments/anvil.json 与anvil-agent-info.json。

Testnet(Hoodi)

DeployLive.s.sol引用目标链上已有的 EigenLayer 合约(地址来自contracts/config/<network>.json),只部署 DataHaven AVS + Snowbridge。部署前会通过_validateNetwork校验网络名,并通过_validateContractExists(检查extcodesize > 0)确认 EigenLayer 合约真实存在。

NETWORK=hoodi forge script script/deploy/DeployTestnet.s.sol \ --rpc-url hoodi \ --private-key $PRIVATE_KEY \ --broadcast
  • 支持的网络:hoodi(stagenet-hoodi、testnet-hoodi同属 Hoodi 测试网)、ethereum/mainnet-ethereum(当前无主网配置);
  • 部署产物 →contracts/deployments/<network>.json。例如 contracts/deployments/hoodi.json 中记录了 BeefyClient、AgentExecutor、Gateway、ServiceManager、RewardsAgent 及所有引用的 EigenLayer 合约地址;
  • 与本地不同,Live 路径会为 ServiceManager 单独创建 ProxyAdmin,并将所有权转移给 AVS owner(proxyAdmin.transferOwnership(avsOwner))。

运行前置

  • RPC 端点定义在 contracts/foundry.toml 的[rpc_endpoints]:hoodi = "${RPC_HOODI}"、mainnet = "${RPC_MAINNET}"、anvil = "http://localhost:8545",因此运行前需设置RPC_HOODI等环境变量;
  • TX_EXECUTION环境变量控制 owner 交易是否自动执行(DeployBase中vm.envOr("TX_EXECUTION", true));
  • DATAHAVEN_VERSION环境变量由 TS 包装脚本传入,作为initialize的initialVersion(默认0.1.0)。

工作原理(How It Works)

README 描述的四步核心流程,逐一对应源码实现:

  1. Registration(注册):验证者通过DataHavenServiceManager向 EigenLayer 注册。源码层面,DataHavenServiceManager.sol 实现IAVSRegistrar.registerOperator:仅允许AllocationManager调用,强制 operatorSetId 为VALIDATORS_SET_ID (0)、要求操作者在validatorsAllowlist白名单中,并从data中解析 20 字节的 solochain 地址建立双向映射(validatorEthAddressToSolochainAddress↔validatorSolochainAddressToEthAddress)。deregisterOperator对称清理映射。

  2. Performance Tracking(表现追踪):DataHaven 计算奖励积分,并通过 Snowbridge 将 Merkle 根发送到以太坊上的RewardsRegistry。在 submitRewards 中,仅snowbridgeInitiator可调用:把按 solochain 地址索引的OperatorDirectedRewardsSubmission翻译成 EigenLayer 操作者地址(validatorSolochainAddressToEthAddress反向查找),用插入排序(数组上限 32 故最优)按操作者地址升序排列,safeIncreaseAllowance后调用RewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission完成入账。

  3. Rewards Claims(奖励申领):验证者在以太坊上凭 Merkle 证明从RewardsRegistry申领奖励(该步骤由 EigenLayerRewardsCoordinator的 Merkle 根机制承载,当前合约直接调用RewardsCoordinator提交操作者定向奖励)。

  4. Slashing(罚没):恶意行为触发罚没。slashValidatorsOperator 仅snowbridgeInitiator可调用,将 solochain 地址反查为 EigenLayer 操作者,构造SlashingParams后调用AllocationManager.slashOperator执行按wadsToSlash比例的罚没。

验证者集合提交(Validator Set Submission)

除 README 流程外,仓库源码还体现了两条延伸能力(README 中“How It Works”未详细展开,但被test/README.md与测试套件覆盖):

  • sendNewValidatorSetForEra:仅validatorSetSubmitter可调用,构造当前 era 的验证者集合消息并经IGatewayV2.v2_sendMessage发送到 Snowbridge;
  • buildNewValidatorSetMessageForEra:从AllocationManager读取操作者集合成员与策略,计算weightedStake = Σ(allocatedStake[j] × multiplier[j]),过滤无 solochain 映射或零质押的候选者,用部分选择排序选出质押最高(平局取地址更小者)的min(MAX_ACTIVE_VALIDATORS, count)名验证者(上限 32),最终经 DataHavenSnowbridgeMessages.sol 的scaleEncodeNewValidatorSetMessagePayload编码为 SCALE 消息(EL_MESSAGE_ID = 0x70150038+ V0 +ReceiveValidators命令 + compact u32 长度 + 地址列表 + u64 era)。

权限与升级模型

  • 关键修饰符:onlySnowbridgeInitiator、onlyValidator(AllocationManager.isMemberOfOperatorSet校验)、onlyAllocationManager、onlyValidatorSetSubmitter、onlyOwner、onlyProxyAdmin;
  • updateVersion仅允许 EIP-1967 admin slot 中的 ProxyAdmin 调用,确保版本更新始终与代理升级(upgradeAndCall)捆绑,信任链为:AVS owner → ProxyAdmin → updateVersion;
  • 合约预留 42 个 slot 的__GAP以兼容后续升级,且 contracts/storage-snapshots/DataHavenServiceManager.storage.json 与 contracts/scripts/check-storage-layout.sh 用于校验存储布局不变量(另有check-storage-layout-negative.sh验证坏布局场景,对应 contracts/script/fixtures/DataHavenServiceManagerBadLayout.sol)。

测试与验证

  • 单元/集成测试:contracts/test/ 下每个*.t.sol针对单一功能面(如Slashing.t.sol、SnowbridgeIntegration.t.sol、ValidatorSetSubmitter.t.sol),测试工具包含 AVSDeployer.sol、SnowbridgeAndAVSDeployer.sol 与 TestUtils.sol;
  • 存储布局:contracts/test/storage/StorageLayout.t.sol 配合存储快照验证升级安全性;
  • 端到端集成:完整网络集成测试见test/README.md(位于 test/README.md),其中bun generate:wagmi负责在合约变更后重新生成 TS 绑定。

部署产物与参考地址

部署完成后,产物位于 contracts/deployments/:

  • anvil.json:本地部署地址(含 ServiceManager、Gateway、RewardsAgent 及各 EigenLayer 核心合约);
  • hoodi.json:Hoodi 测试网部署地址(当前已部署的 ServiceManager0xd69a...8f1B、Gateway0x0B13...C25、RewardsAgent0xeAd1...B1A8等);
  • anvil-agent-info.json/anvil-rewards-info.json:Agent 与奖励相关信息;
  • metadata.json:AVS 元数据,与DATAHAVEN_AVS_METADATA常量指向的地址一致;
  • state-diff.json 与校验和:部署状态差异快照。

小结

DataHaven 的 AVS 合约层以DataHavenServiceManager为枢纽,一端对接 EigenLayer 的AllocationManager(注册、策略与罚没)与RewardsCoordinator(奖励入账),另一端通过 SnowbridgeGateway/Agent 与 DataHaven solochain 双向通信,形成“注册 → 质押选验证者 → 跨链奖励 → 罚没”的完整闭环。部署与运维时只需注意:配置以config/<network>.json为准(勿改Config.sol/DeployParams.s.sol)、本地用DeployLocal、测试网用DeployLive并确保 JSON 与目标链匹配,即可完成从开发到测试网的全流程接入。

  • 区块链
  • 存储
  • Web3

【免费下载链接】datahaven

An EVM compatible Substrate chain, powered by StorageHub and secured by EigenLayer

项目地址:https://gitcode.com/gh_mirrors/da/datahaven
点击查看免费下载

相关推荐

上一篇:anti-slop的no-module-mocking争议:为什么测试应该禁用vi.mock和jest.mock
下一篇:4步构建智能引用系统:解决多语言文档格式统一难题

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询