From 0c80f425b728596b2ad15d4fb77cf6581172efa2 Mon Sep 17 00:00:00 2001 From: Lihua <2634610614@qq.com> Date: Mon, 6 Oct 2025 17:50:33 +0800 Subject: [PATCH] feat(docs): add i18n support with Chinese translations - Add zh/ directory structure for Chinese documentation - Translate core protocol, guides, and reference docs - Enable bilingual documentation support --- docs.json | 814 ++++++-- docs/alt-vm-implementations/overview.mdx | 2 +- .../transfer-warp-route-ownership.mdx | 6 +- docs/guides/quickstart/deploy-warp-route.mdx | 2 +- .../evm/transfer-and-call-pattern.mdx | 4 +- .../standard-ISMs/multisig-ism-latencies.mdx | 199 +- docs/protocol/core/interchain-gas-payment.mdx | 4 +- docs/resources/glossary.mdx | 6 +- zh/docs/alt-vm-implementations/cosmos-sdk.mdx | 138 ++ .../implementation-guide.mdx | 380 ++++ zh/docs/alt-vm-implementations/overview.mdx | 58 + .../interchain-account/example-usage.mdx | 96 + .../interchain-account/overrides.mdx | 47 + .../interchain-account/overview.mdx | 84 + .../cross-chain-swaps-with-recovery.mdx | 89 + .../use-cases/cross-chain-swaps.mdx | 110 + .../warp-routes/example-usage.mdx | 103 + .../applications/warp-routes/interface.mdx | 26 + .../multi-collateral-warp-routes.mdx | 78 + zh/docs/applications/warp-routes/overview.mdx | 75 + zh/docs/applications/warp-routes/types.mdx | 124 ++ zh/docs/get-started-building.mdx | 132 ++ .../deploy-hyperlane-with-local-agents.mdx | 409 ++++ zh/docs/guides/chains/deploy-hyperlane.mdx | 219 ++ zh/docs/guides/create-custom-hook-and-ism.mdx | 192 ++ .../deploy-hyperlane-troubleshooting.mdx | 208 ++ .../transfer-mailbox-ownership.mdx | 109 + .../update-mailbox-default-ism.mdx | 137 ++ zh/docs/guides/production/prod-overview.mdx | 48 + .../using-squads/alt-svm-using-sqauds.mdx | 60 + .../using-squads/using-squads-solana.mdx | 32 + .../remove-trusted-relayer.mdx | 118 ++ .../transfer-warp-route-ownership.mdx | 123 ++ .../guides/quickstart/deploy-warp-route.mdx | 161 ++ .../guides/quickstart/local-testnet-setup.mdx | 161 ++ .../guides/warp-routes/bridge-ui-guide.mdx | 138 ++ .../warp-routes/evm-svm-warp-route-guide.mdx | 137 ++ .../deploy-multi-collateral-warp-routes.mdx | 71 + .../warp-routes/evm/deploy-yield-routes.mdx | 92 + .../warp-routes/evm/extending-warp-routes.mdx | 168 ++ .../fast-native-transfer-via-gas-token.mdx | 156 ++ .../evm/managing-warp-route-limits.mdx | 44 + ...lti-collateral-warp-routes-rebalancing.mdx | 208 ++ .../evm/transfer-and-call-pattern.mdx | 109 + .../warp-routes/evm/xerc20-warp-route.mdx | 84 + .../warp-routes/svm/svm-warp-route-guide.mdx | 269 +++ zh/docs/intro.mdx | 33 + zh/docs/operate/config/agent-config.mdx | 66 + zh/docs/operate/config/config-reference.mdx | 1844 +++++++++++++++++ zh/docs/operate/guides/avs-operator-guide.mdx | 75 + .../operate/guides/deploy-with-terraform.mdx | 204 ++ zh/docs/operate/guides/docker-quickstart.mdx | 163 ++ zh/docs/operate/overview-agents.mdx | 51 + zh/docs/operate/relayer/api.mdx | 52 + .../relayer/api/igp/delete-igp-rules.mdx | 32 + .../operate/relayer/api/igp/get-igp-rules.mdx | 57 + .../relayer/api/igp/post-igp-rules.mdx | 74 + .../get-merkle-tree-insertions.mdx | 67 + .../post-merkle-tree-insertions.mdx | 96 + .../relayer/api/messages/get-messages.mdx | 90 + .../relayer/api/messages/post-messages.mdx | 144 ++ .../relayer/api/operations/get-operations.mdx | 41 + .../api/operations/post-message-retry.mdx | 78 + .../api/operations/post-reprocess-message.mdx | 83 + zh/docs/operate/relayer/message-filtering.mdx | 75 + .../operate/relayer/monitoring-alerting.mdx | 52 + zh/docs/operate/relayer/run-relayer.mdx | 262 +++ zh/docs/operate/set-up-agent-keys.mdx | 110 + .../validators/monitoring-alerting.mdx | 51 + zh/docs/operate/validators/run-validators.mdx | 399 ++++ .../validators/validator-signatures-aws.mdx | 81 + zh/docs/protocol-economics/intro.mdx | 266 +++ zh/docs/protocol/ISM/custom-ISM.mdx | 124 ++ .../ISM/economic-security/hyperlane-avs.mdx | 251 +++ .../ISM/economic-security/overview.mdx | 28 + zh/docs/protocol/ISM/ism-marketplace.mdx | 55 + zh/docs/protocol/ISM/modular-security.mdx | 45 + zh/docs/protocol/ISM/sequence-diagram.mdx | 65 + .../ISM/standard-ISMs/aggregation-ISM.mdx | 52 + .../ISM/standard-ISMs/multisig-ISM.mdx | 88 + .../standard-ISMs/multisig-ism-latencies.mdx | 204 ++ .../ISM/standard-ISMs/offchain-lookup-ISM.mdx | 149 ++ .../ISM/standard-ISMs/routing-ISM.mdx | 46 + zh/docs/protocol/agents/overview.mdx | 10 + zh/docs/protocol/agents/relayer.mdx | 106 + zh/docs/protocol/agents/validators.mdx | 68 + zh/docs/protocol/core/fees.mdx | 44 + .../protocol/core/interchain-gas-payment.mdx | 106 + zh/docs/protocol/core/mailbox.mdx | 189 ++ .../core/post-dispatch-hooks-overview.mdx | 251 +++ zh/docs/protocol/protocol-overview.mdx | 38 + .../warp-routes/warp-routes-example-usage.mdx | 82 + .../warp-routes/warp-routes-overview.mdx | 78 + .../warp-routes/warp-routes-types.mdx | 127 ++ .../deployments/interchainAccountRouter.mdx | 170 ++ .../deployments/interchainGasPaymaster.mdx | 192 ++ .../addresses/deployments/mailbox.mdx | 193 ++ .../addresses/deployments/merkleTreeHook.mdx | 192 ++ .../addresses/deployments/proxyAdmin.mdx | 177 ++ .../deployments/storageGasOracle.mdx | 174 ++ .../addresses/deployments/testRecipient.mdx | 179 ++ .../deployments/validatorAnnounce.mdx | 193 ++ .../addresses/validators/latencies.mdx | 204 ++ .../mainnet-default-ism-validators.mdx | 1309 ++++++++++++ .../testnet-default-ism-validators.mdx | 366 ++++ .../developer-tips/token-faucets.mdx | 29 + .../reference/developer-tips/unit-testing.mdx | 131 ++ zh/docs/reference/developer-tools/cli.mdx | 50 + .../libraries/hookmetadata.mdx | 166 ++ .../libraries/mailbox-client.mdx | 156 ++ .../developer-tools/libraries/message.mdx | 167 ++ .../developer-tools/libraries/router.mdx | 233 +++ .../developer-tools/libraries/typecasts.mdx | 26 + .../typescript-sdk/overview.mdx | 13 + .../transfer-fee-calculation.mdx | 57 + zh/docs/reference/domains.mdx | 33 + .../explorer/configuring-pi-chains.mdx | 63 + .../reference/explorer/explorer-debugging.mdx | 54 + zh/docs/reference/explorer/graphql-api.mdx | 173 ++ zh/docs/reference/explorer/overview.mdx | 37 + zh/docs/reference/hooks/arbitrum-L2-to-L1.mdx | 93 + zh/docs/reference/hooks/interchain-gas.mdx | 202 ++ zh/docs/reference/hooks/op-stack.mdx | 57 + zh/docs/reference/hooks/polygon-pos.mdx | 49 + zh/docs/reference/messaging/receive.mdx | 92 + zh/docs/reference/messaging/send.mdx | 133 ++ zh/docs/reference/registries.mdx | 66 + zh/docs/resources/audits.mdx | 69 + zh/docs/resources/faq.mdx | 111 + zh/docs/resources/glossary.mdx | 109 + zh/docs/resources/message-debugging.mdx | 130 ++ zh/index.mdx | 77 + 132 files changed, 18467 insertions(+), 240 deletions(-) create mode 100644 zh/docs/alt-vm-implementations/cosmos-sdk.mdx create mode 100644 zh/docs/alt-vm-implementations/implementation-guide.mdx create mode 100644 zh/docs/alt-vm-implementations/overview.mdx create mode 100644 zh/docs/applications/interchain-account/example-usage.mdx create mode 100644 zh/docs/applications/interchain-account/overrides.mdx create mode 100644 zh/docs/applications/interchain-account/overview.mdx create mode 100644 zh/docs/applications/use-cases/cross-chain-swaps-with-recovery.mdx create mode 100644 zh/docs/applications/use-cases/cross-chain-swaps.mdx create mode 100644 zh/docs/applications/warp-routes/example-usage.mdx create mode 100644 zh/docs/applications/warp-routes/interface.mdx create mode 100644 zh/docs/applications/warp-routes/multi-collateral-warp-routes.mdx create mode 100644 zh/docs/applications/warp-routes/overview.mdx create mode 100644 zh/docs/applications/warp-routes/types.mdx create mode 100644 zh/docs/get-started-building.mdx create mode 100644 zh/docs/guides/chains/deploy-hyperlane-with-local-agents.mdx create mode 100644 zh/docs/guides/chains/deploy-hyperlane.mdx create mode 100644 zh/docs/guides/create-custom-hook-and-ism.mdx create mode 100644 zh/docs/guides/deploy-hyperlane-troubleshooting.mdx create mode 100644 zh/docs/guides/production/core-deployment/transfer-mailbox-ownership.mdx create mode 100644 zh/docs/guides/production/core-deployment/update-mailbox-default-ism.mdx create mode 100644 zh/docs/guides/production/prod-overview.mdx create mode 100644 zh/docs/guides/production/using-squads/alt-svm-using-sqauds.mdx create mode 100644 zh/docs/guides/production/using-squads/using-squads-solana.mdx create mode 100644 zh/docs/guides/production/warp-route-deployment/remove-trusted-relayer.mdx create mode 100644 zh/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx create mode 100644 zh/docs/guides/quickstart/deploy-warp-route.mdx create mode 100644 zh/docs/guides/quickstart/local-testnet-setup.mdx create mode 100644 zh/docs/guides/warp-routes/bridge-ui-guide.mdx create mode 100644 zh/docs/guides/warp-routes/evm-svm-warp-route-guide.mdx create mode 100644 zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes.mdx create mode 100644 zh/docs/guides/warp-routes/evm/deploy-yield-routes.mdx create mode 100644 zh/docs/guides/warp-routes/evm/extending-warp-routes.mdx create mode 100644 zh/docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token.mdx create mode 100644 zh/docs/guides/warp-routes/evm/managing-warp-route-limits.mdx create mode 100644 zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing.mdx create mode 100644 zh/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx create mode 100644 zh/docs/guides/warp-routes/evm/xerc20-warp-route.mdx create mode 100644 zh/docs/guides/warp-routes/svm/svm-warp-route-guide.mdx create mode 100644 zh/docs/intro.mdx create mode 100644 zh/docs/operate/config/agent-config.mdx create mode 100644 zh/docs/operate/config/config-reference.mdx create mode 100644 zh/docs/operate/guides/avs-operator-guide.mdx create mode 100644 zh/docs/operate/guides/deploy-with-terraform.mdx create mode 100644 zh/docs/operate/guides/docker-quickstart.mdx create mode 100644 zh/docs/operate/overview-agents.mdx create mode 100644 zh/docs/operate/relayer/api.mdx create mode 100644 zh/docs/operate/relayer/api/igp/delete-igp-rules.mdx create mode 100644 zh/docs/operate/relayer/api/igp/get-igp-rules.mdx create mode 100644 zh/docs/operate/relayer/api/igp/post-igp-rules.mdx create mode 100644 zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions.mdx create mode 100644 zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions.mdx create mode 100644 zh/docs/operate/relayer/api/messages/get-messages.mdx create mode 100644 zh/docs/operate/relayer/api/messages/post-messages.mdx create mode 100644 zh/docs/operate/relayer/api/operations/get-operations.mdx create mode 100644 zh/docs/operate/relayer/api/operations/post-message-retry.mdx create mode 100644 zh/docs/operate/relayer/api/operations/post-reprocess-message.mdx create mode 100644 zh/docs/operate/relayer/message-filtering.mdx create mode 100644 zh/docs/operate/relayer/monitoring-alerting.mdx create mode 100644 zh/docs/operate/relayer/run-relayer.mdx create mode 100644 zh/docs/operate/set-up-agent-keys.mdx create mode 100644 zh/docs/operate/validators/monitoring-alerting.mdx create mode 100644 zh/docs/operate/validators/run-validators.mdx create mode 100644 zh/docs/operate/validators/validator-signatures-aws.mdx create mode 100644 zh/docs/protocol-economics/intro.mdx create mode 100644 zh/docs/protocol/ISM/custom-ISM.mdx create mode 100644 zh/docs/protocol/ISM/economic-security/hyperlane-avs.mdx create mode 100644 zh/docs/protocol/ISM/economic-security/overview.mdx create mode 100644 zh/docs/protocol/ISM/ism-marketplace.mdx create mode 100644 zh/docs/protocol/ISM/modular-security.mdx create mode 100644 zh/docs/protocol/ISM/sequence-diagram.mdx create mode 100644 zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM.mdx create mode 100644 zh/docs/protocol/ISM/standard-ISMs/multisig-ISM.mdx create mode 100644 zh/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx create mode 100644 zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM.mdx create mode 100644 zh/docs/protocol/ISM/standard-ISMs/routing-ISM.mdx create mode 100644 zh/docs/protocol/agents/overview.mdx create mode 100644 zh/docs/protocol/agents/relayer.mdx create mode 100644 zh/docs/protocol/agents/validators.mdx create mode 100644 zh/docs/protocol/core/fees.mdx create mode 100644 zh/docs/protocol/core/interchain-gas-payment.mdx create mode 100644 zh/docs/protocol/core/mailbox.mdx create mode 100644 zh/docs/protocol/core/post-dispatch-hooks-overview.mdx create mode 100644 zh/docs/protocol/protocol-overview.mdx create mode 100644 zh/docs/protocol/warp-routes/warp-routes-example-usage.mdx create mode 100644 zh/docs/protocol/warp-routes/warp-routes-overview.mdx create mode 100644 zh/docs/protocol/warp-routes/warp-routes-types.mdx create mode 100644 zh/docs/reference/addresses/deployments/interchainAccountRouter.mdx create mode 100644 zh/docs/reference/addresses/deployments/interchainGasPaymaster.mdx create mode 100644 zh/docs/reference/addresses/deployments/mailbox.mdx create mode 100644 zh/docs/reference/addresses/deployments/merkleTreeHook.mdx create mode 100644 zh/docs/reference/addresses/deployments/proxyAdmin.mdx create mode 100644 zh/docs/reference/addresses/deployments/storageGasOracle.mdx create mode 100644 zh/docs/reference/addresses/deployments/testRecipient.mdx create mode 100644 zh/docs/reference/addresses/deployments/validatorAnnounce.mdx create mode 100644 zh/docs/reference/addresses/validators/latencies.mdx create mode 100644 zh/docs/reference/addresses/validators/mainnet-default-ism-validators.mdx create mode 100644 zh/docs/reference/addresses/validators/testnet-default-ism-validators.mdx create mode 100644 zh/docs/reference/developer-tips/token-faucets.mdx create mode 100644 zh/docs/reference/developer-tips/unit-testing.mdx create mode 100644 zh/docs/reference/developer-tools/cli.mdx create mode 100644 zh/docs/reference/developer-tools/libraries/hookmetadata.mdx create mode 100644 zh/docs/reference/developer-tools/libraries/mailbox-client.mdx create mode 100644 zh/docs/reference/developer-tools/libraries/message.mdx create mode 100644 zh/docs/reference/developer-tools/libraries/router.mdx create mode 100644 zh/docs/reference/developer-tools/libraries/typecasts.mdx create mode 100644 zh/docs/reference/developer-tools/typescript-sdk/overview.mdx create mode 100644 zh/docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation.mdx create mode 100644 zh/docs/reference/domains.mdx create mode 100644 zh/docs/reference/explorer/configuring-pi-chains.mdx create mode 100644 zh/docs/reference/explorer/explorer-debugging.mdx create mode 100644 zh/docs/reference/explorer/graphql-api.mdx create mode 100644 zh/docs/reference/explorer/overview.mdx create mode 100644 zh/docs/reference/hooks/arbitrum-L2-to-L1.mdx create mode 100644 zh/docs/reference/hooks/interchain-gas.mdx create mode 100644 zh/docs/reference/hooks/op-stack.mdx create mode 100644 zh/docs/reference/hooks/polygon-pos.mdx create mode 100644 zh/docs/reference/messaging/receive.mdx create mode 100644 zh/docs/reference/messaging/send.mdx create mode 100644 zh/docs/reference/registries.mdx create mode 100644 zh/docs/resources/audits.mdx create mode 100644 zh/docs/resources/faq.mdx create mode 100644 zh/docs/resources/glossary.mdx create mode 100644 zh/docs/resources/message-debugging.mdx create mode 100644 zh/index.mdx diff --git a/docs.json b/docs.json index f0b285c..75d9ab1 100644 --- a/docs.json +++ b/docs.json @@ -13,186 +13,355 @@ }, "favicon": "/favicon.svg", "navigation": { - "tabs": [ + "languages": [ { - "tab": "Home", - "groups": [ + "language": "en", + "tabs": [ { - "group": "Overview", - "pages": [ - "index", - "docs/intro", + "tab": "Home", + "groups": [ { - "group": "Deployments", + "group": "Overview", "pages": [ + "index", + "docs/intro", { - "group": "Contract Addresses", + "group": "Deployments", "pages": [ - "docs/reference/addresses/deployments/mailbox", - "docs/reference/addresses/deployments/interchainGasPaymaster", - "docs/reference/addresses/deployments/storageGasOracle", - "docs/reference/addresses/deployments/merkleTreeHook", - "docs/reference/addresses/deployments/validatorAnnounce", - "docs/reference/addresses/deployments/proxyAdmin", - "docs/reference/addresses/deployments/testRecipient", - "docs/reference/addresses/deployments/interchainAccountRouter" + { + "group": "Contract Addresses", + "pages": [ + "docs/reference/addresses/deployments/mailbox", + "docs/reference/addresses/deployments/interchainGasPaymaster", + "docs/reference/addresses/deployments/storageGasOracle", + "docs/reference/addresses/deployments/merkleTreeHook", + "docs/reference/addresses/deployments/validatorAnnounce", + "docs/reference/addresses/deployments/proxyAdmin", + "docs/reference/addresses/deployments/testRecipient", + "docs/reference/addresses/deployments/interchainAccountRouter" + ] + }, + { + "group": "Default ISM Validators", + "pages": [ + "docs/reference/addresses/validators/mainnet-default-ism-validators", + "docs/reference/addresses/validators/testnet-default-ism-validators" + ] + }, + "docs/reference/domains", + "docs/reference/registries" + ] + } + ] + }, + { + "group": "Quickstart", + "pages": [ + "docs/get-started-building", + "docs/guides/quickstart/deploy-warp-route", + "docs/guides/quickstart/local-testnet-setup" + ] + }, + { + "group": "Applications", + "pages": [ + { + "group": "Hyperlane Warp Routes", + "pages": [ + "docs/applications/warp-routes/overview", + "docs/applications/warp-routes/interface", + "docs/applications/warp-routes/types", + "docs/applications/warp-routes/example-usage", + "docs/applications/warp-routes/multi-collateral-warp-routes", + "docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing" ] }, { - "group": "Default ISM Validators", + "group": "Interchain Accounts", "pages": [ - "docs/reference/addresses/validators/mainnet-default-ism-validators", - "docs/reference/addresses/validators/testnet-default-ism-validators" + "docs/applications/interchain-account/overview", + "docs/applications/interchain-account/example-usage", + "docs/applications/interchain-account/overrides" ] }, - "docs/reference/domains", - "docs/reference/registries" + { + "group": "Use Cases", + "pages": [ + "docs/applications/use-cases/cross-chain-swaps", + "docs/applications/use-cases/cross-chain-swaps-with-recovery" + ] + } ] - } - ] - }, - { - "group": "Quickstart", - "pages": [ - "docs/get-started-building", - "docs/guides/quickstart/deploy-warp-route", - "docs/guides/quickstart/local-testnet-setup" - ] - }, - { - "group": "Applications", - "pages": [ + }, { - "group": "Hyperlane Warp Routes", + "group": "Guides", "pages": [ - "docs/applications/warp-routes/overview", - "docs/applications/warp-routes/interface", - "docs/applications/warp-routes/types", - "docs/applications/warp-routes/example-usage", - "docs/applications/warp-routes/multi-collateral-warp-routes", - "docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing" + { + "group": "Setup Hyperlane on your Chain", + "pages": [ + "docs/guides/chains/deploy-hyperlane", + "docs/guides/chains/deploy-hyperlane-with-local-agents" + ] + }, + { + "group": "Hyperlane Warp Routes (HWR)", + "pages": [ + { + "group": "EVM HWR", + "pages": [ + "docs/guides/warp-routes/evm/deploy-yield-routes", + "docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token", + "docs/guides/warp-routes/evm/extending-warp-routes", + "docs/guides/warp-routes/evm/xerc20-warp-route", + "docs/guides/warp-routes/evm/managing-warp-route-limits", + "docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes", + "docs/guides/warp-routes/evm/transfer-and-call-pattern" + ] + }, + { + "group": "SVM HWR", + "pages": [ + "docs/guides/warp-routes/svm/svm-warp-route-guide", + { + "group": "Using Squads", + "pages": [ + "docs/guides/production/using-squads/alt-svm-using-sqauds", + "docs/guides/production/using-squads/using-squads-solana" + ] + } + ] + }, + "docs/guides/warp-routes/evm-svm-warp-route-guide", + "docs/guides/warp-routes/bridge-ui-guide" + ] + }, + { + "group": "Go to Production", + "pages": [ + "docs/guides/production/prod-overview", + { + "group": "Core Deployment", + "pages": [ + "docs/guides/production/core-deployment/update-mailbox-default-ism", + "docs/guides/production/core-deployment/transfer-mailbox-ownership" + ] + }, + { + "group": "HWR Deployment", + "pages": [ + "docs/guides/production/warp-route-deployment/remove-trusted-relayer", + "docs/guides/production/warp-route-deployment/transfer-warp-route-ownership" + ] + } + ] + }, + "docs/guides/create-custom-hook-and-ism", + "docs/guides/deploy-hyperlane-troubleshooting" ] }, { - "group": "Interchain Accounts", + "group": "Developer Tools", "pages": [ - "docs/applications/interchain-account/overview", - "docs/applications/interchain-account/example-usage", - "docs/applications/interchain-account/overrides" + "docs/reference/developer-tools/cli", + { + "group": "Libraries", + "pages": [ + "docs/reference/developer-tools/libraries/mailbox-client", + "docs/reference/developer-tools/libraries/router", + "docs/reference/developer-tools/libraries/typecasts", + "docs/reference/developer-tools/libraries/message", + "docs/reference/developer-tools/libraries/hookmetadata" + ] + }, + { + "group": "Typescript SDK", + "pages": [ + "docs/reference/developer-tools/typescript-sdk/overview", + "docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation" + ] + }, + { + "group": "Developer Tips", + "pages": ["docs/reference/developer-tips/unit-testing"] + } ] }, { - "group": "Use Cases", + "group": "Resources", "pages": [ - "docs/applications/use-cases/cross-chain-swaps", - "docs/applications/use-cases/cross-chain-swaps-with-recovery" + { + "group": "Hyperlane Explorer", + "pages": [ + "docs/reference/explorer/overview", + "docs/reference/explorer/configuring-pi-chains", + "docs/reference/explorer/graphql-api", + "docs/reference/explorer/explorer-debugging" + ] + } ] } ] }, { - "group": "Guides", - "pages": [ + "tab": "Learn", + "groups": [ { - "group": "Setup Hyperlane on your Chain", - "pages": [ - "docs/guides/chains/deploy-hyperlane", - "docs/guides/chains/deploy-hyperlane-with-local-agents" - ] + "group": "Introduction", + "pages": ["docs/protocol/protocol-overview"] }, { - "group": "Hyperlane Warp Routes (HWR)", + "group": "Protocol", "pages": [ { - "group": "EVM HWR", + "group": "General Message Passing", "pages": [ - "docs/guides/warp-routes/evm/deploy-yield-routes", - "docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token", - "docs/guides/warp-routes/evm/extending-warp-routes", - "docs/guides/warp-routes/evm/xerc20-warp-route", - "docs/guides/warp-routes/evm/managing-warp-route-limits", - "docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes", - "docs/guides/warp-routes/evm/transfer-and-call-pattern" + "docs/protocol/core/mailbox", + "docs/protocol/core/fees", + "docs/protocol/core/interchain-gas-payment" ] }, { - "group": "SVM HWR", + "group": "Modular Security", "pages": [ - "docs/guides/warp-routes/svm/svm-warp-route-guide", + "docs/protocol/ISM/modular-security", + "docs/protocol/ISM/sequence-diagram", + "docs/protocol/ISM/ism-marketplace", + "docs/protocol/ISM/custom-ISM", + { + "group": "Standard ISMs", + "pages": [ + { + "group": "Multisig ISM", + "pages": [ + "docs/protocol/ISM/standard-ISMs/multisig-ISM", + "docs/reference/addresses/validators/latencies" + ] + }, + "docs/protocol/ISM/standard-ISMs/routing-ISM", + "docs/protocol/ISM/standard-ISMs/aggregation-ISM", + "docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM" + ] + }, { - "group": "Using Squads", + "group": "Economic Security", "pages": [ - "docs/guides/production/using-squads/alt-svm-using-sqauds", - "docs/guides/production/using-squads/using-squads-solana" + "docs/protocol/ISM/economic-security/overview", + "docs/protocol/ISM/economic-security/hyperlane-avs" ] } ] }, - "docs/guides/warp-routes/evm-svm-warp-route-guide", - "docs/guides/warp-routes/bridge-ui-guide" + { + "group": "Hyperlane Agents", + "pages": [ + "docs/protocol/agents/overview", + "docs/protocol/agents/validators", + "docs/protocol/agents/relayer" + ] + } ] }, { - "group": "Go to Production", + "group": "HYPER and Protocol Economics", + "pages": ["docs/protocol-economics/intro"] + }, + { + "group": "Reference", "pages": [ - "docs/guides/production/prod-overview", { - "group": "Core Deployment", + "group": "Send & Receive", "pages": [ - "docs/guides/production/core-deployment/update-mailbox-default-ism", - "docs/guides/production/core-deployment/transfer-mailbox-ownership" + "docs/reference/messaging/send", + "docs/reference/messaging/receive" ] }, { - "group": "HWR Deployment", + "group": "Post-Dispatch Hooks", "pages": [ - "docs/guides/production/warp-route-deployment/remove-trusted-relayer", - "docs/guides/production/warp-route-deployment/transfer-warp-route-ownership" + "docs/protocol/core/post-dispatch-hooks-overview", + "docs/reference/hooks/interchain-gas", + "docs/reference/hooks/op-stack", + "docs/reference/hooks/arbitrum-L2-to-L1", + "docs/reference/hooks/polygon-pos" ] } ] }, - "docs/guides/create-custom-hook-and-ism", - "docs/guides/deploy-hyperlane-troubleshooting" + { + "group": "Alt-VM Implementations & Guides", + "pages": [ + "docs/alt-vm-implementations/overview", + "docs/alt-vm-implementations/implementation-guide", + "docs/alt-vm-implementations/cosmos-sdk" + ] + }, + { + "group": "Resources", + "pages": [ + "docs/resources/message-debugging", + "docs/resources/glossary", + "docs/resources/faq", + "docs/resources/audits" + ] + } ] }, { - "group": "Developer Tools", - "pages": [ - "docs/reference/developer-tools/cli", + "tab": "Agent Operators", + "groups": [ + { + "group": "Introduction", + "pages": ["docs/operate/overview-agents"] + }, + { + "group": "Key Management", + "pages": ["docs/operate//set-up-agent-keys"] + }, { - "group": "Libraries", + "group": "Validators", "pages": [ - "docs/reference/developer-tools/libraries/mailbox-client", - "docs/reference/developer-tools/libraries/router", - "docs/reference/developer-tools/libraries/typecasts", - "docs/reference/developer-tools/libraries/message", - "docs/reference/developer-tools/libraries/hookmetadata" + "docs/operate/validators/run-validators", + "docs/operate/validators/validator-signatures-aws", + "docs/operate/validators/monitoring-alerting" ] }, { - "group": "Typescript SDK", + "group": "Relayer", "pages": [ - "docs/reference/developer-tools/typescript-sdk/overview", - "docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation" + "docs/operate/relayer/run-relayer", + { + "group": "HTTP API", + "pages": [ + "docs/operate/relayer/api", + "docs/operate/relayer/api/operations/get-operations", + "docs/operate/relayer/api/operations/post-message-retry", + "docs/operate/relayer/api/operations/post-reprocess-message", + "docs/operate/relayer/api/messages/get-messages", + "docs/operate/relayer/api/messages/post-messages", + "docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions", + "docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions", + "docs/operate/relayer/api/igp/get-igp-rules", + "docs/operate/relayer/api/igp/post-igp-rules", + "docs/operate/relayer/api/igp/delete-igp-rules" + ] + }, + "docs/operate/relayer/message-filtering", + "docs/operate/relayer/monitoring-alerting" ] }, { - "group": "Developer Tips", - "pages": ["docs/reference/developer-tips/unit-testing"] - } - ] - }, - { - "group": "Resources", - "pages": [ + "group": "Agent Config", + "pages": [ + "docs/operate/config/agent-config", + "docs/operate/config/config-reference" + ] + }, { - "group": "Hyperlane Explorer", + "group": "Guides", "pages": [ - "docs/reference/explorer/overview", - "docs/reference/explorer/configuring-pi-chains", - "docs/reference/explorer/graphql-api", - "docs/reference/explorer/explorer-debugging" + "docs/operate/guides/docker-quickstart", + "docs/operate/guides/deploy-with-terraform", + "docs/operate/guides/avs-operator-guide" ] } ] @@ -200,165 +369,355 @@ ] }, { - "tab": "Learn", - "groups": [ - { - "group": "Introduction", - "pages": ["docs/protocol/protocol-overview"] - }, + "language": "zh", + "tabs": [ { - "group": "Protocol", - "pages": [ + "tab": "首页", + "groups": [ + { + "group": "概述", + "pages": [ + "zh/index", + "zh/docs/intro", + { + "group": "部署", + "pages": [ + { + "group": "合约地址", + "pages": [ + "zh/docs/reference/addresses/deployments/mailbox", + "zh/docs/reference/addresses/deployments/interchainGasPaymaster", + "zh/docs/reference/addresses/deployments/storageGasOracle", + "zh/docs/reference/addresses/deployments/merkleTreeHook", + "zh/docs/reference/addresses/deployments/validatorAnnounce", + "zh/docs/reference/addresses/deployments/proxyAdmin", + "zh/docs/reference/addresses/deployments/testRecipient", + "zh/docs/reference/addresses/deployments/interchainAccountRouter" + ] + }, + { + "group": "默认 ISM 验证器", + "pages": [ + "zh/docs/reference/addresses/validators/mainnet-default-ism-validators", + "zh/docs/reference/addresses/validators/testnet-default-ism-validators" + ] + }, + "zh/docs/reference/domains", + "zh/docs/reference/registries" + ] + } + ] + }, { - "group": "General Message Passing", + "group": "快速开始", "pages": [ - "docs/protocol/core/mailbox", - "docs/protocol/core/fees", - "docs/protocol/core/interchain-gas-payment" + "zh/docs/get-started-building", + "zh/docs/guides/quickstart/deploy-warp-route", + "zh/docs/guides/quickstart/local-testnet-setup" ] }, { - "group": "Modular Security", + "group": "应用", "pages": [ - "docs/protocol/ISM/modular-security", - "docs/protocol/ISM/sequence-diagram", - "docs/protocol/ISM/ism-marketplace", - "docs/protocol/ISM/custom-ISM", { - "group": "Standard ISMs", + "group": "Hyperlane Warp 路由", + "pages": [ + "zh/docs/applications/warp-routes/overview", + "zh/docs/applications/warp-routes/interface", + "zh/docs/applications/warp-routes/types", + "zh/docs/applications/warp-routes/example-usage", + "zh/docs/applications/warp-routes/multi-collateral-warp-routes", + "zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing" + ] + }, + { + "group": "跨链账户", + "pages": [ + "zh/docs/applications/interchain-account/overview", + "zh/docs/applications/interchain-account/example-usage", + "zh/docs/applications/interchain-account/overrides" + ] + }, + { + "group": "用例", + "pages": [ + "zh/docs/applications/use-cases/cross-chain-swaps", + "zh/docs/applications/use-cases/cross-chain-swaps-with-recovery" + ] + } + ] + }, + { + "group": "指南", + "pages": [ + { + "group": "在您的链上设置 Hyperlane", + "pages": [ + "zh/docs/guides/chains/deploy-hyperlane", + "zh/docs/guides/chains/deploy-hyperlane-with-local-agents" + ] + }, + { + "group": "Hyperlane Warp 路由 (HWR)", "pages": [ { - "group": "Multisig ISM", + "group": "EVM HWR", "pages": [ - "docs/protocol/ISM/standard-ISMs/multisig-ISM", - "docs/reference/addresses/validators/latencies" + "zh/docs/guides/warp-routes/evm/deploy-yield-routes", + "zh/docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token", + "zh/docs/guides/warp-routes/evm/extending-warp-routes", + "zh/docs/guides/warp-routes/evm/xerc20-warp-route", + "zh/docs/guides/warp-routes/evm/managing-warp-route-limits", + "zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes", + "zh/docs/guides/warp-routes/evm/transfer-and-call-pattern" ] }, - "docs/protocol/ISM/standard-ISMs/routing-ISM", - "docs/protocol/ISM/standard-ISMs/aggregation-ISM", - "docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM" + { + "group": "SVM HWR", + "pages": [ + "zh/docs/guides/warp-routes/svm/svm-warp-route-guide", + { + "group": "使用 Squads", + "pages": [ + "zh/docs/guides/production/using-squads/alt-svm-using-sqauds", + "zh/docs/guides/production/using-squads/using-squads-solana" + ] + } + ] + }, + "zh/docs/guides/warp-routes/evm-svm-warp-route-guide", + "zh/docs/guides/warp-routes/bridge-ui-guide" ] }, { - "group": "Economic Security", + "group": "进入生产环境", "pages": [ - "docs/protocol/ISM/economic-security/overview", - "docs/protocol/ISM/economic-security/hyperlane-avs" + "zh/docs/guides/production/prod-overview", + { + "group": "核心部署", + "pages": [ + "zh/docs/guides/production/core-deployment/update-mailbox-default-ism", + "zh/docs/guides/production/core-deployment/transfer-mailbox-ownership" + ] + }, + { + "group": "HWR 部署", + "pages": [ + "zh/docs/guides/production/warp-route-deployment/remove-trusted-relayer", + "zh/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership" + ] + } ] + }, + "zh/docs/guides/create-custom-hook-and-ism", + "zh/docs/guides/deploy-hyperlane-troubleshooting" + ] + }, + { + "group": "开发工具", + "pages": [ + "zh/docs/reference/developer-tools/cli", + { + "group": "库", + "pages": [ + "zh/docs/reference/developer-tools/libraries/mailbox-client", + "zh/docs/reference/developer-tools/libraries/router", + "zh/docs/reference/developer-tools/libraries/typecasts", + "zh/docs/reference/developer-tools/libraries/message", + "zh/docs/reference/developer-tools/libraries/hookmetadata" + ] + }, + { + "group": "TypeScript SDK", + "pages": [ + "zh/docs/reference/developer-tools/typescript-sdk/overview", + "zh/docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation" + ] + }, + { + "group": "开发者提示", + "pages": ["zh/docs/reference/developer-tips/unit-testing"] } ] }, { - "group": "Hyperlane Agents", + "group": "资源", "pages": [ - "docs/protocol/agents/overview", - "docs/protocol/agents/validators", - "docs/protocol/agents/relayer" + { + "group": "Hyperlane 浏览器", + "pages": [ + "zh/docs/reference/explorer/overview", + "zh/docs/reference/explorer/configuring-pi-chains", + "zh/docs/reference/explorer/graphql-api", + "zh/docs/reference/explorer/explorer-debugging" + ] + } ] } ] }, { - "group": "HYPER and Protocol Economics", - "pages": ["docs/protocol-economics/intro"] - }, - { - "group": "Reference", - "pages": [ + "tab": "学习", + "groups": [ + { + "group": "介绍", + "pages": ["zh/docs/protocol/protocol-overview"] + }, + { + "group": "协议", + "pages": [ + { + "group": "通用消息传递", + "pages": [ + "zh/docs/protocol/core/mailbox", + "zh/docs/protocol/core/fees", + "zh/docs/protocol/core/interchain-gas-payment" + ] + }, + { + "group": "模块化安全", + "pages": [ + "zh/docs/protocol/ISM/modular-security", + "zh/docs/protocol/ISM/sequence-diagram", + "zh/docs/protocol/ISM/ism-marketplace", + "zh/docs/protocol/ISM/custom-ISM", + { + "group": "标准 ISM", + "pages": [ + { + "group": "多重签名 ISM", + "pages": [ + "zh/docs/protocol/ISM/standard-ISMs/multisig-ISM", + "zh/docs/reference/addresses/validators/latencies" + ] + }, + "zh/docs/protocol/ISM/standard-ISMs/routing-ISM", + "zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM", + "zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM" + ] + }, + { + "group": "经济安全", + "pages": [ + "zh/docs/protocol/ISM/economic-security/overview", + "zh/docs/protocol/ISM/economic-security/hyperlane-avs" + ] + } + ] + }, + { + "group": "Hyperlane 代理", + "pages": [ + "zh/docs/protocol/agents/overview", + "zh/docs/protocol/agents/validators", + "zh/docs/protocol/agents/relayer" + ] + } + ] + }, { - "group": "Send & Receive", + "group": "HYPER 和协议经济学", + "pages": ["zh/docs/protocol-economics/intro"] + }, + { + "group": "参考", "pages": [ - "docs/reference/messaging/send", - "docs/reference/messaging/receive" + { + "group": "发送和接收", + "pages": [ + "zh/docs/reference/messaging/send", + "zh/docs/reference/messaging/receive" + ] + }, + { + "group": "调度后钩子", + "pages": [ + "zh/docs/protocol/core/post-dispatch-hooks-overview", + "zh/docs/reference/hooks/interchain-gas", + "zh/docs/reference/hooks/op-stack", + "zh/docs/reference/hooks/arbitrum-L2-to-L1", + "zh/docs/reference/hooks/polygon-pos" + ] + } + ] + }, + { + "group": "替代虚拟机实现和指南", + "pages": [ + "zh/docs/alt-vm-implementations/overview", + "zh/docs/alt-vm-implementations/implementation-guide", + "zh/docs/alt-vm-implementations/cosmos-sdk" ] }, { - "group": "Post-Dispatch Hooks", + "group": "资源", "pages": [ - "docs/protocol/core/post-dispatch-hooks-overview", - "docs/reference/hooks/interchain-gas", - "docs/reference/hooks/op-stack", - "docs/reference/hooks/arbitrum-L2-to-L1", - "docs/reference/hooks/polygon-pos" + "zh/docs/resources/message-debugging", + "zh/docs/resources/glossary", + "zh/docs/resources/faq", + "zh/docs/resources/audits" ] } ] }, { - "group": "Alt-VM Implementations & Guides", - "pages": [ - "docs/alt-vm-implementations/overview", - "docs/alt-vm-implementations/implementation-guide", - "docs/alt-vm-implementations/cosmos-sdk" - ] - }, - { - "group": "Resources", - "pages": [ - "docs/resources/message-debugging", - "docs/resources/glossary", - "docs/resources//faq", - "docs/resources/audits" - ] - } - ] - }, - { - "tab": "Agent Operators", - "groups": [ - { - "group": "Introduction", - "pages": ["docs/operate/overview-agents"] - }, - { - "group": "Key Management", - "pages": ["docs/operate//set-up-agent-keys"] - }, - { - "group": "Validators", - "pages": [ - "docs/operate/validators/run-validators", - "docs/operate/validators/validator-signatures-aws", - "docs/operate/validators/monitoring-alerting" - ] - }, - { - "group": "Relayer", - "pages": [ - "docs/operate/relayer/run-relayer", + "tab": "代理", + "groups": [ + { + "group": "介绍", + "pages": ["zh/docs/operate/overview-agents"] + }, { - "group": "HTTP API", + "group": "密钥管理", + "pages": ["zh/docs/operate//set-up-agent-keys"] + }, + { + "group": "验证器", "pages": [ - "docs/operate/relayer/api", - "docs/operate/relayer/api/operations/get-operations", - "docs/operate/relayer/api/operations/post-message-retry", - "docs/operate/relayer/api/operations/post-reprocess-message", - "docs/operate/relayer/api/messages/get-messages", - "docs/operate/relayer/api/messages/post-messages", - "docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions", - "docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions", - "docs/operate/relayer/api/igp/get-igp-rules", - "docs/operate/relayer/api/igp/post-igp-rules", - "docs/operate/relayer/api/igp/delete-igp-rules" + "zh/docs/operate/validators/run-validators", + "zh/docs/operate/validators/validator-signatures-aws", + "zh/docs/operate/validators/monitoring-alerting" ] }, - "docs/operate/relayer/message-filtering", - "docs/operate/relayer/monitoring-alerting" - ] - }, - { - "group": "Agent Config", - "pages": [ - "docs/operate/config/agent-config", - "docs/operate/config/config-reference" - ] - }, - { - "group": "Guides", - "pages": [ - "docs/operate/guides/docker-quickstart", - "docs/operate/guides/deploy-with-terraform", - "docs/operate/guides/avs-operator-guide" + { + "group": "中继器", + "pages": [ + "zh/docs/operate/relayer/run-relayer", + { + "group": "HTTP API", + "pages": [ + "zh/docs/operate/relayer/api", + "zh/docs/operate/relayer/api/operations/get-operations", + "zh/docs/operate/relayer/api/operations/post-message-retry", + "zh/docs/operate/relayer/api/operations/post-reprocess-message", + "zh/docs/operate/relayer/api/messages/get-messages", + "zh/docs/operate/relayer/api/messages/post-messages", + "zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions", + "zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions", + "zh/docs/operate/relayer/api/igp/get-igp-rules", + "zh/docs/operate/relayer/api/igp/post-igp-rules", + "zh/docs/operate/relayer/api/igp/delete-igp-rules" + ] + }, + "zh/docs/operate/relayer/message-filtering", + "zh/docs/operate/relayer/monitoring-alerting" + ] + }, + { + "group": "代理配置", + "pages": [ + "zh/docs/operate/config/agent-config", + "zh/docs/operate/config/config-reference" + ] + }, + { + "group": "指南", + "pages": [ + "zh/docs/operate/guides/docker-quickstart", + "zh/docs/operate/guides/deploy-with-terraform", + "zh/docs/operate/guides/avs-operator-guide" + ] + } ] } ] @@ -421,8 +780,13 @@ "options": ["copy", "view", "chatgpt", "claude"] }, "seo": { + "indexing": "all", "metatags": { - "og:image": "/images/hero-light.png" + "og:image": "/images/hero-light.png", + "og:type": "website", + "og:site_name": "Hyperlane Docs", + "twitter:card": "summary_large_image", + "twitter:site": "@hyperlane" } }, "redirects": [ diff --git a/docs/alt-vm-implementations/overview.mdx b/docs/alt-vm-implementations/overview.mdx index c4d25d8..a1cee82 100644 --- a/docs/alt-vm-implementations/overview.mdx +++ b/docs/alt-vm-implementations/overview.mdx @@ -14,7 +14,7 @@ While our public documentation currently focuses on EVM compatibility, we offer ### CosmosSDK -The Hyperlane Cosmos SDK module, enables direct integration with Cosmos SDK-based blockchains. See [Hyperlane - Cosmos SDK Module](docs/alt-vm-implementations/cosmos-sdk). +The Hyperlane Cosmos SDK module, enables direct integration with Cosmos SDK-based blockchains. See [Hyperlane - Cosmos SDK Module](/docs/alt-vm-implementations/cosmos-sdk). ### CosmWasm[​](#cosmwasm "Direct link to CosmWasm") diff --git a/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx b/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx index e8a67a8..54b977b 100644 --- a/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx +++ b/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx @@ -2,9 +2,9 @@ title: "Transfer Ownership" --- -import PrerequisitesPartial from "/snippets/prerequisites-config-symbol.mdx"; -import WarpReadSymbolChainPartial from "/snippets/warp-read-symbol-chain.mdx"; -import WarpApplySymbolConfigDefaultPartial from "/snippets/warp-apply-symbol-config-default.mdx"; +import PrerequisitesPartial from "/snippets/warp-routes/prerequisites-config-symbol.mdx"; +import WarpReadSymbolChainPartial from "/snippets/warp-routes/warp-read-symbol-chain.mdx"; +import WarpApplySymbolConfigDefaultPartial from "/snippets/warp-routes/warp-apply-symbol-config-default.mdx"; This guide provides a step-by-step guide to transferring ownership of your Hyperlane Warp Route (HWR). It also explains the responsibilities, security considerations, and configuration options that come with owning a HWR. diff --git a/docs/guides/quickstart/deploy-warp-route.mdx b/docs/guides/quickstart/deploy-warp-route.mdx index 87bd578..e11fdb5 100644 --- a/docs/guides/quickstart/deploy-warp-route.mdx +++ b/docs/guides/quickstart/deploy-warp-route.mdx @@ -161,6 +161,6 @@ You can test in either direction between where you have the HWR set. However, if ## Learn More -- Check out the [HWR](docs/applications/warp-routes/overview) reference page for more information on the interface and security implications of a HWR. The [interface](docs/applications/warp-routes/overview#interface) section covers calling `transferRemote` to transfer tokens to a specified recipient on a destination chain. Note that you'll have to prompt for a token approval prior to calling `transferRemote`. +- Check out the [HWR](/docs/applications/warp-routes/overview) reference page for more information on the interface and security implications of a HWR. The [interface](/docs/applications/warp-routes/overview#interface) section covers calling `transferRemote` to transfer tokens to a specified recipient on a destination chain. Note that you'll have to prompt for a token approval prior to calling `transferRemote`. - A HWR is a type of [router](/docs/reference/developer-tools/libraries/router) application, a pattern enabling you to link multiple contracts across chains together. diff --git a/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx b/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx index dc290c5..136367d 100644 --- a/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx +++ b/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx @@ -6,7 +6,7 @@ title: "Transfer and Call Pattern" The **Transfer and Call Pattern** enables a contract to both bridge assets via [Hyperlane Warp Route (HWR)](/docs/protocol/warp-routes/warp-routes-overview) and execute an action on the destination chain after the assets arrive. This pattern is useful for cases where an action depends on token balances after bridging. -While HWR handle cross-chain token transfers, this pattern extends their capabilities by using [Interchain Accounts (ICA)](docs/applications/interchain-account) to execute arbitrary logic on the destination chain. +While HWR handle cross-chain token transfers, this pattern extends their capabilities by using [Interchain Accounts (ICA)](/docs/applications/interchain-account) to execute arbitrary logic on the destination chain. ### Use Cases @@ -67,7 +67,7 @@ flowchart TB ## How It Works 1. Tokens are transferred from the sender to the contract. -2. An [Interchain Account (ICA)](docs/applications/interchain-account) is derived for the contract on the destination chain. +2. An [Interchain Account (ICA)](/docs/applications/interchain-account) is derived for the contract on the destination chain. 3. The HWR transfer is initiated, sending the tokens crosschain to the interchain account. 4. A remote contract call is executed on the destination chain from the interchain account after the tokens arrive. diff --git a/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx b/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx index 2312bdf..edd6c08 100644 --- a/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx +++ b/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx @@ -2,10 +2,203 @@ title: "Multisig ISM Latencies" --- -import ChainList from "../../../../components/ChainList"; - Validators must wait a certain number of blocks to be mined before they are considered valid and [reorg-safe](https://www.alchemy.com/overviews/what-is-a-reorg). Without this, validators could be slashed since they may have signed a checkpoint that is no longer valid. Refer to the following sections for block finality configuration used by the Hyperlane validators. - + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| --------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract | 2741 | 0 | 1 | +| Aleph Zero EVM | 1000041455 | 5 | 3 | +| Ancient8 | 888888888 | 5 | 2 | +| ApeChain | 33139 | 5 | 0.2 | +| AppChain | 466 | 0 | 2 | +| Arbitrum | 42161 | 5 | 0.25 | +| Arbitrum Nova | 42170 | 5 | 2 | +| Arcadia | 4278608 | 5 | 2 | +| Artela | 11820 | 5 | 2 | +| Astar | 592 | finalized | 13 | +| Astar zkEVM | 3776 | 5 | 3 | +| Aurora | 1313161554 | 5 | 1 | +| Avalanche | 43114 | 3 | 2 | +| B3 | 8333 | 5 | 1 | +| Base | 8453 | 10 | 2 | +| Berachain | 80094 | 5 | 2 | +| Bitlayer | 200901 | 20 | 3 | +| Blast | 81457 | 5 | 2 | +| BOB | 60808 | 5 | 2 | +| Boba Mainnet | 288 | 5 | 2 | +| Botanix | 3637 | 5 | 6 | +| Binance Smart Chain | 56 | finalized | 3 | +| B² Network | 223 | 5 | 3 | +| Celestia | 1128614981 | 1 | 6 | +| Celo | 42220 | 5 | 1 | +| CheeseChain | 383353 | 1 | 30 | +| Chiliz | 1000088888 | 9 | 3 | +| Core | 1116 | 21 | 3 | +| Corn | 21000000 | 5 | 20 | +| Coti | 2632500 | 5 | 5 | +| Cyber | 7560 | 5 | 2 | +| Degen | 666666666 | 5 | 10 | +| Dogechain | 2000 | 5 | 2 | +| Eclipse | 1408864445 | 0 | 0.4 | +| Endurance | 648 | 15 | 12 | +| Ethereum | 1 | 15 | 13 | +| Everclear | 25327 | 2 | 2 | +| Fantom Opera | 250 | 5 | 2 | +| Flare | 14 | 3 | 2 | +| EVM on Flow | 1000000747 | 25 | 1 | +| Fluence | 9999999 | 5 | 1 | +| Form | 478 | 5 | 2 | +| Fraxtal | 252 | 5 | 2 | +| Fuse | 122 | 19 | 5 | +| Galactica | 613419 | 0 | 1 | +| Game7 | 2187 | 0 | 5 | +| Glue | 1300 | 5 | 6 | +| Gnosis | 100 | 5 | 5 | +| Gravity Alpha Mainnet | 1625 | 5 | 1 | +| Harmony One | 1666600000 | 5 | 2 | +| Hashkey | 177 | 5 | 2 | +| Hemi Network | 43111 | 5 | 12 | +| HyperEVM | 999 | 5 | 2 | +| Immutable zkEVM | 1000013371 | 20 | 2 | +| Injective EVM | 2525 | 3 | 3 | +| Infinity VM | 1032009 | 1 | 1 | +| Infinity VM | 1001032009 | 1 | 1 | +| Injective | 6909546 | 10 | 1 | +| Ink | 57073 | 5 | 1 | +| Kaia | 8217 | 5 | 1 | +| Katana | 747474 | 5 | 1 | +| Linea | 59144 | 5 | 3 | +| Lisk | 1135 | 5 | 2 | +| LUKSO | 42 | 15 | 12 | +| Lumia Prism | 1000073017 | 5 | 4 | +| Manta Pacific | 169 | 5 | 3 | +| Mantle | 5000 | 2 | 2 | +| Matchain | 698 | 5 | 1 | +| Merlin | 4200 | 5 | 3 | +| Metal L2 | 1000001750 | 5 | 2 | +| Metis Andromeda | 1088 | 5 | 5 | +| MilkyWay | 1835625579 | 1 | 6 | +| Mint | 185 | 5 | 2 | +| Miraclechain | 92278 | 0 | 3 | +| Mode | 34443 | 5 | 2 | +| Molten | 360 | 0 | 30 | +| Moonbeam | 1284 | finalized | 12 | +| Morph | 2818 | 5 | 4 | +| Neutron | 1853125230 | 1 | 3 | +| Nibiru | 6900 | 5 | 2 | +| Ontology | 58 | 5 | 1 | +| Oort | 970 | 0 | 2 | +| opBNB | 204 | 5 | 1 | +| Optimism | 10 | 10 | 2 | +| Orderly L2 | 291 | 5 | 2 | +| Paradex | 514051890 | 1 | 30 | +| Peaq | 3338 | finalized | 6 | +| Plume | 98866 | 0 | 2 | +| Polygon | 137 | finalized | 2 | +| Polygon zkEVM | 1101 | 5 | 10 | +| Polynomial | 1000008008 | 5 | 2 | +| Prom | 227 | 5 | 6 | +| Proof of Play Apex | 70700 | 5 | 1 | +| RARI Chain | 1000012617 | 0 | 30 | +| Reactive Mainnet | 1597 | 5 | 7 | +| Redstone | 690 | 5 | 2 | +| Ronin | 2020 | 5 | 3 | +| Scroll | 534352 | 17 | 3 | +| Sei | 1329 | 1 | 1 | +| Shibarium | 109 | finalized | 5 | +| SnaxChain | 2192 | 5 | 2 | +| Solana | 1399811149 | 0 | 0.4 | +| Solaxy | 1936682104 | 0 | 1.2 | +| Soneium | 1868 | 5 | 2 | +| Sonic | 146 | 5 | 2 | +| Sonic SVM | 507150715 | 0 | 0.4 | +| SOON | 50075007 | 0 | 0.05 | +| Sophon | 50104 | 0 | 1 | +| Starknet | 358974494 | 1 | 30 | +| Story Mainnet | 1514 | 5 | 3 | +| Subtensor | 964 | 5 | 12 | +| Superposition | 1000055244 | 0 | 60 | +| Superseed | 5330 | 5 | 2 | +| svmBNB | 574456 | 0 | 0.4 | +| Swell | 1923 | 5 | 2 | +| TAC | 239 | 5 | 1 | +| Taiko | 167000 | 5 | 12 | +| Tangle | 5845 | finalized | 6 | +| Torus | 21000 | finalized | 8 | +| Unichain | 130 | 5 | 1 | +| Vana | 1480 | 5 | 6 | +| Viction | 88 | 3 | 2 | +| World Chain | 480 | 5 | 2 | +| Xai | 660279 | 5 | 1 | +| XLayer | 196 | 5 | 10 | +| XRPL EVM | 1440000 | 5 | 6 | +| Zero Network | 543210 | 0 | 1 | +| ZetaChain | 7000 | 0 | 6 | +| Zircuit | 48900 | 5 | 2 | +| zkSync | 324 | 0 | 1 | +| Zora | 7777777 | 5 | 2 | + + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| ------------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract Testnet | 11124 | 0 | 1 | +| Aleph Zero EVM Testnet | 2039 | 5 | 3 | +| Alfajores | 44787 | 0 | 5 | +| Arbitrum Sepolia | 421614 | 0 | 3 | +| Arcadia Testnet v2 | 1098411886 | 1 | 1 | +| Aurora Testnet | 1313161555 | 1 | 1 | +| Basecamp Testnet | 1000001114 | 1 | 1 | +| Base Sepolia | 84532 | 1 | 2 | +| Berachain Bepolia | 80069 | 5 | 2 | +| BSC Testnet | 97 | 9 | 3 | +| CarrChain Testnet | 76672 | 0 | 1 | +| Celestia Testnet | 1297040200 | 1 | 6 | +| Chronicle Yellowstone | 175188 | 0 | 1 | +| Citrea Testnet | 5115 | 1 | 2 | +| Coti Testnet | 7082400 | 1 | 5 | +| Eco Testnet | 471923 | 0 | 1 | +| Flame Dawn-1 Testnet | 1660473773 | 1 | 2 | +| Form Testnet | 132902 | 1 | 2 | +| Fuji | 43113 | 3 | 2 | +| Holesky | 17000 | 2 | 13 | +| Hyperliquid EVM Testnet | 998 | 1 | 2 | +| Infinity VM Monza Testnet | 96025 | 1 | 1 | +| Ink Sepolia | 763373 | 1 | 1 | +| MegaETH Testnet | 6342 | 1 | 1 | +| Milkyway Testnet | 1162171030 | 1 | 6 | +| Mode Testnet | 919 | 1 | 2 | +| Monad Testnet | 10143 | 1 | 1 | +| Neura Testnet | 267 | 0 | 2 | +| Odyssey Testnet | 911867 | 1 | 1 | +| Optimism Sepolia | 11155420 | 0 | 2 | +| Paradex Sepolia | 12263410 | 1 | 30 | +| Plume Testnet | 98867 | 0 | 2 | +| Polygon Amoy | 80002 | 10 | 2 | +| Scroll Sepolia | 534351 | 1 | 3 | +| Sepolia | 11155111 | 2 | 13 | +| Solana Testnet | 1399811150 | 0 | 0.4 | +| Somnia Testnet | 50312 | 1 | 1 | +| Soneium Minato Testnet | 1946 | 1 | 2 | +| Sonic Blaze Testnet | 57054 | 1 | 1 | +| Sonic SVM Testnet | 15153042 | 0 | 0.4 | +| Sonic Testnet | 64165 | 1 | 1 | +| Starknet Sepolia | 23448591 | 1 | 30 | +| SUAVE Toliman Testnet | 33626250 | 1 | 4 | +| Subtensor Testnet | 945 | 1 | 12 | +| Superposition Testnet | 98985 | 1 | 1 | +| Tangle Testnet | 3799 | 0 | 6 | +| Unichain Testnet | 1301 | 1 | 1 | +| Load Network Alphanet | 9496 | 1 | 2 | + + + + diff --git a/docs/protocol/core/interchain-gas-payment.mdx b/docs/protocol/core/interchain-gas-payment.mdx index b5d20bb..08c5d2d 100644 --- a/docs/protocol/core/interchain-gas-payment.mdx +++ b/docs/protocol/core/interchain-gas-payment.mdx @@ -50,7 +50,7 @@ flowchart LR IGP -. "value" .- Relayer ``` -For convenience, a [Relayer](docs/operate/relayer/run-relayer) watches for dispatched messages and will submit process transactions on behalf of the message sender if they receive sufficient payment on the origin chain. This is the _interchain gas payment_. +For convenience, a [Relayer](/docs/operate/relayer/run-relayer) watches for dispatched messages and will submit process transactions on behalf of the message sender if they receive sufficient payment on the origin chain. This is the _interchain gas payment_. ```mermaid flowchart LR @@ -103,4 +103,4 @@ There are no trust assumptions with respect to Relayers in the Hyperlane protoco ## Learn More - For details on gas limit calculations, benchmarking recommendations, gas oracles, and destination gas configuration, refer to [Interchain Gas Payment Details](/docs/reference/hooks/interchain-gas). -- For Relayer setups and implementation guidance, see the [Relayer](docs/operate/relayer/run-relayer) section. +- For Relayer setups and implementation guidance, see the [Relayer](/docs/operate/relayer/run-relayer) section. diff --git a/docs/resources/glossary.mdx b/docs/resources/glossary.mdx index 26e2af8..d31db2c 100644 --- a/docs/resources/glossary.mdx +++ b/docs/resources/glossary.mdx @@ -42,13 +42,13 @@ A [middleware](/docs/resources/glossary#middleware) smart contract that allows u For example, DAOs can use interchain accounts to own contracts on remote chains. -See [Interchain Accounts](docs/applications/interchain-account) for more information. +See [Interchain Accounts](/docs/applications/interchain-account) for more information. ## Interchain gas paymaster A smart contract deployed by a [Relayer](/docs/resources/glossary#relayer) that accepts payments on an origin chain for message delivery on destination chains. -See [interchain gas payments](docs/protocol/core/interchain-gas-payment) for more information +See [interchain gas payments](/docs/protocol/core/interchain-gas-payment) for more information ## Interchain queries (IQS) @@ -64,7 +64,7 @@ ISMs are responsible for verifying that interchain messages being delivered on t ## Mailbox -Arguably the most important Hyperlane smart contract, the [mailbox](docs/protocol/core/interchain-gas-payment) exposes an interface that developers can use to [send](/docs/reference/messaging/send) and [receive](/docs/reference/messaging/receive) interchain messages. +Arguably the most important Hyperlane smart contract, the [mailbox](/docs/protocol/core/interchain-gas-payment) exposes an interface that developers can use to [send](/docs/reference/messaging/send) and [receive](/docs/reference/messaging/receive) interchain messages. ## Middleware[​](#middleware "Direct link to Middleware") diff --git a/zh/docs/alt-vm-implementations/cosmos-sdk.mdx b/zh/docs/alt-vm-implementations/cosmos-sdk.mdx new file mode 100644 index 0000000..488670f --- /dev/null +++ b/zh/docs/alt-vm-implementations/cosmos-sdk.mdx @@ -0,0 +1,138 @@ +--- +title: "Cosmos SDK 模块" +--- + +SDK 模块通过将 Hyperlane 直接集成到基于 Cosmos SDK 的链中,实现无缝的跨链通信。该模块为 Cosmos 链提供了一种无需许可的方式来与外部生态系统通信,包括 EVM 和其他区块链。 + +虽然 Hyperlane 已经通过 [CosmWasm](https://github.com/many-things/cw-hyperlane?tab=readme-ov-file) 支持 Cosmos 链,但该模块通过使 Cosmos SDK 链(无论是否支持 CosmWasm)能够利用 Hyperlane 的互操作性功能,扩展了可访问性。 + +## 主要特性 + +- **Hyperlane 兼容性:** 该模块完全实现了 Hyperlane 消息传递协议,在所有 Hyperlane 兼容链之间实现无缝的跨链功能。 +- **Hyperlane Warp 路由 (HWR):** 利用核心功能,可以在所有 Hyperlane 兼容链之间创建和转移代币。 +- **端到端互操作解决方案**:为基于 Cosmos SDK 的链实现 Hyperlane 跨链互操作性框架的消息传递、传输和安全模块。 +- **无需许可和开源**:任何人都可以部署和配置该模块以满足其需求,无需依赖中介。 +- **由 KYVE 构建**:由 [KYVE](https://www.kyve.network/) 团队开发,将 Cosmos 互操作性扩展到 IBC 之外。 + +## 模块概述 + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (8).svg](/images/docs/reference/alt-vm-implementations/hyperlane-cosmos_8-ec3ccdfbe86107f3811715cabe27ea4b.svg) + +### `x/core` + +`core` 模块旨在实现 Hyperlane 协议的基本功能,用于分发和处理消息,然后可供 `warp` 等应用程序使用。它包括邮箱并注册在子模块中实现的钩子。 + +#### 邮箱 + +- 负责分发和处理消息 + +- 确保重放保护 + +- 指定 `default` 或 `required` 钩子,如 `IGP` 或 `MerkleTreeHook` + +- 调用已注册的 `PostDispatch` 钩子 + +- 重要方法: + + - `dispatch()` + - `process()` + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (2).svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvci1zY2hlbWU6IGxpZ2h0OyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MXB4IiBoZWlnaHQ9IjE4MXB4IiB2aWV3Qm94PSItMC41IC0wLjUgMTQxIDE4MSI+PGRlZnMvPjxyZWN0IGZpbGw9IiNmZmZmZmYiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8+PGc+PGcgZGF0YS1jZWxsLWlkPSIwIj48ZyBkYXRhLWNlbGwtaWQ9IjEiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzUiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTUzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU3Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU4Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01OSIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNjIiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYwIi8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzEiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY2Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY3Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02OCIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNjkiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTcwIi8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzIiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTc4Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy03OSI+PGc+PHBhdGggZD0iTSAwIDMwIEwgMCAwIEwgMTQwIDAgTCAxNDAgMzAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIiBzdHlsZT0iZmlsbDogcmdiKDI1NSwgMjU1LCAyNTUpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsiLz48cGF0aCBkPSJNIDAgMzAgTCAwIDE4MCBMIDE0MCAxODAgTCAxNDAgMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyIvPjxwYXRoIGQ9Ik0gMCAzMCBMIDE0MCAzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJub25lIiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7Ii8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAxMzhweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNXB4OyBtYXJnaW4tbGVmdDogMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGZvbnQ+TWFpbGJveDwvZm9udD48L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNzAiIHk9IjE5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7IiBmb250LXNpemU9IjEycHgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPk1haWxib3g8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgwIj48Zz48cmVjdCB4PSIwIiB5PSIzMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNDVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj48c3BhbiBzdHlsZT0idGV4dC13cmFwLW1vZGU6IG5vd3JhcDsiPmlkPC9zcGFuPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSI0OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij5pZDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgxIj48Zz48cmVjdCB4PSIwIiB5PSI2MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNzVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj48c3BhbiBzdHlsZT0idGV4dC13cmFwLW1vZGU6IG5vd3JhcDsiPjxmb250Pm93bmVyPC9mb250Pjwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNiIgeT0iNzkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+b3duZXI8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy04MiI+PGc+PHJlY3QgeD0iMCIgeT0iOTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDEwNXB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPmRlZmF1bHRfaXNtPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjYiIHk9IjEwOSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij5kZWZhdWx0X2lzbTwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgzIj48Zz48cmVjdCB4PSIwIiB5PSIxMjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDEzNXB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPmRlZmF1bHRfaG9vazwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxMzkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+ZGVmYXVsdF9ob29rPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODQiPjxnPjxyZWN0IHg9IjAiIHk9IjE1MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTY1cHg7IG1hcmdpbi1sZWZ0OiA2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDI2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+cmVxdWlyZWRfaG9vazwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxNjkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+cmVxdWlyZWRfaG9vazwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+) + +#### 子模块 + +跨链安全和后分发是具有专用 keeper 和对核心 keeper 受限访问的子模块。这种架构设计旨在促进可扩展性,允许开发者无缝集成自己的实现。 + +#### `01_interchain_security` + +该子模块实现 ISM 逻辑,负责验证在目标链上传递的跨链消息确实*在源链上发送*。模块化设计允许开发者轻松添加自定义 ISM 实现。目前有三种 ISM 类型可用:`MessageIdMultisig`、`MerkleRootMultisig` 和 `Noop`。 + +``` +type IInterchainSecurityModule interface { Verify(ctx context.Context, ismId HexAddress, metadata []byte, message HyperlaneMessage) (bool, error)} +``` + +**`MultisigIsm`** + +- 验证 `n` 个验证器中有 `m` 个已签署消息的有效性 +- `MessageIdMultisig` → 审查友好,最小化 gas +- `MerkleRootMultisig` → 抗审查保证 +- 重要方法: + - `verify()` + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (3).svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvci1zY2hlbWU6IGxpZ2h0OyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MXB4IiBoZWlnaHQ9IjE1MXB4IiB2aWV3Qm94PSItMC41IC0wLjUgMTQxIDE1MSI+PGRlZnMvPjxyZWN0IGZpbGw9IiNmZmZmZmYiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8+PGc+PGcgZGF0YS1jZWxsLWlkPSIwIj48ZyBkYXRhLWNlbGwtaWQ9IjEiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzUiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTUzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU3Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU4Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01OSIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNjIiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYwIi8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzEiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY2Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY3Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02OCIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTcyIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy03OCIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzkiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODAiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgxIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy04MiIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODMiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTg0Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMSI+PGc+PHBhdGggZD0iTSAwIDMwIEwgMCAwIEwgMTQwIDAgTCAxNDAgMzAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIiBzdHlsZT0iZmlsbDogcmdiKDI1NSwgMjU1LCAyNTUpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsiLz48cGF0aCBkPSJNIDAgMzAgTCAwIDE1MCBMIDE0MCAxNTAgTCAxNDAgMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyIvPjxwYXRoIGQ9Ik0gMCAzMCBMIDE0MCAzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJub25lIiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7Ii8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAxMzhweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNXB4OyBtYXJnaW4tbGVmdDogMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGZvbnQ+TXVsdGlzaWcgSVNNPC9mb250PjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI3MCIgeT0iMTkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+TXVsdGlzaWcgSVNNPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yIj48Zz48cmVjdCB4PSIwIiB5PSIzMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogNDVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj48c3BhbiBzdHlsZT0idGV4dC13cmFwLW1vZGU6IG5vd3JhcDsiPmlkPC9zcGFuPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSI0OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij5pZDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTMiPjxnPjxyZWN0IHg9IjAiIHk9IjYwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiA3NXB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxzcGFuIHN0eWxlPSJ0ZXh0LXdyYXAtbW9kZTogbm93cmFwOyI+PGZvbnQ+b3duZXI8L2ZvbnQ+PC9zcGFuPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSI3OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij5vd25lcjwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTQiPjxnPjxyZWN0IHg9IjAiIHk9IjkwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxMDVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj52YWxpZGF0b3JzPC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjYiIHk9IjEwOSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij52YWxpZGF0b3JzPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktNSI+PGc+PHJlY3QgeD0iMCIgeT0iMTIwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxMzVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj50aHJlc2hvbGQ8L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNiIgeT0iMTM5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7IiBmb250LXNpemU9IjEycHgiPnRocmVzaG9sZDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+) + +#### `02_post_dispatch`[​](#02_post_dispatch "Direct link to 02_post_dispatch") + +该子模块实现 PostDispatch 接口和钩子实例,如 `InterchainGasPaymaster` 或 `MerkleTreeHook`。模块化设计允许开发者轻松添加自定义 PostDispatch 钩子实现。 + +``` +type PostDispatchHook interface { HookType() uint8 SupportsMetadata(metadata any) bool PostDispatch(ctx sdk.Context, metadata util.StandardHookMetadata, message util.HyperlaneMessage, maxFee sdk.Coins) (sdk.Coins, error) QuoteDispatch(ctx context.Context, hookId HexAddress, metadata util.StandardHookMetadata, message HyperlaneMessage) (sdk.Coins, error)} +``` + +**`InterchainGasPaymaster`** + +- 允许消息发送者向中继器支付费用以在目标链上传递消息 + +- `DestinationGasConfig` 用于确定正确的 `InterchainGasPayment` + +- 重要方法: + + - `postDispatch()` + - `payForGas()` + - `claim()` + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (9).svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvci1zY2hlbWU6IGxpZ2h0OyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MXB4IiBoZWlnaHQ9IjE1MXB4IiB2aWV3Qm94PSItMC41IC0wLjUgMTQxIDE1MSI+PGRlZnMvPjxyZWN0IGZpbGw9IiNmZmZmZmYiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8+PGc+PGcgZGF0YS1jZWxsLWlkPSIwIj48ZyBkYXRhLWNlbGwtaWQ9IjEiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzUiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTUzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU3Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU4Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01OSIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNjIiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYwIi8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzEiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY2Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY3Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02OCIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTcyIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy03OCIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzkiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODAiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgxIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy04MiIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODMiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTg0Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMSI+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0zIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS00Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS01Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktNyI+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS04Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS05Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0xMCIvPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTEiLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTEyIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0xMyIvPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTQiLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTE1Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTciLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTIwIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yMSI+PGc+PHBhdGggZD0iTSAwIDMwIEwgMCAwIEwgMTQwIDAgTCAxNDAgMzAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIiBzdHlsZT0iZmlsbDogcmdiKDI1NSwgMjU1LCAyNTUpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsiLz48cGF0aCBkPSJNIDAgMzAgTCAwIDE1MCBMIDE0MCAxNTAgTCAxNDAgMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyIvPjxwYXRoIGQ9Ik0gMCAzMCBMIDE0MCAzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJub25lIiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7Ii8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAxMzhweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNXB4OyBtYXJnaW4tbGVmdDogMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGZvbnQ+SUdQPC9mb250PjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI3MCIgeT0iMTkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+SUdQPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yMiI+PGc+PHJlY3QgeD0iMCIgeT0iMzAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDQ1cHg7IG1hcmdpbi1sZWZ0OiA2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDI2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PHNwYW4gc3R5bGU9InRleHQtd3JhcC1tb2RlOiBub3dyYXA7Ij5pZDwvc3Bhbj48L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNiIgeT0iNDkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+aWQ8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yMyI+PGc+PHJlY3QgeD0iMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDc1cHg7IG1hcmdpbi1sZWZ0OiA2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDI2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PHNwYW4gc3R5bGU9InRleHQtd3JhcC1tb2RlOiBub3dyYXA7Ij48Zm9udD5vd25lcjwvZm9udD48L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjYiIHk9Ijc5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7IiBmb250LXNpemU9IjEycHgiPm93bmVyPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMjQiPjxnPjxyZWN0IHg9IjAiIHk9IjkwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxMDVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5kZW5vbTwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxMDkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+ZGVub208L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yNSI+PGc+PHJlY3QgeD0iMCIgeT0iMTIwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxMzVweDsgbWFyZ2luLWxlZnQ6IDZweDsiPjxkaXYgc3R5bGU9ImJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMDsgdGV4dC1hbGlnbjogbGVmdDsgbWF4LWhlaWdodDogMjZweDsgb3ZlcmZsb3c6IGhpZGRlbjsgY29sb3I6ICMwMDAwMDA7ICI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiAmcXVvdDtIZWx2ZXRpY2EmcXVvdDs7IGNvbG9yOiAjMDAwMDAwOyBsaW5lLWhlaWdodDogMS4yOyBwb2ludGVyLWV2ZW50czogYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IG5vcm1hbDsgIj5jbGFpbWFibGVfZmVlczwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxMzkiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+Y2xhaW1hYmxlX2ZlZXM8L3RleHQ+PC9zd2l0Y2g+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg==) + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (10).svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvci1zY2hlbWU6IGxpZ2h0OyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgd2lkdGg9IjE0MXB4IiBoZWlnaHQ9IjE1MXB4IiB2aWV3Qm94PSItMC41IC0wLjUgMTQxIDE1MSI+PGRlZnMvPjxyZWN0IGZpbGw9IiNmZmZmZmYiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8+PGc+PGcgZGF0YS1jZWxsLWlkPSIwIj48ZyBkYXRhLWNlbGwtaWQ9IjEiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzUiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTUzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU3Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTU4Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy01OSIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNjIiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYwIi8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzEiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTYzIj48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY0Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02NSIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY2Ij48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTY3Ii8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy02OCIvPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTcyIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy03OCIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctNzkiPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODAiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTgxIi8+PGcgZGF0YS1jZWxsLWlkPSIzRkVGei1qamhNVVJCR3p3SjlmNy04MiIvPjxnIGRhdGEtY2VsbC1pZD0iM0ZFRnotampoTVVSQkd6d0o5ZjctODMiLz48ZyBkYXRhLWNlbGwtaWQ9IjNGRUZ6LWpqaE1VUkJHendKOWY3LTg0Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMSI+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0zIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS00Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS01Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktNyI+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS04Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS05Ii8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0xMCIvPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTEiLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTEyIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0xMyIvPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTQiLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTE1Ii8+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMTciLz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTIwIi8+PGcgZGF0YS1jZWxsLWlkPSJBbXd5bnJtMkNvcDFhYVdNdVVTWS0yMSI+PGc+PHBhdGggZD0iTSAwIDMwIEwgMCAwIEwgMTQwIDAgTCAxNDAgMzAiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0iYWxsIiBzdHlsZT0iZmlsbDogcmdiKDI1NSwgMjU1LCAyNTUpOyBzdHJva2U6IHJnYigwLCAwLCAwKTsiLz48cGF0aCBkPSJNIDAgMzAgTCAwIDE1MCBMIDE0MCAxNTAgTCAxNDAgMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgc3R5bGU9InN0cm9rZTogcmdiKDAsIDAsIDApOyIvPjxwYXRoIGQ9Ik0gMCAzMCBMIDE0MCAzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHBvaW50ZXItZXZlbnRzPSJub25lIiBzdHlsZT0ic3Ryb2tlOiByZ2IoMCwgMCwgMCk7Ii8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBjZW50ZXI7IHdpZHRoOiAxMzhweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiAxNXB4OyBtYXJnaW4tbGVmdDogMXB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGZvbnQ+TWVya2xlVHJlZUhvb2s8L2ZvbnQ+PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjcwIiB5PSIxOSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5NZXJrbGVUcmVlSG9vazwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMjIiPjxnPjxyZWN0IHg9IjAiIHk9IjMwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiA0NXB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxzcGFuIHN0eWxlPSJ0ZXh0LXdyYXAtbW9kZTogbm93cmFwOyI+aWQ8L3NwYW4+PC9kaXY+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0Pjx0ZXh0IHg9IjYiIHk9IjQ5IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7IiBmb250LXNpemU9IjEycHgiPmlkPC90ZXh0Pjwvc3dpdGNoPjwvZz48L2c+PC9nPjxnIGRhdGEtY2VsbC1pZD0iQW13eW5ybTJDb3AxYWFXTXVVU1ktMjMiPjxnPjxyZWN0IHg9IjAiIHk9IjYwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjMwIiBmaWxsPSJub25lIiBzdHJva2U9Im5vbmUiIHBvaW50ZXItZXZlbnRzPSJhbGwiLz48L2c+PGc+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuNSAtMC41KSI+PHN3aXRjaD48Zm9yZWlnbk9iamVjdCBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IHRleHQtYWxpZ246IGxlZnQ7IiBwb2ludGVyLWV2ZW50cz0ibm9uZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgcmVxdWlyZWRGZWF0dXJlcz0iaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IHVuc2FmZSBjZW50ZXI7IGp1c3RpZnktY29udGVudDogdW5zYWZlIGZsZXgtc3RhcnQ7IHdpZHRoOiAxMzBweDsgaGVpZ2h0OiAxcHg7IHBhZGRpbmctdG9wOiA3NXB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAyNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxzcGFuIHN0eWxlPSJ0ZXh0LXdyYXAtbW9kZTogbm93cmFwOyI+PGZvbnQ+b3duZXI8L2ZvbnQ+PC9zcGFuPjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSI3OSIgZmlsbD0ibGlnaHQtZGFyaygjMDAwMDAwLCAjZmZmZmZmKSIgZm9udC1mYW1pbHk9IiZxdW90O0hlbHZldGljYSZxdW90OyIgZm9udC1zaXplPSIxMnB4Ij5vd25lcjwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTI0Ij48Zz48cmVjdCB4PSIwIiB5PSI5MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTAwcHg7IG1hcmdpbi1sZWZ0OiA2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDE2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+dHJlZTwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxMDQiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+dHJlZTwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9IkFtd3lucm0yQ29wMWFhV011VVNZLTI1Ij48Zz48cmVjdCB4PSIwIiB5PSIxMTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0ibm9uZSIgcG9pbnRlci1ldmVudHM9ImFsbCIvPjwvZz48Zz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMC41IC0wLjUpIj48c3dpdGNoPjxmb3JlaWduT2JqZWN0IHN0eWxlPSJvdmVyZmxvdzogdmlzaWJsZTsgdGV4dC1hbGlnbjogbGVmdDsiIHBvaW50ZXItZXZlbnRzPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiByZXF1aXJlZEZlYXR1cmVzPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHkiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogdW5zYWZlIGNlbnRlcjsganVzdGlmeS1jb250ZW50OiB1bnNhZmUgZmxleC1zdGFydDsgd2lkdGg6IDEzMHB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZy10b3A6IDEyMHB4OyBtYXJnaW4tbGVmdDogNnB4OyI+PGRpdiBzdHlsZT0iYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAwOyB0ZXh0LWFsaWduOiBsZWZ0OyBtYXgtaGVpZ2h0OiAxNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBjb2xvcjogIzAwMDAwMDsgIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6ICZxdW90O0hlbHZldGljYSZxdW90OzsgY29sb3I6ICMwMDAwMDA7IGxpbmUtaGVpZ2h0OiAxLjI7IHBvaW50ZXItZXZlbnRzOiBhbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtd3JhcDogbm9ybWFsOyAiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDEwcHg7Ij48c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsiPgk8L3NwYW4+YnJhbmNoPC9mb250PjwvZGl2PjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48dGV4dCB4PSI2IiB5PSIxMjQiIGZpbGw9ImxpZ2h0LWRhcmsoIzAwMDAwMCwgI2ZmZmZmZikiIGZvbnQtZmFtaWx5PSImcXVvdDtIZWx2ZXRpY2EmcXVvdDsiIGZvbnQtc2l6ZT0iMTJweCI+CWJyYW5jaDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48ZyBkYXRhLWNlbGwtaWQ9InRlMGtFNDgycTBGdWZ3S1RiX01vLTEiPjxnPjxyZWN0IHg9IjAiIHk9IjEzMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiBwb2ludGVyLWV2ZW50cz0iYWxsIi8+PC9nPjxnPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjUgLTAuNSkiPjxzd2l0Y2g+PGZvcmVpZ25PYmplY3Qgc3R5bGU9Im92ZXJmbG93OiB2aXNpYmxlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgcG9pbnRlci1ldmVudHM9Im5vbmUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHJlcXVpcmVkRmVhdHVyZXM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjRXh0ZW5zaWJpbGl0eSI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiB1bnNhZmUgY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHVuc2FmZSBmbGV4LXN0YXJ0OyB3aWR0aDogMTMwcHg7IGhlaWdodDogMXB4OyBwYWRkaW5nLXRvcDogMTQwcHg7IG1hcmdpbi1sZWZ0OiA2cHg7Ij48ZGl2IHN0eWxlPSJib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDA7IHRleHQtYWxpZ246IGxlZnQ7IG1heC1oZWlnaHQ6IDE2cHg7IG92ZXJmbG93OiBoaWRkZW47IGNvbG9yOiAjMDAwMDAwOyAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7OyBjb2xvcjogIzAwMDAwMDsgbGluZS1oZWlnaHQ6IDEuMjsgcG9pbnRlci1ldmVudHM6IGFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC13cmFwOiBub3JtYWw7ICI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMTBweDsiPjxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlOyI+CTwvc3Bhbj5jb3VudDwvZm9udD48L2Rpdj48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PHRleHQgeD0iNiIgeT0iMTQ0IiBmaWxsPSJsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpIiBmb250LWZhbWlseT0iJnF1b3Q7SGVsdmV0aWNhJnF1b3Q7IiBmb250LXNpemU9IjEycHgiPgljb3VudDwvdGV4dD48L3N3aXRjaD48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+) + +**`MerkleTreeHook`** + +- 将分发的消息插入链上默克尔树 + +- `MessageIdMultisig` 和 `MerkleRootMultisig` ISM 必需 + +- 重要方法: + + - `postDispatch()` + - `InsertedIntoTree()` _(事件)_ + +### `x/warp` + +`warp` 基于核心功能构建,通过在已通过 Hyperlane 连接的链之间启用代币创建和跨链转账。这些代币通过特定的 ISM 利用模块化安全性。 + +- 目前有两种代币类型可用: + + 1. **抵押品:** 在源链上锁定代币作为跨链转账的抵押品。 + 2. **合成:** 在目标链上铸造新代币来代表原始代币。 + +- 重要方法: + + - `createToken()` + - `remoteTransfer()` + - `enrollRemoteRouter()` + +![/img/cosmos-sdk-implementation/hyperlane-cosmos (5).svg](/images/docs/reference/alt-vm-implementations/hyperlane-cosmos_5-4d9d437b2c602154b2c863f61c0c772a.svg) + +## HWR - 远程转账生命周期 + +#### `Dispatch()` + +![/img/cosmos-sdk-implementation/image.png](/images/docs/reference/alt-vm-implementations/image-710f4e66324d60f87c7f6d26c804e08f.png) + +#### `Process()` + +![/img/cosmos-sdk-implementation/image_1.png](/images/docs/reference/alt-vm-implementations/image_1-263f95c8e52d31b257c591ff994b7759.png) + +## EVM / Cosmos SDK 差异 + +### EVM ≠ Cosmos SDK + +1. 实例而不是合约 +2. ID 而不是合约地址 +3. 代币:没有原生代币,这对 IGP 有影响,必须指定用于 gas 支付的 `denom`。同样,没有 `NativeCollateralToken`。 + +### 工具集成 + + + Hyperlane 代理和 CLI 对原生 Cosmos SDK 模块的支持正在开发中。部署 HWR 需要手动设置所有必要组件(邮箱、ISM、IGP、代币等)并执行正确的交易。 + diff --git a/zh/docs/alt-vm-implementations/implementation-guide.mdx b/zh/docs/alt-vm-implementations/implementation-guide.mdx new file mode 100644 index 0000000..daa4d63 --- /dev/null +++ b/zh/docs/alt-vm-implementations/implementation-guide.mdx @@ -0,0 +1,380 @@ +--- +title: "实现指南" +--- + +新链架构的 Hyperlane 实现由以下部分组成: + +1. [合约](#1-合约):为应用程序开发者提供发送和接收消息的接口 +2. [代理](#2-代理):通过添加安全性和中继消息来操作协议 +3. [应用程序](#3-应用程序):使用协议并展示其功能的应用程序 + +在开始之前,建议先查看协议文档。 + + + 如果您想深入了解,请查看一些当前可用的 Hyperlane 实现: + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity) +- [CosmWasm](https://github.com/many-things/cw-hyperlane) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts) +- [Move](https://github.com/movementlabsxyz/hyperlane-monorepo/tree/v3-aptos) + + + +## 1. 合约 + +下面描述了 Hyperlane 协议的链上合约规范。为了便于理解,它使用 solidity 类型,但所有内容都应该可以推广到其他语言。 + +- `address` 应被解释为本地链的地址类型。 +- `payable` 描述了允许调用者传递原生代币的函数。 +- 确保为所有重要的状态变更正确发出事件。 +- 清楚地记录与参考实现的任何偏差及其理由。 + +### 注意事项 + +**字节表示:** + +- 注意不同的链可能有不同的原生类型来表示字节。例如,StarkNet 使用 felt252 表示合约地址,这可能无法完全容纳其他链中使用的 32 字节地址。 +- 在处理跨链地址时实现适当的转换和验证机制。 + +**序列化:** + +- 密切关注消息字段的序列化方式,特别是对于可变长度数据(如消息正文)。 +- 确保所使用的序列化方法(例如,abi.encodePacked 等效方法)在不同链实现中行为一致。 + +### 消息 + +消息是 Hyperlane 协议使用的核心数据结构。它是一个打包的数据结构,包含将消息从一个域路由到另一个域所需的所有信息。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-message/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/types/message.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/types/message.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/libs/message.cairo) + +``` +struct Message { // 源和目标邮箱的版本 uint8 version, // 用于在其源邮箱上唯一标识消息的随机数 uint32 nonce, // 源链域 uint32 origin, // 源链上发送者的地址 bytes32 sender, // 目标链域 uint32 destination, // 目标链上接收者的地址 bytes32 recipient, // 消息正文的原始字节 bytes body} +``` + +### 邮箱 + +邮箱是开发者发送和接收消息的入口点。确保 `localDomain` 是不可变的,以防止可能损害跨链安全的未授权更改。 + +- [Solidity 接口](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) + +实现: + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/Mailbox.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-mailbox/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/contracts/core/mailbox/src/execute.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/mailbox/src/processor.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/mailbox.cairo) + + + 除了默认和自定义钩子外,Hyperlane 还引入了 **必需钩子** 的概念,用于所有调度的后处理。确保在默认或自定义钩子之前调用必需钩子。 + + +#### dispatch + +将消息调度到目标域和接收者。 + +``` +function dispatch( // 目标链的域 uint32 destination, // 目标链上接收者的地址作为 bytes32 bytes32 recipient, // 消息正文的原始字节内容 bytes body) returns ( // 插入邮箱默克尔树的消息 ID bytes32 messageId); +``` + +将消息调度到目标域和接收者,并为默认钩子提供元数据。 + +``` +function dispatch( // 目标链的域 uint32 destination, // 目标链上接收者的地址作为 bytes32 bytes32 recipient, // 消息正文的原始字节内容 bytes body, // 默认后调度钩子使用的元数据 bytes defaultHookMetadata) returns ( // 插入邮箱默克尔树的消息 ID bytes32 messageId); +``` + +将消息调度到目标域和接收者,并为自定义钩子提供元数据以替代默认钩子。 + +``` +function dispatch( // 目标链的域 uint32 destination, // 目标链上接收者的地址作为 bytes32 bytes32 recipient, // 消息正文的原始字节内容 bytes body, // 自定义后调度钩子使用的元数据 bytes customHookMetadata, // 用于替代默认钩子的自定义钩子 IPostDispatchHook customHook) returns ( // 插入邮箱默克尔树的消息 ID bytes32 messageId); +``` + +#### process + +尝试将 `message` 传递给其接收者。使用提供的 `metadata` 通过接收者的 ISM 验证 `message`。 + +``` +function process( // ISM 用于验证消息的元数据 bytes metadata, // 字节打包的消息 bytes message); +``` + +#### latestDispatchedId + +返回用于后调度钩子中身份验证的最新调度消息 ID。 + +``` +function latestDispatchedId() public view returns (bytes32); +``` + +### 消息接收者 + +想要接收消息的合约必须公开以下处理程序。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMessageRecipient.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-interfaces/src/lib.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/core/mod.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/libraries/message-recipient-interface/src/lib.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/c0dbded927f340715bef8f6a8c6262f520ff3f1a/cairo/crates/contracts/src/interfaces.cairo#L131) + +``` +function handle( // 源链的域 uint32 origin, // 源链上发送者的地址 bytes32 sender, // 消息正文的原始字节内容 bytes body); +``` + +它们可以可选地指定一个安全模块来在处理消息之前验证消息。 + +``` +function IInterchainSecurityModule() returns (address); +``` + + + 在实现这三个合约后,您可以达到第一个里程碑进行测试,通过调用 `Mailbox` 的 `dispatch` 函数向接收者发送消息并断言接收者收到了消息,来模拟消息传输。请参见[此处的 Foundry 测试案例](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/test/Messaging.t.sol#L29)。 + + +### 跨链安全模块 + +跨链安全模块用于在消息被处理之前验证消息。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IIInterchainSecurityModule.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-interfaces/src/lib.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/ism/mod.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/interchain_security_module.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/c0dbded927f340715bef8f6a8c6262f520ff3f1a/cairo/crates/contracts/src/interfaces.cairo#L93) + +#### moduleType + +返回表示此 ISM 编码的安全模型类型的枚举。 + +``` +enum ModuleType { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // 与不携带元数据的中继器一起使用 CCIP_READ}function moduleType() returns (ModuleType); +``` + +_中继器从此类型推断如何获取和格式化元数据。_ + +#### verify + +定义负责基于提供的元数据验证跨链消息的安全模型。 + +``` +function verify( // 中继器提供的链下元数据,特定于 // 模块编码的安全模型 // (例如验证器签名) bytes metadata, // Hyperlane 编码的跨链消息 bytes message) returns ( // 如果消息已验证,则为 true bool success); +``` + + + **静态模块管理** - 我们的 Solidity 实现将 MultisigISM 定义为静态的并且是字节码的一部分,这在其他链中可能不可行。您可能需要为 ISM 实现动态模块。 + + +### 验证器宣布 + +验证器宣布其签名存储位置,以便中继器可以获取和验证其签名。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IValidatorAnnounce.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/validator-announce/src/interface.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/core/va.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/validator-announce/src/instruction.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/validator_announce.cairo) + +### announce + +宣布验证器签名存储位置 + +``` +function announce( address validator, // 验证器的地址 string storageLocation, // 编码已签名检查点位置的信息 bytes signature // 已签名的验证器宣布) external returns (bool); +``` + +### getAnnouncedStorageLocations + +返回所有已宣布存储位置的列表 + +``` +function getAnnouncedStorageLocations( address[] _validators // 要获取存储位置的验证器列表) external view returns ( string[][] // 已注册存储元数据的列表); +``` + +### 多重签名 ISM + +实现一个安全模块,检查提供用于验证的元数据是否满足一组配置验证器的签名法定人数。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/multisig-ism/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/ism/multisig.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel/programs/ism/multisig-ism-message-id) +- Cairo [MerkleRoot](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/merkleroot_multisig_ism.cairo) 和 [MessageId](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/messageid_multisig_ism.cairo) + + + 在实现此 ISM 时,一个常见错误是允许单个验证器的签名被多次传递并错误地达到法定人数。请注意确保验证器不能被重复计算,并为此添加负面测试用例。参见 [solidity `test_verify_revertWhen_duplicateSignatures` 示例](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/test/isms/MultisigIsm.t.sol#L194)。 + + +#### 元数据 + +与中继器中的 `MESSAGE_ID_MULTISIG` 模块类型实现一起使用。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/libs/MessageIdMultisigIsmMetadata.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/multisig-ism-metadata/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/types/metadata.rs) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/ism/multisig-ism-message-id/src/processor.rs) +- [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/libs/multisig/message_id_ism_metadata.cairo) + +元数据必须按以下格式格式化: + +``` +struct MultisigMetadata { // 源邮箱的地址 bytes32 originMailbox; // 已签名的检查点根 bytes32 signedCheckpointRoot; // 验证器的连接签名 bytes signatures;} +``` + +#### validatorsAndThreshold + +返回负责验证消息的验证器集和所需的签名数量。 + +_可以根据 \_message 的内容而改变_ + +``` +function validatorsAndThreshold( // Hyperlane 格式化的跨链消息 bytes message) returns ( // 验证器地址数组 address[] validators, // 所需的验证器签名数量 uint8 threshold); +``` + + + 在实现 MultisigISM 后,您将达到第二个里程碑,测试您的邮箱仅在接收者的 ISM 返回 true 后才处理。您可以使用 `TestISM` 进行测试,您可以静态设置它接受或拒绝任何消息。参见[此处的 Foundry 测试案例](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/test/Mailbox.t.sol#L282)。 + + +### 跨链 Gas 支付主 + +Gas 支付主用于支付目标链上消息处理所需的 gas。如果中继器愿意补贴消息处理,这并非严格要求。 + + + 实现对足够 gas 支付的强健检查,考虑特定于链的代币处理。我们的 solidity 实现收取原生消息价值,但对于其他链,您可能需要收取特定代币并相应地调整 gas 开销和 `tokenExchangeRate`。 + + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/igp/InterchainGasPaymaster.sol) +- [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/igp/interchain-gas-paymaster/src/main.sw) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/contracts/igps/core/src) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/hyperlane-sealevel-igp/src/processor.rs) + +#### payForGas + +存入 msg.value 作为将消息中继到其目标链的支付。 + + + 虽然您可以指定 `refundAddress`,但如果您将钩子组合在一起,超额支付**可能不会被退还**给消息发送者。 + + +``` +function payForGas( // 要支付的消息的 ID bytes32 messageId, // 消息目标链的域 uint32 destination, // 要支付的目标 gas 数量 uint256 gasAmount, // 退还任何超额支付的本地地址 address refundAddress) payable; +``` + +#### GasPayment + +当为消息的 gas 成本进行支付时发出。 + +``` +event GasPayment( bytes32 messageId, uint32 destinationDomain, uint256 gasAmount, uint256 payment); +``` + +#### DestinationGasConfigSet + +当设置远程域的 gas 预言机时发出。 + +``` +event DestinationGasConfigSet( uint32 remoteDomain, // 远程域 address gasOracle, // gas 预言机 uint96 gasOverhead // 目标 gas 开销); +``` + +## 2. 代理 + +下面描述了新链实现的代理规范。rust 实现希望支持所有链,但规范旨在与链无关。 + +#### 消息索引 + +所有代理必须从源邮箱索引消息。在 solidity 邮箱中,我们[为每个调度的消息发出事件](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/contracts/Mailbox.sol#L221-L222)。其他链可能有不同的方式来公开此信息,但代理必须能够可靠地获取消息内容并具有一致的排序 -- 参见[消息索引器](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/indexer.rs)特征。 + +- [ethereum](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs) + +### 验证器 + +除了从邮箱索引调度的消息外,验证器还为他们观察到的消息生成证明,以在目标链上用于安全。 + +#### 检查点 + +验证器从邮箱生成称为检查点的证明,通过默克尔根提交到所有调度的消息 ID。 + +``` +pub struct Checkpoint { /// 邮箱地址 pub mailbox_address: H256, /// 邮箱链 pub mailbox_domain: u32, /// 检查点根 pub root: H256, /// 检查点的索引 pub index: u32,} +``` + +验证器使用[邮箱特征](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/mailbox.rs)上的最新检查点方法从邮箱获取最新检查点,并使用[检查点同步器特征](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-base/src/traits/checkpoint_syncer.rs)将签名提交到一些高可用存储。 + +#### 带消息 ID 的检查点 + +验证器使用索引消息将检查点与从邮箱发出的相应消息 ID 连接。 + +``` +pub struct CheckpointWithMessageId { /// 现有的 Hyperlane 检查点结构 #[deref] pub checkpoint: Checkpoint, /// 从邮箱 checkpoint.index 发出的消息哈希 pub message_id: H256,} +``` + +它们也在其同步器上发布这些增强的检查点。 + + + 您可以通过使用上述合约配置链来测试您的验证器,并观察它创建有效签名。 + + +### 中继器 + +除了从邮箱索引调度的消息外,中继器还在目标链上处理消息。这需要构建满足消息接收者的 ISM 验证要求的元数据,并签署在目标邮箱上处理消息的交易。 + +#### 元数据构建器 + +每种模块类型意味着消息验证成功的不同元数据格式。中继器需要实现每个模块特征(例如[多重签名](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/multisig_ism.rs))。 + +#### 消息处理器 + +中继器将尝试在目标邮箱上处理消息(参见[消息处理器](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/fa424826c0132c135511e5316a6e559b574b3a8f/rust/main/agents/relayer/src/msg/processor.rs#L28))。如果 + +- 消息接收者 ISM 返回未知模块类型 +- 模块类型已知但元数据验证失败 +- 元数据验证但干运行(gas 估计)消息处理失败 + +那么消息将被踢到指数退避重试队列。中继器依赖于[邮箱](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/mailbox.rs)和[ism](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/interchain_security_module.rs)特征的实现来进行这些检查。 + +#### Gas 支付执行 + +中继器也可能要求在处理目标链上的消息之前,在源链上为特定消息 ID 支付 gas。为此,它们必须部署一个 IGP,其地址设置为受益人并索引 gas 支付事件。参见 [gas 支付执行特征](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/agents/relayer/src/msg/gas_payment/mod.rs)。我们建议从无 gas 支付执行策略开始,然后逐渐支持更严格的策略。 + +### 测试 + +一旦您实现了中继器的 MVP,您应该创建一个端到端测试: + +1. 启动本地源链和目标链。 +2. 将您的合约部署到两条链上。 +3. 为源链运行验证器。 +4. 在两条链之间运行中继器。 +5. 观察在源链上调度消息后,验证器观察消息,创建签名,中继器通过在目标链上指定验证器的 ISM 适当地处理您的消息。 + +参见 [Rust 代码库上的端到端测试](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/utils/run-locally/src/main.rs)以获得灵感。 + + + 在通过本地端到端测试验证代理后,建议您也使用真实测试网运行端到端测试。 + + +## 3. 应用程序 + +### Hyperlane Warp 路由 + +根据需求在域之间路由代币的代币路由器应用程序。 + +- [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/token) +- [CosmWasm](https://github.com/many-things/cw-hyperlane/tree/main/packages/interface/src/warp) +- [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/libraries/hyperlane-sealevel-token/src/instruction.rs) + +#### transferRemote + +将 `amountOrId` 代币转移到 `destination` 域上的 `recipient`。 + +``` +function transferRemote( // 目标链的域 uint32 destination, // 目标链上接收者的地址 bytes32 recipient, // 要发送给远程接收者的代币数量或标识符 uint256 amountOrId) returns ( // 调度消息的标识符 bytes32 messageId); +``` + +#### 转账消息 + +为了与其他链上的 Hyperlane Warp 路由互操作,转账消息的 `body` 必须是字节打包的 `TransferMessage` 结构。 + +``` +struct TransferMessage { // 远程转账的接收者 bytes32 recipient; // 要转移的代币数量或代币标识符 uint256 amountOrId; // 可选元数据,例如 NFT URI 信息 bytes metadata;} \ No newline at end of file diff --git a/zh/docs/alt-vm-implementations/overview.mdx b/zh/docs/alt-vm-implementations/overview.mdx new file mode 100644 index 0000000..5681bcc --- /dev/null +++ b/zh/docs/alt-vm-implementations/overview.mdx @@ -0,0 +1,58 @@ +--- +title: "替代虚拟机实现" +--- + +虽然我们的公共文档目前主要关注 EVM 兼容性,但我们为其他生态系统提供不同程度的支持。这些生态系统目前可能没有完整的功能对等性或完整的工具集成(如 TypeScript CLI 支持)。我们正在积极努力扩展我们在这些平台上的文档和工具。 + + + 如果您对在这些生态系统上构建或将 Hyperlane 引入其他新生态系统感到兴奋,请通过[我们的 Discord](https://discord.gg/hyperlane) 联系我们! + + +## Cosmos + +### CosmosSDK + +Hyperlane Cosmos SDK 模块支持与基于 Cosmos SDK 的区块链直接集成。参见 [Hyperlane - Cosmos SDK 模块](/zh/docs/alt-vm-implementations/cosmos-sdk)。 + +### CosmWasm + +查看 Hyperlane 的 CosmWasm 实现[在此](https://github.com/many-things/cw-hyperlane),由 [Mitosis 团队](https://mitosis.org/)实现和维护。 + +按照[此指南](https://github.com/many-things/cw-hyperlane/blob/main/DEPLOYMENT.md)了解如何部署到 Cosmos 应用链。截至 2024 年 7 月,我们已在 Celestia、Stride 和 Neutron 上线。 + +## Sealevel + +用于 Solana 虚拟机的 Hyperlane v3 现已在 Solana 和 Eclipse 上线,更多 Solana rollup 即将推出。 + +您可以在[此处](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs)找到 Sealevel 合约实现。 + + + **Hyperlane 是否为 Solana 程序使用 Anchor?** + +- 不,Hyperlane 的核心 Solana 程序不使用 Anchor。 + +**我可以使用 Anchor 构建 Hyperlane 的 Solana 集成吗?** + +- 可以。虽然 Hyperlane 本身不使用 Anchor,但可以与其一起构建。例如:[Everclear 的 Solana spoke](https://github.com/everclearorg/monorepo/tree/dev/packages/contracts/solana-spoke/programs/everclear_spoke/src) - 将 Anchor 与 Hyperlane 的 SVM 邮箱一起使用。 + +**我可以为 Solana 程序使用什么测试框架?** + +- Hyperlane 使用 `solana-program-test` crate 进行单元和集成测试。这是一个原生 Rust 工具。如果您使用 Anchor,您可能会发现 Anchor 的内置测试实用程序或通用 Rust 测试框架很有帮助。 + + + +## Cairo + +Hyperlane 协议已由 [Pragma 团队](https://www.pragma.build/)为 Starkware 在 Cairo 中实现。 + +您可以在[此处](https://github.com/astraly-labs/hyperlane_starknet)找到进行中的实现。 + +## Move + +Hyperlane 已由 [Movement Labs](https://movementlabs.xyz/) 在 MoveVM 中实现。 + +您可以在[此处](https://github.com/movementlabsxyz/hyperlane-monorepo)找到进行中的实现。这些 Move 合约已在 Movement 的 M1 测试网上线。 + +## Sway + +在[此处](https://github.com/hyperlane-xyz/fuel-contracts)找到我们进行中的 Sway 实现。 \ No newline at end of file diff --git a/zh/docs/applications/interchain-account/example-usage.mdx b/zh/docs/applications/interchain-account/example-usage.mdx new file mode 100644 index 0000000..cbafb44 --- /dev/null +++ b/zh/docs/applications/interchain-account/example-usage.mdx @@ -0,0 +1,96 @@ +--- +title: "示例用法" +--- + +## 编码 + +当使用 `callRemote` 调用远程合约时,函数参数必须编码为 `Call` 结构体数组。 + +每个 `Call` 结构体包含: + +- `to`:目标合约地址(转换为 bytes32)。 +- `value`:随调用发送的 ETH 或原生代币数量。 +- `data`:函数调用数据,可以使用 abi.encodeCall 编码。 + +`Call.data` 可以使用 `abi.encodeCall` 函数轻松编码。 + +```solidity +struct Call { + bytes32 to; // 支持非 EVM 目标 + uint256 value; + bytes data; +} + +interface IUniswapV3Pool { + function swap( + address recipient, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata data + ) external returns (int256 amount0, int256 amount1); +} + +IUniswapV3Pool pool = IUniswapV3Pool(...); +Call swapCall = Call({ + to: TypeCasts.addressToBytes32(address(pool)), + data: abi.encodeCall(pool.swap, (...)); + value: 0, +}); +uint32 ethereumDomain = 1; +IInterchainAccountRouter(0xabc...).callRemote(ethereumDomain, [swapCall]); +``` + +## TypeScript 用法 + +我们还提供了 TypeScript 工具,可以轻松部署 ICA 账户并在源链上调用 `callRemote`: + +```typescript +const localChain = 'ethereum'; +const signer = ; +const localRouter: InterchainAccountRouter = InterchainAccountRouter__factory.connect(, signer); +const recipientAddress = ; // 在此处使用您自己的地址 +const recipientF = new TestRecipient__factory.connect(recipientAddress, signer); // 在此处使用您自己的合约 +const fooMessage = "Test"; +const data = recipient.interface.encodeFunctionData("fooBar", [1, fooMessage]); + +const call = { + to: recipientAddress, + data, + value: BigNumber.from("0"), +}; +const quote = await local["quoteGasPayment(uint32)"]( + multiProvider.getDomainId(remoteChain) +); + +const config: AccountConfig = { + origin: localChain, + owner: signer.address, + localRouter: localRouter.address, +}; +await localRouter.callRemote(localChain, remoteChain, [call], config); +``` + +## 确定地址 + +在某些情况下,您可能需要在进行调用之前计算远程链上的 ICA 地址。例如,如果您的 ICA 在执行交易之前需要资金,您可以检索其地址并提前向其转移资产。有关更多信息,请参见[转移和调用模式](/zh/docs/guides/warp-routes/evm/transfer-and-call-pattern)部分。 + +`getRemoteInterchainAccount` 函数可用于获取给定目标链和所有者地址的 ICA 地址。 + +下面包含了一个合约预计算其自己的跨链账户地址的示例。 + +```solidity +address myInterchainAccount = IInterchainAccountRouter(...).getRemoteInterchainAccount( + destination, + address(this) +); +``` + +如果您使用[#overrides](./overrides)来指定远程链,请在计算远程 ICA 地址时传递这些覆盖设置。 + +```solidity +address myRemoteIca = IInterchainAccountRouter(...).getRemoteInterchainAccount( + address(this), + remoteRouterOverride, + remoteIsmOverride +); \ No newline at end of file diff --git a/zh/docs/applications/interchain-account/overrides.mdx b/zh/docs/applications/interchain-account/overrides.mdx new file mode 100644 index 0000000..14f4414 --- /dev/null +++ b/zh/docs/applications/interchain-account/overrides.mdx @@ -0,0 +1,47 @@ +--- +title: "覆盖" +--- + +跨链账户允许开发者覆盖在`InterchainAccountRouter`中配置的默认链和安全模型。 + +这些功能适用于: + +- 在`InterchainAccountRouter`中未配置的链上调用ICA。 +- 使用与`InterchainAccountRouter`中配置的默认值不同的ISM +- 调整IGP支付的燃气限制或设置其他参数。 + +## 接口 + +`callRemoteWithOverrides`函数看起来与`callRemote`函数类似,但接受三个额外的参数。 + +首先,开发者可以覆盖`_router`,即远程链上`InterchainAccountRouter`的地址。这允许开发者在本地`InterchainAccountRouter`上未配置的远程链上控制ICA。 + +其次,开发者可以覆盖`_ism`,即用于保护其ICA的远程跨链安全模块(ISM)的地址。此ISM将用于验证在本地和远程`InterchainAccountRouters`之间传递的跨链消息。这允许开发者使用最适合其需求的自定义安全模型。 + +第三,开发者可以覆盖`_hookMetadata`,即传递给每个ICA调用的消息钩子的[StandardHookMetadata](/zh/docs/reference/developer-tools/libraries/hookmetadata)元数据(例如,覆盖IGP支付的燃气限制)。 + +```solidity + /** + * @notice Dispatches a sequence of remote calls to be made by an owner's + * interchain account on the destination domain + * @dev Recommend using CallLib.build to format the interchain calls + * @param _destination The remote domain of the chain to make calls on + * @param _router The remote router address + * @param _ism The remote ISM address + * @param _calls The sequence of calls to make + * @param _hookMetadata The hook metadata to override with for the hook set by the owner + * @return The Hyperlane message ID + */ + function callRemoteWithOverrides( + uint32 _destination, + bytes32 _router, + bytes32 _ism, + CallLib.Call[] calldata _calls, + bytes memory _hookMetadata + ) public payable returns (bytes32) + + function getRemoteInterchainAccount( + address _owner, + address _router, + address _ism + ) public view returns (address) \ No newline at end of file diff --git a/zh/docs/applications/interchain-account/overview.mdx b/zh/docs/applications/interchain-account/overview.mdx new file mode 100644 index 0000000..ed2e6eb --- /dev/null +++ b/zh/docs/applications/interchain-account/overview.mdx @@ -0,0 +1,84 @@ +--- +title: "概述" +--- + +跨链账户(ICA)使源链上的合约能够对远程链上的合约进行身份验证的调用。与需要接收者实现特定接口的通用消息传递不同,ICA 允许与目标链上的_任何_合约进行交互。 + +开发者可以使用 ICA 进行跨链执行,使合约能够在远程链上触发函数调用。目标链上的每个 ICA 对应于源链上的唯一发送者,账户基于 `(origin, sender, router, ISM)` 是确定性的。这意味着对于每个进行跨链调用的合约,在目标链上都有一个相应的账户来执行这些调用。 + +ICA 目前仅在 EVM 链上受支持。 + +## 架构概述 + +```mermaid +flowchart TB + subgraph Origin chain + direction TB + Sender + A_O[InterchainAccountRouter] + M_O[(Mailbox)] + end + + subgraph Destination chain + direction TB + M_D[(Mailbox)] + A_D[InterchainAccountRouter] + SenderAccount + Recipient + end + + Sender -- "callRemote(destination, recipient, call)" --> A_O + A_O -- "dispatch(destination, router,
[sender, recipient, call])" --> M_O + M_O -. "relay" .- M_D + M_D -- "handle(origin, router,
[sender, recipient, call])" --> A_D + A_D == "interchainAccount(origin, sender)" ==> SenderAccount + SenderAccount -- "call" --> Recipient + + click A_O https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + click A_D https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + + style Sender fill:#FF0099 + style SenderAccount fill:#FF0099 + style Recipient fill:#FF0099 +``` + +## 跨链账户的工作原理 + +跨链账户允许您使用路由器(`InterchainAccountRouter`)从**链 A** 向**链 B** 进行远程调用。我们使用 [CREATE2](https://docs.openzeppelin.com/cli/2.8/deploying-with-create2) 来计算确定性的 [OwnableMulticall](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/libs/OwnableMulticall.sol) 合约地址,该合约作为您跨链调用的代理。您可以在[这里](./example-usage)探索这一点。 + +工作原理如下: + +- 您可以编码您的调用,包括目标地址、调用数据和每个调用的 `msg.value`,批量组合在一个数组中。 +- 您将编码的调用发送到**链 A** 路由器,该路由器将其中继到**链 B** 路由器。 +- 解码调用后,**链 B** 路由器检查计算的地址是否已部署。如果没有,我们部署 _OwnableMulticall_ 合约。 +- 然后路由器在 ICA 地址上执行多重调用,该地址反过来在**链 B** 上进行所需的任意调用。 + +跨链账户接口为每个 `(uint32 origin, address owner, address remoteRouter, address remoteISM)` 元组分配一个唯一的 ICA 地址。发送者拥有目标链上的该 ICA,并可以通过 `InterchainAccountRouter.callRemote()` 端点指导其进行任意函数调用。 + +对于 Hyperlane 支持的核心链,您可以使用路由器合约所有者设置的默认值。请参见 [#overrides](./overrides) 部分了解如何调用_任何_链。 + +## 接口 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.11; + +import {CallLib} from "../contracts/libs/Call.sol"; + +interface IInterchainAccountRouter { + function callRemote( + uint32 _destinationDomain, + CallLib.Call[] calldata calls + ) external returns (bytes32); + + function getRemoteInterchainAccount(uint32 _destination, address _owner) + external + view + returns (address); +} +``` + + + - 开箱即用地使用 `InterchainAccountRouter` - ICA 路由器已部署到核心链。请参考[地址](/zh/docs/reference/addresses/deployments/interchainAccountRouter)。 + 尝试使用 `callRemote` 方法通过您钱包的跨链账户进行调用。 + \ No newline at end of file diff --git a/zh/docs/applications/use-cases/cross-chain-swaps-with-recovery.mdx b/zh/docs/applications/use-cases/cross-chain-swaps-with-recovery.mdx new file mode 100644 index 0000000..c60acfc --- /dev/null +++ b/zh/docs/applications/use-cases/cross-chain-swaps-with-recovery.mdx @@ -0,0 +1,89 @@ +--- +title: "TaoFi:具有用户控制恢复功能的跨链交换" +--- + +本用例解释了[**TaoFi Bridge**](https://www.taofi.com/bridge)如何使用Hyperlane组件——包括[跨链账户(ICAs)](/zh/docs/applications/interchain-account/overview)和[**Hyperlane Warp路由(HWR)**](/zh/docs/applications/warp-routes/overview)——来实现具有滑点保护和用户控制恢复功能的跨链桥接。 + +![Taofi_Overview.png](/images/docs/applications/taofi-overview.png) + +## 概述 + +跨链交换可能由于滑点或抢跑而在目标链上失败,导致用户无法回滚且无法控制其资金。 + +**TaoFi Bridge**通过让用户在Ethereum、Base、Solana和Bittensor EVM之间桥接**USDC**,同时确保在执行失败时有**安全回退**机制来解决这个问题。 + +为了实现这一点,TaoFi依赖于关键的设计功能: + +- **滑点保护**:交换包含最小金额参数,可以减轻夹子攻击。 +- **加盐**:为每个用户在目标链上提供唯一账户,保持资金隔离。 +- **安全回退**:如果交换失败,资金仍保留在用户在目标链上的账户中,可以提取或重试。 + +## 问题 + +传统上,跨链交换面临关键挑战: + +1. **复杂的用户体验**:用户通常需要桥接、切换链并手动交换。 +2. **不同用户的相同目标地址**:在目标链上,所有资金通常到达同一地址。这使得按用户分区变得困难,如果交换失败,就没有直接的方法将代币返还给正确的所有者。 +3. **夹子攻击**:在目标链上,交换可能被MEV机器人抢跑,导致用户获得更差的执行或失败的交易。 +4. **失败情况**:如果交换在资金桥接后失败(例如,由于滑点或流动性不足),用户可能无法获得任何恢复选项。 + +## 解决方案:基于Hyperlane构建的TaoFi Bridge + +TaoFi通过构建在Hyperlane的互操作性堆栈上克服了这些挑战。使用这些组件,用户可以在Ethereum、Base、Solana和Bittensor EVM之间一键桥接和交换USDC——同时在执行失败时仍保持对其资金的控制。 + +## 关键组件与功能 + +TaoFi基于Hyperlane的核心组件构建,并利用它们启用的高级功能。 + +- [**跨链账户(ICAs)**](/zh/docs/applications/interchain-account):使链A上的合约能够在链B上执行任意逻辑 +- [**Hyperlane Warp路由(HWR)**](/zh/docs/applications/warp-routes/overview):在链之间桥接资产 +- **加盐**:ICA路由器支持用于账户派生的`salt`参数。通过将用户地址作为盐传递,每个用户都获得一个唯一的目标账户。这确保资金按用户分区,并可以在交换失败时安全管理或退款。 +- **通过[Transfer-and-Call](/zh/docs/guides/warp-routes/evm/transfer-and-call-pattern)和唯一用户账户地址进行故障处理**:通过使用_Transfer and Call_模式,应用程序可以首先桥接代币,然后仅在资产到达后执行合约功能(例如:交换)。如果该操作失败(例如,由于滑点),代币仍安全地保留在用户在目标链上的唯一账户中。然后用户可以选择使用新参数重试或提取其资金,确保他们永远不会失去控制。 +- **滑点检查(最小金额参数)**:通过在远程调用中包含最小金额参数,应用程序防止夹子攻击成功。如果有人试图夹子交易,交换将不再满足最小金额条件。交易不会以更差的价格执行,而是安全失败,让用户决定如何处理桥接的资金。 + +## 工作原理(分步说明) + +假设用户想要交换**Bittensor EVM上的USDC** → **Base上的USDC**。 + +### 步骤1:用户在**Bittensor EVM**上发起交换 + +- 用户在TaoFi UI中签署**单个交易**。 +- 在幕后: + - 合约为用户在Base上派生一个**加盐的跨链账户**。 + - 创建一个Transfer and Call请求,其中包括要桥接的金额和在Base上运行的交换操作。 + +### 步骤2:Hyperlane桥接代币和消息 + +跨链编排由Hyperlane的互操作性框架处理。[**中继器**](/zh/docs/protocol/agents/relayer)(一个无需许可的链下代理)在链之间传递2条消息。 + +- **消息1**:使用HWR将资金从Bittensor EVM桥接到Base。它们到达用户在Base上的**唯一ICA**(使用`salt`参数生成)。 +- **消息2**:执行请求告诉用户的ICA在Base上执行交换。此消息包括保护免受夹子攻击和滑点的**最小金额参数**。 + +### 步骤3:Base上的执行和故障处理 + +- 一旦资金到达远程链,Hyperlane就会将交换调用传递给ICA路由器。用户的ICA在Base上执行调用(转换为Base上的USDC)。 +- 如果交换无法满足**最小金额条件**(例如,由于滑点),交易将不被处理。 +- 资金保留在用户的ICA中,然后用户可以: + - 使用更新的参数重试交换,或 + - 直接提取资金。 + +## 架构图 + +![TaoFi Architecture](/images/docs/applications/taofi-architecture.png) + +## 总结 + +回顾: + +1. HWR跨链传递资金。 +2. 加盐为目标链上的每个用户创建**唯一地址**。 +3. ICA在远程链上执行交换,滑点检查确保只有在满足用户最小金额时才进行。如果不满足,则安全失败。 +4. 回退机制确保即使操作失败,用户也能保持控制。 + +## 结果:具有安全网的跨链交换 + +使用TaoFi,用户可以在Ethereum、Base、Solana和Bittensor EVM之间交换代币。 + +- 无需手动桥接 +- 为每个用户提供确定性、隔离的ICA +- 即使交换未执行,用户仍保持控制 \ No newline at end of file diff --git a/zh/docs/applications/use-cases/cross-chain-swaps.mdx b/zh/docs/applications/use-cases/cross-chain-swaps.mdx new file mode 100644 index 0000000..bedbb79 --- /dev/null +++ b/zh/docs/applications/use-cases/cross-chain-swaps.mdx @@ -0,0 +1,110 @@ +--- +title: "Superswaps:一键跨链代币交换" +--- + +本用例解释了[Superswaps](https://velodrome.finance/docs/superswaps)如何在幕后使用Hyperlane组件工作,包括[**跨链账户(ICAs)**](/zh/docs/applications/interchain-account)、[**Hyperlane Warp路由(HWR)**](/zh/docs/applications/warp-routes/overview)和[**链下查找ISM**](/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM)。 + +## 概述 + +**[Superswaps](https://velodrome.finance/docs/superswaps)**是由[Velodrome](https://velodrome.finance/)开发的跨链交换机制,用于在Superchain生态系统中实现一键代币交换。 + +![Warp Route diagram/doodle](/images/docs/applications/superswap-intro.png) + +Superswaps不需要用户手动桥接资产并在不同链上执行单独的交换,而是使用Hyperlane的互操作性堆栈通过一键操作提供多个跨链异步可组合交易和抗MEV的交换体验。 + +在我们深入了解Superswaps的工作原理之前,让我们先讨论当今存在的挑战。 + +## 问题 + +作为用户,跨链交换传统上需要多个步骤。假设您在链A上有代币A,想要在链B上获得代币B。这通常需要: + +1. 在链A上交换代币(例如,在Optimism上将OP交换为USDC) +2. 手动将代币桥接到链B(例如,Base) +3. 切换到链B +4. 再次交换为所需资产(例如,USDC到DAI) + +**挑战:** + +- **糟糕的用户体验**:多个交易、钱包交互和链切换 +- **流动性碎片化**:每条链上的不同资金池 + +## 解决方案:基于Hyperlane的Superswaps + +Superswaps通过利用Hyperlane的开放互操作性框架,将整个过程简化为用户的单击操作。 + +### 关键组件 + +- **[跨链账户(ICAs)](/zh/docs/applications/interchain-account/overview)**:允许链A上的合约在链B上执行任意逻辑 +- **[Hyperlane Warp路由(HWR)](/zh/docs/applications/warp-routes/overview)**:在链之间桥接资产 +- **[oUSDT](https://docs.openusdt.xyz/)**:用于在链之间传输价值的跨链稳定币 +- **[链下查找ISM](/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM)**:提供一种使用存储在链下的数据验证Hyperlane消息的方法,这些数据可以在需要时获取和验证 + +### Superswap流程(分步说明) + +假设用户想要交换**Optimism上的OP** → **Base上的USDC**。 + +#### 步骤1:用户在Optimism上发起Superswap(源链) + +- 用户通过Velodrome UI签署**一个交易**。 +- 在幕后,Velodrome: + - 交换用户的`OP → oUSDT`(在Optimism上) + - 准备一个**跨链账户(ICA)**调用以在Base上执行交换 + +#### 步骤2:Hyperlane处理桥接和消息传递 + +一旦用户签署了单个Superswap交易,跨链编排就由Hyperlane的互操作性框架处理。 + +[中继器](/zh/docs/protocol/agents/relayer)(一个无需许可的链下代理)负责**在链之间传送3个不同的消息**。每个消息在确保代币移动、指令安全提交和仅在验证时执行方面发挥不同的作用。 + +**1. oUSDT通过HWR桥接** + +- [oUSDT](https://docs.openusdt.xyz/),驱动Superswaps的中介代币,从源链(Optimism)桥接到目标链(Base),并交付到Base上的**用户跨链账户(ICA)**。 +- 这确保Base上的ICA持有交换所需的代币。 + +**2. 提交消息(交换详情的哈希)** + +- 第二个消息是**提交**。此消息不发送完整的交换详情,而只包含**交换指令的哈希**(例如,"交换`oUSDT → USDC`")。 +- 此消息通过Hyperlane的跨链账户路由器发送,由[链下查找ISM](/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM)(一个可以在需要时从外部源获取数据的安全模块)处理。ISM将哈希存储在链上作为已提交内容的公共记录,同时保持实际交换参数隐藏。 +- 完整的交换调用数据在此阶段不会放置在链上。相反,它存储在网关服务的链下。只有通过Hyperlane的**跨链燃气支付(IGP)**系统支付燃气费的中继器才能检索它,并且它必须在访问数据之前使用**ECDSA签名**进行身份验证。这通过在最终执行之前保持交换详情隐藏来保护交换免受MEV攻击。 + + +使用**链下查找ISM**的MEV保护:链下查找ISM在执行任何ICA指令之前强制执行**提交-揭示方案**。 + +- 首先,交换详情作为哈希**提交**到链上(不透露完整数据)。 +- 稍后,当揭示调用到达时,ISM: + - 从链下网关获取完整的调用数据 + - 验证此数据的哈希与早期的链上提交匹配 +- 只有当提交和揭示匹配时,ICA才继续执行。 +- 此过程通过**保持交换详情私密**直到执行时刻来保护用户免受MEV攻击。 + + + +**3. 揭示和执行消息(完整交换详情)** + +- 第三个消息是**揭示和执行**步骤。此消息传递到**目标ICA路由器**,后者又调用**链下查找ISM**。 +- 揭示消息本身不包含完整的调用数据。相反,它包含指向链下网关的指针以及中继器的签名证明,这将其认证为正确的传送者。 +- **链下查找ISM**然后触发链下查找。此步骤从网关获取交换调用数据并将其返回。ISM重新计算此调用数据的哈希,并将其与早期存储在链上的提交进行检查。如果两者匹配,消息即被验证。 +- 最后,目标链上的**发送方ICA**调用交换功能。由于代币已经通过HWR就位,调用数据现在已验证,ICA在目标链上执行交换 - 将`oUSDT`转换为`USDC`。 + +#### 总结 + +回顾: + +1. Hyperlane Warp路由跨链传递代币。 +2. 提交消息在链上锁定交换哈希(但隐藏详情)。 +3. 揭示消息在链下获取真实交换数据,将其与哈希验证,然后执行交换。 + +#### ICA架构概述 + +此图显示了ICA在Superswaps中的工作方式:源链调度提交和执行消息,链下基础设施(Velodrome网关和中继器)协调数据检索和消息传递,目标链通过ICA执行交换。 + +![Warp Route diagram/doodle](/images/docs/applications/superswap-diagram.png) + +### 结果:一键跨链代币交换 + +使用Superswaps,用户只需一键即可在目标链上接收代币 + +- 无需手动桥接 +- 无需切换网络 +- 无需作为用户执行多个交易 +- 交换受到MEV保护 \ No newline at end of file diff --git a/zh/docs/applications/warp-routes/example-usage.mdx b/zh/docs/applications/warp-routes/example-usage.mdx new file mode 100644 index 0000000..6ff8f17 --- /dev/null +++ b/zh/docs/applications/warp-routes/example-usage.mdx @@ -0,0 +1,103 @@ +--- +title: "HWR 示例用法" +--- + +Hyperlane Warp 路由(HWR)定义了资产在链之间的移动方式,无论是作为原生代币、合成表示还是抵押品支持的资产。路由的选择取决于资产类型和目标链上的预期行为。 + +## HWR 组合 + +### 1. 原生到原生 + +此路由允许在都使用自己原生代币的链之间转移原生代币。 + + + 此类型的路由应仅在两个网络都有等值原生代币时使用,例如 inEVM 和以太坊。 + + +#### 设置 + +- 在两条链上都部署 **HypNative** 合约。 + +#### 示例流程 + +``` +交易类型:原生到原生转移 +从:以太坊(ETH) +到:inEVM(ETH) +数量:1 ETH +``` + +#### 图表 + +```mermaid +graph LR + A[Alice on Ethereum] -->|1 ETH| B(Ethereum HypNative) + B -->|Message| C(inEVM HypNative) + C -->|ETH equivalent| D[Alice on inEVM] +``` + +#### 用例 + +- Alice 想要快速从以太坊向 inEVM 转移价值。 + +### 2. 原生到合成 + +此路由在另一条链上创建原生代币的合成表示。 + +#### 设置 + +- 在原生资产存在的源链上部署 **HypNative** 合约。 +- 在铸造合成代币的目标链上部署 **HypERC20** 合约。 + +#### 示例流程 + +``` +交易类型:从原生代币铸造合成代币 +从:Celo(CELO) +到:Optimism(wCELO) +数量:100 CELO +``` + +#### 图表 + +```mermaid +graph LR + A[Alice on Celo] -->|100 CELO| B(Celo HypNative) + B -->|Message| C(Optimism HypERC20) + C -->|Mint 100 wCELO| D[Alice on Optimism] +``` + +#### 用例 + +- 基于 Celo 的项目希望使其原生 CELO 代币可在 Optimism 上使用。 + +### 3. 抵押品到合成 + +此路由允许基于抵押化的 ERC20 代币创建合成代币。 + +#### 设置 + +- 在原始资产存在的源链上部署**抵押品合约(HypERC20Collateral)**。 +- 在铸造资产的目标链上部署**合成合约(HypERC20)**。 + +#### 示例流程 + +``` +交易类型:从抵押品代币铸造合成代币 +从:以太坊(USDC - 原始资产)- 抵押品源 +到:Arbitrum(wUSDC - 铸造的合成资产)- 合成目标 +数量:1000 USDC +``` + +#### 图表 + +```mermaid +graph LR + A[Alice on Ethereum] -->|1000 USDC| B(Ethereum HypERC20Collateral) + B -->|Message| C(Arbitrum HypERC20) + C -->|Mint 1000 wUSDC| D[Alice on Arbitrum] +``` + +#### 用例 + +- Alice 想要在 Arbitrum 上使用她的 USDC,而不需要将实际的 USDC 转移到 Arbitrum 或依赖 Arbitrum 的桥接 USDC。 \ No newline at end of file diff --git a/zh/docs/applications/warp-routes/interface.mdx b/zh/docs/applications/warp-routes/interface.mdx new file mode 100644 index 0000000..4bd691f --- /dev/null +++ b/zh/docs/applications/warp-routes/interface.mdx @@ -0,0 +1,26 @@ +--- +title: "HWR 接口" +--- + +Hyperlane Warp 路由(HWR)利用 `IHypERC20` 代币接口。HWR 代币实现此接口,该接口扩展了标准的 `ERC20` 接口。 + +```solidity +/// @notice ERC20 接口的跨链扩展 +interface IHypERC20 is IERC20 { + /** + * @notice 将代币转移到远程链上的指定接收者 + * @param _destination 目标链的域 ID + * @param _recipient 接收者的地址,编码为 bytes32 + * @param _amount 要转移的代币数量 + */ + function transferRemote( + uint32 _destination, + bytes32 _recipient, + uint256 _amount + ) external payable; +} +``` + +## 部署您的 HWR + +准备部署您的 HWR?这很简单,请遵循[分步指南](/zh/docs/guides/quickstart/deploy-warp-route)。 \ No newline at end of file diff --git a/zh/docs/applications/warp-routes/multi-collateral-warp-routes.mdx b/zh/docs/applications/warp-routes/multi-collateral-warp-routes.mdx new file mode 100644 index 0000000..9cfb929 --- /dev/null +++ b/zh/docs/applications/warp-routes/multi-collateral-warp-routes.mdx @@ -0,0 +1,78 @@ +--- +title: "HWR 2.0" +--- + +Hyperlane Warp 路由 2.0 是一种 Hyperlane Warp 路由(HWR)类型,允许从多个抵押品链获取流动性,并为支持的配置提供原生重新平衡。 + +## 概述 + +在单抵押品 HWR 中,代币被锁定在一个源链上。 + +示例: + +- 在以太坊上锁定 100 USDC +- 在 NewChain 上铸造 100 USDC + +另一方面,Hyperlane Warp 路由 2.0 允许用户从多个抵押品链进行桥接。 + +示例: + +- 在 Base 上锁定 50 USDC +- 在 Arbitrum 上锁定 50 USDC +- 在 NewChain 上铸造 100 USDC + +这种设置允许目标链从多个来源接收资产,使用户更容易载入流动性而不依赖单一源。 + +## 原生重新平衡 + +如果资金更多地向一个方向流动,路由中的一条链可能耗尽抵押品,创建不平衡的流动,阻止提取。为了维持流畅的用户体验,抵押品必须在链之间平衡。HWR 2.0 通过原生重新平衡解决了这个问题——抵押品通过重新平衡器自动在链之间移动以解决不平衡。 + +要了解更多关于原生重新平衡的信息,请前往:[HWR 2.0:原生重新平衡](/zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing) + +## 高级流程图 + +```mermaid +flowchart + subgraph base + BU((User)) + BWR[USDC Collateral HWR] + end + subgraph arbitrum + AU((User)) + AWR[USDC Collateral HWR] + end + subgraph newchain + NWR[USDC Synthetic HWR] + Recipient((Recipient)) + end + BU -- "transferRemote(newchain,
recipient, amount)" --> BWR + BWR -. "{recipient, amount}" .-> NWR + AU -- "transferRemote(newchain,
recipient, amount)" --> AWR + AWR -. "{recipient, amount}" .-> NWR + NWR -. "2 \* amount" .-> Recipient +``` + +## 支持的代币和协议 + +当 HWR 2.0 中每个参与链上的给定代币满足所需条件时,原生重新平衡是可能的。 + +### USDC + +- **链**:Arbitrum、Base、以太坊、OP Mainnet、Polygon PoS、Unichain、Avalanche + - 对 [Circle CCTP](https://developers.circle.com/cctp) v1/v2 和 Everclear 支持的其他链的支持将逐步推出。 + +### ETH +- **链**:Arbitrum Base、以太坊、OP Mainnet + - 对其他链的支持将基于 Everclear 部署逐步推出 + +### USDT + +- 🚧 原生重新平衡支持目前已计划 + + +原生重新平衡的链支持取决于协议可用性和代币桥接基础设施。阅读更多关于[原生重新平衡要求](/zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing#requirements-for-native-rebalancing)的信息 + + +## 指南 + +- 要部署 Hyperlane Warp 路由 2.0,请前往[部署 Hyperlane Warp 路由 2.0](/zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes) \ No newline at end of file diff --git a/zh/docs/applications/warp-routes/overview.mdx b/zh/docs/applications/warp-routes/overview.mdx new file mode 100644 index 0000000..1e33ba1 --- /dev/null +++ b/zh/docs/applications/warp-routes/overview.mdx @@ -0,0 +1,75 @@ +--- +title: "HWR 概述" +--- + +Hyperlane Warp 路由(HWR)是模块化的跨链资产桥,使用 Hyperlane 实现代币在链之间的转移。开发者可以使用 Hyperlane 无需许可地部署 HWR 来在链之间移动资产。 + +它们支持各种资产类型,包括: + +- ERC20 和 ERC721 代币(适用于兼容 EVM 的链) +- 基于 SVM 的资产(适用于兼容 SVM 的链) +- 原生代币(如 ETH 或其他 Gas 代币) + +您可以将 HWR 与 Hyperlane 部署结合,在任何链与其他已通过 Hyperlane 连接的链之间创建经济路由。 + +## 模块化安全 + +像所有构建在 Hyperlane 之上的应用程序一样,HWR 通过[跨链安全模块](../../protocol/ISM/modular-security)具有可定制的安全性。 + +HWR 的部署者可以指定用于验证跨链转移消息的 ISM。这意味着每个 HWR 可能具有独特的安全配置。转移跨链代币的用户应在使用路由之前了解其信任假设。 + + + 同样,Warp 前端应手动策划其 HWR,以避免支持不安全的路由。有关详细信息,请参见 [Warp UI 部署文档](/zh/docs/guides/warp-routes/bridge-ui-guide)。 + + +## HWR 架构 + +HWR 让部署者选择代币在链之间的转移方式。根据 HWR 的类型,合约将锁定代币、铸造包装代币、销毁包装代币或释放原始代币。 + +例如: + +1. **抵押品 → 合成**:代币在源链(抵押品)上被锁定,发送消息,包装代币在目标链(合成)上被铸造。 +2. **原生 → 合成**:原生 Gas 代币(例如 ETH)在源链上被锁定,发送消息,合成代币在目标链上被铸造。 +3. **原生 → 抵押品**:原生代币在源链上被锁定,发送消息,抵押品代币在目标链上被释放。 + +每个 HWR 需要在其所在的每条链上部署一个合约,作为入口/出口点。这些合约使用[邮箱](/zh/docs/protocol/core/mailbox)相互发送跨链消息。 + +### HWR 类型 + +下表提供了 HWR 类型的高级概述。有关详细说明,请参见:[HWR 类型](./types)。 + +| **HWR 类型** | **描述** | +| ------------------------- | ------------------------------------------------------------------------------------------------ | +| 原生代币 HWR | 实现原生 Gas 代币(例如 ETH)在链之间的直接转移,无需包装。 | +| 抵押品支持的 ERC20 | 在源链上锁定 ERC20 代币作为跨链转移的抵押品。 | +| 合成 ERC20 | 在目标链上铸造新的 ERC20 代币来代表原始代币。 | +| Hyperlane Warp 路由 2.0 | 允许从多个抵押品代币获取流动性。 | +| 专用 HWR | 添加高级功能或与特定用例集成(例如,资金库、法币支持的代币)。 | + +### 架构示例 + +让我们通过一个使用锁定和铸造模型在两条链之间转移 ERC20 代币的**抵押品**到**合成** HWR 来演示: + +1. 用户在抵押品链(例如以太坊)的 HWR 合约中锁定他们的代币。 +2. 通过 Hyperlane 的邮箱发送消息并中继到合成链(例如 Base)。 +3. 在目标链上,HWR 合约向用户铸造包装代币。 + +在下面的图表中,ISM 是一个[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM),它使用一组验证器来批准消息。(注意:并非所有 ISM 都需要验证器,这取决于所选择的安全模型。) + +以下是流程的简化视图: + +![Warp Route diagram/doodle](/images/docs/protocol/warp-routes/warp-route.png) + +## 部署 HWR + +HWR 可以在任何具有 Hyperlane 部署的链集合之间部署。 + +要部署 HWR,请前往以下指南: + +- [基于 EVM 的 HWR](/zh/docs/guides/quickstart/deploy-warp-route) +- [基于 SVM 的 HWR](/zh/docs/guides/warp-routes/svm/svm-warp-route-guide) +- [EVM-SVM HWR](/zh/docs/guides/warp-routes/evm-svm-warp-route-guide) + + + 如果您想创建一个包含 Hyperlane 当前未部署的链的 HWR,请随时[自行部署 Hyperlane](/zh/docs/guides/chains/deploy-hyperlane)! + \ No newline at end of file diff --git a/zh/docs/applications/warp-routes/types.mdx b/zh/docs/applications/warp-routes/types.mdx new file mode 100644 index 0000000..312bc1b --- /dev/null +++ b/zh/docs/applications/warp-routes/types.mdx @@ -0,0 +1,124 @@ +--- +title: "HWR 类型" +--- + +Hyperlane Warp 路由(HWR)是 Hyperlane 的代币桥接实现,允许通过 Hyperlane 在任何链上无需许可地转移原生、ERC20 和合成(新部署的 ERC20)资产。本文档提供了所有 HWR 类型的详细信息。 + +| **HWR 类型** | **描述** | +| ------------------------- | ------------------------------------------------------------------------------------------------ | +| 原生代币 HWR | 实现原生 Gas 代币(例如 ETH)在链之间的直接转移,无需包装。 | +| 抵押品支持的 ERC20 | 在源链上锁定 ERC20 代币作为跨链转移的抵押品。 | +| 合成 ERC20 | 在目标链上铸造新的 ERC20 代币来代表原始代币。 | +| Hyperlane Warp 路由 2.0 | 允许从多个抵押品代币获取流动性。 | +| 专用 HWR | 添加高级功能或与特定用例集成(例如,资金库、法币支持的代币)。 | + +_请注意,本文档不包括 ERC721 HWR。_ + +## 核心 HWR 类型 + +### 原生代币 HWR + +在 `HypNative.sol` 中实现,原生 HWR 处理原生 Gas 代币(例如以太坊或 Arbitrum 上的 ETH,Mantle 上的 MNT)在不同链之间的转移。 + +#### 特性 + +- 直接转移原生代币而无需包装。 +- 使用 `msg.value` 作为转移金额。 +- 将多余的 `msg.value` 作为钩子支付处理。 +- 通过 `receive()` 函数支持捐赠。 + +有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypNative.sol)。 + +### 抵押品支持的 ERC20 HWR + +在 `HypERC20Collateral.sol` 中实现,抵押品 HWR 使 ERC20 代币能够在源链上作为抵押品被锁定,然后用于在目标链上铸造合成表示。 + +#### 特性 + +- 将现有的 ERC20 代币包装为转移的抵押品。 +- 在源链的合约中锁定代币。 +- 在目标链上释放等值代币。 +- 使用 SafeERC20 进行安全的代币转移。 + +有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20Collateral.sol)。 + +### 合成 ERC20 HWR + +在 `HypERC20.sol` 中实现,合成 HWR 在目标链上铸造代表源链原始代币的新代币。原始代币不会转移,而是保持锁定状态。 + +#### 特性 + +- 在所有链中保持一致的总供应量。 +- 支持自定义代币属性(名称、符号、小数位数)。 +- 在目标链上铸造新代币。 +- 当转回时在源链上销毁代币。 + +有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20.sol)。 + +## 高级功能 + +### TokenRouter 功能 + +所有 HWR 都扩展了 `TokenRouter` 合约,该合约为 HWR 代币转移提供核心功能。 + +#### 特性 + +1. **消息结构**:使用 [TokenMessage](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenMessage.sol) 库编码和解码代币转移消息。 +2. **转移启动**:`transferRemote` 函数启动跨链转移。 +3. **消息处理**:`_handle` 函数处理传入的转移消息。 +4. **抽象方法**: + - `_transferFromSender`:由所有 HWR 实现以处理代币收集。 + - `_transferTo`:由所有 HWR 实现以处理代币分发。 + +#### TokenMessage 格式 + +```solidity +[32 bytes for recipient][32 bytes for amount][remaining bytes for metadata] +``` + +这种标准化格式确保不同 HWR 实现之间的一致处理,同时允许通过元数据进行扩展。 + +有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenRouter.sol)。 + +### FastTokenRouter 转移 + +在 `FastTokenRouter.sol` 中实现,此路由器扩展了 TokenRouter 并通过流动性提供者机制提供更快的代币转移。 + +#### 特性 + +- 允许流动性提供者在消息处理之前满足转移请求。 +- 包括 `fastFee` 以激励流动性提供者。 +- 引入 `fastTransferId` 用于唯一转移标识。 + +有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/FastTokenRouter.sol)。 + +## 专用 HWR 扩展 + +### 1. 快速抵押品转移(FastHypERC20Collateral) + +- 将快速转移功能与抵押品支持的 ERC20 功能相结合。 +- 有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/FastHypERC20Collateral.sol)。 + +### 2. 资金库集成(HypERC4626OwnerCollateral,HypERC4626Collateral) + +- 通过与 ERC-4626 资金库集成,允许抵押品产生收益。 +- 有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626OwnerCollateral.sol)和[重新平衡变体](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626Collateral.sol)。 + +### 3. 法币支持的代币(HypFiatToken) + +- 专为稳定币和其他法币支持的代币设计,实现特定的铸造和销毁操作。 +- 有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypFiatToken.sol)。 + +### 4. 缩放原生代币(HypNativeScaled) + +- 缩放原生代币值以在具有不同小数位的链之间保持一致性。 +- 有关更多详细信息,请参见[实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypNativeScaled.sol)。 + +### 5. xERC20 集成(HypXERC20 和 HypXERC20Lockbox) + +- 启用 xERC20 代币的跨链转移,与锁箱机制集成进行转换。 +- 有关更多详细信息,请参见 [HypXERC20 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20.sol)和 [HypXERC20Lockbox 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20Lockbox.sol)。 + +## 参考资料 + +有关设置示例和用例,请查看 [HWR:示例用法](./example-usage)。 \ No newline at end of file diff --git a/zh/docs/get-started-building.mdx b/zh/docs/get-started-building.mdx new file mode 100644 index 0000000..8c3771a --- /dev/null +++ b/zh/docs/get-started-building.mdx @@ -0,0 +1,132 @@ +--- +title: "开始使用 Hyperlane 构建" +--- + +通过三个步骤构建跨链应用程序。无论您是创建代币桥、跨链 NFT 还是跨链消息传递,本指南都将帮助您入门。 + +## 步骤 1:确定您的虚拟机 + +选择您想要启用跨链功能的区块链环境。 + + + Hyperlane 支持多种虚拟机类型,包括 EVM 链(以太坊、Polygon、Arbitrum)、Cosmos 和 Solana。 + + +**您需要决定的内容:** + +- 源链(消息发起的地方) +- 目标链(消息传递的地方) +- 每条链的 Gas 代币要求 + +--- + +## 步骤 2:部署 Hyperlane 核心基础设施 + +部署核心 Hyperlane 合约,包括核心邮箱和 ISM 合约。 + +**在部署之前,检查您的链上是否已有 Hyperlane:** + + + + 查看 [Hyperlane 注册表](https://github.com/hyperlane-xyz/hyperlane-registry) + 了解哪些链已有 Hyperlane 部署。如果您要连接的链已经部署了 Hyperlane 核心合约,请跳转到步骤 3! + + + +**如果您需要部署:** + +- 使用 Hyperlane CLI 进行自动化部署 +- 配置您的安全设置 +- 部署 Hyperlane 核心合约 + +[部署 Hyperlane 基础设施 →](/zh/docs/guides/chains/deploy-hyperlane) + +--- + +## 步骤 3:创建您的 Hyperlane Warp 路由 (HWR) + +使用 Hyperlane 的消息传递基础设施桥接您的代币。 + + + Hyperlane Warp 路由是使用 Hyperlane 消息传递基础设施的模块化跨链资产桥。了解它们的工作原理。 + + +**常见的 HWR 类型:** + +- **ERC-20 HWR**:桥接任何 ERC-20 代币 +- **原生 HWR**:移动原生代币(ETH、SOL 等) +- **抵押品 HWR**:在源链锁定代币,在目标链铸造 +- **合成 HWR**:在目标链上创建包装版本 + +**选择您的部署指南:** + + + + 在以太坊、Polygon、Arbitrum 和其他 EVM 链上部署 + + +{" "} + + + 在 Solana 和其他 Sealevel VM 链上部署 + + + + 在基于 Cosmos SDK 的链上部署 + + + + + **高级 HWR**:查看我们的 [HWR 资源](/zh/docs/applications/warp-routes/types) 和 [HWR 指南](/zh/docs/guides/warp-routes) 了解更复杂的用例。 + + +--- + +## 下一步 + + + + 为您的 HWR 创建用户界面 + + + + 使用本地验证器和中继器部署 Hyperlane + + + + 为您的跨链消息配置自定义安全 + + +{" "} + + + +## 需要帮助? + + + 加入我们的 [Discord 社区](https://discord.gg/hyperlane) 获取支持! + \ No newline at end of file diff --git a/zh/docs/guides/chains/deploy-hyperlane-with-local-agents.mdx b/zh/docs/guides/chains/deploy-hyperlane-with-local-agents.mdx new file mode 100644 index 0000000..4019c53 --- /dev/null +++ b/zh/docs/guides/chains/deploy-hyperlane-with-local-agents.mdx @@ -0,0 +1,409 @@ +--- +title: "使用本地代理部署Hyperlane" +description: "使用本地验证器和中继器部署Hyperlane的高级指南" +--- + + + 此指南面向最终可能打算在类生产环境中运行Hyperlane代理的高级用户。它将涵盖如何手动配置和运行代理的基础知识,但**这不是生产环境设置指南**。 + + +## 概述 + +本指南包含六个步骤: + +1. **设置密钥**,您将使用这些密钥来部署合约并运行验证器和中继器 +2. **部署合约**到本地链以及本地链将能够发送和接收消息的每个远程链 +3. **运行验证器**为您部署的跨链安全模块提供所需的签名 +4. **运行中继器**在您部署合约的链之间发送和接收消息 +5. **发送测试消息**以确认您的中继器能够在每对链之间传递消息 +6. **部署Hyperlane Warp路由(HWR)**以发送代币价值,而不仅仅是消息,跨链 + +## 开始使用 + +## 1. 设置密钥 + +设置您用于部署合约和运行代理的密钥。 + +## 2. 部署合约 + +将Hyperlane合约部署到您的链。 + +## 3. 运行验证器 + +验证器为从您的链发送到远程链的消息提供安全性。只有在使用[Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM)时才需要它们。了解更多关于验证器的作用,请参阅[这里](/zh/docs/protocol/agents/validators)。 + +### 设置目录 + +首先,将`CONFIG_FILES`环境变量设置为在[部署合约](#2-deploy-contracts)步骤中生成的代理配置文件路径。例如: + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config-{timestamp}.json +``` + +接下来,为您的验证器创建一个本地目录以写入其签名。记住路径,因为在配置验证器时您需要它。 + + + 验证器签名路径将作为[验证器公告交易](/zh/docs/alt-vm-implementations/implementation-guide#validator-announce)的一部分写入链上。**请小心不要泄露任何安全敏感或个人信息!** + + +```bash +# 选择一个特定于您验证的链的信息性名称 +export VALIDATOR_SIGNATURES_DIR=/tmp/hyperlane-validator-signatures- + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + + +在Mac上通过Docker运行代理时,您将无法挂载`/tmp`中的任何内容。为了解决这个问题,请创建一个本地`tmp`目录来挂载。 + +```bash +# 创建一个可被docker访问的本地tmp目录 +mkdir tmp + +# 选择一个特定于您验证的链的信息性名称 +export VALIDATOR_SIGNATURES_DIR=tmp/hyperlane-validator-signatures- + +# 创建目录 +mkdir -p $VALIDATOR_SIGNATURES_DIR +``` + + + +### 配置 + +验证器可以配置许多参数。对于本指南,我们只关注少数几个: + +| 参数 | 描述 | +| ------------------------- | ----------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--originChainName` | 正在验证的链的名称(例如`ethereum`)。 | +| `--checkpointSyncer.type` | 对于本指南设置为`localStorage`。 | +| `--checkpointSyncer.path` | 验证器签名将写入的本地目录路径。与`$VALIDATOR_SIGNATURES_DIR`相同的路径。 | +| `--validator.key` | 您验证器的十六进制私钥。 | + + + 确保验证器密钥对应于设置MultisigIsmConfig时提供的地址。否则,您在上一步中部署的Multisig ISM将无法验证从您的链发送的消息。 + + +要了解更多关于您可以更改的所有参数,请阅读[代理配置参考](/zh/docs/operate/config/config-reference)。 + + + + **更新代理配置** + + 除非您在Linux上运行Docker,否则您还需要更新网络的代理配置。这是因为Docker在Mac、Windows或Windows Server上不支持[`host`网络模式](https://docs.docker.com/network/drivers/host/)。 + + 要做到这一点,导航到`$CONFIG_FILES`的代理配置文件,并将所有"localhost"或"127.0.0.1"实例替换为`host.docker.internal`。例如: + + ```json + ... + "localnet1": { + ... + "rpcUrls": [ + { + // "http": "http://localhost:8545" + // "http": "http://127.0.0.1:8545" + "http": "http://host.docker.internal:8545" + } + ], + ... + }, + ... + ``` + + **挂载目录** + + 使用Docker运行会增加额外的复杂性,因为配置文件需要从Docker容器内部访问,验证器签名需要从容器外部访问,以便中继器读取。这样中继器就可以构造消息成功通过Multisig ISM验证所需的元数据。 + + 为了解决这个问题,您可以将文件系统上的目录挂载到容器中。在下面的参数中,我们: + + 1. 将`$CONFIG_FILES`环境变量设置为容器内的固定路径。 + 2. 将代理配置文件挂载到此固定路径并使其只读。 + 3. 将持久数据目录挂载到容器内的固定路径。 + 4. 将验证器签名目录挂载到容器内的固定路径。 + + ```bash + ... + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ + ... + ``` + + 硬编码这些路径可以在为不同源链运行验证器的docker实例之间去重配置。这使得在运行容器时更容易传递正确的参数。请参阅下面的示例,其中为不同链配置的唯一项目是链名称和验证器密钥。 + + ```bash + ... + ./validator \ + --db /hyperlane_db \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /tmp/validator-signatures \ + --validator.key + ... + ``` + + + + **克隆和设置** + + 首先,克隆Hyperlane monorepo: + + ```bash + git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git + ``` + + 然后按照`rust`目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。如果您使用的是Apple Silicon,这应该会设置`rustup`以及Rosetta 2。 + + ```bash + # 安装rustup + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + + # (仅限apple silicon) 安装rosetta 2 + softwareupdate --install-rosetta --agree-to-license + ``` + + + + +### 运行 + + + + 现在您已了解更多关于配置验证器参数的信息,请拉取最新的docker镜像: + + ```bash + docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 + ``` + + 在运行之前,确保您需要挂载的所有目录都存在。这可能涉及创建`hyperlane_db_validator_`(如果它还不存在)。 + + ```bash + mkdir -p hyperlane_db_validator_ + ``` + + 最后,运行验证器: + + ```bash + docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 \ + ./validator \ + --db /hyperlane_db \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /tmp/validator-signatures \ + --validator.key + ``` + + + + 按照设置说明进行操作后,您现在应该能够使用`cargo`运行验证器: + + ```bash + cargo run --release --bin validator -- \ + --db ./hyperlane_db_validator_ \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key + ``` + + + **可选:直接运行二进制文件** + + 您也可以构建代理: + + ```bash + cargo build --release --bin validator + ``` + + 并直接运行二进制文件: + + ```bash + ./target/release/validator \ + --db ./hyperlane_db_validator_ \ + --originChainName \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ + --validator.key + ``` + + + + + + + 更多信息,请查看[验证器指南](/zh/docs/operate/validators/run-validators)。要了解运行多个验证器,请参阅[此部分](/zh/docs/operate/validators/run-validators#running-multiple-validators)。 + + +## 4. 运行中继器 + + + - **单中继器建议**:一般来说,单个中继器就足够了,可以有效地处理100多个链的消息传递。您不需要为每个网络运行单独的中继器 - 这种方法实际上会增加操作复杂性而不会提供性能优势。 + + + + +- **可信中继器ISM密钥管理**:如果您使用可信中继器ISM(不推荐用于生产),请避免在多个中继器实例中使用相同的中继器密钥,因为这可能导致nonce冲突和交易失败。要么运行单个中继器,要么为每个中继器使用不同的密钥。 +- 对于生产部署,使用multisig ISM而不是可信中继器ISM。 + + + +中继器在本地和远程链之间传递跨链消息。了解更多关于中继器的作用,请参阅[这里](/zh/docs/protocol/agents/relayer)。 + +您应该已经将`CONFIG_FILES`环境变量设置为在[代理配置](#agent-configs)步骤中生成的代理配置路径。如果没有,现在就这样做。 + +```bash +export CONFIG_FILES=/full/path/to/configs/agent-config.json +``` + +### 配置 + +中继器可以配置许多参数。对于本指南,我们只关注少数几个: + +| 参数 | 描述 | +| ------------------------------- | -------------------------------------------------------------------------------------------- | +| `--db` | 将持久数据写入磁盘的路径。 | +| `--relayChains` | 要在其间中继的链的逗号分隔名称。例如`ethereum,polygon,avalanche`。 | +| `--allowLocalCheckpointSyncers` | 允许中继器在本地文件系统上查找验证器签名。 | +| `--defaultSigner.key` | 用于为所有链签署交易的十六进制私钥。 | +| `--metrics-port` | 可选。暴露prometheus指标的端口,默认为`9090`。 | + + + 您的中继链集应该包括源链和目标链。 + + +要了解更多关于您可以更改的所有参数,请阅读[代理配置参考](/zh/docs/operate/config/config-reference)。 + + + + **挂载目录** + + 对于中继器,我们向Docker提供与验证器几乎相同的参数: + + 1. 将`$CONFIG_FILES`环境变量设置为容器内的固定路径。 + 2. 将代理配置文件挂载到此固定路径并使其**只读**。 + 3. 将持久数据目录挂载到容器内的固定路径。 + 4. 将验证器签名目录挂载到容器内的固定路径并使其**只读**。 + + ```bash + ... + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ + ... + ``` + + 硬编码这些路径可以在为不同链集运行中继器的docker实例之间去重配置。这使得在运行容器时更容易传递正确的参数。请参阅下面的示例,其中为不同链配置的唯一项目是要在其间中继的链列表和中继器密钥。 + + + + **克隆和设置** + + 如果您还没有这样做,请克隆Hyperlane monorepo并按照`rust`目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。 + + ```bash + # 克隆hyperlane monorepo + git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git + + # 安装rustup + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + + # (仅限apple silicon) 安装rosetta 2 + softwareupdate --install-rosetta --agree-to-license + ``` + + + + +### 运行 + + + + 如果您还没有拉取Docker镜像,现在通过运行以下命令来拉取: + + ```bash + docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 + ``` + + 在运行之前,确保您需要挂载的所有目录都存在。这可能涉及创建`hyperlane_db_relayer`(如果它还不存在)。 + + ```bash + mkdir -p hyperlane_db_relayer + ``` + + 最后,运行中继器: + + ```bash + docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ + --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + ``` + + + + 按照设置说明进行操作后,您现在应该能够使用`cargo`运行中继器: + + ```bash + cargo run --release --bin relayer -- \ + --db ./hyperlane_db_relayer \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + --metrics-port 9091 + ``` + + 指标端口被覆盖以避免与验证器冲突。 + + + **可选:直接运行二进制文件** + + 您也可以构建代理: + + ```bash + cargo build --release --bin relayer + ``` + + 并直接运行二进制文件: + + ```bash + ./target/release/relayer \ + --db ./hyperlane_db_relayer \ + --relayChains , \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + --metrics-port 9091 + ``` + + + + + + + 更多信息,请查看[中继器指南](/zh/docs/operate/relayer/run-relayer)。 + + +## 5. 发送测试消息 + +发送测试消息以验证您的设置是否正常工作。 + +## 6. (可选) 部署Hyperlane Warp路由 + +要使用您的新Hyperlane部署连接代币,请参阅[Hyperlane Warp路由部署指南](/zh/docs/guides/quickstart/deploy-warp-route)。 \ No newline at end of file diff --git a/zh/docs/guides/chains/deploy-hyperlane.mdx b/zh/docs/guides/chains/deploy-hyperlane.mdx new file mode 100644 index 0000000..c64f4f3 --- /dev/null +++ b/zh/docs/guides/chains/deploy-hyperlane.mdx @@ -0,0 +1,219 @@ +--- +title: "部署到新链" +description: "关于如何将您的链与 Hyperlane 连接的分步指南" +--- + + + +- 本指南仅适用于 **EVM 兼容** 链。 +- 它将引导您尽快将 Hyperlane 部署到新链以进行测试,而非生产。这包括核心邮箱和 ISM 合约以及用于资产桥接的 Hyperlane Warp 路由合约。 +- 要查看已支持的链,请访问[注册表](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)。 +- 如果您需要任何帮助,请在 Discord 的 #developers 频道联系我们或[取得联系](https://forms.gle/KyRTaWvo4XNmNvrq6)。 + + + +## 先决条件 + +任何人都可以在具备以下构件和资产后开始此快速入门指南: + +- 您选择的新的、自定义的或预先存在的网络,包括以下元数据: + - 链名称,例如 `ethereum` + - 链 ID,例如 `1` + - RPC URL,例如 `https://eth.llamarpc.com` +- 部署者钱包/EOA 私钥或助记词 + - 此 EOA 应在您的自定义链和您将向其发送消息和从中发送消息的任何链上提供资金 +- [Hyperlane CLI](/zh/docs/reference/developer-tools/cli) + +## 1. 注册表 + +让我们创建一个自定义链配置,运行: + +```bash +hyperlane registry init +``` + +按照提示设置您的链元数据。设置区块或 Gas 属性是可选的。 + +现在,在 `$HOME/.hyperlane/chains` 下,您将找到一个以您的自定义链名称命名的新文件夹,以及该文件夹内名为 `metadata.yaml` 的文件。 + +
+ + 此配置在 `$HOME/.hyperlane/chains/yourchain/metadata.yaml` 的示例内容 + + +```yaml +# yaml-language-server: $schema=../schema.json +# 您的自定义链的元数据 + +blockExplorers: + - apiUrl: https://explorer.yourchain.com/api + apiKey: XXXX # 有助于避免合约验证 API 的速率限制 + family: etherscan #您使用的浏览器,也支持 routescan 或 blockscout + name: Chainscan + url: https://explorer.yourchain.com +blocks: + confirmations: 1 + estimateBlockTime: 1 + reorgPeriod: 0 +chainId: 171717 +displayName: Chain Name +domainId: 171717 +isTestnet: true # 可选 +name: yourchain +nativeToken: + name: Ether + symbol: ETH + decimals: 18 +protocol: ethereum +rpcUrls: + - http: https://hyper-lane-docs.rpc.caldera.xyz/http +``` + +
+ +## 2. 核心 + +接下来,让我们配置、部署和测试您自定义链的核心合约。 + +### 初始化配置 + +1. 从您的本地环境,将您已资助的部署者地址的私钥或助记词设置为 `HYP_KEY`。例如:`export HYP_KEY=''` +2. 从同一终端实例,运行: + +```bash +hyperlane core init +``` + +
+ + 部署配置将写入 `./configs/core-config.yaml` + + +```yaml +# 拥有和管理已部署合约的地址。此账户具有管理员权限。 +owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + +# 默认跨链安全模块 (ISM) 配置。 +defaultIsm: + #`type`: 指定 ISM 的类型。这里,它使用受信任的中继器 ism。 + type: trustedRelayerIsm + #`relayer`: 负责处理跨链消息的中继器地址。 + relayer: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + +defaultHook: + # 指定使用默克尔树的钩子配置。 + type: merkleTreeHook + +requiredHook: + # 负责管理钩子配置的所有者地址。 + owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + # 钩子的类型。这个应用协议费用机制。 + type: protocolFee + # 接收协议费用的地址。 + beneficiary: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" + # 协议允许的最大费用,以 wei 为单位。 + maxProtocolFee: "100000000000000000" + # 协议收取的当前费用,为测试目的设置为 0。 + protocolFee: "0" +``` + +
+ +### 部署合约 + +要部署合约,运行: + +```bash +hyperlane core deploy +``` + +使用箭头和回车从主网列表底部选择您的自定义链。所有合约部署需要几分钟时间。 + +
+ + 在 `$HOME/.hyperlane/chains` 下,您将找到一个以您的自定义链名称命名的新文件夹,以及该文件夹内名为 `addresses.yaml` 的文件 + + +```yaml +staticMerkleRootMultisigIsmFactory: "0x6906cb4741d3E2322E9f9aA645DfC8AB6F122c47" +staticMessageIdMultisigIsmFactory: "0x3CE97a32d9C8294691cBd2baC09B078EDa75c429" +staticAggregationIsmFactory: "0x81f969fDBF48278Ce09685Ce48e03388B6785aF4" +staticAggregationHookFactory: "0x3d864A3c25F61E3c3A7d02e980453A6E1f0a92A6" +domainRoutingIsmFactory: "0xC4c01f7B03f0fFa77A0265C600dEF7Ad28BCa5A2" +proxyAdmin: "0xABb7175d5F123172E7B7Fa467CC9fE4C2FEdb942" +mailbox: "0x5F58d75A9caDE4e2b191313223978dF049f93b81" +interchainAccountRouter: "0x43c0745b0dE9Cb780816a24ddE63d79Ca99B5dE8" +interchainAccountIsm: "0x9C96dC8f4257413225d6B5C47d1afbafc39B269F" +validatorAnnounce: "0xE3bd39BF92DB385dE6313D6070b035bD934378CB" +testRecipient: "0xa58462b1943Be1469Ed58db690C78583BA34Fd2E" +``` + +
+ + + - `eth_getStorageAt()` 兼容性:某些链可能不使用 [`eth_getStorageAt()`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) API。如果您的部署遇到相关问题,请参考[故障排除指南](/zh/docs/guides/deploy-hyperlane-troubleshooting#eth-getstorageat-compatibility)。 + + +### 发送测试消息 + +要发送测试消息,运行: + +```bash +hyperlane send message --relay +``` + +`--relay` 标志是可选的,将消息传递到目标链。 + +您也可以在后台运行中继器: + +```bash +hyperlane relayer --chains yourchain,sepolia +``` + + + **🎉 恭喜!您已成功向您的自定义链发送了消息** + + +## 3. Hyperlane Warp 路由 + +现在您的链上有了 Hyperlane 邮箱和核心合约,是时候在您的链和任何其他 Hyperlane 链之间设置代币桥接了。 + +继续查看[部署 Hyperlane Warp 路由](/zh/docs/guides/quickstart/deploy-warp-route)文档了解更多详细信息。 + +## 4. 提交到注册表 + +如果您希望其他链也能与您连接以及将此投入生产,请提交注册表 PR。 + +### 确保信息完整 + +确保您的元数据完整: + +- 在文件夹内添加 `logo.svg` 文件 +- 包括标识部署团队的 `Deployer` 信息 +- 如果链是测试网,则表示 `isTestnet` `true` +- 如果您有 gnosis safe 服务,添加 api url `gnosisSafeTransactionServiceUrl` +- 检查 yaml 文件并按字母顺序排序 + +### 提交到 GitHub + +首先,导航到您的本地注册表实例并提交更改 + +```bash +cd ~/.hyperlane && git init && git add . && git commit +``` + +然后,将本地注册表与规范注册表同步 + +```bash +git remote add canonical git@github.com:hyperlane-xyz/hyperlane-registry.git +git pull canonical main --rebase +``` + +最后,将本地注册表推送到 github fork 并提交 PR。请在您的 PR 中包含一个[变更集](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)。 + + +**恭喜!您已成功将 Hyperlane 部署到您的链并将您的工作添加到 Hyperlane 注册表** + +感谢您为无需许可互操作性的未来做出贡献 🫡 + + \ No newline at end of file diff --git a/zh/docs/guides/create-custom-hook-and-ism.mdx b/zh/docs/guides/create-custom-hook-and-ism.mdx new file mode 100644 index 0000000..263310f --- /dev/null +++ b/zh/docs/guides/create-custom-hook-and-ism.mdx @@ -0,0 +1,192 @@ +--- +title: "创建自定义 Hook 和 ISM" +--- + +Hook 和 ISM 具有互补关系:您可以从源链自定义行为,它们在目标链上使用成对的 ISM 合约来验证您的自定义 hook 行为。 + +您可以根据需求实现和使用自己的 hook 和 ISM 模式。您可以通过在源链上实现 `IPostDispatchHook` 接口和在目标链上实现 `IInterchainSecurityModule` 接口来使用外部桥接提供商,例如 Wormhole 或 Chainlink 的 CCIP。 + + + + ```solidity + interface IPostDispatchHook { + enum Types { + UNUSED, + ROUTING, + AGGREGATION, + MERKLE_TREE, + INTERCHAIN_GAS_PAYMASTER, + FALLBACK_ROUTING, + ID_AUTH_ISM, + PAUSABLE, + PROTOCOL_FEE, + LAYER_ZERO_V1, + RATE_LIMITED, + ARB_L2_TO_L1, + OP_L2_TO_L1, + MAILBOX_DEFAULT_HOOK, + AMOUNT_ROUTING + } + + /** + * @notice 返回表示 hook 类型的枚举 + */ + function hookType() external view returns (uint8); + + /** + * @notice 返回 hook 是否支持 metadata + * @param metadata metadata + * @return hook 是否支持 metadata + */ + function supportsMetadata( + bytes calldata metadata + ) external view returns (bool); + + /** + * @notice 通过 Mailbox 调度消息后的后置操作 + * @param metadata hook 所需的 metadata + * @param message 从 Mailbox.dispatch() 调用传递的消息 + */ + function postDispatch( + bytes calldata metadata, + bytes calldata message + ) external payable; + + /** + * @notice 计算 postDispatch 调用所需的支付 + * @param metadata hook 所需的 metadata + * @param message 从 Mailbox.dispatch() 调用传递的消息 + * @return postDispatch 调用的报价支付 + */ + function quoteDispatch( + bytes calldata metadata, + bytes calldata message + ) external view returns (uint256); + } + ``` + + + + + ```solidity + // SPDX-License-Identifier: MIT OR Apache-2.0 + pragma solidity >=0.6.11; + + interface IInterchainSecurityModule { + enum Types { + UNUSED, + ROUTING, + AGGREGATION, + LEGACY_MULTISIG, + MERKLE_ROOT_MULTISIG, + MESSAGE_ID_MULTISIG, + NULL, // used with relayer carrying no metadata + CCIP_READ, + ARB_L2_TO_L1, + WEIGHTED_MERKLE_ROOT_MULTISIG, + WEIGHTED_MESSAGE_ID_MULTISIG, + OP_L2_TO_L1 + } + + /** + * @notice 返回表示此 ISM 编码的安全模型类型的枚举。 + * @dev Relayer 推断如何获取和格式化 metadata。 + */ + function moduleType() external view returns (uint8); + + /** + * @notice 定义负责根据提供的 metadata 验证跨链消息的安全模型。 + * @param _metadata Relayer 提供的链下 metadata,特定于 + * 模块编码的安全模型(例如验证器签名) + * @param _message Hyperlane 编码的跨链消息 + * @return 如果消息已验证则返回 True + */ + function verify( + bytes calldata _metadata, + bytes calldata _message + ) external returns (bool); + + } + + interface ISpecifiesInterchainSecurityModule { + function interchainSecurityModule() + external + view + returns (IInterchainSecurityModule); + } + ``` + + + + + + Hook 当前期望 metadata 使用 [`StandardHookMetadata` 库](/zh/docs/reference/developer-tools/libraries/hookmetadata)进行格式化。 + + +您还可以继承我们的 `AbstractMessageIdAuthorizedIsm`,它允许对中间的 `verifyMessageId` 函数调用进行访问控制,如果从授权的 `AbstractMessageIdAuthHook` hook 接收到,则在存储中将 messageId 设置为 true。此模式目前在 [`OpStackHook`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/hooks/OPStackHook.sol#L33C8-L33C8) \<> [`OpStackIsm`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/isms/hook/OPStackIsm.sol#L31) 模式中使用。 + +## 工作流程 + +```mermaid +flowchart TB + subgraph Origin Chain + Sender + M_O[(Mailbox)] + E_B_O[(ExternalBridgeOrigin)] + + C_H[AbstractMessageIdAuthorizedIsm] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "postDispatch(metadata, ...)
{value - fee}" ..-> C_H + C_H -- "externalCall(metadata, message)" --> E_B_O + + end + + E_B_O -. "crosschainCall(metadata,message)" ..-> E_B_D + M_O -. "relay" ..-> M_D + + subgraph Destination Chain + Recipient + M_D[(Mailbox)] + E_B_D[(ExternalBridgeDestination)] + ISM{AbstractMessageIdAuthorizedIsm} + + M_D -- "handle(origin,sender,message)" --> Recipient + M_D -- "verify(metadata, message)" --> ISM + ISM -. "interchainSecurityModule()" .- Recipient + + E_B_D -- "verifiedMessageId(message)" --> ISM + end + + style E_B_O fill: #FF0099 + style E_B_D fill: #FF0099 +``` + +## 接口 + +在实现上述接口后,您可以通过在我们的 mailbox 中使用重载的 `dispatch` 调用来覆盖默认 hook 以及 hook metadata。 + +**在源链上:** + +- `mailbox.dispatch()` 通过 `AbstractMessageIdAuthHook.postDispatch()` 调用您的自定义 hook。 +- `_postDispatch` 检查 `latestDispatchedId` 是否是从 hook 调度的 id,以确保 mailbox 是调用 hook 的合约(因为调用 `postDispatch` 没有访问控制) +- `_sendMessageId` 调用您的自定义外部桥接逻辑,例如调用 CCIP router 合约。 + +**在目标链上:** + +- 外部桥接将调用 `verifyMessageId` 函数(该函数有访问控制)并在 `verifiedMessages` 映射中将 `messageId` 设置为 true。 +- 在接收到 relayer 的消息时,mailbox 将调用您的 ISM 合约(在您的接收者地址中指定),它检查 `verifiedMessages` 映射中的 messageId 是否为 true,并向 mailbox 返回 true,反之亦然。 + + + `AbstractMessageIdAuthorizedIsm` 可以通过 `postDispatch` 调用发送 `msg.value`,我们使用 `verifiedMessages` 的小端序 255 位来存储 `msg.value`,最高位用于 messageId 传递的实际接收。因此,您可以从源链发送最多 2^255 数量的原生代币价值,而目标 ISM 只能在目标链上接收最多 2^255 数量的原生代币价值。 + + +## 访问控制 + +如果 `postDispatch` 必须只使用_刚刚_调度的 `message` 调用,则可以使用 Mailbox 上的 `latestDispatchedId` 函数来验证消息是否_确实_已调度。 + + + 这是用来代替某些 `require(mailbox == msg.sender)` 来支持**组合**,其中一个 hook 可能将 `message` 传递给另一个 hook。 + + +为方便起见,[`MailboxClient` 库](/zh/docs/reference/developer-tools/libraries/mailbox-client)中提供了以下实用程序。 \ No newline at end of file diff --git a/zh/docs/guides/deploy-hyperlane-troubleshooting.mdx b/zh/docs/guides/deploy-hyperlane-troubleshooting.mdx new file mode 100644 index 0000000..7199c53 --- /dev/null +++ b/zh/docs/guides/deploy-hyperlane-troubleshooting.mdx @@ -0,0 +1,208 @@ +--- +title: "故障排查指南" +--- + +## 常规故障排查 + + + + + +可以使用以下两个环境变量为 Hyperlane 工具配置日志记录级别和格式: + +- `LOG_LEVEL`:要过滤的日志级别。默认为 `info`。选项:`debug | info | warn | error | off` +- `LOG_FORMAT`:日志输出的格式。默认为 `pretty`。选项:`pretty | json` + +[Hyperlane CLI](/zh/docs/reference/developer-tools/cli) 还允许通过 `--log` 和 `--verbosity` 标志配置日志记录。 + + + + + +在您的工作目录中,您可能会找到按链名称组织的 `chains/` yaml 文件。这些 `metadata.yaml` 文件描述了在 Hyperlane 部署和应用程序中使用链所需的信息。 + +您可以在此文件中为任何新链定义完整配置。可配置的 metadata 在此[示例配置](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml)中定义。您还可以在 [chainMetadataTypes.ts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts) 找到链 metadata schema。 + +以下是两个本地 anvil 链的示例配置: + +```yaml +anvil1: + chainId: 31337 + domainId: 31337 + name: anvil1 + protocol: ethereum + rpcUrls: + - http: http://localhost:8545 + nativeToken: + name: Ether + symbol: ETH + decimals: 18 +anvil2: + chainId: 31338 + domainId: 31338 + name: anvil2 + protocol: ethereum + rpcUrls: + - http: http://localhost:8555 +``` + +您还可以通过提供要覆盖的字段来扩展核心链配置: + +```yaml +sepolia: + blocks: + confirmations: 2 +``` + + + + + +您可以通过扩展核心链配置来覆盖 RPC URL。 + +示例:定义 RPC URL 数组并调整重试设置 + +```yaml +demochain: + name: demochain + chainId: 123456 + domainId: 123456 + protocol: ethereum + rpcUrls: + - http: https://rpc-testnet.demochain.gg +sepolia: + rpcUrls: + - http: https://rpc2.sepolia.org + - http: https://some-other-sepolia-rpc.gg + retry: + maxRequests: 10 +``` + + + + + +交易覆盖是形成交易请求时要包含的任何属性。例如: + +- `gasPrice`: number | string +- `maxFeePerGas`: number | string +- `maxPriorityFeePerGas`: number | string +- `nonce`: number | string +- `type`: number +- `ccipReadEnabled`: boolean + +在下面的示例中,我们使用 7 gwei 的 gas 价格,硬编码 nonce,并为基础费用和优先费用设置最大值。 + +```yaml +sepolia: + transactionOverrides: + gasPrice: 7000000000 # 7 gwei + maxFeePerGas: 150000000000 # 150 gwei + maxPriorityFeePerGas: 40000000000 # 40 gwei + nonce: 1337 +``` + + + 如果您在链配置中覆盖了 nonce,请确保在成功交易时更新该值。 + + + + + + +消息传递中的延迟或超时通常是由 RPC 问题引起的,例如端点过载,或来自仅按需生成区块的链。 + +要识别问题,请检查指示 RPC 相关问题的日志,例如:`Deprioritizing an inner provider in FallbackProvider` + +要解决这些延迟: + +- **检查 RPC 健康状况:** 确保 RPC 端点响应正常。 +- **为按需生成区块的链配置:** 对于这些链,将 reorgPeriod 设置为 0。这确保 agent 始终查看链的顶端,避免由区块最终确定过程引起的延迟。 + + + + + +## Agent 故障排查 + + + + + +- **原因**:当 relayer 无法检索处理消息所需的 validator 签名时会发生这种情况。 +- **解决方案**: + - 确保 validator 已宣布其存储位置。检查 validator 日志中是否有如下消息: + `Validator has announced signature storage location, locations: ["file:///tmp/hyperlane-validator-signatures-local"]` + - 验证每个 validator 都有唯一的签名存储路径(`--checkpointSyncer.path`)以防止覆盖。 + - 确认 relayer 对存储路径具有读取访问权限。 + + + + + +- **原因**:当跨链安全模块(ISM)无法识别源链时会发生这种情况。 +- **解决方案**: + - 确保 ISM 配置包含源链的 Validator。 + - 如果没有,请将源链的 validator 添加到您的 ISM。 + - 更新 ISM 配置后重启 relayer。 + + + + + +如果消息卡在 relayer 队列中或未被处理,请使用 `list_operations` 端点检查 relayer 的队列: + +```shell +curl http://0.0.0.0:9090/list_operations?destination_domain= +``` + +此端点提供队列中消息的状态,可以帮助确定它们为什么没有被传递。 + + + + + +要获得详细的洞察,请启用调试日志记录并监控 relayer 的活动:`HYP_LOG_LEVEL=debug`。捕获日志后,您可以使用它们来定位特定消息 ID 的问题。 + + + + + +查看日志后,您可以使用 `message_retry` 端点触发所有待处理消息的立即重试: + +```shell +curl --location 'http://127.0.0.1:9090/message_retry' \ +--header 'Content-Type: application/json' \ +--data '[{"messageid": "*", "origindomain": "*", "senderaddress": "*", "destinationdomain": "*", "recipientaddress": "*"}]' +``` + +确保您使用最新版本的 relayer 并捕获所有日志以进行调试。 + + + + + +确保您链上的跨链安全模块(ISM)配置正确。错误的 ISM 可能导致消息无法处理。验证配置中的 ISM 地址,并确保它与您的部署设置匹配。 + + + + + +## 高级故障排查 + + + + + +某些链原生不支持 [`eth_getStorageAt()`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) API。如果您在这些链之一上部署并遇到问题,请查看此 [commit](https://github.com/hyperlane-xyz/hyperlane-monorepo/commit/871df7a4dce203ff5cf23ae654d03743dc00ea61) 中对 Hyperlane 代码库所做的更改。 + +要在这些链上部署 Hyperlane,请按照以下步骤操作: + +1. 克隆 [repo](https://github.com/hyperlane-xyz/hyperlane-monorepo) +2. 应用 [commit](https://github.com/hyperlane-xyz/hyperlane-monorepo/commit/871df7a4dce203ff5cf23ae654d03743dc00ea61) 中的更改。 +3. 从根目录构建项目:`yarn build` +4. 从根目录运行 Hyperlane CLI:`yarn workspace @hyperlane-xyz/cli hyperlane` + + + + \ No newline at end of file diff --git a/zh/docs/guides/production/core-deployment/transfer-mailbox-ownership.mdx b/zh/docs/guides/production/core-deployment/transfer-mailbox-ownership.mdx new file mode 100644 index 0000000..ddd2ce9 --- /dev/null +++ b/zh/docs/guides/production/core-deployment/transfer-mailbox-ownership.mdx @@ -0,0 +1,109 @@ +--- +title: "转移邮箱所有权" +description: "学习如何使用Hyperlane CLI更改您的Hyperlane邮箱所有者" +--- + +import PrerequisitesPartial from "/snippets/core/prerequisites-config-artifacts.mdx"; +import CoreReadChainPartial from "/snippets/core/core-read-chain.mdx"; +import CoreApplyChainPartial from "/snippets/core/core-apply-chain.mdx"; + +本指南解释了如何使用Hyperlane CLI更改您的Hyperlane邮箱所有者。当您想要将控制权给予不同的地址时,例如出于安全原因或在更改管理邮箱的人员时,转移所有权是必要的。 + +作为新所有者,您将完全控制邮箱设置,包括管理钩子、ISM配置和消息处理权限。我们将指导您更新所有者地址、应用更改并确认一切设置正确。 + +## 使用Hyperlane CLI + +转移邮箱所有权的最快方法之一是使用[Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli)。 + + + + + 如果您遵循了[如何使用Hyperlane连接您的链](/zh/docs/guides/chains/deploy-hyperlane)指南,您可能已部署了一个所有者设置为单个私钥的邮箱。在生产环境中,建议使用多重签名。 + + +要使用Hyperlane CLI确认,请执行以下命令,将`--chain`设置为部署邮箱的链名称: + + + +运行`core read`后,您应该看到类似的配置,其中`owner`设置为私钥地址: + +```yaml {8} +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: "merkleTreeHook" +defaultIsm: + address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" + relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + type: "trustedRelayerIsm" +owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: "protocolFee" +``` + +输出保存到`CURRENT_DIR/configs/core-config.yaml`。 + +按照这些步骤使用CLI将现有所有权转移到另一个地址。 + +## 步骤1:更新配置 + +在`core-config.yaml`中更新`owner`地址 + +```diff core-config.yaml +defaultHook: + address: "0xE71AC7A1ccB822423576EfFdb0B74564C49BEcBA" + type: merkleTreeHook +defaultIsm: + address: "0x89842f40928f81FC4415b39bfBFC3205eB6161cB" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: trustedRelayerIsm +- owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" ++ owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: protocolFee +``` + +## 步骤2:应用 + +使用CLI执行: + + + +您应该看到在链上执行的一批交易,以及指示邮箱已更新的最终消息。 + +## 步骤3:确认 + +要使用Hyperlane CLI确认,请执行以下命令: + + + +运行`core read`后,您应该看到类似的配置,现在已更新的`owner`: + +```yaml {8} +defaultHook: + address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" + type: "merkleTreeHook" +defaultIsm: + address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: "trustedRelayerIsm" +owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +requiredHook: + address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: "protocolFee" +``` + +通过完成这些步骤,您已成功转移并验证了邮箱所有权到新地址。 \ No newline at end of file diff --git a/zh/docs/guides/production/core-deployment/update-mailbox-default-ism.mdx b/zh/docs/guides/production/core-deployment/update-mailbox-default-ism.mdx new file mode 100644 index 0000000..9f5b724 --- /dev/null +++ b/zh/docs/guides/production/core-deployment/update-mailbox-default-ism.mdx @@ -0,0 +1,137 @@ +--- +title: "更新邮箱默认ISM" +description: "学习如何使用Hyperlane CLI为生产部署更新您的邮箱默认ISM" +--- + +import PrerequisitesPartial from "/snippets/core/prerequisites-config-artifacts.mdx"; +import CoreReadChainPartial from "/snippets/core/core-read-chain.mdx"; +import CoreApplyChainPartial from "/snippets/core/core-apply-chain.mdx"; + +## 使用Hyperlane CLI + +当首次使用CLI部署时,新的邮箱开箱即用地使用可信中继器ISM,因此您无需运行中继器或验证器。 + +为了进入生产环境,您需要使用Hyperlane CLI移除此ISM。 + + + + + 如果您遵循了[如何使用Hyperlane连接您的链](/zh/docs/guides/chains/deploy-hyperlane)指南,您可能已部署了一个所有者设置为单个私钥的邮箱。在生产环境中,建议使用多重签名。 + + +要使用Hyperlane CLI确认,请执行以下命令,将`--chain`设置为部署邮箱的链名称: + + + +运行`core read`后,您应该看到类似的配置,其中`owner`设置为私钥地址: + +```yaml {4-7} +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: "merkleTreeHook" +defaultIsm: + address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" + relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + type: "trustedRelayerIsm" +owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +requiredHook: + address: "0x390d29a822C21F57B163F1173cD43382bd643401" + beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + maxProtocolFee: "100000000000000000" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + protocolFee: "0" + type: "protocolFee" +``` + +输出保存到`CURRENT_DIR/configs/core-config.yaml`。 + +这个特定的配置有一个`trustedRelayerIsm`。这意味着回退到邮箱`defaultIsm`的合约(例如,Hyperlane Warp路由)将给予`relayer`地址执行任意消息的权限。这在自中继功能之外的情况下可能是不可取的。 + +按照这些步骤使用CLI将现有的默认ISM更新为不同的配置。 + +## 步骤1:更新配置 + +或者,您可以将`relayer`地址更新为其他地址(例如,通过将其设置为不可访问的地址来"销毁"它)。 + +```diff core-config.yaml +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: merkleTreeHook +defaultIsm: + address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" +- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" ++ relayer: "0x0000000000000000000000000000000000000001" + type: trustedRelayerIsm +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: protocolFee +``` + +或者,您可以将`defaultIsm`配置更新为不同的ISM配置。如图所示,它已更新为`messageIdMultisigIsm`。 + + + 配置ISM是一个高级功能,需要了解不同的ISM类型以及它们如何在拓扑上协同工作。 + + +```diff core-config.yaml +defaultHook: + address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" + type: merkleTreeHook +defaultIsm: +- address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" +- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +- type: trustedRelayerIsm ++ threshold: 1 ++ type: messageIdMultisigIsm ++ validators: ++ - "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: protocolFee +``` + +## 步骤2:应用 + +使用CLI执行: + + + +您应该看到在链上执行的一批交易,以及指示邮箱已更新的最终消息。 + +## 步骤3:确认 + +要使用Hyperlane CLI确认,请执行以下命令: + + + +运行`core read`后,您应该看到类似的配置,现在已更新的默认ISM: + +```yaml {6} +defaultHook: + address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" + type: "merkleTreeHook" +defaultIsm: + address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" + relayer: "0x0000000000000000000000000000000000000001" + type: "trustedRelayerIsm" +owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" +requiredHook: + address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" + beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + maxProtocolFee: "100000000000000000" + owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" + protocolFee: "0" + type: "protocolFee" +``` + +通过完成这些步骤,您已成功更新了邮箱默认ISM并增强了邮箱的安全性。您的邮箱现在已准备好用于生产环境。 \ No newline at end of file diff --git a/zh/docs/guides/production/prod-overview.mdx b/zh/docs/guides/production/prod-overview.mdx new file mode 100644 index 0000000..3e32800 --- /dev/null +++ b/zh/docs/guides/production/prod-overview.mdx @@ -0,0 +1,48 @@ +--- +title: "概述" +--- + +要将您的Hyperlane部署启动到生产环境中,请按照以下步骤设置您的链的核心部署并配置Hyperlane Warp路由(HWR)部署。 + +### 1. 核心部署 + +首先,您需要设置并生产化Hyperlane部署的核心组件。 + + + + 更新与邮箱合约关联的跨链安全模块(ISM)。ISM作为关键安全层,验证链之间的消息。确保默认ISM设置符合您的安全要求。 + + + 将邮箱合约的所有权转移到生产就绪的所有者账户。此步骤通过确保只有受信任的方控制其配置来保护邮箱。 + + + +### 2. HWR部署 + + + + 移除最初可能配置的任何测试或开发中继器。在生产环境中,确保只使用受信任的安全中继器以防止未授权的消息中继。 + + + +将HWR的所有权转移到指定的生产所有者。此步骤确保只有受信任的方控制关键的HWR设置,如ISM配置、验证器选项和中继器设置。 + + + + \ No newline at end of file diff --git a/zh/docs/guides/production/using-squads/alt-svm-using-sqauds.mdx b/zh/docs/guides/production/using-squads/alt-svm-using-sqauds.mdx new file mode 100644 index 0000000..cd1ae37 --- /dev/null +++ b/zh/docs/guides/production/using-squads/alt-svm-using-sqauds.mdx @@ -0,0 +1,60 @@ +--- +title: "Alt SVMs:使用Squads" +description: "在Alt SVMs上的Squads应用中执行和签署交易的分步指南" +--- + +## UI设置 + +主要的Squads UI不支持alt SVMs。请使用:[Squads备份应用](https://backup.app.squads.so/) + +### 1. 为Alt-SVM进行配置 + +**您必须配置它以使其与alt-SVM兼容!** + +转到**设置**并根据链使用以下设置: + + + + + - **RPC URL:** `https://mainnetbeta-rpc.eclipse.xyz` + - **Program ID:** + `eSQDSMLf3qxwHVHeTr9amVAGmZbRLY2rFdSURandt6f` + + + - **RPC URL:** `https://rpc.mainnet.soo.network/rpc` + - **Program ID:** + `Hz8Zg8JYFshThnKHXSZV9XJFbyYUUKBb5NJUrxDvF8PB` + + + - **RPC URL:** `https://api.mainnet-alpha.sonic.game/` + - **Program ID:** + `sqdsFBUUwbsuoLUhoWdw343Je6mvn7dGVVRYCa4wtqJ` + + + - **RPC URL:** `https://api.mainnet-beta.solana.com` _(可能需要私有RPC URL以获得更好的性能)_ + - **Program ID:** + `SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf` + + + + + + 请注意,这些配置保存在您的浏览器存储中,虽然它们在刷新后可能在UI中消失,但确实会持续存在。![svm squads](/images/docs/guides/squads/altvm-squads1.png) + + +### 2. 导入多重签名地址 + +对于此步骤,需要**多重签名账户**。您可以直接导入它,或使用**Vault地址**(代币所有者地址)搜索它。 + +![svm squads](/images/docs/guides/squads/altvm-squads2.png) + +## 提交交易 + +1. 您将从Abacus Works团队收到一个base58**消息**,该消息是执行步骤3所必需的。 +2. 转到**交易**选项卡,然后点击**导入交易**。 + ![altvm squads](/images/docs/guides/squads/altvm-squads3.png) +3. 将base58消息复制到UI中,然后点击**导入**。 +4. 刷新页面。您现在应该看到交易。 + ![altvm squads](/images/docs/guides/squads/altvm-squads4.png) +5. 确保**跟踪提议交易的索引/公钥**以及它们的作用。这样,签署者就知道他们正在签署什么。 + ![altvm squads](/images/docs/guides/squads/altvm-squads5.png) \ No newline at end of file diff --git a/zh/docs/guides/production/using-squads/using-squads-solana.mdx b/zh/docs/guides/production/using-squads/using-squads-solana.mdx new file mode 100644 index 0000000..57f019a --- /dev/null +++ b/zh/docs/guides/production/using-squads/using-squads-solana.mdx @@ -0,0 +1,32 @@ +--- +title: "在Solana上使用Squads" +description: "在Solana上的Squads应用中执行和签署交易的分步指南" +--- + +对于Solana,可以使用的主要UI:[Squads应用](https://app.squads.so/) + +## 步骤 + +1. 您将从Abacus Works团队收到一个base58交易,这是执行步骤3所必需的。 + +2. 在Squads中导航到**开发者 → TX构建器**,然后点击**导入base58编码的交易**。 + ![svm squads](/images/docs/guides/squads/svm-squads1.png) + +3. 将从Abacus Works团队收到的base58交易复制到文本框中。 + +4. 点击下一步,然后点击**添加指令**。 + ![svm squads](/images/docs/guides/squads/svm-squads2.png) + +5. 给它一个清晰的名称,然后点击**运行模拟**。 + ![svm squads](/images/docs/guides/squads/svm-squads3.png) + + 模拟应该成功! + +6. 当您准备将其提交到保险库时,点击**发起交易**。 + +7. 您将被提示使用Ledger通过Phantom签署大约5笔交易。 + +8. 您将被带到**交易**视图,您可能需要刷新。现在与其他签署者分享交易,让他们确认或拒绝。 + +9. 您可以模拟交易并点击**查看详情**来查看模拟交易的日志。🎉 您应该看到显示所有权已成功转移的日志! + ![svm squads](/images/docs/guides/squads/svm-squads4.png) \ No newline at end of file diff --git a/zh/docs/guides/production/warp-route-deployment/remove-trusted-relayer.mdx b/zh/docs/guides/production/warp-route-deployment/remove-trusted-relayer.mdx new file mode 100644 index 0000000..b90af3c --- /dev/null +++ b/zh/docs/guides/production/warp-route-deployment/remove-trusted-relayer.mdx @@ -0,0 +1,118 @@ +--- +title: "移除可信中继器" +--- + +import PrerequisitesPartial from "/snippets/warp-routes/prerequisites-config-symbol.mdx"; +import WarpReadSymbolChainPartial from "/snippets/warp-routes/warp-read-symbol-chain.mdx"; +import WarpApplySymbolConfigDefaultPartial from "/snippets/warp-routes/warp-apply-symbol-config-default.mdx"; + +本指南解释了如何使用Hyperlane CLI从您的Hyperlane Warp路由(HWR)中移除默认的可信中继器ISM。移除可信中继器ISM是为生产环境准备HWR的关键步骤。 + +## 使用Hyperlane CLI + +当首次使用CLI部署时,新的HWR开箱即用地使用可信中继器ISM,因此您无需运行中继器或验证器。 + +为了进入生产环境,您需要使用[Hyperlane CLI](/zh/docs/reference/developer-tools/cli)移除此ISM。 + + + + + 如果您遵循了[部署Warp路由](/zh/docs/guides/quickstart/deploy-warp-route)指南,您很可能已部署了一个可信中继器设置为签名者地址的HWR。 + + +要使用Hyperlane CLI确认,请找到您的代币符号及其部署的链: + + + +然后您可以选择要移除可信中继器的HWR。 + +运行`warp read`后,您应该在`interchainSecurityModule`下看到包含`trustedRelayerIsm`的类似配置: + +```yaml {7-9} +yourchain: + ... + interchainSecurityModule: + address: "0xd54d32cD6a62482497252D59E6cCC1445fF0b92d" + type: "staticAggregationIsm" + modules: + - address: "0x50b6dA835D9b8b20523891410a2E042855B465C8" + relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + type: "trustedRelayerIsm" + - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + address: "0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc" + type: "defaultFallbackRoutingIsm" + domains: {} + threshold: 1 +``` + +这个特定配置有一个`trustedRelayerIsm`作为`staticAggregationIsm`的一部分。 + +这意味着`relayer`地址将被允许调用HWR的`handle()`函数。换句话说,`relayer`可以在HWR上执行任意消息。这在自中继功能之外的情况下可能是不可取的。 + +默认情况下,`warp read`将输出保存到`CURRENT_DIR/configs/warp-route-deployment.yaml`。按照这些步骤使用CLI将现有所有权转移到另一个地址。 + +## 步骤1:配置 + +通过从`modules`中**移除**`trustedRelayerIsm`块来更新`warp-route-deployment.yaml`。或者,您可以根据需要配置整个`modules`块。 + +```diff title="warp-route-deployment.yaml" +yourchain: + mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9' + owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + interchainSecurityModule: + address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' + type: 'staticAggregationIsm' + modules: +- - address: '0x50b6dA835D9b8b20523891410a2E042855B465C8' +- relayer: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' +- type: trustedRelayerIsm + - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' + type: 'defaultFallbackRoutingIsm' + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native + +``` + +## 步骤2:应用 + +使用CLI执行: + + + +您应该看到在链上执行的一批交易,以及指示warp配置已更新的最终消息。 + +## 步骤3:确认 + +要使用Hyperlane CLI确认可信中继器已成功移除,请使用您的代币符号及其部署的链运行以下命令: + + + +运行`warp read`后,确认可信中继器ISM已从您的HWR中移除(在此示例中,它应该只包含剩余的`defaultFallbackRoutingIsm`)。您应该在`interchainSecurityModule`下看到类似的配置: + +```yaml {8-11} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + interchainSecurityModule: + address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" + type: "staticAggregationIsm" + modules: + - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" + type: "defaultFallbackRoutingIsm" + domains: {} + threshold: 1 + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + type: "native" +``` + +通过完成这些步骤,您已成功从HWR中移除了可信中继器ISM并增强了HWR设置的安全性。您的HWR现在已准备好用于生产环境。 \ No newline at end of file diff --git a/zh/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx b/zh/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx new file mode 100644 index 0000000..cb30fd4 --- /dev/null +++ b/zh/docs/guides/production/warp-route-deployment/transfer-warp-route-ownership.mdx @@ -0,0 +1,123 @@ +--- +title: "转移所有权" +--- + +import PrerequisitesPartial from "/snippets/warp-routes/prerequisites-config-symbol.mdx"; +import WarpReadSymbolChainPartial from "/snippets/warp-routes/warp-read-symbol-chain.mdx"; +import WarpApplySymbolConfigDefaultPartial from "/snippets/warp-routes/warp-apply-symbol-config-default.mdx"; + +本指南提供了转移Hyperlane Warp路由(HWR)所有权的分步指南。它还解释了拥有HWR所带来的责任、安全考虑和配置选项。 + +## HWR所有权概述 + +在转移HWR所有权之前,了解此所有权的含义很重要。所有权授予对配置设置的控制权,例如跨链安全模块(ISM)、验证器选项以及对安全至关重要的其他参数。 + + + 一旦在链上设置了邮箱,任何人都可以部署HWR。HWR通常由几个不同的群体部署——Abacus Works团队、资产发行方、链团队或应用程序团队。 + + +### 所有权概述 + +- **责任**:作为所有者,您承担的责任包括管理安全配置,如ISM和验证器设置,以满足您特定的安全和运营目标。 +- **安全与自主权**:所有权选择通常归结于安全和控制偏好。我们强烈建议对任何生产设置使用多重签名,如Gnosis Safe。团队可以选择**完全所有权**以获得完全自主权,或在多重签名上选择**联合所有权**以共享安全管理。联合所有权允许在关键更新上进行协作决策,这可以增加用户和开发者的信任。 + +### ISM、验证器和中继器选项 + +在配置或转移HWR时,所有者在管理ISM、验证器和中继器设置方面具有灵活性: + +- **ISM自定义**:每个HWR可能需要根据安全需求定制ISM配置。所有者可以设置自定义ISM或使用Hyperlane的默认设置。 +- **验证器选项**:所有权允许您选择或管理您的验证器集。Hyperlane默认可以处理验证器责任,使运行自己的验证器成为可选项。 +- **中继器支持**:Hyperlane默认提供中继器服务,但团队可以操作自己的中继器以获得对安全、可靠性和成本的更多控制。此自定义使团队能够定制消息处理以满足特定的性能、合规或运营要求。 + +## HWR所有权转移指南 + +### 使用Hyperlane CLI + +转移HWR所有权的最快方法之一是使用[Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli)。 + + + + + 如果您遵循了[部署Warp路由](/zh/docs/guides/quickstart/deploy-warp-route)指南,您可能已部署了一个所有者设置为单个私钥的HWR。在生产环境中,建议使用多重签名。 + + +要使用Hyperlane CLI确认,请找到您的代币符号及其部署的链: + + + +您应该能够选择要更新所有权的HWR。 + +运行`warp read`后,您应该看到类似的配置,其中`owner`设置为私钥地址: + +```yaml {3} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ... +``` + +默认情况下,`warp read`将输出保存到`CURRENT_DIR/configs/warp-route-deployment.yaml`。按照这些步骤使用CLI将现有所有权转移到另一个地址。 + +## 步骤1:配置 + +在`warp-route-deployment.yaml`中更新`owner`地址 + +```diff title="warp-route-deployment.yaml" +yourchain: + mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9' +- owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' ++ owner: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' + IInterchainSecurityModule: + address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' + type: staticAggregationIsm + modules: + - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' + address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' + type: defaultFallbackRoutingIsm + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native + +``` + +## 步骤2:应用 + +使用CLI执行,提供代币符号和HWR配置: + + + +您应该看到在链上执行的一批交易,以及指示warp配置已更新的最终消息。 + +## 步骤3:确认 + +要使用Hyperlane CLI确认所有者已成功更新,请使用您的代币符号及其部署的链运行以下命令: + + + +运行`warp read`后,您应该看到类似的配置,现在已更新的`owner`: + +```yaml {3} +yourchain: + mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" + owner: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" + IInterchainSecurityModule: + address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" + type: staticAggregationIsm + modules: + - owner: "0xe738d6e51aad88F6F4ce6aB8827279cffFb94876" + address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" + type: defaultFallbackRoutingIsm + domains: {} + threshold: 1 + name: Ether + symbol: ETH + decimals: 18 + totalSupply: 0 + type: native +``` + +通过完成这些步骤,您已成功转移并验证了HWR所有权到新地址。 \ No newline at end of file diff --git a/zh/docs/guides/quickstart/deploy-warp-route.mdx b/zh/docs/guides/quickstart/deploy-warp-route.mdx new file mode 100644 index 0000000..218f364 --- /dev/null +++ b/zh/docs/guides/quickstart/deploy-warp-route.mdx @@ -0,0 +1,161 @@ +--- +title: "桥接代币" +--- + + + **本指南适用于基于 EVM 的链。** 对于其他环境,请查看: +- [SVM Hyperlane Warp 路由指南](/zh/docs/guides/warp-routes/svm/svm-warp-route-guide) +- [EVM ↔ SVM Hyperlane Warp 路由指南](/zh/docs/guides/warp-routes/evm-svm-warp-route-guide) + + + +本节提供了通过部署 Hyperlane Warp 路由(HWR)合约创建跨链代币桥的分步演练。 + +## 先决条件 + +- [Hyperlane CLI](/zh/docs/reference/developer-tools/cli) +- 用于合约交易签名的私钥 + +## 1. 配置 + +### HWR 部署配置 + +要部署路由,您需要一个 HWR 部署配置文件。有效的配置将指定: + +- 此 HWR 是为哪个链上的哪个代币创建的? +- _可选:_ Hyperlane 连接详细信息,例如[邮箱](/zh/docs/reference/addresses/deployments/mainnet/mailbox)、[跨链 Gas](/zh/docs/reference/hooks/interchain-gas) 和[跨链安全模块](/zh/docs/protocol/ISM/modular-security#core-concepts)的合约地址。 +- _可选:_ 代币标准,包括 ERC20(可替代代币)、ERC721(NFT)和 ERC4626(收益代币)。请注意,ERC721 支持是实验性的,一些 Hyperlane 工具还无法用于 NFT。 + +创建 HWR 部署配置文件最简单的方法是使用 CLI 的配置命令: + +``` +hyperlane warp init +``` + +此命令提供一个演练,直接在终端中提示您进行配置选择。您将被要求为配置的每个部分选择特定选项,例如网络类型、要连接的链、代币类型以及是否使用受信任的 ISM。 + + + +- 如果您的配置看起来正确,现在可以跳转到[步骤 2:部署](#2-deployment)。或者查看下面的详细信息,了解如何手动定义配置。 +- 如果您需要设置代币桥的任何帮助,请在 Discord 的 #developers 频道联系我们或[取得联系](https://forms.gle/KyRTaWvo4XNmNvrq6)。 + + + +#### 部署配置架构 + +您的配置包含链名称到部署配置的映射。每个配置设置关于您要为其创建 HWR 的代币的详细信息。 + +- **type**: + + - 设置为 `collateral` 以为 ERC20/ERC721 代币创建基本 HWR + - 设置为 `collateralVault` 以为 ERC20 代币创建收益 HWR,该代币存入现有的 ERC4626 资金库 + - 设置为 `native` 以为原生代币(例如以太币)创建 HWR + +- **address:** + + - 如果使用 `collateral`,要为其创建路由的 ERC20/ERC721 合约地址 + - 如果使用 `collateralVault`,要将抵押品存入的现有 ERC4626 资金库地址 + +- **isNft:** 如果为 ERC721 合约使用 `collateral`,设置为 `true`。 + +#### 可选字段[​](#optional-fields "Direct link to Optional fields") + +您可以在配置条目中指定以下可选值。如果未提供值,部署者将尝试从其他地方获取这些值。对于元数据(符号、名称、小数位),它将查询合约。对于地址(mailbox、ISM),它将检查注册表,您的注册表(如果提供)或[默认注册表](/zh/docs/reference/registries#default-registry)。 + +- **symbol:** 代币符号 +- **name:** 代币名称 +- **decimals:** 代币的小数位数 +- **mailbox:** 用于发送和接收消息的[邮箱](/zh/docs/reference/addresses/deployments/mainnet/mailbox)合约地址 +- **interchainSecurityModule:** 用于验证跨链消息的[跨链安全模块](/zh/docs/protocol/ISM/modular-security#core-concepts)地址 + +#### 示例[​](#example "Direct link to Example") + +有关使用本地 anvil 链的最小 Warp 部署配置示例,请参见 [`warp-route-deployment.yaml`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/warp-route-deployment.yaml)。 + + + * 在以下部分了解更多关于 HWR 类型和不同配置的信息: + + * [HWR 类型](/zh/docs/protocol/warp-routes/warp-routes-types) + * [HWR 示例用法](/zh/docs/protocol/warp-routes/warp-routes-example-usage) + + + +### 链配置 + +部署将需要关于任何将与其交互的链的基本信息。如果目标链不在 [Hyperlane 注册表](https://github.com/hyperlane-xyz/hyperlane-registry)中,您必须为它们指定链元数据。有关详细信息,请参见 [CLI 参考](/zh/docs/reference/developer-tools/cli)。 + +要查看当前已知的链,运行以下命令: + +``` +hyperlane registry list +``` + +要为任何其他链创建链元数据配置,运行以下命令: + +``` +hyperlane registry init +``` + +或者您可以手动定义配置。有关其架构,请参见 [ChainMetadata 类型](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts#L62)。有关示例,请参见 [chain-config.yaml](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml)。 + + + 尽可能确保在您的 HWR 配置中**重用注册表/CLI 中的任何现有链**,而不是设置新的邮箱。 + + +## 2. 部署 HWR + +配置准备就绪后,使用以下命令启动 HWR 部署: + +``` +hyperlane warp deploy +``` + +在部署期间,CLI 需要访问您的私钥来签署交易。您可以通过以下两种方式之一设置: + +1. **环境变量**:将您的私钥设置为 HYP_KEY 以避免每次都输入: + + ``` + export HYP_KEY= + ``` + +2. **手动输入**:或者,您可以在部署期间提示时直接输入私钥。 + +`hyperlane warp deploy` 命令将创建两个新的构件文件: + +1. `otherchain-yourchain-addresses.yaml`:包含新部署的 HWR 合约地址。 +2. `otherchain-yourchain-config.yaml`:用于通过 CLI 和 Warp UI 与 HWR 交互的配置文件。 + +这些文件将位于 `$HOME/.hyperlane/deployments/warp_routes/` 下。 + +3. 测试 + +您可以使用以下命令启动单个 wei 的测试转移: + +``` +hyperlane warp send --relay --symbol TOKEN +``` + +`--relay` 标志是可选的,将消息中继到目标链。 + +您还可以在后台运行仅为您的 HWR 传递的中继器: + +``` +hyperlane relayer --symbol TOKEN +``` + +您可以在设置 HWR 的任一方向上进行测试。但是,如果您部署了 `native` 或 `collateral` HWR,您必须选择与部署该 `native` 或 `collateral` 类型相对应的源。默认情况下,发送的数量是代币最小单位的 `1`。 + + + **下一步** + +- 如果您正在遵循[将 Hyperlane 部署到新链](/zh/docs/guides/chains/deploy-hyperlane#3-warp-route)指南并希望连接其他链或与 Abacus Works 一起进入生产环境,请继续[提交到注册表](/zh/docs/guides/chains/deploy-hyperlane#4-submit-to-registry)指南。 + +- 有关通过 UI 与 HWR 交互,请继续查看 [Warp UI 文档](/zh/docs/guides/warp-routes/bridge-ui-guide)。 + + + +## 了解更多 + +- 查看 [HWR](/zh/docs/applications/warp-routes/overview) 参考页面,了解有关 HWR 接口和安全影响的更多信息。[接口](/zh/docs/applications/warp-routes/overview#interface)部分涵盖调用 `transferRemote` 将代币转移到目标链上的指定接收者。请注意,在调用 `transferRemote` 之前,您必须提示进行代币批准。 + +- HWR 是一种[路由器](/zh/docs/reference/developer-tools/libraries/router)应用程序,这是一种使您能够跨链链接多个合约的模式。 \ No newline at end of file diff --git a/zh/docs/guides/quickstart/local-testnet-setup.mdx b/zh/docs/guides/quickstart/local-testnet-setup.mdx new file mode 100644 index 0000000..d044783 --- /dev/null +++ b/zh/docs/guides/quickstart/local-testnet-setup.mdx @@ -0,0 +1,161 @@ +--- +title: "本地设置:在 Anvil 节点间发送消息" +description: "本指南将引导您使用 Hyperlane CLI 在两个本地 Anvil 节点之间发送跨链消息。" +--- + +## 前置条件[​](#prerequisites "直接链接到前置条件") + +- **[Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli):** 确保您已安装最新版本的 Hyperlane CLI。 + + ``` + npm install -g @hyperlane-xyz/cli + ``` + +- **[Anvil (foundry)](https://book.getfoundry.sh/getting-started/installation):** 用于运行本地链。通过以下命令安装: + + ``` + curl -L https://foundry.paradigm.xyz | bash + ``` + +- **Node.js** (v18 或更高版本) + +- **部署钱包私钥**:您需要一个有资金的钱包来部署合约。这将用作 HYP_KEY。 + + ``` + export HYP_KEY= + ``` + +## 分步指南[​](#step-by-step-guide "直接链接到分步指南") + +### 1. 环境设置 + +为 Hyperlane 配置创建工作目录:[​](#1-environment-setup-create-a-working-directory-for-the-hyperlane-configuration "直接链接到 1. 环境设置:为 Hyperlane 配置创建工作目录:") + +``` +mkdir hyperlane-local-test && cd hyperlane-local-test +``` + +### 2. 启动两个不同的 Anvil 节点[​](#2-start-two-distinct-anvil-nodes "直接链接到 2. 启动两个不同的 Anvil 节点") + +我们将运行两个具有唯一链 ID 的 Anvil 节点。 + +- 在第一个终端中,启动第一个 Anvil 节点: + + ``` + anvil --port 8545 --chain-id 31337 --block-time 1 + ``` + + - 运行在 `http://localhost:8545`。 + - 链 ID:`31337`。 + +- 在新终端中,启动第二个 Anvil 节点: + + ``` + anvil --port 8546 --chain-id 31338 --block-time 1 + ``` + + - 运行在 `http://localhost:8546`。 + - 链 ID:`31338`。 + +### 3. 初始化 Hyperlane Registry (注册表)[​](#3-initialize-the-hyperlane-registry "直接链接到 3. 初始化 Hyperlane Registry") + +在新终端中,使用 Hyperlane CLI 为两个 Anvil 节点创建配置: + +``` +hyperlane registry init +``` + +按照提示设置 `anvilnode1`。CLI 会询问您的链详细信息,包括 chainId 和 RPC URLs。对 `anvilnode2` 重复此过程。 + +此过程将在 `$HOME/.hyperlane/chains/anvilnode1` 和 `$HOME/.hyperlane/chains/anvilnode2` 下创建 `metadata.yaml` 文件。 + +元数据示例: + +- **anvilnode1** + +``` +chainId: 31337displayName: Anvilnode1domainId: 31337isTestnet: truename: anvilnode1nativeToken: decimals: 18 name: ETH symbol: ETHprotocol: ethereumrpcUrls: - http: http://localhost:8545 +``` + +- **anvilnode2** + +``` +chainId: 31338displayName: Anvilnode2domainId: 31338isTestnet: truename: anvilnode2nativeToken: decimals: 18 name: ETH symbol: ETHprotocol: ethereumrpcUrls: - http: http://localhost:8546 +``` + +### 4. 部署核心合约[​](#4-deploy-core-contracts "直接链接到 4. 部署核心合约") + +我们将配置并部署 Hyperlane 核心合约。 + + + 您需要部署钱包私钥来部署核心合约。您可以使用 `export HYP_KEY=''` 将私钥设置为环境变量。 + + +``` +hyperlane core init +``` + +部署配置将保存到 `./configs/core-config.yaml`。 + +接下来,部署核心合约: + +``` +hyperlane core deploy +``` + +按照提示选择 `anvilnode1`。CLI 将部署 Mailbox (消息邮箱)、Interchain Security Modules (跨链安全模块) 和其他必需的合约。对 `anvilnode2` 重复此过程。 + +完成后,您将在 `$HOME/.hyperlane/chains/anvilnode1` 和 `$HOME/.hyperlane/chains/anvilnode2` 中找到 `addresses.yaml`,其中包含已部署的合约地址。 + + + 您应该能够在运行本地节点的终端中看到合约部署的消息。 + + +### 5. 发送测试消息[​](#5-send-a-test-message "直接链接到 5. 发送测试消息") + +使用 Hyperlane CLI 从 `anvilnode1` 向 `anvilnode2` 发送消息。 + +``` +hyperlane send message --relay +``` + +CLI 将提示您提供源链(`anvilnode1`)和目标链(`anvilnode2`)。 + + + 对于本地测试,`--relay` 标志会自动将消息中继到目标链。 + + +发送消息后,检查以下内容: + +- Validator (验证器) 日志:查找表明已生成并存储签名的条目。 +- Relayer (中继器) 日志:查找成功的元数据检索和消息处理。 +- Anvil 日志:确保区块已挖掘以处理交易。 + + + 🎉 您已成功使用 Hyperlane 在两个本地 Anvil 节点之间发送了消息! + + +## 故障排除[​](#troubleshooting "直接链接到故障排除") + +1. "Could not fetch metadata" 警告: + + - **原因:** 当 relayer (中继器) 无法检索处理消息所需的 validator (验证器) 签名时发生。常见原因: + + - validator (验证器) 密钥缺乏测试网资金。 + - validator (验证器) 尚未宣布其存储位置。 + + - **解决方案:** + + - 确保 validators (验证器) 已宣布其存储位置。检查 validator (验证器) 日志中的消息,如:`Validator has announced signature storage location, locations: ["file:///tmp/hyperlane-validator-signatures-local"].` + - 验证每个 validator (验证器) 都有唯一的签名存储路径(`--checkpointSyncer.path`)以防止覆盖。 + - 确认 relayer (中继器) 对存储路径具有读取权限。 + +2. 消息超时: + + - **原因:** Anvil 默认不自动挖掘区块,导致 validators (验证器) 或 relayers (中继器) 无限期等待新区块。 + - **解决方案:** 确保在启动 Anvil 时使用 `--block-time 1` 标志,以每秒自动挖掘区块。 + +3. Validator (验证器) 不匹配或配置错误: + + - **原因:** 目标链上的 ISM 配置与源链使用的 validator (验证器) 密钥不匹配。 + - **解决方案:** 检查 ISM 配置是否包含正确的 validator (验证器) 地址。Validator (验证器) 日志可帮助识别已宣布的地址。 \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/bridge-ui-guide.mdx b/zh/docs/guides/warp-routes/bridge-ui-guide.mdx new file mode 100644 index 0000000..4756c22 --- /dev/null +++ b/zh/docs/guides/warp-routes/bridge-ui-guide.mdx @@ -0,0 +1,138 @@ +--- +title: "为您的 HWR 部署 Bridge UI (跨链桥用户界面)" +--- + +在您成功[部署 Hyperlane Warp Route (HWR) (跨链资产路由)](/zh/docs/guides/quickstart/deploy-warp-route)后,您有两个现成的选项来设置前端 UI 以支持跨链代币转账: + +1. **[Fork、自定义并部署 Hyperlane Warp UI 模板](#fork--customize-the-ui)** +2. **[使用托管的 Superbridge 实例](#superbridge)** + +## 1. Hyperlane Warp UI 模板 + +[Hyperlane Warp UI 模板](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template) 是一个预构建的 Next.JS 应用,您可以轻松自定义和部署。 + +- **配置**:按照[配置说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/README.md)了解如何配置 Warp UI Web 应用程序并在本地运行的详细信息。 +- **自定义**:按照[自定义说明](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/CUSTOMIZE.md)了解如何配置 UI 的代币并更改默认品牌资产/主题的详细信息。 + +### Registry (注册表) + +默认情况下,应用程序将使用发布在 NPM 上的规范 Hyperlane registry (注册表)。要使用不同的 registry (注册表),您可以使用 `NEXT_PUBLIC_REGISTRY_URL` 环境变量设置 URL。 + +### HWR 配置示例 + +以下是连接 Sepolia 上的 USDC 到 Alfajores 的 HWR 配置示例。您可以使用 Typescript 或 YAML 作为路由配置。 + +```typescript +{ + tokens: [ + { + // 代币的 ChainName + chainName: "sepolia", + // 参见 https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/token/TokenStandard.ts + standard: TokenStandard.EvmHypCollateral, + // 代币元数据(decimals、symbol、name) + decimals: 6, + symbol: "USDC", + name: "USD Coin", + // 路由器地址 + addressOrDenom: "YOUR_ROUTER_ADDRESS_1", + // 底层抵押代币的地址 + collateralAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", + // 代币标志图像的路径 + logoURI: "/logos/usdc.png", + // 此代币连接到的代币列表 + connections: [{ token: "ethereum|alfajores|YOUR_ROUTER_ADDRESS_2" }], + }, + { + chainName: "alfajores", + standard: TokenStandard.EvmHypSynthetic, + decimals: 6, + symbol: "USDC", + name: "USD Coin", + addressOrDenom: "YOUR_ROUTER_ADDRESS_2", + logoURI: "/logos/usdc.png", + connections: [{ token: "ethereum|alfajores|YOUR_ROUTER_ADDRESS_2" }], + }, + ]; +} +``` + +#### 链配置示例 + +链元数据也可以根据需要进行配置。这些配置与 CLI 用于其任何部署或发送命令的配置相同(例如,来自[部署指南](/zh/docs/guides/chains/deploy-hyperlane)的配置)。 + +```typescript +{ +anvil1: { + chainId: 31337, + name: 'anvil1', + displayName: 'Anvil 1 Local', + nativeToken: { name: 'Ether', symbol: 'ETH', decimals: 18 }, + publicRpcUrls: [{ http: 'http://127.0.0.1:8545' }], + blocks: { + confirmations: 1, + reorgPeriod: 0, + estimateBlockTime: 10, + }, + logoURI: '/logo.svg' + } +} +``` + +### 部署 UI + +由于 UI 是一个 Next.js 应用程序,您可以使用您喜欢的托管服务来托管它。我们推荐 [Vercel](https://vercel.com),它与 Next 配合得很好。[AWS Amplify](https://aws.amazon.com/amplify) 是另一个流行的选择。 + +1. 注册 [Vercel](https://vercel.com/) +2. 创建新项目并将其连接到您的 GitHub 仓库 +3. 点击 Deploy! + +就是这样!现在您和您的用户可以使用 UI 将代币从抵押链发送到远程链、从一个远程链发送到另一个远程链,以及从任何远程链发送回抵押链。 + + +如果这些链没有运行生产 relayer (中继器),您可以在后台运行一个轻量级 CLI relayer (中继器),仅为您的 HWR 提供服务: + +```bash +hyperlane relayer --symbol TOKEN +``` + +这将允许您在本地测试 warp UI 或进行快速演示,而无需在云中运行完整的生产 relayer (中继器)。 + + + +### Return gas (返回 gas) + +像 HWRs 这样的代币桥接器的一个常见问题是,用户可能将 USDC 等代币转移到新链上,但之后才意识到他们没有原生 gas 代币来移动这些代币到任何地方,包括返回。 + +为了改善用户体验,您可以通过 faucet (水龙头) 提供一些原生 gas 代币,此外还有 UI 警告。要创建 faucet (水龙头),请修改 HWR 合约以持有原生代币余额与接收者共享。 + + + 对于希望进一步自定义 Warp UI 用于自己项目或构建自己的跨链应用程序的开发者,我们鼓励您探索 Typescript SDK。SDK 包含越来越多的实用程序和抽象,用于在不同协议(EVM、Cosmos、Solana)之间与 Hyperlane 交互。 + + +## 2. Superbridge + +[Superbridge](https://superbridge.app) 是一个自定义桥接提供商,他们为数百个 rollups、各种代币和不同生态系统管理桥接前端。 + +为您的 HWR 获得托管的 Superbridge 是运营您的桥接器的无忧方法。他们最受欢迎的一些 Hyperlane 驱动的桥接器包括 [Renzo 的 ezETH bridge](https://renzo.superbridge.app) 和 [Elixir 的 deUSD bridge](https://elixir.superbridge.app)。通过托管桥接实例,Superbridge 将为您的 HWR 处理托管、主题化、升级和用户支持请求。 + +他们还构建了一个便捷功能,允许对最近部署的 HWRs 进行自助测试。 + +### 测试您的 HWR + +1. 导航至 [Superbridge Hyperlane Playground](https://hyperlane.superbridge.app) +2. 点击设置齿轮,然后点击 Customize ![](/images/docs/guides/deploy-warp-ui/superbridge-settings.png) +3. 粘贴您在部署 HWRs 时生成的 YAML 文件 ![](/images/docs/guides/deploy-warp-ui/superbridge-paste-yaml.png) +4. 指定的代币和网络现在将可用于桥接。 + + + 如果在您粘贴 YAML 文件后任何代币或网络丢失,可能是 Superbridge 尚不支持此网络上的 Hyperlane。[联系](mailto:support@superbridge.app) Superbridge 了解添加支持的时间表。 + + +### 桥接 Widget (小部件) + +除了托管 UI 外,Superbridge 还提供桥接 widget (小部件),因此您可以将桥接器嵌入到自己的网站中。查看他们的 [Widget Demos](https://widget-demos.superbridge.app/) 网站,了解所有可用配置选项的概述。 + +### 投入生产 + +要通过 Superbridge 将您的 HWR 投入生产,[联系 Superbridge 团队](mailto:alex@superbridge.app)。他们通常可以在大约一天内启动并运行前端。 \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm-svm-warp-route-guide.mdx b/zh/docs/guides/warp-routes/evm-svm-warp-route-guide.mdx new file mode 100644 index 0000000..9d4c878 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm-svm-warp-route-guide.mdx @@ -0,0 +1,137 @@ +--- +title: "部署 EVM <-> SVM HWR" +--- + +## 前置条件 + +确保您已安装并配置以下工具: + +- [Hyperlane CLI](/zh/docs/reference/developer-tools/cli) +- Rust (最新稳定版本) +- Yarn 和 Node.js (最新稳定版本) +- Solana CLI 工具 + +## 操作步骤 + +### 步骤 1:创建 HWR 目录 + +1. 在 `./rust/sealevel/environments/${environment}` 中,创建一个名为 `warp-routes` 的目录 +2. 在 `warp-routes` 内,为您的 HWR 部署创建一个新目录,例如 `environments/mainnet3/warp-routes/pzeth` +3. **可选:** 如果需要,向 `hyperlane-registry` 提交 PR,添加与 HWR 中的合成代币关联的元数据。示例[在此](https://github.com/hyperlane-xyz/hyperlane-registry/pull/142)。 + + - **提示:** 虽然不是必需的,但对于 `image` 字段,尽量选择不太可能破坏 URL 的来源 + +### 步骤 2:在 SVM 端部署 + +4. 从这里开始,要在 SVM 端部署,您也可以按照我们的官方指南获取提示:[部署 SVM HWR](https://docs.hyperlane.xyz/docs/guides/warp-routes/svm/svm-warp-route-guide) +5. 为 SVM 配置创建 `token-config.json`,例如 + + ```bash + { + "solana": { + "type": "synthetic", + "decimals": 9, + "name": "Renzo Restaked LST", + "symbol": "pzETH", + "uri": "", + "interchainGasPaymaster": "5FG1TUuhXGKdMbbH8uHEnUghazD4aVfEPAgKLNGNx3SL", + "remoteDecimals": 18 + } + } + ``` + + - 通常 EVM 代币有 18 位小数,这对 SVM 来说太大了。模式是使用 `remoteDecimals: 18` 将它们作为 9 位小数桥接到 SOL。 + +6. 运行部署命令: + + ```bash + cargo run -- -k ~/solana-mainnet-deployer-keypair.json warp-route deploy \ + --warp-route-name pzeth \ + --environment mainnet3 \ + --environments-dir ../environments \ + --built-so-dir ../../target/deploy \ + --token-config-file ../environments/mainnet3/warp-routes/pzeth/token-config.json \ + --chain-config-file ../environments/mainnet3/chain-config.json \ + --ata-payer-funding-amount 50000000 + ``` + +### 步骤 3:在 Ethereum 端部署 + +7. 部署 Ethereum HWR 合约,这也将基于 yaml 代币配置注册 SVM 路由器。 + + 1. 确保您有最新版本的 [Hyperlane CLI](/zh/docs/reference/developer-tools/cli)。 + 2. 使用 CLI 的配置命令创建 HWR 部署配置文件:`hyperlane warp init ` + + 该命令提供了一个操作步骤,直接在终端中提示您进行配置选择。 + 使用以下步骤进行 HWR 配置。您可以在操作过程中输入,也可以直接在生成的 YAML 配置文件中输入。 + + - 为 SVM 链手动设置 `foreignDeployment: `,如下面的配置示例所示。 + - 设置 `interchainSecurityModule: "0x0000000000000000000000000000000000000000"` 以使用目标链 Mailbox 中设置的默认 ISM + - 将 `gas` 设置为您期望 SVM 消息传递交易所需计算单元的上限。例如,HWRs 的 gas 设置为 `300`。这很重要,必须是上限 - 否则 relayer (中继器) 不会传递 HWR 转账消息,因为发送者支付的金额不足以传递它们。 + + ```json + ethereum: + interchainSecurityModule: "0x0000000000000000000000000000000000000000" + isNft: false + mailbox: "0xc005dc82818d67AF737725bD4bf75435d065D239" + owner: "0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba" + token: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + type: collateral + gas: 300000 + eclipsemainnet: + foreignDeployment: "D6k6T3G74ij6atCtBiWBs5TbFa1hFVcrFUSGZHuV7q3Z" + mailbox: "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y" + owner: "9bRSUPjfS3xS6n5EfkJzHFTRDa4AHLda8BU2pP4HoWnf" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" + type: synthetic + gas: 300000 + ``` + + 3. 使用 Hyperlane CLI 部署:`hyperlane warp deploy ` + 4. 确认部署: + ```bash + $ cast call 0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4 'routers(uint32)(bytes32)' $DESTINATION_DOMAIN --rpc-url $(rpc ethereum) 1399811149 + 0xe9792265ec273ffc17731af890d3e9963e9d744e7b99f02491911ce1bb75b8cb + ``` + +### 步骤 4:更新 SVM token-config.json + +8. 回到 Solana 工具,使用外部部署更新 `token-config.json`: + + - `ethereum` 的字段应设置为来自 HWR 合约 artifact 的值。 + - `token` 应设置为 `collateralAddressOrDenom`(被桥接的代币地址) + - `foreignDeployment` 应设置为 `addressOrDenom`(HWR 合约的地址,如 `HypERC20Collateral`)。 + + ```bash + { + "solana": { + "type": "synthetic", + "decimals": 9, + "name": "Renzo Restaked LST", + "symbol": "pzETH", + "uri": "", + "interchainGasPaymaster": "5FG1TUuhXGKdMbbH8uHEnUghazD4aVfEPAgKLNGNx3SL", + "remoteDecimals": 18 + }, + "ethereum": { + "type": "collateral", + "decimals": 18, + "token": "0x8c9532a60e0e7c6bbd2b2c1303f63ace1c3e9811", + "foreignDeployment": "0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4" + } + } + ``` + +### 步骤 5:部署 + +9. 运行最终部署命令: + +```bash +cargo run -- -k ~/solana-mainnet-deployer-keypair.json warp-route deploy \ +--warp-route-name pzeth \ +--environment mainnet3 \ +--environments-dir ../environments \ +--built-so-dir ../../target/deploy \ +--token-config-file ../environments/mainnet3/warp-routes/pzeth/token-config.json \ +--chain-config-file ../environments/mainnet3/chain-config.json \ +--ata-payer-funding-amount 50000000 \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes.mdx b/zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes.mdx new file mode 100644 index 0000000..178d369 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/deploy-multi-collateral-warp-routes.mdx @@ -0,0 +1,71 @@ +--- +title: "部署 HWR 2.0" +--- + +本指南将指导您如何使用 Hyperlane Warp Routes 2.0 创建多抵押代币桥接器,允许资产从多个链而不是单一来源链获取。 + + + - 有关 Hyperlane Warp Routes 2.0 的入门知识,请查看:[Hyperlane Warp + Routes 2.0](/zh/docs/applications/warp-routes/multi-collateral-warp-routes) + + +## 前置条件 + +要完成本操作步骤,您应该具备以下条件: + +1. 两个抵押链和一个您选择的合成链,您希望在它们之间部署 Hyperlane Warp Route 2.0。确保在链上有一些资金来支付部署 gas 费用。 +2. 用作抵押的代币。 +3. 已安装的 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli) 实例和设置为 `HYP_KEY` 环境变量的钱包私钥,在您的源网络和目标网络上有资金。 + +## 部署您的 Hyperlane Warp Route 2.0 + +### 1. 创建您的 Hyperlane Warp Route 配置 + +1. 使用 Hyperlane CLI 初始化 Hyperlane Warp Route 部署文件: + +`hyperlane warp init` + +此命令提供操作步骤,直接在终端中提示您进行配置选择。 + +您的设置应该如下所示: + +- 选择三个网络:为两个源网络选择 `collateral`,为目标网络选择 `synthetic`。 +- 输入代币地址、代理管理合约,并选择是否要使用受信任的 ISMs。 + +做出选择后,CLI 将在 `./configs/warp-route-deployment.yaml` 生成 Hyperlane Warp Route 配置文件。 + +### 2. 部署您的 Hyperlane Warp Routes 2.0 + +配置就绪后,您可以使用以下命令启动 Hyperlane Warp Route 部署: + +`hyperlane warp deploy` + +在部署过程中,CLI 需要访问您的私钥来签署交易。您可以在提示时输入或将您的私钥设置为 `HYP_KEY`。确保您的钱包在所有相关链上都有足够的资金来支付部署的 gas 成本。 + +### 3. 测试 + +您可以使用以下命令启动测试转账: + +`hyperlane warp send --symbol TOKEN` + +CLI 将提示您: + +- 选择匹配的 Hyperlane Warp Route +- 选择源链和目标链 + + + 在两个 `collateral` 链之间发送时,确保目标链上有足够的抵押品来完成转账。合成代币在目标链上铸造。在抵押路由中,代币必须已经存在于目标链上才能被释放。 + + +它将运行检查并发送消息。您将获得: + +- 交易链接(例如,BaseScan) +- 消息 ID 和浏览器链接 +- 处理完成后的确认 + + + 🎉 **恭喜!** 您已成功部署了 Hyperlane Warp Route 2.0。 + 您的用户现在可以从多个链桥接资产! + + +👉 下一步:[为 Hyperlane Warp Routes 部署 Bridge UI](/zh/docs/guides/warp-routes/bridge-ui-guide) \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/deploy-yield-routes.mdx b/zh/docs/guides/warp-routes/evm/deploy-yield-routes.mdx new file mode 100644 index 0000000..93dd36b --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/deploy-yield-routes.mdx @@ -0,0 +1,92 @@ +--- +title: "部署 Yield Routes (收益路由)" +--- + +本指南的目标是说明如何使用 Hyperlane Warp Routes (HWR) 创建收益生成桥接器,确保闲置的桥接资产通过随时间复合收益而保持生产力。根据变体(下面有更多详细信息),收益分配给收益路由所有者或用户。 + +## 前置条件 + +要完成以下操作步骤,您应该具备以下条件: + +1. 您选择的源网络和目标网络,您希望在它们之间部署收益路由。 +2. 源网络上 [ERC-4626 vault (保险库)](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) 的地址,您希望从中生成收益。此保险库的底层资产将被设置为 HWR 的抵押品(例如,如果保险库由 USDC 资助,HWR 也将支持 USDC 转账)。 +3. 已安装的 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli) 实例和设置为 `HYP_KEY` 环境变量的钱包私钥,在您的源网络和目标网络上有资金。 + +## 操作步骤 + +### 概念 + +- **ERC-4626 Vault (保险库)**:代币化收益保险库的 Ethereum 标准。存款时,将铸造代表底层资产所有权的份额代币。 +- **Yield Route (收益路由) (EvmHypOwnerCollateral & EvmHypSynthetic)**:收益型 EVM 抵押代币的 Hyperlane 表示。请注意,收益路由的保险库存入资产地址用作 HWRs 抵押代币。 + - 这种特定的收益路由变体将保险库收益分配给**所有者**。还有一种替代设置,其中收益分配给用户(EvmHypCollateral & EvmHypSyntheticRebase)。在本指南的大部分内容中,我们将引用前一种变体。概念保持相同。 + + + 为了本操作步骤的目的,"源"网络将指代生成收益的网络(例如,Ethereum 有一个 USDC 借贷保险库,具有可索取收益。在称为 yourchain 的目标链上铸造合成 USDC)。 + + +以下是 Ethereum 和 yourchain 之间的桥接流程 + +**桥接 USDC:Ethereum → yourchain** + +```mermaid +flowchart LR + A[Ethereum:
Alice] -->|Deposit USDC| B[yourchain:
EvmHypOwnerCollateral] + B -->|USDC Deposit into Vault| C[Ethereum:
ERC-4626 Vault] + C -->|Yield Generation| C + B ==>|Bridge| E[yourchain:
EvmHypSynthetic] + E -->|Mint Synthetic USDC| F[yourchain:
Alice] + C[Ethereum:
ERC-4626 Vault] -->|Withdraw Yield| G[Ethereum:
Vault Owner] +``` + +在此示例中,Alice 想要在 Ethereum 和 yourchain 之间桥接 USDC。收益路由将把她的 USDC 转移到收益型 ERC-4626 保险库,然后在 yourchain 上为她铸造合成 USDC。请注意,收益路由所有者可以索取从该保险库生成的收益。 + +**桥接 USDC:yourchain → Ethereum** + +```mermaid +flowchart LR + A[yourchain:
Alice] -->|Burn Synthetic USDC| B[yourchain:
EvmHypSynthetic] + B ==>|Bridge| C[Ethereum:
EvmHypOwnerCollateral] + D[Ethereum:
ERC-4626 Vault] -->|USDC Withdraw from Vault| C + C -->|Withdraw USDC| F[Ethereum:
Alice] + +``` + +当 Alice 想要桥接回 Ethereum 时,会发生相反的情况。收益路由将销毁她的合成 USDC,从 Ethereum 上的保险库提取 USDC,并返还她的 USDC。 + +### Yield Route (收益路由) 部署步骤 + +使用 Hyperlane CLI,在 Ethereum 和 yourchain 上分别部署 USDC EvmHypOwnerCollateral 和 EvmHypSynthetic 代币: + +#### 1. 运行 `hyperlane warp init` 生成 HWR 配置: + +1. 使用空格选择 `yourchain` 和 `Ethereum`,然后按回车。 +2. 对于 Ethereum,选择 `collateralVault`,接受 mailbox,并输入 yourchain 上的 USDC 保险库地址。 + - 或者,您可以选择 `collateralVaultRebase`,这是一种收益路由变体,通过增加持有量向用户分配收益。 +3. 对于 yourchain,选择 `synthetic` 并接受 mailbox。 + + - 如果您选择了 `collateralVaultRebase`,您必须将其与 `syntheticRebase` 配对 + +#### 2. 运行 `hyperlane warp deploy` 部署 HWR。 + +### 索取收益 + +根据收益路由变体,可以通过在各自的合约上调用 `HypERC4626OwnerCollateral.sweep()` 或 `HypERC4626Collateral.rebase()` 来索取收益。 + + + 🎉 恭喜!您现在已经使用您的保险库创建了一个新的收益路由。桥接的用户资产现在可以在源 HWR 中获得被动收益。 + + + + 请注意,此抵押策略承担某些 ISM 信任假设,并且存在底层 [ERC-4626 + 保险库](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) + 变得抵押不足的固有风险。 + + +## 资源 + +有关这些步骤的更深入详细信息,请遵循[桥接代币](/zh/docs/guides/quickstart/deploy-warp-route)指南。 + +查看由 Hyperlane 支持团队、Cheese Chain 和 Ethereum Foundation 发布的一些附加信息: + +- [Hyperlane: Introducing Yield Routes](https://medium.com/hyperlane/introducing-yield-routes-f7e8fd091443) +- [ERC-4626 Tokenized Vault Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/extending-warp-routes.mdx b/zh/docs/guides/warp-routes/evm/extending-warp-routes.mdx new file mode 100644 index 0000000..df16194 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/extending-warp-routes.mdx @@ -0,0 +1,168 @@ +--- +title: "扩展 Hyperlane Warp Route" +--- + +# 使用 Hyperlane CLI + +在部署您的 Hyperlane Warp Route (HWR) 后,您可能希望将其扩展到新链。扩展 HWR 涉及在目标链上部署新的代币合约并将现有代币与其注册。 + +您可以使用 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli) 扩展现有的 HWR。 + + + + + Gnosis Safe 用户:拥有 HWR 的 EOA 必须是 Safe 签名者或 + [委托人](https://docs.safe.global/core-api/transaction-service-guides/delegates) + 才能提议更新交易。 + + +如果您已经有 warp 配置,请跳至[步骤 1](#step-1-configuration)。 + +要使用 Hyperlane CLI 生成 HWR 配置,请在部署链上找到您的代币符号: + + + + + +然后您可以选择要扩展的 HWR。 + +运行 `hyperlane warp read` 后,CLI 将显示类似以下的配置: + +```yaml +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "1" + remoteRouters: + "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" + type: "synthetic" +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" + type: "native" +``` + +此特定配置有 2 个链:basesepolia 和 sepolia。这意味着消息可以在两个链之间中继。 + +默认情况下,`warp read` 将输出保存到 `CURRENT_DIR/configs/warp-route-deployment.yaml`。按照以下步骤将链添加到现有 HWR。 + +## 步骤 1:配置 + +通过添加新链的配置来更新 `warp-route-deployment.yaml`。 + +```diff title="warp-route-deployment.yaml" +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" + type: "native" +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "1" + remoteRouters: + "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" + type: "synthetic" ++ holesky: ++ mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc" ++ owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" ++ name: "Ether" ++ symbol: "ETH" ++ decimals: 18 ++ totalSupply: "1" ++ type: "synthetic" +``` + + + EOA 用户:扩展配置 `owner` 必须与前置条件步骤中的 EOA 地址匹配,以避免部署失败。 + + +## 步骤 2:应用 + +使用 CLI,执行适用于您的 HWR 所有者设置的命令: + + + + + + + 使用此模板定义并保存 Gnosis Safe 策略:```yaml + basesepolia: submitter: type: "gnosisSafe" chain: "basesepolia" safeAddress: + "0x518489F9ed41Fc35BCD23407C484F31897067ff0" sepolia: submitter: type: + "gnosisSafe" chain: "sepolia" safeAddress: + "0x518489F9ed41Fc35BCD23407C484F31897067ff0" holesky: submitter: type: + "gnosisSafe" chain: "holesky" safeAddress: + "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326" ``` 在这种情况下,每个链都是 + 具有各自 Safe 地址的 Gnosis Safe 策略。必须**接受** Safe + 提案才能完成 HWR 扩展。 + + + + +执行后,您应该看到在链上执行的一批交易,以及指示 warp 配置已更新的最终消息。 + +## 步骤 3:确认 + +要使用 Hyperlane CLI 确认 HWR 已成功扩展,请在部署代币的链上运行以下命令与您的代币符号: + + + +运行 `warp read` 后,确认 HWR 已被扩展: + +```yaml {23-34} +basesepolia: + mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: 0 + remoteRouters: + "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" + "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" + type: native +sepolia: + mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "0" + remoteRouters: + "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" + "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" + type: "synthetic" +holesky: + mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc" + owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + name: "Ether" + symbol: "ETH" + decimals: 18 + totalSupply: "0" + remoteRouters: + "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" + "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" + type: "synthetic" \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token.mdx b/zh/docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token.mdx new file mode 100644 index 0000000..9ee5064 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/fast-native-transfer-via-gas-token.mdx @@ -0,0 +1,156 @@ +--- +title: "通过自定义 Gas 代币实现快速原生转账" +--- + +本文档将指导您如何使用 Hyperlane 通过自定义 gas 代币实现与您的 L2 之间的快速原生转账。 + +## 主要动机 + +1. 创建在您选择的 L2 上使用的自定义 gas 代币。 +2. 使用此 gas 代币启用快速原生转账,而不是通过规范桥接器等待漫长的结算时间。 + +## 前置条件 + +要完成以下操作步骤,您应该具备以下条件: + +1. 一个 L2 网络("yourchain"),您能够在其上指定[自定义 gas 代币](https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token)并希望启用与其之间的快速原生转账。 +2. 唯一的部署者或授权所有者来接收收据代币的铸造(下面有关此代币的更多信息)。 +3. 已安装的 [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/developer-tools/cli) 实例和来源为 `HYP_KEY` 的钱包私钥,在所有相关网络上有资金。 + +## 操作步骤:快速原生转账 + + + - 请注意,下面的"收据代币"是一个(一次性)可铸造的"虚拟"代币,用于在 yourchain 对应的 L1 上抵押 warp-route。您将在创建后销毁该代币的铸造权。 - 另外,根据您的 L2,您的自定义 gas 代币的代币符号可能会被分配与您的收据代币相同的符号。如果在 ethereum 上部署,您可能希望将符号设置为 `ETH`。 + + +### 1. 部署收据代币 + +在 ethereum 上部署 `ETH` 收据代币,成为您 L2 的自定义 gas 代币。 + +1. 例如,您可以通过 [Remix](https://remix.ethereum.org/) 使用有资金的钱包和类似以下的合约部署您的收据代币: + + ```solidity + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.20; + + import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + + contract YourchainETH is ERC20 { + constructor() ERC20("YourchainETH", "ETH") { + _mint(msg.sender, 10000000 * (10 ** 18)); + } + } + ``` + +2. 确保您的 `ETH` 收据代币的 100% 总供应量铸造给部署者或选择的授权地址。这必须是一次性铸造事件,以避免下面的 ethereum ↔ yourchain 原生 HWR 的价值稀释。 +3. 部署后,保存合约地址以供下面使用。 + +### 2. 设置自定义 Gas 代币 + +将 yourchain 上的自定义 gas 代币设置为新部署的 `ETH` ERC20 收据代币。 + +1. 使用 OP stack 设置自定义 gas 代币:https://docs.optimism.io/builders/chain-operators/features/custom-gas-token +2. 使用 arbitrum orbit 设置自定义 gas 代币:https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token + +### 3. 转移所有收据代币 + +使用您的 L2 规范桥接器将 100% 的 `ETH` 收据代币从 ethereum 转移到 yourchain。 + +1. 使用 OP stack 标准桥接器转移:https://docs.optimism.io/builders/app-developers/bridging/standard-bridge +2. 使用 arbitrum orbit 桥接器转移:https://docs.arbitrum.io/launch-orbit-chain/how-tos/add-orbit-chain-to-bridge-ui + +### 4. 部署原生 Hyperlane Warp Route (HWR) + +使用 Hyperlane CLI,部署 ethereum `ETH` EvmHypNative ↔ yourchain `ETH` EvmHypNative HWR: + +1. 运行 `hyperlane warp init` 并完成以下流程: + 1. 使用空格选择 `ethereum` 和 `yourchain`,然后按回车。 + 2. 对于 ethereum,选择 `native` 并接受 mailbox。 + 3. 对于 yourchain,选择 `native` 并接受 mailbox。 +2. 在执行部署之前,确保 yourchain 的 `metadata.yaml` 定义了 `blockExplorers` 字段。这将是合约验证所需的,以便轻松抵押 yourchain 的 HWR。 +3. 运行 `hyperlane warp deploy` 并确认 warp 部署配置符合预期。 +4. 执行后,您的 `yourchain-ethereum-config.yaml` 部署文件将类似于以下内容: + + ```solidity + # yaml-language-server: $schema=../schema.json + tokens: + - addressOrDenom: "0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd" + chainName: yourchain + connections: + - token: ethereum|ethereum|0x6d64832bDB4F04721D4F23CCbF17326cb636101e + decimals: 18 + name: Ether + standard: EvmHypNative + symbol: ETH + - addressOrDenom: "0x6d64832bDB4F04721D4F23CCbF17326cb636101e" + chainName: ethereum + connections: + - token: ethereum|yourchain|0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd + decimals: 18 + name: Ether + standard: EvmHypNative + symbol: ETH + + ``` + +### 5. 抵押您的 HWR + +通过 `receive()` 函数将 yourchain `ETH` 作为抵押品存入 yourchain 的原生 HWR。如果需要,您可以使用已验证的合约通过扫描器的 UI 或 Metamask 等钱包执行此操作 + +这抵押了原生 HWR,使用户能够快速将其原生资产桥接到 yourchain 和从 yourchain 桥接。 + +### 6. 测试 + +您可以使用以下命令启动单个 wei 的测试转账: + +```bash +hyperlane warp send --relay --symbol ETH +``` + +`--relay` 标志是可选的,将消息中继到目标链。 + +您也可以在后台运行仅为您的 HWR 提供服务的 relayer (中继器): + +```bash +hyperlane relayer --symbol TOKEN +``` + +您可以在设置 HWR 的任何方向进行测试。 + + + 默认情况下,您的 warp 核心配置位于本地 Registry 的 `$HOME/.hyperlane/deployments/warp_routes` 中,与 `--warp` 标志一起使用。 + + + + 🎉 恭喜!您现在已经通过您的 L2 上的自定义 gas 代币启用了与 yourchain 之间的快速原生转账。 + + +```mermaid +sequenceDiagram + box ethereum L1 + participant ycETH as ETH (ERC20) + participant ETH as ETH (Native) + end + box yourchain L2 + participant yETH as ETH (Native) + end + + Note over yETH: 1) set custom gas
token to ycETH + ycETH-->>yETH: 2) transfer 100%
of receipt token + yETH-->>yETH: 3) deposit native
as collateral + yETH-->ETH: <- fast ETH transfer -> +``` + + + 请注意,此抵押策略承担某些 ISM 信任假设。 + + +## 资源 + +查看 [inEVM bridge](https://bridge.inevm.com/) 以了解这些 HWRs 的实际应用示例。 + +查看由 Hyperlane 支持团队和 Injective 发布的一些附加信息: + +- [inEVM Spotlight: Hyperlane](https://blog.injective.com/en/inevm-spotlight-hyperlane-2/) +- [Connecting Injective: Hyperlane Opens the inEVM Bridge](https://medium.com/hyperlane/connecting-injective-hyperlane-opens-the-inevm-bridge-6f1d3edf0ff8) +- [Hyperlane and Injective | Expanding opportunities](https://medium.com/@kobriyyu/hyperlane-and-injective-expanding-opportunities-8ce170b72da7) \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/managing-warp-route-limits.mdx b/zh/docs/guides/warp-routes/evm/managing-warp-route-limits.mdx new file mode 100644 index 0000000..5b17d5b --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/managing-warp-route-limits.mdx @@ -0,0 +1,44 @@ +--- +title: "管理 HWR 限制" +description: "管理 xERC20 和 FiatToken 上的 Hyperlane Warp Route 限制" +--- + +## xERC20 部署 + +Hyperlane Warp Routes (HWR) 支持 [`xERC20` tokens](https://github.com/defi-wonderland/xERC20)。按照以下步骤配置 `xERC20` 以供 HWR 使用: + +1. **所有权转移**: + +- 确保将 [`xERC20` 合约](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol) 的所有权转移给安全的多签,以确保安全。此步骤对于防止未经授权的更改至关重要。 +- `xERC20` 合约使用 OpenZeppelin 的 `Ownable` 接口。使用 `transferOwnership` 函数完成此步骤。 + +2. **铸造限制配置**: + +- HWR 合约的铸造和销毁限制通过 `xERC20` 合约中的 [`setLimits`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L85) 函数管理。此函数必须由合约所有者调用。 + - `xERC20` 合约使用 24 小时窗口来管理限制。这由 [`_DURATION`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L13) 变量定义,设置为 1 days(24 小时)。当前可用限制使用 [`_getCurrentLimit`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L234) 函数动态计算。 + - 如果自上次使用以来已过去 24 小时(`_DURATION`),限制将自动恢复到完整的 `maxLimit`。 +- 确保限制适合预期的交易量以防止中断。根据交易量和预期使用模式审查和调整限制。 + +## FiatToken 部署 + +HWRs 支持 [Circle 的 Bridged USDC,以 `FiatToken` 的铸造者形式](https://github.com/circlefin/stablecoin-evm)(有关文档,请参阅该仓库的更多信息)。在 `FiatToken` 和 `MasterMinter` 合约上有三个相关角色: + +1. **`MasterMinter` owner** 是可以设置控制器和铸造者的账户。 +2. **`MasterMinter` controller** 是可以为其分配的铸造者设置铸造限制的账户。 +3. **`MasterMinter` minter** 是实际可以在 `FiatToken` 上调用 `mint` 的账户。 + +所有者和控制器通常应设置为 Safe 多签以增强安全性,铸造者是本地链上的 HWR 合约地址。`FiatToken` 的铸造限制是绝对的,意味着它们不会自动重置,如果需要必须更新。 + +应在 `MasterMinter` 合约上设置三个操作以准备使用: + +1. **移除之前的测试控制器:** + +- 作为所有者,通过 [`removeController(address _controller)` 函数](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/Controller.sol#L87C14-L87C51) 移除之前的测试控制器 + +2. **设置控制器和铸造者:** + +- 作为所有者,您应该通过 [`configureController(address controller, address worker)` 函数](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/Controller.sol#L70) 设置控制器和铸造者。控制器可以与所有者相同,铸造者应该是 HWR 地址。 + +3. **为铸造者设置铸造限制:** + +- 作为控制器,您应该通过 [`configureMinter(uint256 _newAllowance)` 函数](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/MintController.sol#L116) 为铸造者设置铸造限制。此限制不会持续重置,因此要么将其设置为足够大的值(如 `cast max-uint`),要么监控使用情况并相应调整。 \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing.mdx b/zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing.mdx new file mode 100644 index 0000000..ea87821 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/multi-collateral-warp-routes-rebalancing.mdx @@ -0,0 +1,208 @@ +--- +title: "HWR 2.0: 原生再平衡" +--- + +链希望允许用户从多个网络存入和提取代币,因为用户越来越多地在不同链上持有资产,并期望无缝的跨链体验。然而,手动管理所有这些链上的代币流动性可能很复杂且运营密集。 + +**Hyperlane Warp Route (HWR) 2.0** 消除了管理多链代币流动性的复杂性,同时使用户能够从任何支持的链向目标链存入代币。HWR 2.0 不是手动在链间重新平衡抵押品,而是自动维护链在需要时、在需要的地方的流动性。 + +## 流动性不平衡挑战 + +当在多个链上部署资产(如 USDC、USDT、ETH)作为封装代币时,流动性管理变得必要。 + +流动性在以下情况下变得不平衡: + +- 用户在链 A 上存入代币但从链 B 提取 +- 链 B 的代币用完 +- 新用户无法从链 B 提取,直到有人手动将代币从链 A 移动到链 B + +## 解决方案:原生再平衡 + +HWR 2.0 通过新的 **Rebalancer Agent (再平衡代理)** 和智能合约支持解决了流动性不平衡问题。Warp Route 合约已升级以启用新功能,具有合约所有者控制的再平衡器角色。 + +### Rebalancer (再平衡器) + +HWR 2.0 包含内置的 **Rebalancer (再平衡器)**。Rebalancer (再平衡器) 是一个白名单代理,持续监控和管理 warp route 中所有链的抵押品。此代理使用外部/原生桥接器如 CCTP 或 Everclear 等协议自动在链间移动资金,维持最佳流动性分布。 + +例如,如果用户在 Arbitrum 上存入 USDC 并在 Base 上提取,Rebalancer (再平衡器) 可以使用 CCTP 将 USDC 从 Arbitrum 转移到 Base,以维持 Base 上的充足流动性。 + +### 原生再平衡启用的功能 + +这启用了: + +- 从任何支持的链存入 +- 提取到任何支持的链 +- 无缝的用户体验 + +再平衡器角色可以由合约所有者允许的任何人操作。Abacus Works 将此作为托管服务提供,基于可配置的阈值和策略进行再平衡,这些策略确定何时以及如何移动抵押品。 + +## 工作原理 + +### 基本设置 + +下面的图表显示了在 Base 和 Arbitrum 上存在规范 USDC,在新链上创建合成 HWR 的设置。 + +```mermaid +flowchart + subgraph base + BU((User)) + BWR[USDC Collateral HWR] + end + + subgraph arbitrum + AU((User)) + AWR[USDC Collateral HWR] + end + + subgraph newchain + NWR[USDC Synthetic HWR] + Recipient((Recipient)) + end + + BU -- "transferRemote(newchain,
recipient, amount)" --> BWR + BWR -. "{recipient, amount}" .-> NWR + AU -- "transferRemote(newchain,
recipient, amount)" --> AWR + AWR -. "{recipient, amount}" .-> NWR + NWR -. "2 \* amount" .-> Recipient +``` + +### 抵押品不平衡 + +如果更多资金单向流动,路由中的其中一个链可能会用完抵押品。这种 _不平衡流动_ 会阻止提取,直到抵押品重新平衡。 + +```mermaid +flowchart + subgraph base + BWR[USDC Collateral HWR] + end + + subgraph arbitrum + AWR[USDC Collateral HWR] + end + + subgraph newchain + NWR[USDC Synthetic HWR] + NU((Recipient)) + end + + NU -- "transferRemote(arbitrum,
recipient, 2 * amount)" --> NWR + NWR -. "{recipient, 2 * amount}" .-> AWR +``` + +### 管理抵押品不平衡 + +为了维持流畅的用户体验,必须在链间平衡抵押品。HWR 2.0 引入了自动化此过程的原生再平衡功能(在支持的地方)- 抵押品自动在链间移动以解决不平衡。对于没有原生再平衡的部署,这需要手动在链间移动抵押品。 + +### 原生再平衡的要求 + +对于原生再平衡,必须满足以下要求: + +- Rebalancer Agent (再平衡代理)(监控和管理抵押品的白名单代理) +- 支持再平衡器角色的 Warp Route 合约 +- 原生/外部桥接器或协议,通常在主要链上可用。例如,USDC 的 CCTP。 + +这些组件共同创建完整的原生再平衡系统。 + + + 没有原生桥接支持或外部协议集成的链无法支持此功能。 + + +## 手动再平衡 + + + 本节适用于手动管理流动性的高级用户。建议在可用的地方使用自动再平衡器。 + + +### 流动性提供者 + +目前,Hyperlane Warp Routes 2.0 没有明确的流动性提供者接口来启用本地存款/提取。但是,LPs 可以使用 [Hyperlane CLI](https://www.npmjs.com/package/@hyperlane-xyz/cli) 或 UI 手动管理流动性,与 [Hyperlane registry](https://github.com/hyperlane-xyz/hyperlane-registry) 中的 HWRs 交互。 + + + 下面定义的临时程序要求 HWR 拓扑中至少存在一个合成链。 + + +- 要检查 HWRs 拓扑,使用 `warp read` 命令: + +``` +hyperlane warp read --symbol ETH + +ethereum: + type: native + ... +base: + type: native + ... +bsc: + type: synthetic + ... +``` + +- 要在 HWR 上发送转账(`transferRemote`),使用 `warp send` 命令: + +``` +hyperlane warp send \ + --symbol ETH \ + --origin base \ + --destination bsc \ + --amount \ + --recipient
+``` + +### 存入流动性 + +LPs 可以通过 `transferRemote` 存入抵押品,其中: + +- `destination` 域是 HWRs 具有 `synthetic` 类型的链 +- `recipient` 地址由 LP 控制 +- `amount` 是以 `origin` 链的 `collateral` 代币计价的流动性 + +```mermaid +flowchart + LP((Liquidity Provider)) + + subgraph arbitrum + AWR[USDC Collateral HWR] + AUSDC[USDC] + end + + subgraph mychain + MWR[USDC Synthetic HWR] + end + + AWR -- "transferFrom(LP, amount)" --> AUSDC + LP -. "amount" .-> AWR + LP -- "transferRemote(newchain,
LP, amount)" --> AWR + + AWR -. "{LP, amount}" .-> MWR + MWR -. "amount" .-> LP +``` + +这可以通过在许多抵押链上提供流动性并用单一合成资产余额表示对每个抵押品的索取权来完成。 + +### 提取流动性 + +LPs 可以通过 `transferRemote` 提取,其中 + +- `destination` 域是 HWR 为 `collateral` 类型的链 +- `recipient` 地址由 LP 控制 +- `amount` 以 `destination` 链的 `collateral` 代币计价 + +```mermaid +flowchart + LP((Liquidity Provider)) + + subgraph arbitrum + AWR[USDC Collateral HWR] + AUSDC[USDC] + end + + subgraph mychain + MWR[USDC Synthetic HWR] + end + + LP -- "transferRemote(arbitrum,
LP, amount)" --> MWR + LP -. "amount" .-> MWR + + MWR -. "{LP, amount}" .-> AWR + AWR -- "transfer(LP, amount)" --> AUSDC + AWR -. "amount" .-> LP \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx b/zh/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx new file mode 100644 index 0000000..995552f --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/transfer-and-call-pattern.mdx @@ -0,0 +1,109 @@ +--- +title: "转账和调用模式" +--- + +## 概述 + +**转账和调用模式** 使合约能够通过 [Hyperlane Warp Route (HWR) (跨链资产路由)](/zh/docs/protocol/warp-routes/warp-routes-overview) 桥接资产,并在资产到达后在目标链上执行操作。此模式对于操作依赖于桥接后的代币余额的情况很有用。 + +虽然 HWR 处理跨链代币转账,但此模式通过使用 [Interchain Accounts (ICA) (跨链账户)](/zh/docs/applications/interchain-account) 在目标链上执行任意逻辑来扩展其功能。 + +### 使用案例 + +一些场景包括: + +- **跨链治理**:用户必须持有特定 NFT 才能对提案进行投票。系统将 NFT 桥接到治理链,并确保投票调用在转账完成后执行。 +- **桥接抵押品**:协议将资产从 L2 发送到 L1 保险库进行抵押,然后与保险库交互。 +- **更快的 rollup 提取**:用户可以立即索取流动性,同时等待最终桥接结算。 + +## 高层架构图 + +```mermaid +flowchart TB + subgraph Origin chain + direction TB + Sender + Contract + ICA_Router_O[Interchain Account Router] + Warp_Route_O[HWR] + Mailbox_O[(Mailbox)] + end + + subgraph Destination chain + direction TB + Mailbox_D[(Mailbox)] + Warp_Route_D[HWR] + ICA_Router_D[Interchain Account Router] + ICA[Interchain Account] + Recipient + end + + Sender -->|Initiates transfer & call| Contract + Contract -->|Sends tokens| Warp_Route_O + Warp_Route_O -->|Receive tokens| Mailbox_O + Mailbox_O -. "Relay" .- Mailbox_D + Mailbox_D -->|Receive tokens| Warp_Route_D + Warp_Route_D -->|Send tokens| ICA + Contract -->|Sends execution request| ICA_Router_O + ICA_Router_O -. "Relay" .- ICA_Router_D + ICA_Router_D -->|Execute call| ICA + ICA -->|Final execution| Recipient + + click ICA_Router_O https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + click ICA_Router_D https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/InterchainAccountRouter.sol + + style Sender fill:#FF0099 + style ICA fill:#FF0099 + style Recipient fill:#FF0099 + +``` + + + - 目前,Interchain Accounts (ICA) (跨链账户) 仅在兼容 EVM 的 + 链上受支持。如果需要更广泛的 VM 支持,此模式可以扩展到其他环境, + 可能需要额外的设计考虑。 + + +## 工作原理 + +1. 代币从发送方转移到合约。 +2. 在目标链上为合约导出 [Interchain Account (ICA) (跨链账户)](/zh/docs/applications/interchain-account)。 +3. 启动 HWR 转账,将代币跨链发送到跨链账户。 +4. 在代币到达后,从跨链账户在目标链上执行远程合约调用。 + +下面的 Solidity 函数演示了此模式: + +```solidity +function transferAndCall( + uint32 destination, + uint256 amount, + IERC20 asset, // Tokens to transfer (not derivable from TokenRouter) + TokenRouter warpRoute, + CallLib.Call[] calldata calls // Array of calls to execute on the destination chain +) external payable { + + // Transfer the specified amount of tokens from the sender to this contract + asset.transferFrom(msg.sender, address(this), amount); + + // Get the interchain account address for the contract on the destination chain + bytes32 self = interchainAccountRouter + .getRemoteInterchainAccount(destination, address(this)) + .addressToBytes32(); + + // Quote the gas fee for the HWR payment + uint256 warpFee = warpRoute.quoteGasPayment(destination); + + // Initiate the HWR transfer to send tokens cross-chain + warpRoute.transferRemote{value: warpFee}(destination, self, amount); + + // Execute the specified interchain calls using the remaining gas funds + interchainAccountRouter.callRemote{value: msg.value - warpFee}( + destination, + calls + ); +} +``` + + + - **执行顺序考虑**:合约必须确保代币转账完全完成后才执行任何后续操作。如果远程调用依赖于代币余额(例如,质押、治理、存款),如果在代币到达之前执行,可能会失败。relayer (中继器) 会使用退避重试以确保成功的 ICA 调用执行。 - ICA 在执行存款之前可能还需要执行 ERC20 批准调用。 - 如果执行操作的合约没有权限限制,任何人都可以调用它(取决于其实现)。 + \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/evm/xerc20-warp-route.mdx b/zh/docs/guides/warp-routes/evm/xerc20-warp-route.mdx new file mode 100644 index 0000000..4e0c5a2 --- /dev/null +++ b/zh/docs/guides/warp-routes/evm/xerc20-warp-route.mdx @@ -0,0 +1,84 @@ +--- +title: "创建您的 xERC20 代币桥接器" +--- + +本指南将指导您在两个您选择的网络之间部署 xERC20 Hyperlane Warp Route (HWR)。我们将使用 Ethereum 作为源链的示例;但是,您可以选择任何支持的网络作为源链和目标链。 + +## 前置条件 + +要完成本操作步骤,您应该具备: + +1. **您选择的源网络和目标网络**,您希望在它们之间部署 xERC20 HWR。 +2. **源链和目标链上的 xERC20 或 xERC20Lockbox 地址**。 +3. **已安装 Hyperlane CLI** 和**设置为 `HYP_KEY` 环境变量的钱包私钥**,在源网络和目标网络上都有资金。 + +### 步骤 1:初始化新的 HWR + +运行以下命令生成 HWR 配置: + +```bash +hyperlane warp init +``` + +1. 使用空格选择 **Ethereum**(源)和 **YourChain**(目标),然后按回车。 +2. 对于 Ethereum(源),选择 **xERC20** 或 **xERC20Lockbox**,并输入合约地址。 +3. 对于 YourChain(目标),选择 **xERC20** 或 **xERC20Lockbox**,并输入合约地址。 + + +选择 xERC20 和 xERC20Lockbox 之间的区别: + +- **xERC20Lockbox**:如果您的代币已经在源链上部署,并且需要封装版本进行跨链转账,请使用此选项。 +- **xERC20**:如果您的代币原生实现 xERC20 且不需要 lockbox,请使用此选项。 + +如果您不确定,请查看您的代币合约结构或部署历史以确定正确的选择。 + + + +### 步骤 2:部署 xERC20 HWR + +运行以下命令部署 HWR: + +```bash +hyperlane warp deploy +``` + +这部署了 \*Hyperlane 适配器合约\*\*,即: + +- **HypXERC20Lockbox**(如果使用 xERC20Lockbox) +- **HypXERC20**(如果使用 xERC20) + +_CLI 不部署非 Hyperlane 合约(例如,现有的 xERC20 合约)。那些应该已经部署。_ + +### 步骤 3:配置铸造权限 + +一旦部署了 xERC20 HWR 合约,您必须为目标代币配置铸造权限。 + +使用您 xERC20 合约中的 [`setLimits` 函数](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L85) 为新部署的 HWR 设置铸造限制。 +默认情况下,这些限制位于本地的 `~/.hyperlane` Registry 中。 + +### 步骤 4:测试跨链转账 + +使用以下命令测试跨链代币转账: + +```bash +hyperlane warp send --symbol --amount +``` + +- 将 `` 替换为您的代币。 +- 将 `` 替换为要转账的代币数量。 + +### + +🎉 恭喜!您已成功创建了 **xERC20 HWR**。您的 xERC20 代币现在可以跨链移动! + + + 请注意,跨链操作依赖于 **Interchain Security Modules + (ISMs) (跨链安全模块)**,并且存在固有风险,例如 ISM 信任假设。 + + +## 资源 + +有关部署 xERC20 HWRs 的更多资源,请查看: + +- [xERC20 Token Standard](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol) +- [xERC20 Token transfer limits](./managing-warp-route-limits) \ No newline at end of file diff --git a/zh/docs/guides/warp-routes/svm/svm-warp-route-guide.mdx b/zh/docs/guides/warp-routes/svm/svm-warp-route-guide.mdx new file mode 100644 index 0000000..b25f678 --- /dev/null +++ b/zh/docs/guides/warp-routes/svm/svm-warp-route-guide.mdx @@ -0,0 +1,269 @@ +--- +title: "部署 SVM HWR" +--- + +## 预期结果 + +您将为您选择的资产在两个具有现有 Hyperlane 核心部署的 SVM 链之间部署 Hyperlane Warp Route (HWR)。在撰写本文档时,支持的 SVM 链是 Solana 和 Eclipse,但您可以在[此处](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel/environments/mainnet3)找到最新列表(所有具有 `core` 子目录的链目录名称)。 + + + **如果您希望您的 SVM rollup 作为核心 Hyperlane 部署得到支持,或者正在寻找设置 EVM 到 SVM HWR,[请联系我们](https://forms.gle/KyRTaWvo4XNmNvrq6)!** + + +## HWR 类型 + +使用的代币类型决定了 HWR 类型,因此了解可用的不同 HWR 合约很重要: + +- [Native (原生)](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#native-token-warp-routes):处理原生 gas 代币的转账(例如 Solana 上的 SOL,Eclipse 上的 ETH)。 +- [Collateral (抵押)](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#collateral-backed-erc20-warp-routes):处理现有 [Token-2022](https://spl.solana.com/token-2022) 或 [Token](https://spl.solana.com/token) 代币的转账(SVM 上的 ERC20 等价物)。 +- [Synthetic (合成)](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#synthetic-erc20-warp-routes):处理合成代币,这些代币在通过 HWR 进行转账时被铸造和销毁,以代表来自原始链的代币。本指南中的工具在这种情况下部署新的 Token-2022 代币,其权限设置为部署者密钥。 + +以下是常见的 HWR 设置(您可以在[此处](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-example-usage)找到更多详细信息): + +- **Native to Synthetic (原生到合成)**:在源链上锁定 Native 代币以在目标链上铸造 Synthetic 代币。返回转账时,Synthetic 代币被销毁。例如 Solana 和 Eclipse 之间的 SOL HWR。 +- **Collateral to Synthetic (抵押到合成)**:在源链上锁定 Collateral 代币以在目标链上铸造 Synthetic 代币。返回转账时,Synthetic 代币被销毁。例如 Solana 和 Eclipse 之间的 USDC HWR。 +- 其他:**Native to Native (原生到原生)**(如 Optimism 和 Arbitrum 之间的 ETH)以及 **Collateral to Collateral (抵押到抵押)** 如果代币已经存在于源链和目标链上也是可能的。在这种情况下,重新平衡流动性是一个重要考虑。 + +## 开始之前 + +部署 HWR 需要有连接到(即主动中继和保护)Hyperlane 生态系统其余部分的核心 Hyperlane 部署。本指南中使用的核心 Hyperlane 部署是 Solana([核心 artifacts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json))和 Eclipse([核心 artifacts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/eclipsemainnet/core/program-ids.json))。您可能需要在整个指南中参考这些核心 artifacts。 + +## 操作步骤:部署 Sealevel HWR + +### 步骤 1:构建 HWR 程序 + +1. 克隆 [hyperlane-monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) + + ```bash + git clone https://github.com/hyperlane-xyz/hyperlane-monorepo + cd hyperlane-monorepo/rust/sealevel/programs + ``` + +2. 在您的机器上构建 HWR 程序。 + + + 构建 HWR 程序需要 `solana-cli 1.14.20`,但不需要手动安装。`./build-programs.sh` 脚本将 + 自动处理切换到此版本,并在构建后恢复到您之前的版本(1.18.18)。 + + + ```bash + # 从此目录运行 + cd rust/sealevel/programs + # 构建 token 程序 + ./build-programs.sh token + ``` + + 此[脚本](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/build-programs.sh)将**编译 Solana 程序**,这是部署所需的。它将自动使用 `solana-cli 1.14.20` 并在之后重置为之前使用的版本。 + + 要验证构建输出,请检查 `hyperlane-monorepo/rust/sealevel/target/deploy` 中的 target/deploy 目录是否有 `.so` 文件 + + + 在构建过程中,您可能会遇到堆栈偏移错误消息,如 `Error: Function [...] Stack offset of 4360 exceeded max offset of xx + ..`。这是一个已知问题,对程序功能没有影响。该错误与依赖 crate 中的未使用函数有关,可以忽略。程序将正确构建、部署和运行,尽管有此警告。 + + +### 步骤 2:准备部署 + +1. 要部署合约,请安装 `solana-cli 1.18.18`。请注意,您**必须**使用此版本,否则部署可能失败。 + + ```bash + sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.18/install)" + ``` + + 安装后,您可以使用以下命令验证版本: + + ```bash + solana --version + ``` + +2. 创建 **Solana 密钥对**。此密钥支付部署费用并将成为已部署程序的所有者。如果您愿意,可以使用现有的有资金的密钥。 + + ```bash + solana-keygen new --outfile ./warp-route-deployer-key.json + ``` + + - 要读取您刚创建的公钥: + + ```bash + solana-keygen pubkey ./warp-route-deployer-key.json + ``` + + - 检查余额: + ```bash + solana balance --keypair ./warp-route-deployer-key.json + ``` + +### 步骤 3:配置 HWR + +1. 在 `rust/sealevel/environments/mainnet3/warp-routes` 中为您的 HWR 创建目录,目录名称是您希望 HWR 部署具有的名称。 + + ```bash + mkdir -p rust/sealevel/environments/mainnet3/warp-routes/ + ``` + + 例如,Solana 和 Eclipse 之间现有的 SOL HWR 位于 `rust/sealevel/environments/mainnet3/warp-routes/eclipsesol`。 + +2. 在您刚创建的目录内,创建名为 `token-config.json` 的配置文件。 + + 根据 [TokenConfig](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/client/src/warp_route.rs#L114) Rust 结构的 `serde_json` 序列化配置您的 HWR 参数。`interchainGasPaymaster` 的设置值可以在[核心部署 artifacts](#before-you-start) 中找到。 + + 下面的示例显示了在 Solana 上转移 SOL 并在 Eclipse 上铸造合成 SOL 的测试网 **Native to Synthetic HWR**。您也可以检查生产 SOL HWR 的[此配置](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/environments/mainnet3/warp-routes/eclipsesol/token-config.json)。 + + ```json + { + "solanatestnet": { + "type": "native", + "decimals": 9, + "interchainGasPaymaster": "" + }, + "eclipsetestnet": { + "type": "synthetic", + "decimals": 9, + "name": "Solana (testnet)", + "symbol": "SOL", + "uri": "" + "interchainGasPaymaster": "" + } + } + ``` + +3. (可选)如果您的 HWR 创建 Synthetic 代币,您可以向 `hyperlane-registry` 提交 PR,添加与此代币关联的元数据(示例 PR [此处](https://github.com/hyperlane-xyz/hyperlane-registry/pull/142))。`hyperlane-registry` 还可以让您的 HWR 在 Hyperlane 生态系统中可见。 + +### 步骤 4:部署 HWR + +1. 在部署 HWR 的两个网络上为新密钥对提供资金。 + + - 公钥在 SVM 网络中应该相同,但通过将私钥加载到每个链推荐的钱包中进行双重检查。 + + - 资金应足以支付与 HWR 相关的所有账户的租金、支付交易费用,并为 [ATA](https://www.alchemy.com/overviews/associated-token-account) 付款人账户提供资金(下面有更多信息)。作为参考,一个 HWR 账户在 Solana 上观察到的租金是 `2.35 SOL`,在 Eclipse 上是 `0.025 ETH`,因此建议至少为密钥提供 `5 SOL` / `0.05 ETH` 资金。 + +2. 从 `rust/sealevel/client` 目录使用 `warp-route deploy` 子命令部署 HWR: + + 示例用法: + + ```bash + cargo run -- -k ./warp-route-deployer-key.json \ + warp-route deploy \ + --warp-route-name \ + --environment mainnet3 \ + --environments-dir ../environments \ + --built-so-dir ../target/deploy \ + --token-config-file ../environments/mainnet3/warp-routes//token-config.json \ + --registry ~/path/to/your/local/hyperlane-registry \ + --ata-payer-funding-amount + ``` + + + 请为 HWR ATA 付款人账户选择合理的资金金额。推荐的初始资金金额是 `alert_threshold * 2`,阈值值在[此处](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/infra/src/warp/helm.ts)找到。 + + +- CLI 标志概述: + - `--warp-route-name`:应与之前为 HWR 选择的目录名称匹配 + - `--environment`:保持为 `mainnet3` + - `--environments-dir ../environments`:保持为 `../environments` + - `--built-so-dir`:保持为 `../../target/deploy`,因为它指向 HWR 程序的编译输出目录 + - `--token-config-file`:指向之前创建的 `token-config.json` 文件 + - `--registry`:指向您本地 hyperlane-registry 克隆的路径 + - `--ata-payer-funding-amount`:此标志指定为部署发生的两个链上的 HWR [ATA](https://www.alchemy.com/overviews/associated-token-account) 付款人账户提供多少资金。它以最低货币单位表示,这意味着在 Solana 上解释为 Lamports,在 Eclipse 上解释为 Gwei(因为它使用 ETH 作为其原生货币)。在下面的命令中,值 `1000000` 相当于 `0.001` ETH 和 `0.001` SOL,这足够初始部署,但不适用于生产使用。ATA 付款人以后总是可以充值。作为参考,每次 HWR 转账在目标链上花费 ATA 付款人 `0.000000001 SOL`(在 Solana 上)和 `0.000021 ETH`(在 Eclipse 上)。 + + + 请注意,由于我们的目标是尽快为开发者提供此工具,它不如我们希望的那样可靠。如果您遇到问题,请通过 [GitHub issue](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues) 或通过 [Discord](https://discord.gg/2BYk6kV7) 的 `developers` 频道联系我们。 + + +#### 故障排除提示 + +- 由于网络拥塞和程序大小,脚本不太可能第一次就成功,但脚本应该是幂等的,并跳过已经部署/初始化的合约。 + + - 像 `Error: 11 write transactions failed` 或 `Error: Custom: Invalid blockhash` 这样的错误总是可以通过重新运行命令重试。如果可重试错误持续存在,请考虑增加[此处](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/44e0ff0733baf0da4d2b0304915f5f6cce92ffc7/rust/sealevel/client/src/cmd_utils.rs#L76)的计算单元价格。 + + - 对于其他错误类型,您可能需要关闭部署者密钥的缓冲区和程序,并从头开始重新部署所有内容。要显示缓冲区和程序并逐个关闭它们,请按照下面的命令操作。关闭程序还有助于恢复其租金押金。 + + ```bash + solana program show --programs --keypair ./warp-route-deployer-key.json --url + + solana program show --buffers --keypair ./warp-route-deployer-key.json --url + + # 关闭程序账户时需要添加 `--bypass-warning` 标志(与关闭缓冲区相对) + solana program close --url + ``` + +- 要增加部署更快成功的几率,您可以在本地 hyperlane-registry 克隆中配置私有 RPC URL。(例如在 `solanamainnet.rpcUrls.http` 中) +- 如果部署合成代币,下面的命令将创建新的代币铸造并使用元数据代币扩展来使用 `--token-config-file` 文件中的字段设置代币名称、符号和元数据 json,运行 `warp-route deploy`: + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -k ./warp-route-deployer-key.json warp-route deploy \ + --warp-route-name eclipsesol \ + --environment mainnet3 \ + --environments-dir ../environments \ + --built-so-dir ../../target/deploy \ + --token-config-file ../environments/mainnet3/warp-routes/eclipsesol/token-config.json \ + --registry ~/path/to/your/local/hyperlane-registry \ + --ata-payer-funding-amount 10000000 + ``` + +## 与 HWR 交互 + +1. **查询 HWR 程序** + + 您可以使用以下命令检查程序详细信息,如 Mint Account、Mint Authority 和 ATA 付款人账户: + + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -k ./warp-route-deployer-key.json \ + -u token query \ + --program-id + ``` + + 替换: + + - ``:例如 https://api.devnet.solana.com + - ``:来自 program-ids.json 的 base58 地址(位于您的 warp-route 目录中)。 + - ``:native|synthetic|collateral + + 如果部署合成代币,查询 Mint Authority 账户以查看元数据: + + ```bash + solana account --url + ``` + +2. **通过 HWR 转移代币** + + 要测试跨链代币转账,运行以下命令: + + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- -u \ + -k ./warp-route-deployer-key.json \ + token transfer-remote ./warp-route-deployer-key.json \ + \ + --program-id + ``` + + - ``:您需要要发送到的链的域 ID,您可以在 [hyperlane-registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) 的链的 `metadata.yaml` 条目中找到。 + - ``:来自 program-ids.json 的 base58 地址(位于您的 warp-route 目录中)。 + - ``:源链上的代币类型,选项有:native|synthetic|collateral + +3. **验证目标链上的余额** + + 通过查询 Mint Account 地址来查找目标链上接收者的余额: + + ```bash + spl-token balance --owner ./warp-route-deployer-key.json \ + -u + ``` + + - 这里的最终参数是 SPL 代币 ID。因此,如果这是您想要检查余额的合成 HWR,您需要使用几步前查询中的 Mint 地址。 + - 您也可以在浏览器中查看对接收者账户进行的最后一笔交易 + +4. **探索其他 CLI 命令** + + 本指南大量使用了来自 `hyperlane-monorepo` 的 `hyperlane-sealevel-client` CLI。您可能会发现它的各种命令对配置 HWR、进行状态查询、发送转账等很有用。查看它提供的其他实用程序,特别是 `token` 子命令下的实用程序。 + + ```bash + # 从 `rust/sealevel/client` 运行 + cargo run -- --help + ``` + + + 对于生产部署,我们强烈建议避免使用本指南中使用的热密钥。相反,将所有权转移到**多签设置**,如 [Squads](https://squads.so/),以增强安全性。 + \ No newline at end of file diff --git a/zh/docs/intro.mdx b/zh/docs/intro.mdx new file mode 100644 index 0000000..3ed0d68 --- /dev/null +++ b/zh/docs/intro.mdx @@ -0,0 +1,33 @@ +--- +title: "Hyperlane 介绍" +--- + +## 什么是 Hyperlane? + +Hyperlane 是一个无需许可的互操作性协议,用于跨不同区块链环境进行跨链通信。它实现了跨不同链的消息传递和资产转移,无需依赖中心化中介或获得任何许可。 + +### 主要特性 + +- **无需许可**:任何人都可以[部署 Hyperlane](/zh/docs/guides/chains/deploy-hyperlane),无论是一层区块链、Rollup 还是应用链,都可以立即开始构建跨链应用程序——无需审批,无需中介。 +- **模块化安全**:Hyperlane 的[跨链安全模块 (ISM)](/zh/docs/protocol/ISM/modular-security) 允许开发者根据应用程序的需求配置、组合和定制其安全模型。 +- **多虚拟机支持**:Hyperlane 支持多个虚拟机 (VM) 的跨链通信,包括 EVM、SVM 和 CosmWasm。 + - Hyperlane 还支持**跨虚拟机交互**,例如 EVM ↔ SVM 资产转移。 + +## 开始使用 Hyperlane 构建[​](#start-building-with-hyperlane "Direct link to Start Building with Hyperlane") + +通过探索部署指南和主要功能来开始使用 Hyperlane: + +- **[使用 Hyperlane Warp 路由 (HWR) 桥接任何代币](/zh/docs/guides/quickstart/deploy-warp-route)**:HWR 让您部署自定义代币桥,使任何原生或 `ERC20` 代币都能跨链转移。 + + - 对于 **EVM 链**,使用 **[EVM HWR 指南](/zh/docs/guides/quickstart/deploy-warp-route)**。 + - 对于 **Solana 虚拟机 (SVM) 链**,参见 **[SVM HWR 指南](/zh/docs/guides/warp-routes/svm/svm-warp-route-guide)**。 + - 对于 **Cosmos SDK 链**,使用 **[Cosmos SDK 模块](/zh/docs/alt-vm-implementations/cosmos-sdk)**。 + - 对于 **EVM 和 SVM 之间的跨链转移**,查看 **[EVM-SVM HWR 指南](/zh/docs/guides/warp-routes/evm-svm-warp-route-guide)**。 + +- **[了解通用消息传递](/zh/docs/reference/messaging/send)**:在链之间发送任意消息。 + +- **使用[跨链账户](/zh/docs/applications/interchain-account)**:从单个账户在远程链上执行智能合约调用。 + +- **[将 Hyperlane 部署到您的链](/zh/docs/guides/chains/deploy-hyperlane)**:在新链上设置 Hyperlane。 + +- **加入我们的生态系统:** [Discord](https://discord.com/invite/hyperlane) | [Twitter](https://x.com/hyperlane) \ No newline at end of file diff --git a/zh/docs/operate/config/agent-config.mdx b/zh/docs/operate/config/agent-config.mdx new file mode 100644 index 0000000..122f65b --- /dev/null +++ b/zh/docs/operate/config/agent-config.mdx @@ -0,0 +1,66 @@ +--- +title: "Agent 配置" +--- + +所有 agent 使用相同的配置方法,这是一种多层配置方法,允许轻松覆盖默认配置。每一层都会覆盖前一层中的重叠值。 + +## 配置层 + +1. [monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config) 中"默认部署"的基础配置会自动加载。 +2. 接下来加载通过 `CONFIG_FILES` 环境变量传入的配置文件;此环境变量应该是要按顺序从第一个到最后一个加载的 json 文件路径的逗号分隔列表。 +3. 接下来读取以 `HYP_` 为前缀的环境变量。 +4. 然后读取以 `HYP__` 为前缀的环境变量,并且仅适用于当前 agent。即 `RELAYER`、`VALIDATOR` 和 `SCRAPER` 将只读取其各自的前缀。 +5. 最后读取命令行参数 + +## 命令行参数[​](#command-line-arguments "直接链接到命令行参数") + +命令行参数在应用程序名称之后添加,例如 `./relayer --originChainNames="test1,test2,test3"` + +支持以下格式: + +- `--argName argValue` +- `--argName "argValue"` +- `--argName 'argValue'` +- `--argName=argValue` +- `--argName="argValue"` +- `--argName='argValue'` + +参数名称不区分大小写,因此在本指南中,我们可能会以驼峰命名法显示它们以便于阅读,但 `--argName` 等效于 `--ARGNAME` 和 `--argname`。 + +示例: + +- `{ "db": "/path/to/dir" }` 可以使用 `--db "/path/to/dir"` 设置 +- `{ "chains": { "ethereum": { "name": "ethereum" } } }`(缩写为 `chains.ethereum.name` 或 `chains..name`)可以使用 `--chains.ethereum.name ethereum` 设置 +- `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }`(缩写为 `chains..customrpcurls`)可以使用 `--chains.avalanche.customrpcurls "https://some-url.com"` 设置 + +## 环境变量[​](#environment-variables "直接链接到环境变量") + +配置文件格式是设置非机密且不需要每次运行都更改的内容的首选方式,因为它是最容易检查和编辑的格式。配置文件中的每个配置值都可以设置为环境变量,只要您使用正确的名称,但是,有一些环境变量无法在配置中设置,例如 `CONFIG_FILES`。 + +`HYP_` 和 `HYP__` 是等效的前缀,唯一的区别是它们的加载顺序,并且可以引用配置文件中的所有配置值。 + +环境变量名称将是这两个前缀之一,然后是配置值的大写路径组件的下划线分隔路径。 + +例如: + +- `{ "db": "/path/to/dir" }` 可以使用 `HYP_DB="/path/to/dir"` 或 `HYP_RELAYER_DB="/path/to/dir"` 设置 +- `{ "chains": { "ethereum": { "name": "ethereum" } } }`(缩写为 `chains.ethereum.name` 或 `chains..name`)可以使用 `HYP_CHAINS_ETHEREUM_NAME="ethereum"` 或 `HYP_VALIDATOR_CHAINS_ETHEREUM_NAME="ethereum"` 或 `HYP_RELAYER_CHAINS_ETHEREUM_NAME="ethereum"` 等设置 +- `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }`(缩写为 `chains..customrpcurls`)可以使用 `HYP_CHAINS_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` 或 `HYP_VALIDATOR_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` 等设置 + +## 使用 Docker 的配置文件 + +在 Docker 中运行 agent 会增加额外的复杂性,因为配置文件需要从 Docker 容器内部访问。可以在 [repo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config) 中找到的基础配置已经是提供的 Docker 镜像的一部分,默认情况下将全部加载。 + +可以使用标志 `--mount type=bind,source=$LOCAL_CONFIG_PATH,target=/config/$CONFIG_NAME,readonly` 挂载单个配置文件,然后将配置文件添加到 `CONFIG_FILES` 以便加载。 + +可以使用标志 `--mount source=$LOCAL_CONFIG_DIR_PATH,target=/config,readonly` 挂载整个目录,然后将单个配置文件添加到 `CONFIG_FILES` 以便加载。 + +例如,假设您在本地机器的路径 `/home/workspace/ethereum.json` 有一个配置文件,并且想要使用它运行 validator。 + +```bash +docker run -it \ +--mount type=bind,source=/home/workspace/ethereum.json,target=/config/ethereum.json,readonly \ +-e CONFIG_FILES=/config/ethereum.json $DOCKER_IMAGE ./validator +``` + +`source` 路径是您本地机器上的路径,`target` 路径是源路径内容将在 Docker 容器内可用的位置,`CONFIG_FILES` 应从目标路径指定配置。 \ No newline at end of file diff --git a/zh/docs/operate/config/config-reference.mdx b/zh/docs/operate/config/config-reference.mdx new file mode 100644 index 0000000..ed07c7d --- /dev/null +++ b/zh/docs/operate/config/config-reference.mdx @@ -0,0 +1,1844 @@ +--- +title: "配置参考" +--- + +## CONFIG_FILES + +**描述:**(仅环境变量)按顺序加载的额外配置文件路径列表(例如 `hyperlane-monorepo/rust/main/config` 中的那些)。它们将从第一个到最后一个合并,因此如果第一个和最后一个都指定了特定的配置路径,将使用最后列出的文件中设置的值。 + +这些文件必须在您的 agent 有权访问的文件系统中可访问。如果您在 Docker 中运行,请参阅 [agent 配置指南](./agent-config#config-files-with-docker)以获取将配置文件挂载到 Docker 容器中的提示。 + +**可选:** 是 + +**Agent:** 所有 + +**类型:** `string`(逗号分隔的文件路径列表) + + +```bash As Arg +# Not supported as an argument +``` + +```bash As Env +export CONFIG_FILES='./config/ethereum/my-config.json,./config/ethereum/my-validator-config.json' +``` + +```json As Config +# Not supported in configuration files +``` + + + +## chains + +**Description:** Configuration for each of the chains that must be used by an agent. + +**Optional:** No + +**Agents:** All + +**Type:** `Map` (See `chains.*` for `ChainSetup` values) + + +```bash As Arg +--chains.${CHAIN_NAME}.* +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_*="...." +export HYP_CHAINS_ETHEREUM_*="...." +``` + +```json As Config +{ + "chains": { + "": {}, + "ethereum": {} + } +} +``` + + + +## chains.``.name + +**Description:** Name of the domain. Allows specifying a different name for the domain than the chain's true name. This should _almost always_ be the same as `chain_name`. + +**Requires:** Alignment with domain id if it is a known domain name. + +**Optional:** No + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--chains.${CHAIN_NAME}.name $DOMAIN_NAME +--chains.ethereum.name ethereum +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_NAME="$DOMAIN_NAME" +export HYP_CHAINS_ETHEREUM_NAME="ethereum" +``` + +```json As Config +{ + "chains": { + "": { + "name": "" + }, + "ethereum": { + "name": "ethereum" + } + } +} +``` + + + +## chains.``.domain + +**Description:** Hyperplane domain id to uniquely identify the domain. See also: [Domain Identifiers](/zh/docs/reference/domains). + +**Requires:** Alignment with domain name if it is a known domain. + +**Optional:** No + +**Agents:** All + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--chains.${CHAIN_NAME}.domain $DOMAIN_ID +--chains.ethereum.domain 1 +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_DOMAIN="$DOMAIN_NAME" +export HYP_CHAINS_ETHEREUM_DOMAIN=1 +``` + +```json As Config +{ + "chains": { + "": { + "domain": "" + }, + "ethereum": { + "domain": 1 + } + } +} +``` + + + +## chains.``.mailbox + +**Description:** Address of the mailbox contract on the chain. See also [contract addresses](/zh/docs/reference/addresses/deployments/mainnet/mailbox). + +**Optional:** No + +**Agents:** All + +**Type:** `Hash (string)` + + +```bash As Arg +--chains.${CHAIN_NAME}.mailbox "$MAILBOX_ADDRESS" +--chains.ethereum.mailbox "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_MAILBOX="$MAILBOX_ADDRESS" +export HYP_CHAINS_ETHEREUM_MAILBOX="0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" +``` + +```json As Config +{ + "chains": { + "": { + "addresses": { + "mailbox": "" + } + }, + "ethereum": { + "addresses": { + "mailbox": "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" + } + } + } +} +``` + + + +## chains.``.interchainGasPaymaster + +**Description:** Address of the interchain gas paymaster contract on the chain. See also [contract addresses](/zh/docs/reference/addresses/deployments/mainnet/interchainGasPaymaster). + +**Optional:** No + +**Agents:** All + +**Type:** `Hash (string)` + + +```bash As Arg +--chains.${CHAIN_NAME}.interchainGasPaymaster "$IGP_ADDRESS" +--chains.ethereum.interchainGasPaymaster "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_INTERCHAINGASPAYMASTER="$IGP_ADDRESS" +export HYP_CHAINS_ETHEREUM_INTERCHAINGASPAYMASTER="0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" +``` + +```json As Config +{ + "chains": { + "": { + "addresses": { + "interchainGasPaymaster": "" + } + }, + "ethereum": { + "addresses": { + "interchainGasPaymaster": "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" + } + } + } +} +``` + + + +## chains.``.validatorAnnounce + +**Description:** Address of the validator announce contract on the chain. See also [contract addresses](/zh/docs/reference/addresses/deployments/mainnet/validatorAnnounce). + +**Optional:** No + +**Agents:** All + +**Type:** `Hash (string)` + + +```bash As Arg +--chains.${CHAIN_NAME}.validatorAnnounce "$VALIDATOR_ANNOUNCE_ADDRESS" +--chains.ethereum.validatorAnnounce "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_VALIDATORANNOUNCE="$VALIDATOR_ANNOUNCE_ADDRESS" +export HYP_CHAINS_ETHEREUM_VALIDATORANNOUNCE="0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" +``` + +```json As Config +{ + "chains": { + "": { + "addresses": { + "validatorAnnounce": "" + } + }, + "ethereum": { + "addresses": { + "validatorAnnounce": "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" + } + } + } +} +``` + + + +## chains.``.merkleTreeHook + +**Description:** Address of the merkle tree hook contract on the chain. See also [contract addresses](/zh/docs/reference/addresses/deployments/mainnet/merkleTreeHook). + +**Optional:** No + +**Agents:** All + +**Type:** `Hash (string)` + + +```bash As Arg +--chains.${CHAIN_NAME}.merkleTreeHook "$MERKLE_TREE_HOOK_ADDRESS" +--chains.ethereum.merkleTreeHook "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_MERKLETREEHOOK="$MERKLE_TREE_HOOK_ADDRESS" +export HYP_CHAINS_ETHEREUM_MERKLETREEHOOK="0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" +``` + +```json As Config +{ + "chains": { + "": { + "addresses": { + "merkleTreeHook": "" + } + }, + "ethereum": { + "addresses": { + "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" + } + } + } +} +``` + + + +## chains.``.signer + +**Description:** The signer that should be used this chain + +**Optional:** Yes (Will use `defaultsigner` if not specified) + +**Agents:** All + +**Type:** `SignerConf (Object)` + + +```bash As Arg +--chains.${CHAIN_NAME}.signer.* +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_*="...." +``` + +```json As Config +{ + "chains": { + "": { + "signer": {} + }, + "ethereum": { + "signer": {} + } + } +} +``` + + + +## chains.``.signer.type + +**Description:** The type of signer that is defined. A `HexKey` signer uses a private key, an `Aws` signer uses an AWS based KMS, and `Node` assumes the local node will sign RPC calls. + +**Optional:** Yes; Defaults to `node` unless a `key` is specified in which case it defaults to `hexKey` + +**Agents:** All + +**Type:** `Enum ("hexKey" | "aws" | "cosmosKey" | "node")` + +Accepted values for the different VMs are: + +- EVM: `hexKey` (ECDSA) or `aws` (ECDSA) +- sealevel: `hexKey` (ED25519) +- cosmos: `cosmosKey` + + +```bash As Arg +--chains.${CHAIN_NAME}.signer.type hexKey +--chains.ethereum.signer.type node +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_TYPE="hexKey" +``` + +```json As Config +{ + "chains": { + "": { + "signer": { + "type": "hexKey" + } + }, + "ethereum": { + "signer": { + "type": "node" + } + } + } +} +``` + + + +## chains.``.signer.key + +**描述:** 十六进制密钥。私钥的十六进制字符串。 + +**需要:** `chains..signer.type = "hexKey" | undefined` + +**可选:** 否(当且仅当满足要求时) + +**Agent:** 所有 + +**类型:** `string` + + +```bash As Arg +--chains.${CHAIN_NAME}.signer.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + +```json As Config +{ + "chains": { + "": { + "signer": { + "key": "" + } + }, + "ethereum": { + "signer": { + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } + } + } +} +``` + + + +## chains.``.signer.id + +**Description:** The UUID identifying the AWS KMS key + +**Requires:** `chains..signer.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--chains.ethereum.signer.type "alias/validator-signer-ethereum" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_ID="alias/validator-signer-ethereum" +``` + +```json As Config +{ + "chains": { + "ethereum": { + "signer": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } + } + } +} +``` + + + +## chains.``.signer.region + +**Description:** The AWS region + +**Requires:** `chains..signer.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--chains.${CHAIN_NAME}.signer.region us-east-1 +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_SIGNER_REGION="us-east-1" +``` + +```json As Config +{ + "chains": { + "": { + "signer": { + "type": "aws", + "region": "us-east-1" + } + } + } +} +``` + + + +## chains.``.protocol + +**Description:** Connection protocol to use. + +**Optional:** Defaults to `"ethereum"` + +**Agents:** All + +**Type:** `Enum ("ethereum" | "fuel")` + + +```bash As Arg +--chains.${CHAIN_NAME}.protocol ethereum +--chains.ethereum.protocol ethereum +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_PROTOCOL="ethereum" +export HYP_CHAINS_ARBITRUM_PROTOCOL="ethereum" +``` + +```json As Config +{ + "chains": { + "": { + "protocol": "" + }, + "arbitrum": { + "protocol": "ethereum" + } + } +} +``` + + + +## chains.``.rpcConsensusType + + + +**The consensus type currently only applies to EVM chains.** + +Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified in [rpcUrls](#chains--rpcurls), only the first one will be used. + + + +**Description:** How to communicate with the provider + +- `"single"` uses a basic http connection +- `"fallback"` will try the first URL and then automatically "fall back" on a connection or other provider failure to the next provider; this should only retry calls which fail due to the provider and not the call itself such; an insufficient gas error for instance would not fall back. +- `"quorum"` requires a majority of the URLs to agree with the exception of submitting transactions; it will automatically coordinate the "latest" block if not specified to reduce sync errors. + +**Requires:** `chains..protocol = "ethereum" | undefined` + +**Optional:** Defaults to `"fallback"` + +**Agents:** All + +**Type:** `Enum ("fallback", "single", "quorum")` + + +```bash As Arg +--chains.${CHAIN_NAME}.rpcConsensusType single +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_RPCCONSENSUSTYPE="single" +export HYP_CHAINS_ETHEREUM_RPCCONSENSUSTYPE="single" +``` + +```json As Config +{ + "chains": { + "": { + "rpcConsensusType": "single" + }, + "ethereum": { + "rpcConsensusType": "single" + } + } +} +``` + + + +## chains.``.customRpcUrls + + + +Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified, only the first one will be used. + + + +**Description:** Comma-separated URLs to connect the provider to. The difference between `customRpcUrls` and [rpcUrls](#chains--rpcurls) is that `customRpcUrls` allows for more user friendly inputs from the CLI or environment variables (comma-separated vs array). + +**Type:** `string` (comma separated list of urls without spaces) + + +```bash As Arg +--chains.${CHAIN_NAME}.customrpcurls "$CONNECTION_URLS" +--chains.ethereum.customrpcurls "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_CUSTOMRPCURLS="$CONNECTION_URLS" +export HYP_CHAINS_ETHEREUM_CUSTOMRPCURLS="http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + +```json As Config +{ + "chains": { + "ethereum": { + "customRpcUrls": "http://127.0.0.1:8545,http://127.0.0.1:8546" + } + } +} +``` + + +## chains.``.rpcUrls + + + +Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified, only the first one will be used. + + + +**Description:** URLs to connect the provider to. The first one is initially used, and on failure the other ones are tried. See [rpcConsensusType](#chains--rpcconsensustypee) for more information. + +**Requires:** + +``` +(chains..protocol = "ethereum" | undefined) + AND (chains..connection.type = "fallback" | "quorum") + OR chains..protocol = "cosmos" | "sealevel" | "fuel" +``` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--chains.${CHAIN_NAME}.rpcurls.0.https "$CONNECTION_URL_0" +--chains.${CHAIN_NAME}.rpcurls.1.https "$CONNECTION_URL_1" +--chains.${CHAIN_NAME}.rpcurls.2.https "$CONNECTION_URL_2" +--chains.ethereum.rpcurls.0.https "http://127.0.0.1:8545" +--chains.ethereum.rpcurls.1.https "http://127.0.0.1:8546" +--chains.ethereum.rpcurls.2.https "http://127.0.0.1:8547" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_0_HTTPS="$CONNECTION_URL_0" +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_1_HTTPS="$CONNECTION_URL_1" +export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_2_HTTPS="$CONNECTION_URL_2" +export HYP_CHAINS_ETHEREUM_RPCURLS_0_HTTPS="http://127.0.0.1:8545" +export HYP_CHAINS_ETHEREUM_RPCURLS_1_HTTPS="http://127.0.0.1:8546" +export HYP_CHAINS_ETHEREUM_RPCURLS_2_HTTPS="http://127.0.0.1:8547" +``` + +```json As Config +{ + "chains": { + "": { + "rpcUrls": [ + { + "http": "" + }, + { + "http": "" + } + ] + }, + "ethereum": { + "rpcUrls": [ + { + "http": "http://127.0.0.1:8545" + }, + { + "http": "http://127.0.0.1:8546" + } + ] + } + } +} +``` + + + +## chains.``.customGrpcUrls + + + +Connections to Cosmos chains require **both** RPC and gRPC URLs. There is **no `rpcConsensusType` configuration** for Cosmos chains, and gRPC URLs always operate in **fallback mode**—if the first URL fails, the next one is used. + + + +**Description:** Comma-separated gRPC URLs used to connect to the provider. Similar to [`customRpcUrls`](#chains--customrpcurls). + +**Type:** `string` (comma-separated list of URLs without spaces) + + +```bash As Arg +--chains.${CHAIN_NAME}.customgrpcurls "$CONNECTION_URLS" +--chains.cosmos.customgrpcurls "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_CUSTOMGRPCURLS="$CONNECTION_URLS" +export HYP_CHAINS_COSMOS_CUSTOMGRPCURLS="http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" +``` + +```json As Config +{ + "chains": { + "cosmos": { + "customRpcUrls": "", + "customGrpcUrls": "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" + } + } +} +``` + + + +## chains.``.index.from + +**Description:** Height at which to start indexing contracts. + +**Optional:** Defaults to `0` + +**Agents:** Relayer & Scraper + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--chains.${CHAIN_NAME}.index.from 0 +--chains.ethereum.index.from 16271503 +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_INDEX_FROM=0 +export HYP_CHAINS_ETHEREUM_INDEX_FROM=16271503 +``` + +```json As Config +{ + "chains": { + "": { + "index": { + "from": 0 + } + }, + "ethereum": { + "index": { + "from": 16271503 + } + } + } +} +``` + + + +## chains.``.index.chunk + +**Description:** Number of blocks to query at once when indexing contracts. Note that the configured providers must support whatever value is set. The default should work with nearly all providers. + +**Optional:** Defaults to `1999` + +**Agents:** Relayer & Scraper + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--chains.${CHAIN_NAME}.index.chunk 1999 +--chains.ethereum.index.chunk 1999 +``` + +```bash As Env +export HYP_CHAINS_${CHAIN_NAME}_INDEX_CHUNK=1999 +export HYP_CHAINS_ETHEREUM_INDEX_CHUNK=1999 +``` + +```json As Config +{ + "chains": { + "": { + "index": { + "chunk": 1999 + } + }, + "ethereum": { + "index": { + "chunk": 1999 + } + } + } +} +``` + + + +## defaultsigner + + + +因为每个 VM 支持不同的签名器类型,默认签名器只能支持单个 VM 类型。例如,如果默认签名器是 ECDSA 签名器,它将只能在 EVM 链上签名。 + + + +**描述:** 应用于所有未指定自己签名器的链的默认签名器。 + +**可选:** 是 + +**Agent:** 所有 + +**类型:** `SignerConf (Object)` + + +```bash As Arg +--defaultSigner.* +``` + +```bash As Env +export HYP_DEFAULTSIGNER_*="...." +``` + +```json As Config +{ + "defaultsigner": {} +} +``` + + + +## defaultsigner.type + +**Description:** The type of signer that is defined. A `HexKey` signer uses a private key, an `Aws` signer uses an AWS-based KMS, and `Node` assumes the local node will sign RPC calls. + +**Optional:** Yes; Defaults to `node` unless a `key` is specified in which case it defaults to `hexKey` + +**Agents:** All + +**Type:** `Enum ("hexKey" | "aws" | "cosmosKey" | "node")` + + +```bash As Arg +--defaultSigner.type hexKey +``` + +```bash As Env +export HYP_DEFAULTSIGNER_TYPE="hexKey" +``` + +```json As Config +{ + "defaultsigner": { + "type": "hexKey" + } +} +``` + + + +## defaultsigner.key + +**Description:** A hex key. The hex string of a private key. + +**Requires:** `defaultsigner.type = "hexKey" | undefined` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--defaultSigner.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + +```bash As Env +export HYP_DEFAULTSIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + +```json As Config +{ + "defaultsigner": { + "type": "hexKey", + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } +} +``` + + + +## defaultsigner.id + +**Description:** The UUID identifying the AWS KMS key + +**Requires:** `defaultsigner.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--defaultSigner.id "alias/validator-signer-ethereum" +``` + +```bash As Env +export HYP_DEFAULTSIGNER_ID="alias/validator-signer-ethereum" +``` + +```json As Config +{ + "defaultsigner": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } +} +``` + + + +## defaultsigner.region + +**Description:** The AWS region + +**Requires:** `defaultsigner.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--defaultSigner.region us-east-1 +``` + +```bash As Env +export HYP_DEFAULTSIGNER_REGION="us-east-1" +``` + +```json As Config +{ + "defaultsigner": { + "type": "aws", + "region": "us-east-1" + } +} +``` + + +## metricsport + +**Description:** Port to expose prometheus metrics on + +**Optional:** Defaults to `9090` + +**Agents:** All + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--metrics-port 9090 +``` + +```bash As Env +export HYP_METRICSPORT=9090 +``` + +```json As Config +{ + "metrics": 9090 +} +``` + + + +## log.format + +**Description:** Configuration for the log module. This controls logging. + +**Optional:** Defaults to `pretty` + +**Agents:** All + +**Type:** `Enum ("pretty" | "json" | "full" | "compact")` + + +```bash As Arg +--log.format pretty +``` + +```bash As Env +export HYP_LOG_FORMAT="pretty" +``` + +```json As Config +{ + "log": { + "format": "pretty" + } +} +``` + + + +## log.level + +**Description:** Configuration for the log module. This controls logging. For full verbosity (including that of dependencies), use `dependencyTrace`. + +**Optional:** Defaults to `info` + +**Agents:** All + +**Type:** `Enum ("dependencyTrace" | "trace" | "debug" | "info" | "warn" | "error" | "off")` + + +```bash As Arg +--log.level info +``` + +```bash As Env +export HYP_LOG_LEVEL="info" +``` + +```json As Config +{ + "log": { + "level": "info" + } +} +``` + + + +## originchainname + +**Description:** Name of the chain a validator should validate for and name of the chain a relayer should relayer messages from. **Deprecated for Relayer, use** [#relaychains](#relaychains) **instead.** + +**Optional:** No - Validators; Yes - Relayer + +**Agents:** Validator & Relayer + +**Type:** `string` + + +```bash As Arg +--originChainName ethereum +``` + +```bash As Env +export HYP_ORIGINCHAINNAME="ethereum" +``` + +```json As Config +{ + "originchainname": "ethereum" +} +``` + + + +## validator + +**Description:** The signer that should be used by the validator. + +**Optional:** Yes + +**Agents:** All + +**Type:** `SignerConf (Object)` + + +```bash As Arg +--validator.* +``` + +```bash As Env +export HYP_VALIDATOR_*="...." +``` + +```json As Config +{ + "validator": {} +} +``` + + + +## validator.type + +**描述:** 定义的 EVM 签名器类型。请注意,无论 validator 在哪个 VM 上运行,checkpoint 始终使用 EVM ECDSA 曲线签名。`HexKey` 签名器使用私钥,`Aws` 签名器使用基于 AWS 的 KMS,`Node` 假定本地节点将签署 RPC 调用。 + +**可选:** 是;默认为 `node`,除非指定了 `key`,在这种情况下默认为 `hexKey` + +**Agent:** 所有 + +**类型:** `Enum ("hexKey" | "aws" | "node")` + + +```bash As Arg +--validator.type hexKey +``` + +```bash As Env +export HYP_VALIDATOR_TYPE="hexKey" +``` + +```json As Config +{ + "validator": { + "type": "hexKey" + } +} +``` + + + +## validator.key + +**Description:** A hex key. The hex string of a private key. + +**Requires:** `validator.type = "hexKey" | undefined` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--validator.key 8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61 +``` + +```bash As Env +export HYP_VALIDATOR_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" +``` + +```json As Config +{ + "validator": { + "type": "hexKey", + "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" + } +} +``` + + + +## validator.id + +**Description:** The UUID identifying the AWS KMS key + +**Requires:** `validator.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--validator.id "alias/validator-signer-ethereum" +``` + +```bash As Env +export HYP_VALIDATOR_ID="alias/validator-signer-ethereum" +``` + +```json As Config +{ + "validator": { + "type": "aws", + "id": "alias/validator-signer-ethereum" + } +} +``` + + + +## validator.region + +**Description:** The AWS region + +**Requires:** `validator.type = "aws"` + +**Optional:** No (iff requirements are met) + +**Agents:** All + +**Type:** `string` + + +```bash As Arg +--validator.region us-east-1 +``` + +```bash As Env +export HYP_VALIDATOR_REGION="us-east-1" +``` + +```json As Config +{ + "validator": { + "type": "aws", + "region": "us-east-1" + } +} +``` + + + +## checkpointsyncer.type + +**Description:** Defines the method of syncing checkpoints + +**Optional:** No + +**Agents:** Validator + +**Type:** `Enum ("localStorage" | "s3")` + + +```bash As Arg +--checkpointSyncer.type localStorage +``` + +```bash As Env +export HYP_CHECKPOINTSYNCER_TYPE="localStorage" +``` + +```json As Config +{ + "checkpointsyncer": { + "type": "localStorage" + } +} +``` + + +## checkpointsyncer.path + +**Description:** Path on the local disk of a local storage type checkpoint syncer configuration. + +**Requires:** `checkpointsyncer.type = "localStorage"` + +**Optional:** No (iff conditions are met) + +**Agents:** Validator + +**Type:** `string` + + +```bash As Arg +--checkpointSyncer.path "/tmp/syncer" +``` + +```bash As Env +export HYP_CHECKPOINTSYNCER_PATH="/tmp/syncer" +``` + +```json As Config +{ + "checkpointsyncer": { + "type": "localStorage", + "path": "/tmp/syncer" + } +} +``` + + + +## checkpointsyncer.bucket + +**Description:** S3 bucket name + +**Requires:** `checkpointsyncer.type = "s3"` + +**Optional:** No (iff conditions are met) + +**Agents:** Validator + +**Type:** `string` + + +```bash As Arg +--checkpointSyncer.bucket signatures-ethereum +``` + +```bash As Env +export HYP_CHECKPOINTSYNCER_BUCKET="signatures-ethereum" +``` + +```json As Config +{ + "checkpointsyncer": { + "type": "s3", + "bucket": "signatures-ethereum" + } +} +``` + + + +## checkpointsyncer.folder + +**Description:** Folder in the S3 bucket + +**Requires:** `checkpointsyncer.type = "s3"` + +**Optional:** No (iff conditions are met) + +**Agents:** Validator + +**Type:** `string` + + +```bash As Arg +--checkpointSyncer.folder signatures-ethereum +``` + +```bash As Env +export HYP_CHECKPOINTSYNCER_FOLDER="signatures-ethereum" +``` + +```json As Config +{ + "checkpointsyncer": { + "type": "s3", + "folder": "signatures-ethereum" + } +} +``` + + + +## checkpointsyncer.region + +**Description:** S3 bucket region + +**Requires:** `checkpointsyncer.type = "s3"` + +**Optional:** No (iff conditions are met) + +**Agents:** Validator + +**Type:** `string` + + +```bash As Arg +--checkpointSyncer.region us-east-1 +``` + +```bash As Env +export HYP_CHECKPOINTSYNCER_REGION="us-east-1" +``` + +```json As Config +{ + "checkpointsyncer": { + "type": "s3", + "region": "us-east-1" + } +} +``` + + + +## interval + +**Description:** How frequently the validator should check for new checkpoints in seconds? See also [latencies](/zh/docs/reference/addresses/validators/latencies). + +**Optional:** No + +**Agents:** Validator + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--interval 30 +``` + +```bash As Env +export HYP_INTERVAL=30 +``` + +```json As Config +{ + "interval": 30 +} +``` + + + +## db + +**描述:** 这是 agent 在磁盘上存储相关数据的本地文件系统路径。**每个 agent 必须唯一!** 多个 agent 必须有不同的路径。如果路径不以系统定义的根路径(如 unix 上的 `/`)开头,则相对于当前工作目录。使用 docker 镜像时,请确保此文件夹在运行之间保持持久化。 + +对于 scraper,这是 postgresql 数据库的连接字符串。 + +**可选:** 对于 validator 和 relayer,它是可选的,默认为当前工作目录中包含 `originchainname` 的路径。对于 scraper,它是必需的。 + +**Agent:** 所有 + +**类型:** `string` + + +```bash As Arg +# Validator +--db "/tmp/hyp/validator/ethereum-cache" + +# Relayer + +--db "/tmp/hyp/relayer/ethereum-cache" + +# Scraper + +--db "postgresql://postgres:password@localhost:5432/dbname" + +```` + +```bash As Env +# Validator +export HYP_DB="/tmp/hyp/validator/ethereum-cache" + +# Relayer +export HYP_DB="/tmp/hyp/relayer/ethereum-cache" + +# Scraper +export HYP_DB="postgresql://postgres:password@localhost:5432/dbname" +```` + +```json As Config +# For the validator: +{ + "db": "/tmp/hyp/validator/ethereum-cache" +} + +# For the relayer: +{ + "db": "/tmp/hyp/relayer/ethereum-cache" +} + +# For the scraper: +{ + "db": "postgresql://postgres:password@localhost:5432/dbname" +} +``` + + + +## relaychains + +**Description:** List of chains to deliver messages between. + +**Optional:** No + +**Agents:** Relayer + +**Type:** `string` (comma separated list) + + +```bash As Arg +--relayChains "arbitrum,ethereum,bsc" +``` + +```bash As Env +export HYP_RELAYCHAINS="arbitrum,ethereum,bsc" +``` + +```json As Config +{ + "relaychains": "arbitrum,ethereum,bsc" +} +``` + + + +## gaspaymentenforcement + +**Description:** JSON stringified array of gas payment enforcement configurations sorted by highest priority first. The last policy should be a catch-all and handle any messages that did not match a previous policy. + +**Optional:** Defaults to no enforcement (`[{"type": "none"}]`) + +**Agents:** Relayer + +**Type:** `JSON (string)` + + +```typescript Type Definition +type gaspaymentenforcement = Array; + +type GasPaymentEnforcementPolicy = +| // fields specific to each type... +// No requirements - all messages are processed regardless of gas payment +({ +type: "none"; +} & { +// Messages that have paid a minimum amount will be processed +type: "minimum"; +payment: U256; +} & { type: "onChainFeeQuoting"; gasfraction?: GasFraction }) // to on-chain fee quoting. `gasfraction` defaults to "1 / 2". // Required amount of gas on the foreign chain has been paid according +| { +// all types have the following fields... +// If a message matches, this policy will be used. +// If no matching list is specified, all messages will match. +matchingList?: MatchingList; +}; + +// A list of matching rules. A message matches if any of the list +// elements matches the message. +type MatchingList = Array; + +// Matches a message if any of the provided values matches. +interface MatchingListElement { +originDomain?: NumericFilter; +senderAddress?: HashFilter; +destinationDomain?: NumericFilter; +recipientAddress?: HashFilter; +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32-bit unsigned integer +type U32 = number | string; +// 256-bit unsigned integer; Note: `number` type has limited precision. +type U256 = string | number; +// 256-bit hash (can also be less) encoded as hex +type H256 = string; +// Matches anything +type Wildcard = "\*"; +// A numeric string in the form `{numerator} / {denominator}`, e.g. "1 / 2" +type GasFraction = string; + +```` + +```bash As Arg +--gasPaymentEnforcement '[ + {"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, + {"type": "minimum", "payment": 100000} +]' +```` + +```bash As Env +export HYP_GASPAYMENTENFORCEMENT='[ + {"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, + {"type": "minimum", "payment": 100000} +]' +``` + +```json As Config +{ + "gaspaymentenforcement": "[{\"type\": \"none\", \"matchingList\": [{\"senderAddress\": \"0xa441b15fe9a3cf56661190a0b93b9dec7d041272\"}]}, {\"type\": \"minimum\", \"payment\": 100000}]" +} +``` + + + +## whitelist + +**Description:** A matching list to define what messages should be allowed. Any messages which do not match this list will not be relayed. If no whitelist is supplied all messages will be allowed. + +See also [message filtering](/zh/docs/operate/relayer/message-filtering) + +**Optional:** Yes + +**Agents:** Relayer + +**Type:** `JSON (string)` + + +```typescript Type Definition +// A list of matching rules. A message matches if any of the list +// elements matches the message. +type MatchingList = Array; + +// Matches a message if any of the provided values matches. +interface MatchingListElement { +originDomain?: NumericFilter +senderAddress?: HashFilter +destinationDomain?: NumericFilter +recipientAddress?: HashFilter +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32-bit unsigned integer +type U32 = number | string; +// 256-bit hash (can also be less) encoded as hex +type H256 = string; +// Matches anything +type Wildcard = "\*"; + +```` + +```bash As Arg +--whitelist '[ + {"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, + {"destinationDomain": 1} +]' +```` + +```bash As Env +export HYP_WHITELIST='[ + {"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, + {"destinationDomain": 1} +]' +``` + +```json As Config +{ + "whitelist": "[{\"senderAddress\": \"0xa441b15fe9a3cf56661190a0b93b9dec7d041272\", \"originDomain\": [1, 42]}, {\"destinationDomain\": 1}]" +} +``` + + + +## blacklist + +**Description:** A matching list to define what messages should be ignored. Any messages which match this list will not be relayed. If no blacklist is supplied all messages will be allowed. + +See also [message filtering](/zh/docs/operate/relayer/message-filtering) + +**Optional:** Yes + +**Agents:** Relayer + +**Type:** `JSON (string)` + + +```typescript Type Definition +type blacklist = MatchingList | undefined; + +// A list of matching rules. A message matches if any of the list +// elements matches the message. +type MatchingList = Array; + +// Matches a message if any of the provided values matches. +interface MatchingListElement { +originDomain?: NumericFilter; +senderAddress?: HashFilter; +destinationDomain?: NumericFilter; +recipientAddress?: HashFilter; +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32-bit unsigned integer +type U32 = number | string; +// 256-bit hash (can also be less) encoded as hex +type H256 = string; +// Matches anything +type Wildcard = "\*"; + +```` + +```bash As Arg +--blacklist '[ + {"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, + {"destinationDomain": 1} +]' +```` + +```bash As Env +export HYP_BLACKLIST='[ + {"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, + {"destinationDomain": 1} +]' +``` + +```json As Config +{ + "blacklist": "[{\"senderAddress\": \"0xa441b15fe9a3cf56661190a0b93b9dec7d041272\", \"originDomain\": [1, 42]}, {\"destinationDomain\": 1}]" +} +``` + + + +## transactiongaslimit + +**Description:** The max allowable gas to relay a transaction. + +**Optional:** Defaults to no limit + +**Agents:** Relayer + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--transactionGasLimit 250000000 +``` + +```bash As Env +export HYP_TRANSACTIONGASLIMIT="250000000" +``` + +```json As Config +{ + "transactiongaslimit": "250000000" +} +``` + + + +## skiptransactiongaslimitfor + +**Description:** List of domain ids to skip applying the `transactiongaslimit` for. + +**Optional:** Defaults to using the `transactiongaslimit` for all domains + +**Agents:** Relayer + +**Type:** `string` (comma separated list of domain ids) + + +```bash As Arg +--skipTransactionGasLimitFor "43114,10,42220" +``` + +```bash As Env +export HYP_SKIPTRANSACTIONGASLIMITFOR="43114,10,42220" +``` + +```json As Config +{ + "skiptransactiongaslimitfor": "43114,10,42220" +} +``` + + + +## allowlocalcheckpointsyncers + +**Description:** Whether to allow local `checkpointsyncer` types, if `false` it will ignore them. + +**Optional:** Defaults to `false` + +**Agents:** Relayer + +**Type:** `boolean` + + +```bash As Arg +--allowLocalCheckpointSyncers false +``` + +```bash As Env +export HYP_ALLOWLOCALCHECKPOINTSYNCERS=false +``` + +```json As Config +{ + "allowlocalcheckpointsyncers": false +} +``` + + + +## maxmessageretries + +**Description:** The maximum number of retries to attempt before dropping a message from the relayer queues. This prevents messages from being retried indefinitely. + +**Optional:** Defaults to a system default value of 66 + +**Agents:** Relayer + +**Type:** `Numeric (string | number)` + + +```bash As Arg +--maxMessageRetries 120 +``` + +```bash As Env +export HYP_MAXMESSAGERETRIES="120" +``` + +```json As Config +{ + "maxmessageretries": "120" +} +``` + + + +## AWS_ACCESS_KEY_ID + +**Description:** (Env only) The access key ID of your validator's AWS IAM user. + +**Optional**: Required if any signer configuration uses `aws` + +**Agents:** Relayer & Validator + +**Type:** `string` + + +```bash As Arg +# Not supported as an argument +``` + +```bash As Env +export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" +``` + +```json As Config +# Not supported in configuration files +``` + + + +## AWS_SECRET_ACCESS_KEY + +**描述:**(仅环境变量)您的 validator 的 AWS IAM 用户的秘密访问密钥。 + +**可选:** 如果任何签名器配置使用 `aws`,则必需 + +**Agent:** Relayer & Validator + +**类型:** `string` + + +```bash As Arg +# Not supported as an argument +``` + +```bash As Env +export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" +``` + +```json As Config +# Not supported in configuration files +``` + + diff --git a/zh/docs/operate/guides/avs-operator-guide.mdx b/zh/docs/operate/guides/avs-operator-guide.mdx new file mode 100644 index 0000000..33cfc81 --- /dev/null +++ b/zh/docs/operate/guides/avs-operator-guide.mdx @@ -0,0 +1,75 @@ +--- +title: "AVS 运营商指南" +--- + +## 概述 + +Hyperlane validator 是轻量级的链下 agent,负责安全性——它们观察源链的 [Mailbox](/zh/docs/protocol/core/mailbox) 上的消息,并在需要时签署证明 mailbox 当前状态的 merkle root。 + +此签名被存储并公开可用(例如在 S3 存储桶中),然后由链下 Relayer 和链上跨链安全模块使用。Validator 之间_没有_网络连接,不需要达成共识;它们也不定期提交链上交易。 + +按照本指南,您将在 Hyperlane 协议所在的[**任何链**](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行 Hyperlane validator,包括 Arbitrum、Optimism、BSC、Base、Blast、Linea、Mode 和 Polygon。之后,您将通过与 Ethereum Mainnet 或 Holesky 上的 AVS 合约交互,将您的 validator 与您的 EigenLayer Operator 链接。这个过程与整个 Hyperlane 框架一样,是开源且无需许可的——不需要白名单或最低质押。 + +## 1. 安装 CLI + +使用 `npm install -g @hyperlane-xyz/cli` 安装最新版本的 `@hyperlane-xyz/cli` 包。详细的 CLI 安装说明可在[此处](/zh/docs/reference/developer-tools/cli)获取。 + +## 2. 运行 validator + +想要使用 Docker Compose 和 AWS 快速部署生产就绪环境的运营商可能希望使用 [Docker Compose 快速入门指南](/zh/docs/operate/guides/docker-quickstart)。 + +按照[此处](/zh/docs/operate/validators/run-validators)的 validator 指南,使用 AWS 设置在 Hyperlane 网络中的[任何链](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行 validator。您还可以轻松地推广到其他存储提供商,如 [GCP](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156) 和 Azure,或其他密钥管理解决方案。 + +确保您的 KMS 密钥在该链上有资金以宣布自己。 + +### 监控 + +您可以通过在 validator 配置中指定的 `--metrics` 端口监控 EigenLayer 特定的端点。在[此处](https://docs.eigenlayer.xyz/eigenlayer/avs-guides/spec/api/)阅读有关示例端点及其预期内容的更多信息。 + +支持的端点包括: + +| 端点 | 描述 | +| ---------------------------- | ------------------------------ | +| **GET /eigen/node** | 节点信息 | +| **GET /eigen/node/health** | 节点健康状况 | +| **GET /eigen/node/services** | 节点正在运行的服务列表 | + +您将需要下一步的 validator 地址(签名密钥的地址)。 + +## 3. 设置密钥 + +operator 密钥和 AVS 签名密钥之间存在区别。operator 密钥仅用于与 AVS 合约交互,而 AVS 签名密钥用于主动操作,在我们的案例中将使用 Hyperlane validator 签署 checkpoint。 + +## 4. 注册您的 operator + +首先,确保您已在 Mainnet 或 Holesky 上[作为 EigenLayer operator](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-installation#operator-configuration-and-registration) 注册了您的 operator 密钥。您只需要 ECDSA 密钥。 + +接下来,要将您的 operator 注册到 Hyperlane AVS,您可以使用 Hyperlane CLI。通过创建 ECDSA 签名并将其与 AVS 签名密钥(即上述 Hyperlane validator 地址,而不是私钥)一起提交来注册您的 operator 密钥(通过 EigenLayer CLI 生成)。 + +```bash + hyperlane avs register --operatorKeyPath \ + --chain \ + --avsSigningKeyAddress +``` + +`AVS_NETWORK` 是您注册的网络,可以是 `Ethereum` 或 `Holesky`。 + +您的 AVS 签名密钥可以跨多个 validator 重复使用,无需为每个 validator 进行额外注册。如果您为每个 validator 使用不同的 AVS 签名密钥,则需要将每个密钥注册为 operator。 + +### 确认注册 + +要确认您在 mainnet 上注册,请使用 Hyperlane CLI 运行 `hyperlane avs check --chain ethereum --operatorAddress ` 并查看您的 validator 地址是否在那里。此查询可能需要几分钟才能完成。 + +此外,您可以在 `operatorRegistry` 函数下在 [Etherscan](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910#readProxyContract#F12) 上搜索您的地址,或在 EigenLayer 的 UI 上查看 [Ethereum](https://app.eigenlayer.xyz/avs/0xe8e59c6c8b56f2c178f63bcfc4ce5e5e2359c8fc) 或 [Holesky](https://holesky.eigenlayer.xyz/avs/0xc76e477437065093d353b7d56c81ff54d167b0ab)。 + + + +恭喜您注册 Hyperlane AVS! + +现在任何 Hyperlane 消息接收者都可以利用您的 validator 签名,帮助保护 rollup 互操作。 + + + +## 了解更多 + +- 您可以在[此处](/zh/docs/protocol/ISM/economic-security/hyperlane-avs)阅读有关 AVS 协议设计的更多信息。 \ No newline at end of file diff --git a/zh/docs/operate/guides/deploy-with-terraform.mdx b/zh/docs/operate/guides/deploy-with-terraform.mdx new file mode 100644 index 0000000..2f4cdde --- /dev/null +++ b/zh/docs/operate/guides/deploy-with-terraform.mdx @@ -0,0 +1,204 @@ +--- +title: "使用 Terraform 部署" +--- + +对于那些更熟悉通过基础设施即代码工具(如 Terraform)部署到 AWS 的人,我们在 [**GitHub 上提供了一个示例配置**](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/terraform),旨在为 AWS 上的 Hyperlane Validator 设置必要的基础设施。它自动创建运行 Validator agent 所需的资源,例如 ECS 集群、VPC、子网和安全组。 + + + 提供的配置仅旨在作为为核心支持网络运行 Validator 的*示例*。您可能需要修改 Validator 模块以支持更高级的配置。建议在生产环境中使用此设置之前进行彻底测试。 + + +## 概述 + +提供的 terraform 有几个关键部分: + +- IAM/KMS 模块:自动为您完成 [Agent 密钥](/zh/docs/operate/set-up-agent-keys)配置。 +- S3 模块:自动为您完成 [AWS 签名桶](/zh/docs/operate/validators/validator-signatures-aws)配置。 +- EFS 模块:设置可以挂载到 Validator 的持久卷。 +- Validator 模块:使用上述模块运行 Validator 实例。 +- `global.tf`:Validator 可以在其中运行的集群的顶级网络配置。 +- `main.tf`:配置要部署的 Validator。 + +下图显示了它们如何组合在一起。 + +```mermaid +graph LR + subgraph VPC_Network ["VPC Network"] + Subnet -- Protected by --> SG[AWS Security Group] + + subgraph SG ["AWS Security Group"] + NATG[AWS NAT Gateway] + IGW[AWS Internet Gateway] + end + end + + subgraph ECS_Validator ["Validator Module"] + ECSTask[ECS Task: Validator] -- Executes in --> Subnet + end + + subgraph S3_Subgraph ["S3 Module"] + S3Bucket[AWS S3 Bucket] -- Accessed by --> ECSTask + ECSTask -- Writes to --> S3Bucket[Validator Signatures] + end + + subgraph EFS_Subgraph ["EFS Module"] + EFS[AWS EFS] -- Mounted on --> ECSTask + end + + subgraph IAM_KMS ["IAM / KMS Module"] + IAMUser[Validator IAM User] + KMSKey[KMS Key] + end + + Internet -- Accessing Metrics --> IGW + NATG -- RPC Calls --> Internet + + %% Additional Interconnections + ECSTask -- Signs with --> KMSKey + ECSTask -- Perms from --> IAMUser + +``` + +## 使用 + +作为前提条件,您需要安装 Terraform 并使用您的凭据配置 AWS CLI。 + +要初始化 terraform 状态: + +```bash +terraform init +``` + +要生成基础设施更改计划: + +```bash +terraform plan +``` + +要预览并应用基础设施更改: + +```bash +terraform apply +``` + +要列出 KMS、IAM 或 S3 信息等输出,您需要解析 JSON 输出: + +```bash +terraform output -json +``` + +## 模块 + +存在多个模块,因此您可以选择要由 terraform 管理的 Validator 设置的哪些部分。 + +### IAM / KMS + +`iam_kms` 模块创建 IAM 用户和 KMS 密钥以进行安全签名操作。它还设置 IAM 策略和附件,以授予使用 KMS 密钥和其他 AWS 服务(如 S3、EFS 和 ECS)所需的权限。 + +### S3 + +`s3` 模块创建 S3 存储桶以存储与 Validator 相关的数据,例如签名。它还设置存储桶策略以管理访问和权限,包括公共访问限制和版本控制。 + +### EFS + +`efs` 模块定义 EFS 文件系统和访问点,允许 Validator 应用程序在 EFS 上存储和访问数据。它还设置挂载目标以将 EFS 文件系统连接到网络。 + +仅在使用 `validator` 模块时才需要此模块。 + +### Validator + +`validator` 模块使用上述所有模块来集成 EFS、IAM/KMS 和 S3 配置。 + +除了: + +- 创建新的 IAM 用户和相关角色以运行 Validator。 +- 创建 Validator 可以向其写入签名的 S3 存储桶。 +- 创建 EFS 卷以在服务中持久化数据。 + +此模块还: + +- 定义用于运行 Validator 应用程序的 ECS 任务定义,包括容器定义、卷配置和日志记录。 +- 创建 ECS 服务来管理 Validator 任务的部署和扩展。 + +## 主配置 + +根级配置为网络基础设施设置 VPC、子网、互联网网关、NAT 网关、路由表和安全组。它还提供了 `validator` 模块的示例用法。 + +```hcl +module "your_validator_name" { + source = "./modules/validator" + + validator_name = "your-validator-name" + origin_chain_name = "originChainName" + + aws_region = var.aws_region + validator_cluster_id = aws_ecs_cluster.validator_cluster.id + validator_subnet_id = aws_subnet.validator_subnet.id + validator_sg_id = aws_security_group.validator_sg.id + validator_nat_gateway_id = aws_nat_gateway.validator_nat_gateway.id + + # Disabling the Validator task allows you to set up all the required infrastructure + # without running the actual Validator yet. This is useful when setting up a Validator for + # the first time, so that you can find out the Validator's address and fund it before it + # performs the announcement transaction. + # validator_task_disabled = true +} +``` + +### 输出 + +根级 `outputs.tf` 转发 `main.tf` 中配置的所有 Validator 的所有输出。**您必须在添加、修改或删除 Validator 时更新此文件。** + +### 示例架构 + +下图显示了 Validator ECS 集群如何适应顶级网络基础设施。 + +```mermaid +graph TD + subgraph VPC_Network ["VPC Network"] + VPC[AWS VPC] + Public_Subnet[AWS Public Subnet] + Private_Subnet[AWS Private Subnet] + VPC -- Connected to --> IGW[AWS Internet Gateway] + VPC -- Contains --> SG[AWS Security Group] + Public_Subnet -- Internet Access via --> IGW + Private_Subnet -- Internet Access via NAT --> NAT_Gateway[AWS NAT Gateway] + NAT_Gateway -- Utilizes --> EIP[AWS Elastic IP] + NAT_Gateway -- Located in --> Public_Subnet + + subgraph Routing ["Routing"] + Public_Subnet -- Associates --> Public_Route_Table[AWS Public Route Table] + Public_Route_Table -- Routes Internet Traffic --> IGW + Private_Subnet -- Associates --> Private_Route_Table[AWS Private Route Table] + Private_Route_Table -- Routes Traffic To --> NAT_Gateway + end + end + + subgraph ECS_Infrastructure ["ECS Infrastructure"] + VPC -- Hosts --> ECS_Cluster[AWS ECS Cluster] + SG -- Secures --> ECS_Cluster + end + + %% Additional Details + SG -- Secures --> Public_Subnet + SG -- Secures --> Private_Subnet + + %% Internet Node + Internet[Internet] + IGW -- Connects to --> Internet + EIP -- Connects to --> Internet +``` + +## 已知问题 + +### PI 配置 + +为 PI 链设置自定义配置值并不简单,例如您自己部署 Hyperlane 的链。目前,您可能只需传递一长串环境变量或命令行参数。 + +### 单个 agent 日志 + +目前所有 agent 都记录到同一个日志组 - `DefaultLogGroup`。要按 agent 分隔它们,您可能需要调整日志组名称并使用新组名称更新 agent 的日志策略。 + +### Relayer 模块 + +docker 镜像支持运行两种类型的 agent。因此,如果您选择这样做,可以使用 Validator 模块作为新 Relayer 模块的起点。 \ No newline at end of file diff --git a/zh/docs/operate/guides/docker-quickstart.mdx b/zh/docs/operate/guides/docker-quickstart.mdx new file mode 100644 index 0000000..a7a885c --- /dev/null +++ b/zh/docs/operate/guides/docker-quickstart.mdx @@ -0,0 +1,163 @@ +--- +title: "使用 Docker Compose 和 AWS 快速入门" +--- + +使用 Docker Compose 提供了一种结构化的方式来管理 validator 部署,同时保持原始 Docker 的灵活性。您可以在 [Docker 文档](https://docs.Docker.com/compose/compose-file/)中找到格式的完整规范。 + +## 1. 设置 validator 密钥 + +按照[此处](/zh/docs/operate/set-up-agent-keys#2-aws-kms)的指南使用 AWS KMS 创建 agent 密钥。 + +## 2. 为签名创建 S3 存储桶 + +按照[此处](/zh/docs/operate/validators/validator-signatures-aws)的指南创建和配置 S3 存储桶供您的 validator 写入签名。 + +## 3.(仅限 AVS 运营商)注册 Hyperlane AVS[​](#3-avs-operators-only-register-with-hyperlane-avs "直接链接到 3.(仅限 AVS 运营商)注册 Hyperlane AVS") + +如果您是 AVS 运营商,请按照[此处](/zh/docs/operate/guides/avs-operator-guide#4-register-your-operator)的指南注册 Hyperlane AVS。 + +## 4. 设置 validator 环境 + +### 创建配置文件 + +在此示例中,我们将运行三条链。 + +```bash +mkdir -p ethereum/hyperlane_db optimism/hyperlane_db base/hyperlane_db && \ +touch ethereum/config.json optimism/config.json base/config.json docker-compose.yml .env.ethereum .env.optimism .env.base +``` + +### 编辑每个 config.json + +您可以在[此处](/zh/docs/operate/config/agent-config)阅读有关 Agent 配置的更多信息。 + +| 参数 | 描述 | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| `customRpcUrls` | 您希望支持的链的高性能 RPC 端点的逗号分隔列表。我们建议使用付费提供商以避免速率限制。 | +| `chains.ethereum` | 在 base/config.json 中应更改为 `chains.base`,在 optimism/config.json 中更改为 `chains.optimism`。 | +| `signer.region` | 应调整为您的 AWS 区域。 | +| `validator.region` | 应调整为您的 AWS 区域。 | +| `signer.id` | 应调整为您在步骤 3 中配置的 AWS KMS id,前缀为 `alias/`。 | +| `validator.id` | 应调整为您在步骤 3 中配置的 AWS KMS id,前缀为 `alias/`。 | +| `originChainName` | 应该是您正在验证的链。 | +| `checkpointSyncer.bucket` | 应反映 S3 存储桶的名称。 | +| `checkpointSyncer.folder` | validator 将在存储桶中使用的文件夹名称。您可以为多个 validator 使用相同的存储桶,但要确保每个 validator 的文件夹名称都是唯一的。 | +| `reorgPeriod` | 每条链可能不同。[查找 reorgPeriod](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)。 | + +以下是示例 agent 配置。 + +```json +{ + "chains": { + "ethereum": { + "customRpcUrls": "https://eth.llamarpc.com,https://rpc.mevblocker.io", + "signer": { + "region": "us-east-1", + "type": "aws", + "id": "alias/hyperlane-validator-signer" + } + } + }, + "originChainName": "ethereum", + "db": "/mnt/hyperlane_db", + "validator": { + "id": "alias/hyperlane-validator", + "type": "aws", + "region": "us-east-1" + }, + "checkpointSyncer": { + "bucket": "hyperlane-validator-signatures", + "region": "us-east-1", + "type": "s3", + "folder": "ethereum" + }, + "reorgPeriod": 14, + "metricsPort": "9090" +} +``` + +### 编辑每个 .env 文件 + +您应该为每条链更改服务名称和 AWS 凭据。 + +```bash +AWS_ACCESS_KEY_ID=<您的 AWS 访问密钥 ID> +AWS_SECRET_ACCESS_KEY=<您的 AWS 秘密访问密钥> +SERVICE_NAME=ethereum +``` + +## 5. 配置 Docker Compose (docker-compose.yml) + +```yaml +x-common-attributes: &common-validator + image: gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 + command: ./validator + container_name: ${SERVICE_NAME}-validator + environment: + CONFIG_FILES: /config.json + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} + volumes: + - ./${SERVICE_NAME}/hyperlane_db:/mnt/hyperlane_db + - ./${SERVICE_NAME}/config.json:/config.json + restart: unless-stopped + +services: + ethereum-validator: + <<: *common-validator + ports: + - "9091:9090/tcp" + + optimism-validator: + <<: *common-validator + ports: + - "9092:9090/tcp" + + base-validator: + <<: *common-validator + ports: + - "9093:9090/tcp" +``` + +您的目录结构应类似于这样: + +```bash +. +├── base +│ ├── config.json +│ └── hyperlane_db +├── docker-compose.yml +├── ethereum +│ ├── config.json +│ └── hyperlane_db +├── .env.base +├── .env.ethereum +├── .env.optimism +└── optimism + ├── config.json + └── hyperlane_db +``` + +## 6. 运行 Hyperlane Validator + +启动容器: + +记住为您的 validator 地址提供资金,以便 validator 可以宣布。 + +```bash +docker compose --env-file .env.ethereum up ethereum-validator -d +docker compose --env-file .env.optimism up optimism-validator -d +docker compose --env-file .env.base up base-validator -d +``` + +确保没有错误: + +```bash +docker logs -f ethereum-validator +docker logs -f optimism-validator +docker logs -f base-validator +``` + + + **运行多个 Validator**:运行多个 validator 可以提高可靠性并确保即使一个失败,消息验证也能继续。在[此处](/zh/docs/operate/validators/run-validators#running-multiple-validators)了解有关设置和要求的更多信息。 + \ No newline at end of file diff --git a/zh/docs/operate/overview-agents.mdx b/zh/docs/operate/overview-agents.mdx new file mode 100644 index 0000000..b62b8a2 --- /dev/null +++ b/zh/docs/operate/overview-agents.mdx @@ -0,0 +1,51 @@ +--- +title: "代理概述" +--- + +Hyperlane 协议将跨链消息传递的传输层与安全层解耦。要运行部署,它依赖链下代理来观察链上活动并执行协议的传输或安全方面。 + +1. Hyperlane [验证器](#validators)是负责安全的轻量级链下代理——它们观察源链[邮箱](/zh/docs/protocol/core/mailbox)上的消息,如有需要,签署证明邮箱当前状态的默克尔根。 +2. [中继器](#relayer)满足协议的消息传输要求。它们为 [`IInterchainSecurityModule` 接口](/zh/docs/protocol/ISM/modular-security)聚合链下安全元数据,并将消息传递给其接收者。 + +## 验证器 + +[验证器](/zh/docs/protocol/agents/validators)满足协议的安全要求,作为[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 或 [Hyperlane AVS](/zh/docs/protocol/ISM/economic-security/hyperlane-avs) 的一部分,通过证明[邮箱](/zh/docs/protocol/core/mailbox)消息的有效性并使其签名可供中继器使用。 + +此签名被存储并公开可用(例如在 S3 存储桶中),然后由链下中继器和链上跨链安全模块使用。验证器之间_没有_网络连接,不需要达成共识;它们也不定期提交链上交易。 + +如果希望帮助保护源链,这是社区运营商运行的代理,这是为帮助去中心化 Hyperlane 上的消息传递而可以执行的最重要职责。**请注意,仅运行验证器并不意味着它正在积极为保护消息做出贡献:** 目标链上的多重签名 ISM 必须已注册验证器的检查点签名密钥,并且该 ISM 必须被消息接收者使用。 + +这些代理用 Rust 实现,并作为 Docker 镜像和二进制文件分发。 + +在[这里](/zh/docs/protocol/agents/validators)了解更多关于验证器的信息 + +## 中继器 + +Hyperlane [中继器](/zh/docs/protocol/agents/relayer)将跨链消息传递给其接收者。 + +中继是无需许可的,在链对之间运行一个诚实的中继器足以确保活跃度。 + +运行中继器: + +1. 比验证器操作复杂得多。 +2. 不需要保护网络。 +3. 仅推荐用于 Hyperlane 的无需许可部署。 + +Hyperlane 中继器被配置为在一个或多个源链和目标链之间中继消息。 + +每个 Hyperlane 消息涉及两个交易: + +1. 在源链上[`dispatch`](/zh/docs/reference/messaging/send)和发送消息。 +2. 在目标链上[`process`](/zh/docs/reference/messaging/receive)和传递消息。 + +中继器的工作是在目标链上传递消息。为了履行这一责任: + +- 中继器跟踪源链上传入的新消息。 +- 它检查接收者指定的[跨链安全模块(ISM)](/zh/docs/protocol/ISM/modular-security)以收集保护消息所需的元数据。例如,它可能从验证器检查点存储中检索多重签名 ISM 签名。 +- 组装安全元数据后,中继器然后将消息发送到目标链上的接收者。 + +如果消息传递失败(例如由于缺乏流动性从 Hyperlane Warp 路由合约转出),中继器使用指数退避机制重试传递,直到成功。 + +中继器在 Hyperlane 中没有特殊权限。如果中继器密钥被泄露,只有这些密钥持有的代币面临风险。 + +在[这里](/zh/docs/protocol/agents/relayer)了解更多关于中继器的信息。 \ No newline at end of file diff --git a/zh/docs/operate/relayer/api.mdx b/zh/docs/operate/relayer/api.mdx new file mode 100644 index 0000000..bc0797e --- /dev/null +++ b/zh/docs/operate/relayer/api.mdx @@ -0,0 +1,52 @@ +--- +title: "Relayer HTTP API" +--- + +Relayer 提供了一个全面的 HTTP API,用于检查数据库内容和管理操作。下面的每个端点都包含一个交互式测试平台,您可以直接测试 API。 + + +在测试端点之前,请确保更新服务器 URL 以匹配您的 Relayer 实例。 + + +## API 端点 + +以下端点可用于与 Relayer 交互: + +### Messages API +- [Get Messages](/zh/docs/operate/relayer/api/messages/get-messages) - 通过 domain 和 nonce 范围查询数据库中的消息 +- [Insert Messages](/zh/docs/operate/relayer/api/messages/post-messages) - 向数据库添加新消息 + +### 操作管理 +- [List Operations](/zh/docs/operate/relayer/api/operations/get-operations) - 查看操作队列中的待处理消息 +- [Retry Messages](/zh/docs/operate/relayer/api/operations/post-message-retry) - 触发重试失败的消息(重置重试计数) +- [Reprocess Message](/zh/docs/operate/relayer/api/operations/post-reprocess-message) - 按需重新排队处理消息 + + +**Retry vs Reprocess**:Retry 处理当前在操作队列(内存)中的失败消息,而 reprocess 从数据库(存储)重新排队消息以进行处理 - 无论是需要重新处理的已传递消息,还是允许外部服务触发消息传递而不依赖队列退避机制。 + + +### 数据检查 +- [Get Merkle Tree Insertions](/zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions) - 查询数据库中的 merkle tree 插入 +- [Insert Merkle Tree Insertions](/zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions) - 插入 merkle tree 插入记录 + +### IGP 管理 +- [List IGP Rules](/zh/docs/operate/relayer/api/igp/get-igp-rules) - 查看当前的 gas 支付规则 +- [Add IGP Rule](/zh/docs/operate/relayer/api/igp/post-igp-rules) - 创建新的 gas 支付规则 +- [Remove IGP Rules](/zh/docs/operate/relayer/igp/api/delete-igp-rules) - 删除现有的 gas 支付规则 + + +IGP 端点仅在配置了 gas enforcers 时可用(`mod.rs:82-83`)。 + + +## 身份验证 + +大多数端点的读取操作不需要身份验证。写入操作可能需要适当的 API 密钥或身份验证,具体取决于您的 Relayer 配置。 + +## Base URL + +本地开发的默认 base URL 是: +``` +http://localhost:9090 +``` + +部署时请更新此 URL 以匹配您的 Relayer 实际端点。 \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/igp/delete-igp-rules.mdx b/zh/docs/operate/relayer/api/igp/delete-igp-rules.mdx new file mode 100644 index 0000000..7055d01 --- /dev/null +++ b/zh/docs/operate/relayer/api/igp/delete-igp-rules.mdx @@ -0,0 +1,32 @@ +--- +title: '删除 IGP 规则' +api: 'DELETE http://localhost:9090/igp_rules/:index' +--- + +删除现有的跨链 Gas 支付(IGP)规则。 + + +仅当配置了 gas 执行器时,此端点才可用。 + + + + 要删除的 IGP 规则的索引 + + + +```bash curl +curl -X DELETE "http://localhost:9090/igp_rules/1" +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/igp_rules/1', { + method: 'DELETE', +}); +``` + +```python Python +import requests + +response = requests.delete('http://localhost:9090/igp_rules/1') +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/igp/get-igp-rules.mdx b/zh/docs/operate/relayer/api/igp/get-igp-rules.mdx new file mode 100644 index 0000000..28a759f --- /dev/null +++ b/zh/docs/operate/relayer/api/igp/get-igp-rules.mdx @@ -0,0 +1,57 @@ +--- +title: '列出 IGP 规则' +api: 'GET http://localhost:9090/igp_rules' +--- + +获取当前的跨链 Gas 支付(IGP)规则。 + + +仅当配置了 gas 执行器时,此端点才可用。 + + + + + 策略 + + + Gas 支付执行策略 + + + 匹配列表 + + + + + + +```json Response +{ + "policies": { + "subtensor": [ + { + "policy": "None", + "matching_list": [] + } + ] + } +} +``` + + + +```bash curl +curl "http://localhost:9090/igp_rules" +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/igp_rules'); +const rules = await response.json(); +``` + +```python Python +import requests + +response = requests.get('http://localhost:9090/igp_rules') +rules = response.json() +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/igp/post-igp-rules.mdx b/zh/docs/operate/relayer/api/igp/post-igp-rules.mdx new file mode 100644 index 0000000..0454a9f --- /dev/null +++ b/zh/docs/operate/relayer/api/igp/post-igp-rules.mdx @@ -0,0 +1,74 @@ +--- +title: '添加 IGP 规则' +api: 'POST http://localhost:9090/igp_rules' +--- + +添加新的跨链 Gas 支付(IGP)规则。 + + +仅当配置了 gas 执行器时,此端点才可用。 + + + + + Gas 支付执行策略 + + + 匹配列表 + + + + +```bash curl +curl -X POST "http://localhost:9090/igp_rules" \ + -H "Content-Type: application/json" \ + -d \ +'{ + "policy": "None", + "matching_list": [ + { + "messageid": "0x03ae9509ddf792965c98729b43f0988d689ae17c79619e87e6c670f61eb1d4bc" + } + ] +}' +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/igp_rules', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + policy: "None", + matching_list: [ + { + messageid: "0x03ae9509ddf792965c98729b43f0988d689ae17c79619e87e6c670f61eb1d4bc" + } + ] + }) +}); +``` + +```python Python +import requests + +response = requests.post('http://localhost:9090/igp_rules', json={ + "policy": "None", + "matching_list": [ + { + "messageid": "0x03ae9509ddf792965c98729b43f0988d689ae17c79619e87e6c670f61eb1d4bc" + } + ] +}) +``` + + + +```json Response +{ + "count": 4, + "skipped": [] +} +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions.mdx b/zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions.mdx new file mode 100644 index 0000000..54fda1e --- /dev/null +++ b/zh/docs/operate/relayer/api/merkle-tree-insertions/get-merkle-tree-insertions.mdx @@ -0,0 +1,67 @@ +--- +title: '获取 Merkle Tree 插入' +api: 'GET http://localhost:9090/merkle_tree_insertions' +--- + +获取 relayer 数据库中的 merkle tree 插入。 + + + + 链 domain ID (u32) + + + 起始叶子索引(包含)(u32) + + + 结束叶子索引(包含)(u32) + + + + + + merkle tree 插入数据数组 + + + merkle tree 插入的区块号 + + + 叶子索引 + + + 消息 ID + + + + + + +```json Response +{ + "merkle_tree_insertions": [ + { + "insertion_block_number": null, + "leaf_index": 100, + "message_id": "0xabc..." + } + ] +} +``` + + + +```bash curl +curl localhost:9090/merkle_tree_insertions?domain_id=1&leaf_index_start=100&leaf_index_end=200 +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/merkle_tree_insertions'); +const insertions = await response.json(); +``` + +```python Python +import requests + +response = requests.get('http://localhost:9090/merkle_tree_insertions') +insertions = response.json() +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions.mdx b/zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions.mdx new file mode 100644 index 0000000..dcc2028 --- /dev/null +++ b/zh/docs/operate/relayer/api/merkle-tree-insertions/post-merkle-tree-insertions.mdx @@ -0,0 +1,96 @@ +--- +title: '插入 Merkle Tree 插入' +api: 'POST http://localhost:9090/merkle_tree_insertions' +--- + +将 merkle tree 插入插入到 relayer 数据库中。 + + + + Merkle Tree 插入数组 + + + merkle tree 插入的链 + + + merkle tree 插入的区块号 + + + 叶子索引 + + + 消息 ID + + + + + + + + 成功插入的 merkle tree 插入数 + + + 被跳过的 merkle tree 插入列表 + + + + +```bash curl +curl "http://localhost:9090/merkle_tree_insertions" \ + -H "Content-Type: application/json" \ + -d \ +'{ + "merkle_tree_insertions": [ + { + "chain": 1, + "insertion_block_number": 100000, + "leaf_index": 5000, + "message_id": "0x006ce24a2b5aff423febad6587a68541f2f997a8ba12f0d239748b68f4e0dde5" + } + ] +}' +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/igp_rules', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + merkle_tree_insertions: [ + { + chain: 1, + insertion_block_number: 100000, + leaf_index: 5000, + message_id: "0x006ce24a2b5aff423febad6587a68541f2f997a8ba12f0d239748b68f4e0dde5" + } + ] + }) +}); +``` + +```python Python +import requests + +response = requests.post('http://localhost:9090/igp_rules', json={ + "merkle_tree_insertions": [ + { + "chain": 1, + "insertion_block_number": 100000, + "leaf_index": 5000, + "message_id": "0x006ce24a2b5aff423febad6587a68541f2f997a8ba12f0d239748b68f4e0dde5" + } + ] +}) +``` + + + +```json Response +{ + "count": 4, + "skipped": [] +} +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/messages/get-messages.mdx b/zh/docs/operate/relayer/api/messages/get-messages.mdx new file mode 100644 index 0000000..38b0a27 --- /dev/null +++ b/zh/docs/operate/relayer/api/messages/get-messages.mdx @@ -0,0 +1,90 @@ +--- +title: '获取消息' +api: 'GET http://localhost:9090/messages' +--- + +在 nonce 范围内查询特定 domain 的消息。 + + + + 链 domain ID (u32) + + + 起始 nonce(包含)(u32) + + + 结束 nonce(包含)(u32) + + + 验证:要求 `nonce_end > nonce_start`,如果无效则返回 400 + + + + + + HyperlaneMessage 对象数组 + + + + Hyperlane 版本号 + + + 消息 nonce + + + 消息源 + + + 消息目标 + + + 消息发送者 + + + 消息接收者 + + + 消息正文 + + + + + +```bash curl +curl "http://localhost:9090/messages?domain_id=1&nonce_start=100&nonce_end=200" +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/messages?domain_id=1&nonce_start=100&nonce_end=200'); +const { messages } = await response.json(); +``` + +```python Python +import requests + +response = requests.get('http://localhost:9090/messages', params={ + 'domain_id': 1, + 'nonce_start': 100, + 'nonce_end': 200 +}) +messages = response.json() +``` + + + +```json Response +{ + "messages": [ + { + "version": 3, + "nonce": 1235, + "origin": 1, + "destination": 2, + "sender": "0xabc...", + "recipient": "0xdef...", + "body": [0, 3, 0, 23, 43, 65] + } + ] +} +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/messages/post-messages.mdx b/zh/docs/operate/relayer/api/messages/post-messages.mdx new file mode 100644 index 0000000..4499f79 --- /dev/null +++ b/zh/docs/operate/relayer/api/messages/post-messages.mdx @@ -0,0 +1,144 @@ +--- +title: '插入消息' +api: 'POST http://localhost:9090/messages' +--- + +将新消息插入数据库。 + + + + 要插入的消息列表 + + + 消息被调度时的区块号 + + + 消息 + + + + + + + + 成功插入的消息数 + + + 被跳过的消息列表 + + + + +```bash curl +curl -X POST "http://localhost:9090/messages" \ + -H "Content-Type: application/json" \ + -d \ +'{ + "messages": [ + { + "dispatched_block_number": 10000, + "message": { + "version": 3, + "nonce": 1234, + "origin": 1, + "destination": 2, + "sender": "0xabc...", + "recipient": "0xdef...", + "body": [0, 3, 0, 23, 43, 65] + } + }, + { + "dispatched_block_number": 10010, + "message": { + "version": 3, + "nonce": 1235, + "origin": 1, + "destination": 2, + "sender": "0xabc...", + "recipient": "0xdef...", + "body": [0, 3, 0, 23, 43, 65] + } + } + ] +}' +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/messages', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + messages: [ + { + dispatched_block_number: 10000, + message: { + version: 3, + nonce: 1234, + origin: 1, + destination: 2, + sender: "0xabc...", + recipient: "0xdef...", + body: [0, 3, 0, 23, 43, 65] + } + }, + { + dispatched_block_number: 10010, + message: { + version: 3, + nonce: 1235, + origin: 1, + destination: 2, + sender: "0xabc...", + recipient: "0xdef...", + body: [0, 3, 0, 23, 43, 65] + } + } + ] + }) +}); +``` + +```python Python +import requests + +response = requests.post('http://localhost:9090/messages', json={ + "messages": [ + { + "dispatched_block_number": 10000, + "message": { + "version": 3, + "nonce": 1234, + "origin": 1, + "destination": 2, + "sender": "0xabc...", + "recipient": "0xdef...", + "body": [0, 3, 0, 23, 43, 65] + } + }, + { + "dispatched_block_number": 10010, + "message": { + "version": 3, + "nonce": 1235, + "origin": 1, + "destination": 2, + "sender": "0xabc...", + "recipient": "0xdef...", + "body": [0, 3, 0, 23, 43, 65] + } + } + ] +}) +``` + + + +```json Response +{ + "count": 4, + "skipped": [] +} +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/operations/get-operations.mdx b/zh/docs/operate/relayer/api/operations/get-operations.mdx new file mode 100644 index 0000000..6e94f78 --- /dev/null +++ b/zh/docs/operate/relayer/api/operations/get-operations.mdx @@ -0,0 +1,41 @@ +--- +title: '列出操作' +api: 'GET http://localhost:9090/list_operations' +--- + +列出操作队列中的待处理消息。返回 relayer 当前正在处理的消息。 + + + 待处理操作数组 + + + +```json Response +[ + { + "message_id": "0x123...", + "status": "pending", + "attempts": 1, + "last_attempt": "2024-01-01T12:00:00Z" + } +] +``` + + + +```bash curl +curl "http://localhost:9090/list_operations" +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/list_operations'); +const operations = await response.json(); +``` + +```python Python +import requests + +response = requests.get('http://localhost:9090/list_operations') +operations = response.json() +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/operations/post-message-retry.mdx b/zh/docs/operate/relayer/api/operations/post-message-retry.mdx new file mode 100644 index 0000000..46210b0 --- /dev/null +++ b/zh/docs/operate/relayer/api/operations/post-message-retry.mdx @@ -0,0 +1,78 @@ +--- +title: '重试消息' +api: 'POST http://localhost:9090/message_retry' +--- + +触发匹配特定模式的失败消息的重试。这会将重试计数重置为 0 并重新排队消息以进行处理。 + + + + + 要重试的特定消息 ID(十六进制字符串) + + + 消息源 domain + + + 消息目标 domain + + + 发送者地址 + + + 接收者地址 + + + 正文正则表达式 + + + + + + + 重试请求的 UUID + + + 评估了多少个待处理操作 + + + 有多少待处理操作与重试请求模式匹配 + + + + +```bash curl +curl -X POST "http://localhost:9090/message_retry" \ + -H "Content-Type: application/json" \ + -d \ +'[ + { + "messageid": "0x123..." + } +]' +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/message_retry', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify([ + { + messageid: "0x123..." + } + ]) +}); +``` + +```python Python +import requests + +response = requests.post('http://localhost:9090/message_retry', json=[ + { + 'messageid': '0x123...' + } +]) +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/api/operations/post-reprocess-message.mdx b/zh/docs/operate/relayer/api/operations/post-reprocess-message.mdx new file mode 100644 index 0000000..a613062 --- /dev/null +++ b/zh/docs/operate/relayer/api/operations/post-reprocess-message.mdx @@ -0,0 +1,83 @@ +--- +title: '重新处理消息' +api: 'POST http://localhost:9090/reprocess_message' +--- + +按需重新排队消息进行处理。此端点允许外部服务触发消息传递,而不是依赖队列退避,并且可以处理区块链网络重组或手动消息处理等场景。 + + +对于纯粹按需处理而不自动重试,请在您的 relayer 配置中将此端点与 `max_message_retries := 0` 结合使用。这确保消息仅在通过此 API 显式触发时才被处理。 + + + + + 消息源 Domain/链 ID + + + 十六进制编码的消息标识符 (H256) + + + + + + 消息是否成功重新排队进行处理 + + + 有关重新处理操作的详细信息 + + + + +```bash curl +curl -X POST "http://localhost:9090/reprocess_message" \ + -H "Content-Type: application/json" \ + -d \ +'{ + "origin_id": 1399811149, + "message_id": "0x9484bd5c635b17b28cb382249d7a6fe5ca15debfd4f824247c68d47badc5b7de" +}' +``` + +```javascript JavaScript +const response = await fetch('http://localhost:9090/reprocess_message', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + origin_id: 1399811149, + message_id: "0x9484bd5c635b17b28cb382249d7a6fe5ca15debfd4f824247c68d47badc5b7de" + }) +}); +``` + +```python Python +import requests + +response = requests.post('http://localhost:9090/reprocess_message', json={ + 'origin_id': 1399811149, + 'message_id': '0x9484bd5c635b17b28cb382249d7a6fe5ca15debfd4f824247c68d47badc5b7de' +}) +``` + + + +```json Success Response +{ + "success": true, + "message": "Message re-queued for processing" +} +``` + +```json Error Response (400 Bad Request) +{ + "error": "Invalid message_id format" +} +``` + +```json Error Response (404 Not Found) +{ + "error": "Message or context not found" +} +``` + \ No newline at end of file diff --git a/zh/docs/operate/relayer/message-filtering.mdx b/zh/docs/operate/relayer/message-filtering.mdx new file mode 100644 index 0000000..a9cd942 --- /dev/null +++ b/zh/docs/operate/relayer/message-filtering.mdx @@ -0,0 +1,75 @@ +--- +title: "消息过滤" +description: "配置要中继哪些消息以及忽略哪些消息" +--- + +默认情况下,Relayer 会尝试传递从其源链发送到任何已配置目标链的消息。 + +Relayer 可能希望进一步过滤它们尝试传递的消息。例如,构建跨链应用程序的人可能希望运行一个仅传递发送到该应用程序的消息的 Relayer。同样,某些 Relayer 可能希望仅将消息中继到可用链的子集。 + +Relayer 可以通过设置 `--whitelist` 或 `--blacklist` 环境变量来**可选地**过滤它们传递的消息。另请参阅[配置参考](/zh/docs/operate/config/config-reference)的 whitelist 部分。 + +这些配置是字符串化的 JSON 对象,格式如下: + +```typescript +// A list of matching rules. A message matches if any of the list +// elements matches the message. +type MatchingList = Array; + +// Matches a message if any of the provided values matches. +interface ListElement { + originDomain?: NumericFilter; + senderAddress?: HashFilter; + destinationDomain?: NumericFilter; + recipientAddress?: HashFilter; +} + +type NumericFilter = Wildcard | U32 | Array; +type HashFilter = Wildcard | H256 | Array; + +// 32-bit unsigned integer +type U32 = number | string; + +// 256-bit hash (can also be less) encoded as hextype H256 = string; + +// Matches anything +type Wildcard = "*"; +``` + +whitelist 和 blacklist 都具有"any"语义。换句话说,Relayer 将传递与 whitelist 过滤器中_任何一个_匹配的消息,并忽略与 blacklist 过滤器中_任何一个_匹配的消息。 + +例如,以下配置用作 whitelist 将确保 Relayer 中继发送到 Ethereum 的任何消息、从地址 `0xca7f632e91B592178D83A70B404f398c0a51581F` 发送到 Celo 或 Avalanche 的任何消息,以及发送到 Arbitrum 或 Optimism 上地址 `0xca7f632e91B592178D83A70B404f398c0a51581F` 的任何消息。 + +```json +[ + { "senderAddress": "*", "destinationDomain": ["1"], "recipientAddress": "*" }, + { + "senderAddress": "0xca7f632e91B592178D83A70B404f398c0a51581F", + "destinationDomain": ["42220", "43114"], + "recipientAddress": "*" + }, + { + "senderAddress": "*", + "destinationDomain": ["42161", "420"], + "recipientAddress": "0xca7f632e91B592178D83A70B404f398c0a51581F" + } +] +``` + +有效的配置可能如下所示: + +```bash +--whitelist='[ + {"senderAddress":"*", + "destinationDomain":["1"], + "recipientAddress":"*"}, + {"senderAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F", + "destinationDomain":["42220","43114"], + "recipientAddress":"*"}, + {"senderAddress":"*", + "destinationDomain":["42161","420"], + "recipientAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F"} + ]' +``` + +blacklist 优先于 whitelist,即如果消息同时匹配 whitelist _和_ blacklist,它将不会被传递。 diff --git a/zh/docs/operate/relayer/monitoring-alerting.mdx b/zh/docs/operate/relayer/monitoring-alerting.mdx new file mode 100644 index 0000000..41a38e2 --- /dev/null +++ b/zh/docs/operate/relayer/monitoring-alerting.mdx @@ -0,0 +1,52 @@ +--- +title: "监控与告警" +--- + +Relayer 在参数指定的端口号上公开指标。端口是默认值,但可以选择任何有效的端口。 + +我们建议使用 Prometheus 抓取这些指标,并使用 Grafana 进行可视化,使用[此仪表板 JSON 模板](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/2f7f714c5b698fedcead9825f52da6ef95f96be1/tools/grafana/easy-relayer-dashboard-template.json),如下所示。此仪表板的优势在于它可以同时显示多个 validator。截图显示了按链或按 kubernetes pod 分组的指标。 + +![Relayer Grafana Dashboard Template](/images/docs/operate/dashboard-template-relayer.png) + + + 如果作为 Docker 镜像运行,请确保端口转发指标端点端口。例如,要将端口 9090 转发到本地端口 80,请在您的 `docker run` 命令中添加以下标志:`-p 9090:80` + + +## 指标 + +仪表板模板包含以下指标。 + +| 指标 | 描述 | +| -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hyperlane_messages_processed_count` | Relayer 按源链和目标链处理的消息("Messages Processed")。 | +| `hyperlane_submitter_queue_length{queue_name="prepare_queue"}` | submitter 的 prepare 队列长度("Prepare Queues")。每个目标链都有一个正在运行的 submitter,所有待处理/可重试的消息最终都会进入 prepare 队列,等待(重新)提交。此队列增加可能意味着消息量超过了 Relayer 的处理吞吐量,或者由于各种原因(RPC 故障、余额不足)提交失败。 | +| `hyperlane_submitter_queue_length{queue_name="submit_queue"}` | submitter 的 submit 队列长度("Submit Queues")。这些是已准备好但尚未提交的消息。 | +| `hyperlane_submitter_queue_length{queue_name="confirm_queue"}` | submitter 的 confirm 队列长度("Confirm Queues")。这些是已提交但尚未确认(最终确定)的消息。 | + +其他相关指标包括: + +| 指标 | 描述 | +| ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hyperlane_request_count` | 使用以下标签记录成功或失败的 RPC 数量:`chain`、`status`(失败或成功)、`provider_node`(负责的 base RPC URL)和 RPC `method`。适用于所有 agent,但目前仅在 EVM 链上支持。 | +| `hyperlane_wallet_balance{agent="relayer"}` | Relayer 在每条链上的余额,以最小面额单位表示 | +| `hyperlane_critical_error` | 链上关键错误的布尔标记,表示活跃度丢失。 | +| `hyperlane_block_height` | agent 连接的 RPC 节点的区块高度。如果此指标没有增加,则 RPC 可能不健康,需要更改。 | +| `hyperlane_span_events_total{agent="relayer", event_level="error"}` | 记录的错误总数。如果此指标在最后一小时的导数超过 1,则至少应发出低严重性警报。请注意,仪表板查询按 kubernetes pod 名称对指标进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | +| `hyperlane_span_events_total{agent="relayer", event_level="warn"}` | 记录的警告总数。如果此指标在最后一小时的导数超过 1,则至少应发出低严重性警报。请注意,仪表板查询按 kubernetes pod 名称对指标进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | + +## 告警 + +可以结合上述指标创建告警以最小化误报。一些关键告警示例: + +### 对于所有 agent + +- 任何链的 `hyperlane_block_height` 在过去 15 分钟内没有增加 +- 过去 10 分钟内 `hyperlane_request_count{status="failure"}` 的速率 > `hyperlane_request_count{status=~"success|failure"}` 速率的 60%。大多数 agent 问题都是由于 RPC 故障,这可能会捕获这些问题。 + +### 对于 Relayer + +- 某条链的 `hyperlane_critical_error` 为 `1`,表示 Relayer 在该链上失去了活跃度。虽然其他链上的操作不受此影响,但这是一个高严重性警报 - 通常与受影响链的不可靠 RPC 有关。 +- 使用 `hyperlane_submitter_queue_length{queue_name="prepare_queue"}`,prepare 队列长度在过去 30 分钟内一直在增加,confirm 队列长度为零,错误/警告计数差异一直在增加。这可能意味着 Relayer 的余额已用完,无法支付 gas,或者目标链 RPC URL 无法正常工作,或者所有新消息都无法处理 +- `hyperlane_wallet_balance` 已降至某个阈值以下。例如,当前余额除以过去 24 小时的差值小于 2,意味着必须在两天内充值 + +如果您收到警报,请始终检查日志以了解可能的问题。 diff --git a/zh/docs/operate/relayer/run-relayer.mdx b/zh/docs/operate/relayer/run-relayer.mdx new file mode 100644 index 0000000..67a3a42 --- /dev/null +++ b/zh/docs/operate/relayer/run-relayer.mdx @@ -0,0 +1,262 @@ +--- +title: "运行 Relayer" +--- + + + +- 有关 Hyperlane 中 Relayer 的介绍,您可以查看[概述部分](/zh/docs/operate/overview-agents)。 +- 我们建议您在尝试运行生产环境的 Relayer 之前,先阅读[**部署 Hyperlane 本地 Agent**](/zh/docs/guides/chains/deploy-hyperlane-with-local-agents) 指南以了解如何在本地配置和运行 Relayer,以及[**运行 Validator**](/zh/docs/operate/validators/run-validators) 文档。 + + + +## 要求 + +- **RPC 节点** + + - Relayer 使用 RPC 节点读取源链并将消息传递到目标链。必须为所有源链和目标链配置 RPC 节点。 + +- **一个或多个签名密钥** + + - 为了传递消息,必须为 Relayer 配置一个签名密钥,以便在每个目标链上提交交易(因此需要在这些链上有资金)。 + - Relayer 使用此密钥签署 `Mailbox.process()` 交易。Hyperlane Relayer agent 目前支持通过 API keys/secrets 访问的 AWS KMS 密钥或原始十六进制私钥进行配置。 + +- **运行的机器** + - Relayer 运营商可以自己编译 Rust 二进制文件,或运行由 Abacus Works 提供的 Docker 镜像。可以使用您喜欢的云服务来运行二进制文件。 + + + **运行单个 Relayer**:单个 Relayer 通常就足够了,可以高效地处理 100 多条链的消息传递。您不需要为每个网络运行单独的 Relayer - 这种方法会增加运营复杂性,而不会提供性能优势。 + + +## 指南 + + + +- 本地 agent 设置展示了如何在您的_本地机器_上运行 Relayer,这**仅用于测试和开发目的**。 +- 我们强烈建议您遵循[本地 agent 指南](/zh/docs/guides/chains/deploy-hyperlane-with-local-agents)以了解如何在本地配置和运行 Relayer。 + + + +### 密钥 + +Relayer 需要能够向多个目标链提交交易,因此需要访问用于签署交易的密钥。支持两种密钥类型:十六进制私钥(用于内存签名)和基于 AWS KMS 的密钥(生产环境的最佳实践)。 + +#### 十六进制密钥 + +您的 Relayer 可以使用用于内存签名的十六进制私钥来签署交易。这是测试或开发目的的推荐设置,但也可以在生产环境中使用。 + +#### AWS KMS 密钥 + +您的 Relayer 可以使用 AWS KMS 密钥来签署交易。这是生产环境 Relayer 的推荐设置。 + + + 请参阅 [Agent Keys](/zh/docs/operate/set-up-agent-keys) 页面以设置您的十六进制密钥或 AWS KMS 密钥。 + + +### 配置 + +#### RPC 配置 + +Hyperlane Validator 和 Relayer 可以使用**多个 RPC URL** 来提高可靠性和冗余性。设置因链类型而异。 + + + + 基于 EVM 的链支持配置多个 RPC 端点以实现冗余,并可以指定如何使用它们。 + + - **配置多个 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 + - **RPC 选择模式 ([`rpcConsensusType`](/zh/docs/operate/config/config-reference#chains--rpcconsensustype))**: + - **Fallback**:agent 尝试第一个 URL,如果需要则切换到下一个。 + - **Quorum**:需要大多数 URL 达成一致(提交交易除外)。 + + + + + 基于 Cosmos 的链需要 **RPC 和 gRPC 端点**才能正常运行。 + + - **配置多个 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 + - **配置 gRPC 端点:** 使用 [`customGrpcUrls`]。 + - **回退机制:** Cosmos agent 始终使用**回退模式**。 + + + + + 基于 SVM 的链支持配置多个 RPC 端点,但**仅使用单个 RPC**。 + + - **配置 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 + + + 对于 **SVM 链**,仅使用**单个 RPC URL**。没有回退或基于仲裁的选择机制。 + + + + **SVM Relayer 资金**:在向 SVM 链中继消息时,请确保您的 Relayer 密钥在目标链上有足够的资金。Relayer 通过模拟执行视图调用,需要发送者有资金才能成功模拟,即使是读取操作也是如此。如果资金不足,您可能会遇到 `No return data from InboxGetRecipientIsm instruction` 错误。 + + + + + +#### 配置设置 + +与本地设置一样,在配置 Relayer 时应提供一些基本参数。 + +| 参数 | 描述 | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--relayChains` | 要在其间中继消息的源链和目标链的逗号分隔名称。例如:`ethereum,polygon,avalanche`。 | +| `--db` | Relayer 应将持久化数据写入磁盘的路径。使用云设置时请确保此路径是持久化的。使用 Docker 时,请确保将持久化路径/卷挂载到容器中。有关更多信息,请参阅 [config-reference](/zh/docs/operate/config/config-reference#db)。 | +| `--allowLocalCheckpointSyncers` | 如果为 `true`,这将允许 Relayer 在 Relayer 的本地文件系统上查找 Validator 签名。在生产环境中,这应该是 `false`。如果您按照 Validator 本地设置说明在同一台机器上运行 Validator,请将此设置为 `true`,以便您的 Relayer 可以访问本地 Validator 签名。 | + + + 您的 Relayer 接受命令行参数和环境变量作为配置。请查看 [agent 配置](/zh/docs/operate/config/agent-config)页面和[配置参考](/zh/docs/operate/config/config-reference)以获取完整的配置选项列表。 + + +您还可以使用 [`CONFIG_FILES` 环境变量](/zh/docs/operate/config/config-reference#config_files)以逗号分隔列表的形式提供其他配置文件的路径。如果您选择在 Docker 中运行,请参阅 [agent 配置](/zh/docs/operate/config/agent-config)的 Docker 部分,了解如何将配置文件挂载到 Docker 容器中的技巧。 + +### 特定设置配置 + +这些配置要求因您遵循的密钥设置说明而异。 + + + + 如果您创建了[十六进制密钥](../set-up-agent-keys),请按如下方式配置默认签名者: + + | 参数 | 描述 | + | --------------------- | ---------------------------------------------------------------------------- | + | `--defaultSigner.key` | 用于为所有链签署交易的十六进制私钥。例如:`1b3dead...beef`。 | + + + + + 如果您创建了 [AWS KMS 密钥](../set-up-agent-keys),请按如下方式配置默认签名者: + + | 参数 | 描述 | + | ------------------------ | --------------------------------------------------------------------------------- | + | `--defaultSigner.type` | 设置为 `aws`。 | + | `--defaultSigner.id` | 您的 Relayer 的 AWS KMS 密钥的别名,以 `alias/` 为前缀。例如:`alias/hyperlane-relayer-1`。 | + | `--defaultSigner.region` | 您的 AWS KMS 密钥所在的区域。例如:`us-east-1`。 | + + + + +对于特定链的签名者(即为每条链自定义要使用的密钥),请查看[配置参考](/zh/docs/operate/config/config-reference) + +## 开始中继 + +### 设置 + +生产环境推荐的安装方法是使用 Docker 镜像。 + + + + 首先下载 Docker 镜像: + + ```bash + docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 + ``` + + + + + **克隆并设置** + + 首先,克隆 Hyperlane monorepo: + + ```sh + git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git + ``` + + 然后遵循 `rust` 目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)。如果您使用的是 Apple Silicon,这应该会设置 `rustup` 以及 Rosetta 2。 + + ```sh + # install rustup + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + + # (apple silicon only) install rosetta 2 + softwareupdate --install-rosetta --agree-to-license + ``` + + 构建 Relayer: + + ```sh + cargo build --release bin relayer + ``` + + + + +### 运行 agent + +如果 Relayer 的密钥已使用 AWS KMS 配置,您将需要将 AWS 访问密钥和密文作为环境变量提供。 + +| 环境变量 | 描述 | +| ----------------------- | ------------------------------------- | +| `AWS_ACCESS_KEY_ID` | 您的 Relayer 的 AWS IAM 用户的访问密钥 ID。 | +| `AWS_SECRET_ACCESS_KEY` | 您的 Relayer 的 AWS IAM 用户的秘密访问密钥。 | + +如需复习,请查看 [Agent Keys](/zh/docs/operate/set-up-agent-keys) 指南。 + + + + 然后使用相关参数启动容器。例如,您的 AWS 配置: + + ```sh + docker run \ + -it \ + -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ + -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ + --mount ... \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains , \ + --defaultSigner.type aws \ + --defaultSigner.id alias/hyperlane-relayer-1 \ + --defaultSigner.region us-east-1 \ + ``` + + + 如果您在同一台机器上使用本地设置运行 Validator,并运行本地 Relayer 以访问这些 Validator 签名,请务必将您的本地 Validator 的签名目录[挂载](https://docs.docker.com/storage/bind-mounts/)到 Relayer 中,路径与您[宣布 Validator](/zh/docs/operate/validators/run-validators#announcing-your-validator) 时使用的路径相同 + + 例如,如果您的本地 Validator 正在将签名写入 `/tmp/hyperlane-validator-signatures-ethereum`,您应该为 Docker 容器挂载一个目录: + + ```sh + docker run \ + -it \ + -e CONFIG_FILES=/config/agent-config.json \ + --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane-validator-signatures-ethereum,target=/tmp/hyperlane-validator-signatures-ethereum,readonly \ + --mount type=bind,source="$(pwd)"/hyperlane_db,target=/hyperlane_db \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 \ + ./relayer \ + --db /hyperlane_db \ + --relayChains ethereum,polygon,avalanche \ + --allowLocalCheckpointSyncers true \ + --defaultSigner.key \ + ``` + + + + + + 查看这些从源代码构建而不使用 Docker 的说明。 + + 我们可以从 `hyperlane-monorepo/rust` 目录中运行构建的二进制文件: + + ```sh + # set AWS environment variables + export AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP + export AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx + + # run the Relayer + ./target/release/relayer \ + --db /hyperlane_db \ + --relayChains , \ + --defaultSigner.type aws \ + --defaultSigner.id alias/hyperlane-relayer-1 \ + --defaultSigner.region us-east-1 \ + ``` + + + + +## 索引 + +Relayer 需要为源链索引所有历史消息。此信息存储在磁盘上的本地数据库中(在配置中使用 `db` 设置)。这意味着首次运行 Relayer 可能需要一些额外的时间来赶上当前状态。 diff --git a/zh/docs/operate/set-up-agent-keys.mdx b/zh/docs/operate/set-up-agent-keys.mdx new file mode 100644 index 0000000..4aac445 --- /dev/null +++ b/zh/docs/operate/set-up-agent-keys.mdx @@ -0,0 +1,110 @@ +--- +title: "Agent 密钥" +--- + +Hyperlane agent - Validator 和 Relayer - 必须配置私钥才能运行。Validator 使用私钥签名[消息检查点](/zh/docs/resources/glossary#checkpoint),Relayer 使用私钥签署传递消息的交易。 + +Hyperlane agent 当前支持以下两种方式配置私钥。 + +## 1. 十六进制密钥 + +用于内存签名的原始十六进制私钥。这是最简单和最快的设置方式。 + +十六进制密钥的安全性低于 AWS KMS 密钥。 + +### 生成十六进制密钥 + +跟踪您的地址和私钥以供 agent 使用。不要丢失或泄露它。 + + + + 使用 [Foundry 的 cast](https://book.getfoundry.sh/cast/),您可以创建新的密钥对: + + ```sh + cast wallet new + ``` + + 输出将如下所示: + + ``` + Successfully created new keypair. + Address: 0x32e6d32E7b1C8691Ef4ad3841003371214a0eebC + Private Key: 0x2958f0eb2ab71bbfb5ea1422835e20e488778b61e3c107f369572e2b53b578f9 + ``` + + + + 您可以访问 [https://privatekeys.pw/keys/ethereum/random](https://privatekeys.pw/keys/ethereum/random),它会自动显示十六进制私钥及其地址列表。 + + + 请注意,由于这些是由网站生成的,这些私钥应被视为不安全,不应用于测试目的以外的任何用途! + + + + + +## 2. AWS KMS + +由 AWS 生成并存储在 CloudHSM 中的密钥。这是生产 agent 的推荐设置。 + +### 创建 IAM 用户 + +此 IAM 用户将被授予使用您稍后配置的 KMS 密钥进行签名的权限。您的 Hyperlane agent 在签名交易时将使用此身份。 + +1. 在 [AWS 控制台](https://us-east-1.console.aws.amazon.com/iamv2/home)中进入 AWS 的身份和访问管理(IAM)。 +2. 在左侧的"访问管理"下,点击"用户"。 +3. 点击橙色按钮"添加用户"。 +4. 选择一个友好且有信息量的用户名,例如 `hyperlane-validator-${chain_name}` 或 `hyperlane-relayer-${chain_name}`。此用户名将在后续步骤中引用,因此如果您选择不同的用户名,请务必在将来使用正确的用户名。 +5. 点击"下一步",您无需为用户分配任何权限。 +6. 点击"创建用户"。 +7. 点击进入您刚创建的用户 +8. 点击"安全凭证"选项卡 +9. 向下滚动到"访问密钥"并点击"创建访问密钥" +10. 选择"在 AWS 外部运行的应用程序"并点击"下一步" +11. 点击"下一步",无需添加描述标签 +12. 点击"创建访问密钥" +13. 将"访问密钥 ID"和"秘密访问密钥"复制到安全的地方。这些将作为环境变量传递给您的 Hyperlane Relayer。 + +### 创建 KMS 密钥 + +此密钥将被您的 agent 用于签名。 + +1. 在 AWS 控制台中进入 AWS 的密钥管理服务(KMS)。 +2. 确保您位于要创建密钥的区域。这可以通过查看控制台右上角的区域或在 URL 的子域中查找名称来确认(例如 `us-west-2.console.aws.amazon.com` 表示您正在 `us-west-2` 区域中操作)。 +3. 在左侧点击"客户管理的密钥"。 +4. 点击"创建密钥"。 +5. 选择"非对称"密钥类型。 +6. 选择"签名和验证"密钥用途。 +7. 选择 `ECC_SECG_P256K1` 密钥规格。 +8. 点击"下一步"。 +9. 将别名设置为友好且有信息量的名称,例如 `hyperlane-validator-signer-${chain_name}` 或 `hyperlane-relayer-signer-${chain_name}` +10. 虽然不是必需的,但可以随意编写描述并添加您认为有用的任何标签。 +11. 点击"下一步"。 +12. 密钥管理员不是必需的,但如果您愿意,可以选择一个。 +13. 点击"下一步"。 +14. 将使用权限授予您在第 1 节中创建的 IAM 用户。 +15. 点击"下一步"。 +16. 在审核页面中,滚动到"密钥策略"。生成的密钥策略是可以接受的,但如果您希望,可以通过以下方式使访问权限更少: + 1. 从"Sid"为"Allow use of the key"的语句中删除 `kms:DescribeKey` 和 `kms:Verify` 操作 + 2. 删除"Sid"为"Allow attachment of persistent resources"的整个语句。 +17. 点击"完成" + + + 高级用户可以考虑使用 [IAM/KMS Terraform 模块](/zh/docs/operate/guides/deploy-with-terraform#modules)来创建 IAM 用户和 KMS 密钥。 + + +### 查询地址 + +在某些情况下,您可能需要知道与您生成的 KMS 密钥关联的地址。 + + +```sh With cast +AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_KMS_KEY_ID=alias/your-key-alias cast wallet address --aws +``` + +```sh Using a script +# The script at the following repo will allow you to query this address: +# https://github.com/tkporter/get-aws-kms-address +``` + + \ No newline at end of file diff --git a/zh/docs/operate/validators/monitoring-alerting.mdx b/zh/docs/operate/validators/monitoring-alerting.mdx new file mode 100644 index 0000000..73af4ba --- /dev/null +++ b/zh/docs/operate/validators/monitoring-alerting.mdx @@ -0,0 +1,51 @@ +--- +title: "监控与告警" +--- + +Validator 在参数指定的端口号上公开 metrics。端口是默认的,尽管可以选择任何有效端口。 + +我们建议使用 Prometheus 来抓取这些 metrics,使用 Grafana 来可视化它们,使用[此仪表板 JSON 模板](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/84e8c5c218ac5d211c766cf4d5a135aee10e508c/tools/grafana/validator-dashboard-template.json),如下所示。此仪表板的好处是它同时显示多个 validator。屏幕截图显示按链或按 kubernetes pod 分组的 metrics。 + +![Validator Grafana 仪表板模板](/images/docs/operate/dashboard-template-validator.png) + + + 如果作为 Docker 镜像运行,请确保转发 metrics 端点端口。例如,要将本地端口 80 上的端口 9090 转发,请将以下标志添加到您的 `docker run` 命令:`-p 9090:80` + + +## Metrics + +仪表板模板包括以下 metrics。 + +| Metric | 描述 | +| --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `hyperlane_latest_checkpoint` | validator 观察到的最新 checkpoint | +| `hyperlane_block_height` | agent 连接的 RPC 节点的区块高度。此 metric 独立于 validator 的 checkpoint 索引功能定期更新。 | +| `hyperlane_contract_sync_liveness` | 在 validator 的索引循环的每次迭代中报告的时间戳。 | +| `hyperlane_contract_sync_block_height` | validator 在索引循环中观察到的区块高度。 | +| `hyperlane_cursor_current_block` | validator 内部游标观察到的区块高度。 | +| `hyperlane_span_events_total{agent="validator", event_level="error"}` | 记录的错误总数,可视化为 30 分钟增量("错误日志计数差异")。如果此 metric 的导数在最后一小时内超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称对 metrics 进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | +| `hyperlane_span_events_total{agent="validator", event_level="warn"}` | 记录的警告总数,可视化为 30 分钟增量("警告日志计数差异")。如果此 metric 的导数在最后一小时内超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称对 metrics 进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | + +## 图表 + +仪表板模板包括以下图表。 + +| 图表 | 描述 | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `已签名 Checkpoint 差异(30m)` | validator 观察到的最新 checkpoint,可视化为 30 分钟增量。如果尽管 `最新区块差异(30m)` 稳定,但值不是正数,则可能意味着要么没有新消息,要么 validator 停止签署 checkpoint。 | +| `观察到的 - 已处理的 checkpoint 差异` | validator 在区块链上观察到的 checkpoint 与 validator 签署并发布的 checkpoint 之间的差异。此图表大部分时间应为零,偶尔会出现短暂的正值。如果在很长一段时间内为正数,则意味着 validator 在签署和发布 checkpoint 方面存在问题。 | +| `最新区块差异(30m)` | agent 连接的 RPC 节点的区块高度,可视化为 30 分钟增量("最新区块差异")。如果此 metric 没有增加,则 RPC 可能不健康,需要更换。 | +| `合约同步活跃度` | 按原样呈现 metric `hyperlane_contract_sync_liveness`。图表应始终上升。如果是常量,则表示存在问题。如果图表包含多条链的 metrics,它们将彼此重叠呈现。当没有问题时这是正常的。如果存在应调查的问题,偏差将可见。 | +| `合约同步区块差异(30m)` | 将 metric `hyperlane_contract_sync_block_height` 呈现为 30 分钟增量。它应该大致匹配链在最近 30 分钟内产生的区块数。如果 metric 在任一方向显著偏离、变为零,应进行调查。 | +| `游标区块差异(30m)` | 将 metric `hyperlane_cursor_current_block` 呈现为 30 分钟增量。它应该大致匹配链在最近 30 分钟内产生的区块数。如果 metric 在任一方向显著偏离、变为零,应进行调查。 | +| `错误日志计数差异(30m)` | 记录的错误总数,可视化为 30 分钟增量("错误日志计数差异")。如果此 metric 的导数在最后一小时内超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称对 metrics 进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | +| `警告日志计数差异(30m)` | 记录的警告总数,可视化为 30 分钟增量("警告日志计数差异")。如果此 metric 的导数在最后一小时内超过 1,则至少需要低严重性告警。请注意,仪表板查询按 kubernetes pod 名称对 metrics 进行分组,因此如果您不在 kubernetes 环境中运行,可能需要调整此查询。 | + +## 告警 + +上述所有 metrics 可以组合起来创建最小化误报的告警。一些示例关键告警: + +- `hyperlane_latest_checkpoint` 停止增加,但 `hyperlane_block_height` 仍在增加,并且 `error` 和 `warn` 日志计数在过去 6 小时内也一直在增加 +- `hyperlane_block_height` 在过去 30 分钟内没有增加 + +如果您收到告警,请始终检查日志以了解问题可能是什么。 \ No newline at end of file diff --git a/zh/docs/operate/validators/run-validators.mdx b/zh/docs/operate/validators/run-validators.mdx new file mode 100644 index 0000000..8a43105 --- /dev/null +++ b/zh/docs/operate/validators/run-validators.mdx @@ -0,0 +1,399 @@ +--- +title: "运行 Validator" +--- + + + 有关 Hyperlane 中 Validator 的介绍,您可以查看[概述部分](/zh/docs/operate/overview-agents)。 + + +按照本指南,您可以在协议运行的任何现有[链](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)上运行 Hyperlane validator。Hyperlane Validator 按每个源链运行,这些说明是为单条链编写的。 + +## 要求 + +- **安全签名密钥** + + - Validator 使用此密钥签署 `Mailbox` 的最新 merkle root。保护此密钥很重要。如果密钥被泄露,攻击者可能会尝试伪造消息,导致 Validator 被削减。 + + - Hyperlane Validator agent 目前支持通过 API 密钥/秘密访问的 AWS KMS 密钥以及十六进制明文密钥进行签名。在 [agent 密钥](/zh/docs/operate/set-up-agent-keys)下查看更多信息。 + +- **公开可读的存储** + + - Validator 将其签名离链写入公开可访问、高可用的存储,以便 [Relayer](/zh/docs/protocol/agents/relayer) 可以聚合它们。 + + - Hyperlane Validator agent 目前支持使用上述相同的 AWS API 密钥将签名存储在 AWS S3 上,以及将签名存储在本地文件系统中进行测试。 + + - 该设计是[开源的](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/56be527d691a11a1ff2de4a390fd0dae8bb77347/typescript/infra/src/agents),可以推广到其他存储和密钥解决方案。有一个社区提交的正在进行中的 [GCS PR](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156)。 + +- **机器要求** + + - Validator 可以自己编译 Rust 二进制文件,或运行 Abacus Works 提供的 Docker 镜像。可以使用您喜欢的云服务运行二进制文件。您甚至可以在不同区域运行多个实例以实现高可用性,因为 Hyperlane 没有"双重签名"的概念。 + + - 硬件要求和成本很低 - validator 通常从 2-Core / 2GB RAM / 4GB Storage 设置开始,典型成本约为每月 $75 + +- **RPC 节点** + + - Validator 进行简单的视图调用,从它们正在验证的链上的 [Mailbox](/zh/docs/protocol/core/mailbox) 合约读取 merkle root。您必须使用自己的 RPC url,而不是任何公共的。 + + - Validator 应配置多个 RPC URL 以实现冗余和可靠性。不同的链有不同的配置——查看配置部分了解详情。 + + + 为 Polygon mainnet 运行 Validator 需要访问存档节点。这是因为 Validator 应该只在 root 最终确定后才签名,而 Polygon 需要 256 个区块确认才能实现最终性。 + + +## 指南 + +### 前提条件 + +总结一下 - 在运行生产 Validator 之前,您需要: + +1. 为您的 Validator 创建一个用于签名的密钥,请参阅 [Agent 密钥](/zh/docs/operate/set-up-agent-keys)文档。 +2. 设置您的 Validator 签名的发布目标,请参阅 [AWS 签名桶设置](/zh/docs/operate/validators/validator-signatures-aws)指南。 + +### 配置 + + + 经验丰富的运营商可能更喜欢[使用 Terraform 部署 agent](/zh/docs/operate/guides/deploy-with-terraform) 或社区提交的 [Ansible playbook](https://github.com/polkachu/hyperlane)。此过程将自动创建 agent 密钥、Validator 存储桶、权限以及在 AWS 上运行 Validator 集群所需的任何其他辅助设置。 + + +#### RPC 配置 + +Hyperlane Validator 和 Relayer 可以使用**多个 RPC URL** 来提高可靠性和冗余。设置因链类型而异。 + + + + +基于 EVM 的链支持配置多个 RPC 端点以实现冗余,并可以指定如何使用它们。 + +- **配置多个 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 +- **RPC 选择模式 ([`rpcConsensusType`](/zh/docs/operate/config/config-reference#chains--rpcconsensustype))**: + - **Fallback**:agent 尝试第一个 URL,如果需要则切换到下一个。 + - **Quorum**:要求大多数 URL 达成一致,除了提交交易;如果未指定,它将自动协调"最新"区块以减少同步错误。 + + + + +基于 Cosmos 的链需要 **RPC 和 gRPC 端点**才能正常运行。 + +- **配置多个 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 +- **配置 gRPC 端点:** 使用 [`customGrpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 +- **回退机制:** Cosmos agent 始终使用**回退模式**。 + + + + +基于 SVM 的链支持配置多个 RPC 端点,但**仅使用单个 RPC**。 + +- **配置 RPC:** 使用 [`customRpcUrls`](/zh/docs/operate/config/config-reference#chains--customrpcurls)。 + + + 对于 **SVM 链**,仅使用**单个 RPC URL**。没有回退或基于仲裁的选择机制。 + + + + + +#### 配置设置 + +与本地设置一样,在配置 Validator 时应提供一些基本参数。 + +| 参数 | 描述 | +| ----------------------------------------------- | --------------------------------------------------------------------------------- | +| `--db` | 用于将持久数据写入磁盘的路径。 | +| `--originChainName` | 正在验证的链的名称。例如:`ethereum`。 | +| `--chains.[originChainName].customRpcUrls` | 覆盖 Validator 用于您的源链的默认 RPC URL。 | +| `--chains.[originChainName].blocks.reorgPeriod` | Validator 在签署 `Mailbox` merkle root 之前需要等待的区块确认数。 | + + + 您的 Validator 接受命令行参数和环境变量作为配置。查看 [agent 配置](/zh/docs/operate/config/agent-config)页面和[配置参考](/zh/docs/operate/config/config-reference)以获取完整的配置可能性列表。 + + +您还可以使用 [`CONFIG_FILES` 环境变量](/zh/docs/operate/config/config-reference#config_files)以逗号分隔列表的形式提供额外配置文件的路径。如果您选择在 Docker 中运行,请参阅 [agent 配置](/zh/docs/operate/config/agent-config)的 docker 部分,了解将配置文件挂载到 Docker 容器中的提示。 + +### 特定于设置的配置 + +这些配置要求根据您设置的环境而有所不同。 + +#### Checkpoint 签名器配置 + + + + +| 参数 | 描述 | +| --------------------------------------- | ----------------------------------------------------------------------------------------- | +| `--validator.key` | 您的 Validator 的私钥,用于签署 merkle root。 | +| `--chains.${localChainName}.signer.key` | 您的 Validator 的私钥,将用于提交链上交易,公开宣布您的 Validator 的 checkpoint syncer。 | + + + + +| 参数 | 描述 | +| -------------------- | ------------------------------------------------------------------------------------------------------- | +| `--validator.region` | 您的 AWS KMS 密钥的区域。例如:`us-east-1`。 | +| `--validator.type` | 设置为 `aws` 字面量。 | +| `--validator.id` | 您的 Validator 的 AWS KMS 密钥的别名,前缀为 `alias/`。例如:`alias/hyperlane-validator-signer-${originChainName}`。 | + + + + +#### 交易签名器配置 + +在此步骤中配置的密钥需要少量资金来发送初始公告交易。 + + + + +这与 checkpoint 签名器的本地配置相同。 + +| 参数 | 描述 | +| --------------------------------------- | ----------------------------------------------------------------------------------------- | +| `--chains.${localChainName}.signer.key` | 您的 Validator 的私钥,将用于提交链上交易,公开宣布您的 Validator 的 checkpoint syncer。 | + + + + +| 参数 | 描述 | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `--chains.${originChainName}.signer.type` | 设置为 `aws` 字面量。 | +| `--chains.${originChainName}.signer.region` | 您的 AWS KMS 密钥的区域。例如:`us-east-1`。 | +| `--chains.${originChainName}.signer.id` | 您的 Validator 的 AWS KMS 密钥的别名,前缀为 `alias/`。例如:`alias/hyperlane-validator-signer-${originChainName}`。 | + + + + +| 参数 | 描述 | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------- | +| `--chains.${originChainName}.signer.type` | 设置为 `cosmosKey` 字面量。 | +| `--chains.${originChainName}.signer.prefix` | 设置为与链的地址格式关联的前缀字面量。例如:`osmo`。 | +| `--chains.${originChainName}.key` | 您的 Validator 的十六进制私钥,将用于提交链上交易,公开宣布您的 Validator 的 checkpoint syncer。 | + + + + +#### Checkpoint syncer 配置 + + + + +| 参数 | 描述 | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--checkpointSyncer.type` | 设置为 `localStorage`。 | +| `--checkpointSyncer.path` | Validator 签名将写入的本地目录路径。这应该是本地设置中 `$MY_VALIDATOR_SIGNATURES_DIRECTORY` 的值。例如:`--checkpointSyncer.path='/tmp/hyperlane-validator-signatures-ethereum'`。 | + + + 请注意,Relayer **必须**配置 `--allowLocalCheckpointSyncers` 才能从此 Validator 读取签名。 + + + + + +| 参数 | 描述 | +| --------------------------- | ----------------------------------------------------- | +| `--checkpointSyncer.type` | 设置为 `s3`。 | +| `--checkpointSyncer.bucket` | AWS S3 存储桶名称。 | +| `--checkpointSyncer.region` | 您的 AWS S3 存储桶的区域。例如:`us-east-1`。 | +| `--checkpointSyncer.folder` | 用于此 validator 的文件夹名称,可以是链的名称 | + + + + +## 开始验证 + +### 设置 + +生产环境的推荐安装方法是使用 Docker 镜像。 + + + + +首先下载 docker 镜像: + +```bash +docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 +``` + + + + +**克隆和设置** + +首先,克隆 Hyperlane monorepo: + +```sh +git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git +``` + +然后按照 `rust` 目录中的[设置说明](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md)进行操作。如果您使用的是 Apple Silicon,这应该会设置 `rustup` 以及 Rosetta 2。 + +```sh +# 安装 rustup +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# (仅 apple silicon) 安装 rosetta 2 +softwareupdate --install-rosetta --agree-to-license +``` + +构建 Validator: + +```sh +cargo build --release bin validator +``` + + + + +### 运行二进制文件 + +对于将签名写入 S3 存储桶并使用 AWS KMS 配置密钥的生产 Validator,您必须将 AWS 访问密钥和秘密作为环境变量提供。 + +| 环境变量 | 描述 | +| ----------------------- | --------------------------------------- | +| `AWS_ACCESS_KEY_ID` | 您的 Validator 的 AWS IAM 用户的访问密钥 ID。 | +| `AWS_SECRET_ACCESS_KEY` | 您的 Validator 的 AWS IAM 用户的秘密访问密钥。 | + +如需复习,请查看 [Agent 密钥](/zh/docs/operate/set-up-agent-keys)指南。 + + + + +然后使用相关参数启动容器。例如,您的 AWS 配置: + +```sh +docker run \ + -it \ + -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ + -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ + --mount ... \ + gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.4.0 \ + ./validator \ + --db /hyperlane_db \ + --originChainName \ + --reorgPeriod 1 \ + --validator.region us-east-1 \ + --checkpointSyncer.region us-east-1 \ + --validator.type aws \ + --chains..signer.type aws \ + --validator.id alias/hyperlane-validator-signer- \ + --chains..signer.id alias/hyperlane-validator-signer- \ + --checkpointSyncer.type s3 \ + --checkpointSyncer.bucket hyperlane-validator-signatures- \ + --checkpointSyncer.folder \ +``` + + + + +请参阅这些说明,了解如何在没有 Docker 的情况下从源代码构建。 + +我们可以从 `hyperlane-monorepo/rust` 目录中运行构建的二进制文件: + +```sh +# 设置 AWS 环境变量 +export AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP +export AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx + +# 运行 Validator +./target/release/validator \ + --db /hyperlane_db \ + --originChainName \ + --reorgPeriod 1 \ + --validator.region us-east-1 \ + --checkpointSyncer.region us-east-1 \ + --validator.type aws \ + --chains..signer.type aws \ + --chains..signer.region \ + --validator.id alias/hyperlane-validator-signer- \ + --chains..signer.id alias/hyperlane-validator-signer- \ + --checkpointSyncer.type s3 \ + --checkpointSyncer.bucket hyperlane-validator-signatures- +``` + + + + +### 宣布您的 Validator + +[Relayer](/zh/docs/operate/relayer/run-relayer) 需要知道在哪里找到您的 Validator 的签名。您的 Validator 将自动尝试通过写入您正在验证的链上的 `ValidatorAnnounce` 合约来宣布自己。 + +为此,您的 Validator 必须有少量代币来支付此交易的 gas 费用。 + +如果您的 Validator 尚未宣布自己,并且没有足够的代币支付 gas 费用,它将记录一条消息,指定需要多少代币。 + +### 成功! + +Validator 将索引源 Mailbox 合约以获取消息。如果已发送消息,您应该会看到 Validator 已签名它们的日志消息。如果一切配置正确,您应该会看到 json 文件被写入您的 S3 存储桶(如果您遵循了 AWS 设置)或您的本地签名目录(如果您遵循了本地设置)。每次将新的出站消息插入 mailbox 时,都会写入新的 json 文件。 + +## 运行多个 Validator + +我们鼓励大家在他们有兴趣支持的尽可能多的链上进行验证。本节概述了设置多个 validator 的注意事项和说明。 + +运行多个 validator 可以提高安全性和冗余性。通过在不同的链或区域部署 validator,您可以降低单点故障的风险。如果一个 validator 遇到停机或问题,其他 validator 可以继续运行,确保验证过程的完整性和可用性。 + +### 运行多个 Validator:关键注意事项 + +- **重用密钥**:多个 validator 可以使用同一个密钥。 +- **共享 AWS 账户**:多个 validator 可以使用同一个 AWS 账户。 +- **使用共享 S3 存储桶**:多个 validator 可以使用同一个 checkpoint syncer S3 存储桶,但是每个**必须**使用不同的文件夹(例如,`--checkpointSyncer.folder validator-1`,`--checkpointSyncer.folder validator-2`)。 + +### 多个 Validator 的额外步骤 + +#### 1. 创建 Agent 配置 + +- 为每个 validator 生成一个 agent [配置](#configuration)文件,指定它们将验证的链和相应的 RPC URL。 +- 确保每个配置文件指向正确的签名密钥和 S3 文件夹。 + +#### 2. 运行每个 Validator + +- 确保为每个 Validator 分配唯一的数据库路径(例如,`--db /hyperlane_db_validator1`)。 +- 配置每个 validator 在唯一端口上公开 metrics(例如,`--metrics-port 9090`,`--metrics-port 9091`)。 +- 如果在同一台机器上运行多个 validator,请分配足够的系统资源(CPU、内存和存储)。 +- 确保日志定向到单独的文件或服务,以便于调试和监控。 +- 如果使用 Docker,请分配唯一的容器名称和网络配置以避免冲突。 + +通过遵循这些额外步骤,您可以高效地管理多个 Hyperlane Validator。 + +## 设计参考 + +```mermaid +flowchart TB + V(("Validator(s)")) + Relayer((Relayer)) + + subgraph Origin + Sender + M_O[(Mailbox)] + POS[Proof of Stake] + + Sender -- "dispatch(destination, recipient, body)" --> M_O + end + + subgraph Cloud + aws[(Metadata
Database)] + end + + M_O -. "indexing" .-> Relayer + M_O -. "indexing" .-> V + POS == "staking" === V + + V -- "signatures" --> aws + + subgraph Destination + Recipient + M_D[(Mailbox)] + ISM[MultisigISM] + + M_D -- "verify(metadata, [origin, sender, body])" --> ISM + M_D -- "handle(origin, sender, body)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + end + + Relayer -- "process()" --> M_D + + aws -. "metadata" .-> Relayer + aws -. "moduleType()" .- ISM + + POS -. "validators()" .- ISM + + click ISM https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/isms/IMultisigIsm.sol + + style Sender fill:#efab17 + style Recipient fill:#efab17 \ No newline at end of file diff --git a/zh/docs/operate/validators/validator-signatures-aws.mdx b/zh/docs/operate/validators/validator-signatures-aws.mdx new file mode 100644 index 0000000..f460a37 --- /dev/null +++ b/zh/docs/operate/validators/validator-signatures-aws.mdx @@ -0,0 +1,81 @@ +--- +title: "AWS 签名桶设置" +description: "配置您的签名密钥和 S3 存储桶" +--- + + + +这些说明适用于生产环境,其中 Validator 密钥存在于 AWS 的密钥管理服务中,Validator 签名公开发布在 S3 存储桶中。 + +如果您只是想为测试或开发目的运行 Validator,请考虑遵循[本地设置指南](/zh/docs/guides/chains/deploy-hyperlane-with-local-agents)。 + + + +### 1. 创建 AWS IAM 用户和签名密钥 + +按照 [Agent 密钥](/zh/docs/operate/set-up-agent-keys)中的说明生成 AWS IAM 用户和 KMS 或十六进制密钥。您将在以下步骤中使用此密钥的凭据。 + +### 2. 创建 S3 存储桶 + + + 请注意,步骤 1(创建 IAM 用户)是设置 S3 存储桶所必需的,因此无论使用的密钥类型如何,都是必需的。 + + +您的 Validator 将把其签名发布到此存储桶。 + +1. 在 AWS 控制台中转到 AWS 的 S3。 + +2. 在右侧,点击橙色的"创建存储桶"按钮 + +3. 选择一个有信息量的存储桶名称,例如 `hyperlane-validator-signatures-${validator_name}-${chain_name}` + +4. 考虑选择与您在上一步中创建的 KMS 密钥相同的区域。 + +5. 保留对象所有权的推荐"禁用 ACL"设置。 + +6. 配置公共访问设置,以便 relayer 可以读取您的签名 + + 1. 取消选中"阻止所有公共访问" + 2. 选中通过访问控制列表阻止访问的前两个选项 + 3. 保留最后两个选项未选中,我们将通过存储桶策略授予公共读取访问权限 + 4. 确认这些设置可能导致公共访问您的存储桶 + +7. 其余默认设置没问题,点击底部的橙色"创建存储桶"按钮 + +### 3. 配置 S3 存储桶权限 + +您的 Validator IAM 用户将需要写入权限,它应该可以被 Relayer 公开读取。 + +1. 在 AWS 控制台中导航回"身份和访问管理(IAM)" +2. 在"IAM 资源"下,您应该看到至少一个"用户",点击进入 +3. 点击您之前配置的用户名称(例如 `hyperlane-validator-${chain_name}`) +4. 将"用户 ARN"复制到剪贴板,它应该看起来像 `arn:aws:iam::791444913613:user/hyperlane-validator-${chain_name}` +5. 在 AWS 控制台中导航回"S3" +6. 点击您刚创建的存储桶名称 +7. 在存储桶名称下方,点击"权限" +8. 向下滚动到"存储桶策略"并点击"编辑" +9. 输入以下内容。存储桶 ARN 就显示在您输入策略的位置上方 + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": "*", + "Action": ["s3:GetObject", "s3:ListBucket"], + "Resource": ["${BUCKET_ARN}", "${BUCKET_ARN}/*"] + }, + { + "Effect": "Allow", + "Principal": { "AWS": "${USER_ARN}" }, + "Action": ["s3:DeleteObject", "s3:PutObject"], + "Resource": "${BUCKET_ARN}/*" + } + ] +} +``` + + + 高级用户可以考虑使用 [S3 Terraform 模块](/zh/docs/operate/guides/deploy-with-terraform#modules)来创建具有正确权限的 S3 存储桶。 + \ No newline at end of file diff --git a/zh/docs/protocol-economics/intro.mdx b/zh/docs/protocol-economics/intro.mdx new file mode 100644 index 0000000..16729aa --- /dev/null +++ b/zh/docs/protocol-economics/intro.mdx @@ -0,0 +1,266 @@ +--- +title: "Hyperlane 协议经济学" +--- + +Hyperlane 是一个无需许可的跨链通信互操作性协议,使消息能够在不同区块链之间移动。 + +HYPER 是 Hyperlane 的原生代币,旨在协调 Hyperlane 生态系统内的激励并赋能社区。它用于通过质押保护跨链通信,并奖励网络参与者对协议活动的贡献。 + +## HYPER 代币概述 + +### HYPER + +HYPER 是 Hyperlane 协议的原生代币。它存在于多个网络上,包括以太坊主网、Base、OP Mainnet、Arbitrum One 和 BSC。 + +HYPER 用于通过质押保护 Hyperlane 协议。验证器部分基于质押 HYPER 被选择提供默认消息安全。 + +| 代币 | 网络 | 合约地址 | +| --------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| **HYPER** | 以太坊主网 | [0x93A2Db22B7c736B341C32Ff666307F4a9ED910F5](https://etherscan.io/token/0x93A2Db22B7c736B341C32Ff666307F4a9ED910F5) | +| **HYPER** | Arbitrum One | [0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4](https://arbiscan.io/token/0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4) | +| **HYPER** | Base | [0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4](https://basescan.org/token/0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4) | +| **HYPER** | OP Mainnet | [0x9923DB8d7FBAcC2E69E87fAd19b886C81cd74979](https://optimistic.etherscan.io/token/0x9923DB8d7FBAcC2E69E87fAd19b886C81cd74979) | +| **HYPER** | BSC | [0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4](https://bscscan.com/token/0xC9d23ED2ADB0f551369946BD377f8644cE1ca5c4) | + +### stHYPER + +stHYPER 是用户将 HYPER 锁定到 [Symbiotic 资金库](https://docs.symbiotic.fi/modules/vault/introduction/)时获得的流动性质押代币。stHYPER 在以太坊主网和 BSC 上可用。 + +它充当收据代币,代表用户质押的 HYPER。在 stHYPER 存在的地方可以申请奖励。 + +| 代币 | 网络 | 合约地址 | +| ----------- | ---------------- | ------------------------------------------------------------------------------------------------------------------- | +| **stHYPER** | 以太坊主网 | [0xE1F23869776c82f691d9Cb34597Ab1830Fb0De58](https://etherscan.io/token/0xE1F23869776c82f691d9Cb34597Ab1830Fb0De58) | +| **stHYPER** | BSC | [0x6E9804a08092D8ba4E69DaCF422Df12459F2599E](https://bscscan.com/token/0x6e9804a08092d8ba4e69dacf422df12459f2599e) | + +### HYPER 与 stHYPER + +| 代币 | 它是什么 | 存在于哪里 | 奖励 | +| ----------- | ----------------------------------------- | --------------------------------------------- | ------- | +| **HYPER** | Hyperlane 协议的原生代币 | 以太坊、Base、OP Mainnet、Arbitrum One、BSC | - | +| **stHYPER** | 来自 Symbiotic 资金库的流动性质押代币 | 以太坊、BSC | ✅ 是 | + +## 质押 + +质押是参与者为 Hyperlane 协议的经济安全做出贡献并获得奖励的方式。 + +要质押,用户将 HYPER 代币锁定到以太坊上的 Symbiotic 资金库中。这会生成 stHYPER,一个代表用户质押头寸的流动性质押代币。 + + + **Symbiotic 上的 HYPER 资金库**:HYPER 资金库不会重新质押到其他协议或网络。它只委托给 Symbiotic 上的 Hyperlane 网络,减少外部削减风险。 + + +### 质押工作原理 + +- **质押流程**:HYPER 持有者可以通过选择 HYPER 资金库并锁定其 HYPER 代币在 Symbiotic 应用程序上质押其代币。 +- **周期长度**:奖励按算法计算并按周期自动分发,目前设置为约 1 个月。此持续时间反映了默认[跨链安全模块(ISM)](/zh/docs/protocol/ISM/modular-security)验证器集链上的最大结算延迟。 +- **解质押流程**:解质押需要用户对下面概述的步骤采取行动。要提取 HYPER,您必须: + 1. 在 Symbiotic 用户界面上启动解质押操作。 + 2. 周期开始和结束日期由协议定义,这意味着一旦您启动解质押,您需要等待大约一个完整周期(约 30 到 60 天,最多约 0.99 + 1 周期)才能使您的提取可用。 + 3. 在周期结束后从 UI 中的质押合约手动完成提取。 + +### 经济安全分配 + +Symbiotic 上 HYPER 资金库中的 HYPER 基于经济安全分配算法委托给验证器。 + +分配算法旨在相对于域(链)的经济活动将经济安全分配给域。这意味着具有更高经济活动的域会获得委托给其验证器集的质押 HYPER 的更大份额。 + +这些验证器集负责保护每个域的默认跨链安全模块(ISM)。ISM 是负责验证在目标链上传递的消息是在源链上发送的智能合约模块。ISM 中的验证器验证消息以确保它们在处理之前是有效和可信的。 + +分配算法输出每个域的分配百分比,用于在每个域的验证器集之间分配总质押 HYPER。_有关此过程的更多详细信息将随后提供。_ + +## Hyperlane 验证器选择和注册 + +虽然 Hyperlane 的 ISM 模型能够完全自定义安全性,但每个提供的邮箱上都有一个默认 ISM。被选入此 ISM 的验证器(且仅这些验证器)将获得验证器奖励。 + +### 选择过程 + +潜在验证器(在 Symbiotic 网络中称为运营商)必须完成 [Hyperlane 验证器调查](https://docs.google.com/forms/d/e/1FAIpQLSfLo8D5GcrQVtR_ug3QcgVrXDgfdGPpz30ZLq7J9t2tHnB5xQ/viewform)。 + +Hyperlane 协议的验证器负责证明从某个源链发送的消息。因此,实体将基于围绕运营实践和正常运行时间的一组加权标准进行评估。 + +这包括但不限于: + +- **运营最佳实践** + - 链节点运营(例如,RPC 设置、管理等) + - 运营安全实践(监控/警报、安全秘密管理、工程值班轮换等) +- **运营历史** + - 历史正常运行时间 + - 运营历史 + - 运行的 Hyperlane 验证器数量 +- **经济安全** + - 在 Hyperlane Symbiotic 资金库中的 HYPER 自质押 + +验证器基于运营历史和性能持续评估,这决定了它们在默认 ISM 集中维持位置的能力。 + +_注意:验证器只有在被选为 Hyperlane 默认 ISM 的一部分时才会获得奖励。_ + +### 注册为 Symbiotic 运营商并选择加入 + +一旦被选为默认 ISM,验证器必须注册为 Symbiotic 上的运营商以接收委托(质押)和奖励。 + +#### 运营商注册 + +请参考 Symbiotic 文档,了解通过 [Symbiotic CLI](https://github.com/symbioticfi/cli) 注册为运营商的步骤: + +- [运营商注册](https://docs.symbiotic.fi/handbooks/operators-handbook#through-cli) +- [运营商 CLI 写入命令指南](https://docs.symbiotic.fi/guides/cli/#write-commands---for-operators) + +#### 元数据提交 + +完成注册后,向 [Symbiotic 主网元数据仓库](https://github.com/symbioticfi/metadata-mainnet) 提交包含您的运营商/网络详细信息和图标的拉取请求。使用与上一步注册时相同的地址。 + + + 元数据必须满足 Symbiotic 文档中概述的几个要求。请注意,不满足这些要求的拉取请求无法被接受。 + + + + 元数据可以稍后调整,但任何更改都需要 Symbiotic 团队审查后才能应用。 + + +#### 选择加入 Hyperlane 的网络和资金库 + +在运营商可以开始接收委托和奖励之前,他们必须完成两个选择加入步骤: + +1. 在 Symbiotic 上选择加入 [Hyperlane 网络](https://app.symbiotic.fi/network/0x59cf937Ea9FA9D7398223E3aA33d92F7f5f986A2): + 1. 使用 [CLI 选择加入命令](https://docs.symbiotic.fi/guides/cli/#opt-in-network)。 + 2. 使用 [CLI 检查命令](https://docs.symbiotic.fi/guides/cli#check-opt-in-network) 验证选择加入。 +2. 在 Symbiotic 上选择加入 [HYPER 资金库](https://app.symbiotic.fi/vault/0xE1F23869776c82f691d9Cb34597Ab1830Fb0De58): + 1. 使用 [CLI 选择加入命令](https://docs.symbiotic.fi/guides/cli/#opt-in-vault)。 + 2. 使用 [CLI 检查命令](https://docs.symbiotic.fi/guides/cli/#check-opt-in-vault) 验证选择加入。 + +### 加入 Hyperlane 的默认 ISM + +一旦验证器提交了 Hyperlane 验证器调查,并完成了 Symbiotic 运营商注册/选择加入,当默认 ISM 验证器位置变得可用时,验证器可以被选择。 + +默认 ISM 位置在以下情况下开放: + +- Hyperlane 扩展到新链。 +- 现有链上的验证器位置由于以下原因变得可用: + 1. 验证器被轮换出去。 + 2. 由于安全要求验证器位置扩展。 + +一旦通过共享通信渠道建立了相互利益,验证器可以继续部署(如果他们选择,也可以更早部署)。请参见[运行验证器](/zh/docs/operate/validators/run-validators)。 + + + 有关验证器奖励申请,请前往[验证器奖励部分](#validator-rewards)。 + + +## 削减 + +削减是一种旨在鼓励在 Hyperlane 协议中诚实参与的机制。 + +质押 HYPER 以保护 Hyperlane 协议的参与者在安全违规情况下承担削减风险。如果验证器的法定人数签署导致安全违规的消息(例如,如果法定人数签署了未包含在规范链状态中的消息),委托给该链的 HYPER 的一部分可以被削减。这意味着质押者的质押 HYPER 将被削减。 + +削减发生在验证器被证明欺诈时。 + +### 欺诈和链上欺诈归因 + +欺诈通过智能合约在默认 ISM 集中的所有链上得到证明。这些合约通过 [`AttributeCheckpointFraud` 合约](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/AttributeCheckpointFraud.sol) 实现欺诈归因系统。该合约定义了特定类型的欺诈行为。 + +`AttributeCheckpointFraud` 合约使用特定的 `attribute` 函数将欺诈归因于验证器,具体取决于违规类型。然后这些归因用于触发 HYPER 资金库中的削减逻辑。 + +**欺诈类型** + +`AttributeCheckpointFraud` 合约中定义了四种欺诈类型: + +1. **白名单:** 验证器使用了无效的默克尔树实现。 +2. **过早:** 验证器过早签署并提交了检查点。 +3. **消息 ID:** 检查点提交了错误的消息 ID,与实际消息不匹配。 +4. **根:** 检查点中的默克尔根无效。 + +### 削减惩罚和过程 + +削减惩罚在所有 HYPER 质押者之间社会化。例如,如果由于故障削减了 5% 的 HYPER,那么所有 HYPER 质押者将失去其质押 HYPER 的 5%。 + +在启动时,削减由 Hyperlane 基金会和安全委员会监督,他们可以批准或否决削减决定。随着时间的推移,这个过程预计将通过无信任 ISM 等模块过渡到链上执行。 + +## 奖励 + +奖励是协议如何协调激励并维持积极参与的核心部分。Hyperlane 协议根据不同参与者的贡献向他们分发奖励。这些包括保护网络、发送消息和运营验证器。 + +有三种主要类型的接收者: + +| **接收者** | **奖励** | +| --------------------------------------------------------------------- | --------------------- | +| **质押者**(stHYPER 持有者) | **质押者奖励** | +| **验证器**(默认 ISM 验证器集) | **验证器奖励** | +| **用户**(签署发送跨链消息交易的 EOA) | **扩展奖励** | + +### 质押者奖励 + +协议向在 Symbiotic 资金库中质押 HYPER 的参与者分发奖励。这些奖励旨在激励对 Hyperlane 经济安全的贡献。 + +- **资格**:任何持有 stHYPER 的人都有资格获得奖励。 +- **分发**:奖励按每个周期(约 30 天)的固定费率发放。 +- **奖励计算**:奖励基于总质押金额和它保持质押的时间。在支付验证器奖励佣金后,质押者将按其质押比例获得奖励。 + +这种奖励流有助于激励用户为 Hyperlane 协议提供经济安全。 + +### 验证器奖励 + +协议向作为默认跨链安全模块(ISM)验证器集一部分的参与者分发奖励。这些参与者通过验证跨链消息帮助保护协议。验证器奖励作为质押奖励的佣金支付。 + +- **资格**:默认 ISM 验证器集中的验证器。 +- **分发**:奖励通过 Symbiotic UI 分配。 + - 验证器可以通过 ['claimRewards()'](https://github.com/symbioticfi/rewards/blob/7844a6ceaf4d740c7083a37e410194c1ef7867d3/src/contracts/defaultOperatorRewards/DefaultOperatorRewards.sol#L75) 函数使用可通过 [Symbiotic CLI](https://github.com/symbioticfi/rewards/blob/main/specs/OperatorRewards.md#cli) 获得的默克尔证明申请奖励。有关详细信息,请参考:[Symbiotic 运营商奖励](https://docs.symbiotic.fi/modules/extensions/rewards/#default-operator-rewards)。 + - 验证器奖励将在注册期间直接分配给运营商密钥。 +- **成为 Hyperlane 默认 ISM 验证器集的一部分**:验证器基于包括运营安全实践、历史性能和质押的 HYPER 数量在内的标准进行评估。有关此的更多详细信息在验证器选择部分提供。_请注意,作为其他 ISM(如应用程序特定 ISM)一部分的验证器不会直接由 Hyperlane 协议奖励。_ + +这种奖励流有助于激励运营 Hyperlane 验证器。 + +### 扩展奖励 + +协议向通过发送跨链消息推动协议活动的用户分发奖励。用户是签署发送 Hyperlane 消息交易的任何外部拥有账户(EOA)。 + +- **资格**:扩展奖励将基于线性基础分发给生成超过设定阈值费用的所有 Hyperlane 用户和应用程序(即,stHYPER 将基于用户或应用程序的费用占超过阈值的总费用的百分比作为相对份额分发)。有关更多信息,请参考 Hyperlane 基金会资源。 +- **工作原理**:扩展奖励基于协议使用情况,每季度向 Hyperlane 协议用户回溯分发。 +- **申请奖励**:符合条件的地址将能够通过用户界面申请奖励。 +- **频率**:奖励每 3 个月分发一次。 + +这种奖励流有助于激励协议的真实使用和采用。 + +### 连续倍数:HyperStreak + +通过 Hyperlane 奖励,Hyperlane 引入了一种新的激励模型,旨在奖励与协议的长期一致性。这个模型的核心部分是 **HyperStreak** 机制。 + +#### 什么是 HyperStreak? + +HyperStreak 是一个奖励在连续时间段内持续质押和持有 stHYPER 的用户的系统。拥有 HyperStreak 的用户将有资格基于其连续获得提升的奖励。 + +HyperStreak 不要求用户预先锁定其代币,而是跟踪用户维持其 stHYPER 的时间长度,鼓励持续参与。 + +#### 工作原理 + +- **资格**:用户必须持有 stHYPER 才有资格累积 HyperStreak。 +- **连续累积**:用户每天持有 stHYPER 而不移动或提取,其 HyperStreak 增长一天。如果用户提取或转移其质押的 HYPER,其连续重置(受宽限期政策约束)。 +- **连续等级**:HyperStreak 有 4 个等级。用户维持连续的时间越长,他们达到的等级越高(等级 4)。每个等级为用户的奖励提供提升。 +- **等级分配**:系统使用动态方法分配等级。用户基于最大可能连续的比例进行排名。在早期阶段(启动后前 90 天),任何质押并持有 stHYPER 而不中断的用户都有资格获得最高等级。最初获得等级 4 的方法是质押并保持在启动日收到或购买的代币闲置。这种等级分配用于确定额外奖励。 + +#### 奖励分发和分配 + +奖励与扩展奖励一起基于加权系统分发,该系统根据每个用户的权重按比例分配季度扩展奖励池。 + +这些额外奖励来自同一个固定的季度扩展奖励池。因此,具有更长连续的用户获得按比例更大的份额,这减少了那些没有连续的人可用的数量。 + +用户的权重由连续等级确定。 + +| 等级 | B(奖励百分比) | 权重 | +| ------------- | -------------------- | ------ | +| **等级 4** | 0.6 | 1.60 | +| **等级 3** | 0.4 | 1.40 | +| **等级 2** | 0.3 | 1.30 | +| **等级 1** | 0.2 | 1.20 | +| **无连续** | 0 | 1.00 | + +给定总奖励池 R,每个用户的份额由以下确定: + +$$ +\text{用户奖励} = \left( \frac{\text{用户权重}}{\sum_{i=1}^{N} \text{用户}_i\text{权重}} \right) \times R +$$ + +HyperStreak 机制鼓励用户与协议持续互动,并奖励那些从一开始就这样做的人。它旨在通过一致的激励支持 Hyperlane 协议的长期可持续性。 + +## 其他资源 + +- [Hyperlane 基金会博客文章](https://medium.com/@hyperlane_fdn/introducing-hyper-f3846883f1f5) \ No newline at end of file diff --git a/zh/docs/protocol/ISM/custom-ISM.mdx b/zh/docs/protocol/ISM/custom-ISM.mdx new file mode 100644 index 0000000..3f24d14 --- /dev/null +++ b/zh/docs/protocol/ISM/custom-ISM.mdx @@ -0,0 +1,124 @@ +--- +title: "创建您自己的 ISM" +--- + +开发者可以通过在其应用程序中实现 `ISpecifiesInterchainSecurityModule` 接口来指定或覆盖默认 ISM。 + + + 如果未指定 ISM,或者指定的 ISM 是空地址,则将使用目标链的 Mailbox 上配置的默认 ISM。 + + +## ISM 接口 + +ISM 必须实现 `InterchainSecurityModule` 接口。此实现可以根据应用程序的需求进行配置、组合和自定义。 + +具体来说,此接口必须在实现 `handle()` 的同一个智能合约中实现。 + +该接口由两个函数组成:`verify` 和 `moduleType`。 + + + +```solidity Solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +enum ModuleType { +UNUSED, +ROUTING, +AGGREGATION, +LEGACY_MULTISIG, +MERKLE_ROOT_MULTISIG, +MESSAGE_ID_MULTISIG, +NULL, // used with relayer carrying no metadata +CCIP_READ, +ARB_L2_TO_L1, +POLYGON_POS, +OP_STACK +} + +interface InterchainSecurityModule { +/\*\* +_ @notice 返回表示此 ISM 编码的安全模型类型的枚举。 +_ @dev Relayer 推断如何获取和格式化 metadata。 +_/ +function moduleType() external view returns (uint8); + + /** + * @notice 定义负责根据提供的 metadata 验证跨链消息的安全模型。 + * @param _metadata Relayer 提供的链下 metadata,特定于 + * 模块编码的安全模型(例如 validator 签名) + * @param _message Hyperlane 编码的跨链消息 + * @return 如果消息已验证则返回 True + */ + function verify( + bytes calldata _metadata, + bytes calldata _message + ) external returns (bool); + +} + +``` + + + +## Verify + +```solidity +/** + * @notice 定义负责根据提供的 metadata 验证跨链消息的安全模型。 + * @param _metadata Relayer 提供的链下 metadata,特定于 + * 模块编码的安全模型(例如 validator 签名) + * @param _message Hyperlane 编码的跨链消息 + * @return 如果消息已验证则返回 True + */ +function verify( + bytes calldata _metadata, + bytes calldata _message +) external returns (bool); +``` + +ISM 必须实现的主要函数是 `verify()`。[Mailbox](/zh/docs/protocol/core/mailbox) 在将消息传递给其接收者之前会调用 `IInterchainSecurityModule.verify()`。如果 `verify()` 回退或返回 `false`,消息将不会被传递。 + +### 参数 + +- `_metadata`:由 [Relayer](/zh/docs/protocol/agents/relayer) 提供的任意字节组成。通常,这些字节特定于 ISM。例如,[Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 的 `_metadata` 必须包含 validator 签名。 + +- `_message`:由正在验证的 Hyperlane 消息组成。ISM 可以使用它来检查有关正在验证的消息的详细信息。例如,[Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 可以根据消息的源链更改 validator 集。 + + + 有关传递给 `verify()` 的 Hyperlane 消息格式的更多信息,请参阅 [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) 库。 + + +## Module Type + +ISM 必须实现的第二个函数是 `moduleType()`。 + +```solidity +function moduleType() external view returns (uint8); +``` + +这用于向 [Relayer](/zh/docs/protocol/agents/relayer) 发出信号,指示 `_metadata` 中应包含什么。ISM **必须**返回支持的模块类型之一。 + +```solidity +enum ModuleType { + UNUSED, + ROUTING, + AGGREGATION, + LEGACY_MULTISIG, + MERKLE_ROOT_MULTISIG, + MESSAGE_ID_MULTISIG, + NULL, // used with relayer carrying no metadata + CCIP_READ, + ARB_L2_TO_L1, + POLYGON_POS, + OP_STACK +} +``` + + + +- 所有 ISM 合约都必须实现 ISM 接口,该接口要求定义 `moduleType`。Relayer 根据此类型进行分支,以确定该 ISM 所需的 metadata。有关模块类型及其 metadata 格式的更多信息,请参阅 [Protocol](/zh/docs/protocol/ISM/modular-security#core-concepts)。 + +- 有关可用模块类型及其各自 metadata 的更多信息,请访问本节中概述的 ISM 文档,例如 [Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM)。 + + \ No newline at end of file diff --git a/zh/docs/protocol/ISM/economic-security/hyperlane-avs.mdx b/zh/docs/protocol/ISM/economic-security/hyperlane-avs.mdx new file mode 100644 index 0000000..08004df --- /dev/null +++ b/zh/docs/protocol/ISM/economic-security/hyperlane-avs.mdx @@ -0,0 +1,251 @@ +--- +title: "Hyperlane AVS" +description: "Hyperlane 的 EigenLayer AVS 模块" +--- + +本指南将帮助您了解构建在 EigenLayer(以太坊重新质押协议)之上的 Hyperlane AVS(主动验证服务)模块。 + +Hyperlane 目前采用权威证明模型来保证安全性,其中选择一组受信任的 Validator 来维护[安全性](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM)。然而,如果任何 Validator 错误签署或出于恶意签署,由于这些 Validator 没有经济质押,因此不会有任何后果。这就是 AVS 模块旨在解决的差距。 + +```mermaid +flowchart TB + subgraph Ethereum + Staker + Operator + EL[EigenLayer] + H_AVS[Hyperlane AVS] + CH1[Challenger1] + CH2[Challenger2] + CH3[Challenger3] + + Operator -- "(de)register()" --> H_AVS + Staker -- "deposit(operator)" --> EL + + H_AVS <-..-> EL + CH1 -. "handleChallenge(operator)" .-> H_AVS + CH2 -. "handleChallenge(operator)" .-> H_AVS + CH3 -. "handleChallenge(operator)" .-> H_AVS + + style H_AVS fill: #FF0099 + style EL fill: #1a0c6d + style CH1 fill: #006400 + style CH2 fill: #006400 + style CH3 fill: #006400 + end +``` + +AVS 模块在 Hyperlane 协议中独特地启用了[经济安全](/zh/docs/protocol/ISM/economic-security/overview),以最小的成本为其支持的每条链引导新的 Validator 网络。这是通过利用可以保护 rollup 之间和来自 rollup 的出站消息的共享质押池来实现的。此过程中的主要利益相关者是: + +- **Operator(运营商)** - 选择加入 Hyperlane AVS 服务并开始验证指定链的出站消息的 EigenLayer operator +- **Staker(质押者)** - 将其质押委托给 operator 以保护网络的 EigenLayer staker +- **Application(应用程序)** - 利用 Hyperlane 寻求跨链经济安全保护其消息的应用程序 + + + EigenLayer 的罚没和奖励支付尚未启用。除了 AVS 之外,还必须在[跨链安全模块 (ISM)](/zh/docs/protocol/ISM/modular-security) 中设置签名和验证。 + + +### 架构 + +```mermaid +classDiagram +namespace Contracts { + class AVSDirectory { + avsOperatorStatus: address => OperatorAVSRegistrationStatus + registerOperatorToAVS(operator, signature) + deregisterOperatorFromAVS() + } + class ECDSAStakeRegistry { + quorum: (IStrategy[], multiplier) + + registerOperatorWithSignature(operator, signature) + updateQuorumConfig(quorum, operators[]) + } + class IServiceManager { + <> + + registerOperatorToAVS(operator,signature) + deregisterOperatorFromAVS(operator) + } + class HyperlaneServiceManager { + enrolledChallengers: address => IRemoteChallenger + + enrollIntoChallengers(IRemoteChallenger[]) + startUnenrollment(IRemoteChallenger[]) + completeUnenrollment(address[]) + } + class IRemoteChallenger { + <> + + challengeDelayBlocks() + handleChallenge(avsSigningKeyAddress) + } + class ISlasher { + <> + + freezeOperator(operator) + } + class IStrategy { + <> + + deposit(token,amt) + withdraw(token,amt) + } + + class StrategyManager { + depositIntoStrategy(strategy, token, amt) + } +} + +ECDSAStakeRegistry--|>IServiceManager +ECDSAStakeRegistry--|>IStrategy +HyperlaneServiceManager--|>ECDSAStakeRegistry +HyperlaneServiceManager--|>IRemoteChallenger +HyperlaneServiceManager--|>ISlasher + +HyperlaneServiceManager--|>AVSDirectory +StrategyManager--|>IStrategy + + +IServiceManager<..HyperlaneServiceManager +``` + +上面的类图描述了当前 AVS 模块合约的架构。至关重要的是,它描述了我们通过 `IRemoteChallenger` 接口支持的 _"metaAVS"_ 设计模式。 + +### `IRemoteChallenger` + +Hyperlane 上的 Operator 可以灵活地在其选择的链上运行,使 AVS 模块能够适应任何链或挑战者。然而,这种灵活性可能导致主网上缺乏普遍接受的用于罚没的"规范"真相来源。这是因为欺诈只能在源链上证明,因此需要一种方法将该信息传输到质押所在的链。 + +秉承无需许可互操作性的精神,我们认为应用程序开发者应该有能力定义自己的真相来源,并为其应用程序的经济安全建立保证。这包括编程挑战条件和罚没窗口的能力。 + +为了实现这种级别的自定义,我们引入了 `IRemoteChallenger` 接口。只有当 `ism.verify()` 在源自检测到欺诈性签名的链的 L1 上成功执行时,才会调用 `handleChallenge` 函数。如上所述,为这个底层 ISM 设置强大的安全措施至关重要。 + +```solidity +interface IRemoteChallenger { + /// @notice Returns the number of blocks that must be mined before a challenge can be handled + /// @return The number of blocks that must be mined before a challenge can be handled + function challengeDelayBlocks() external view returns (uint256); + + /// @notice Handles a challenge for an operator + /// @param operator The address of the operator + function handleChallenge(address operator) external; +} +``` + +此配置应该是不可变的,并且可供任何 AVS operator 查看和选择加入。`handleChallenge` 函数明确编码了您期望如何将来自源链(例如 Arbitrum)的挑战传递到 AVS 合约和 `IRemoteChallenger` 所在的 Ethereum 主网。 + +对于 Arbitrum,它可以是 rollup 的原生桥接,对于另一个 L1,它可以是基于委员会的解决方案。我们的接口对挑战者实现无关,以允许在这个设计领域具有灵活性。这允许我们在 L1 上 `ism.verify()` 成功后通过调用 `handleChallenge()` 来重用现有的 hook-ISM 设置。在使用 rollup 原生桥接的情况下,合理的 `challengeDelayBlocks` 应该略长于一周。 + +作为 operator,您应该审查不同的 `IRemoteChallenger` 合约并评估其风险和回报。如果感兴趣,您可以直接从 `HyperlaneServiceManager` 合约注册到一个或多个挑战者。 + + + IRemoteChallenger 实现尚未在生产环境中上线。 + + +### 注册工作流程 + +前提条件:operator 必须注册为 EigenLayer Operator(通过其 CLI) + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Operator + participant ECDSAStakeRegistry + participant HSM + participant AVSDirectory + end + +Operator->>ECDSAStakeRegistry: registerOperatorWithSignature(operator,operatorSignature) +ECDSAStakeRegistry->>HSM: registerOperatorToAVS(operator,operatorSignature) +HSM->>AVSDirectory: registerOperatorToAVS(operator,operatorSignature) +Operator->>HSM: enrollForChallengers(challenger[]) +``` + +Operator 需要注册到特定的挑战者以允许通过无需许可的罚没实现经济安全。作为 operator,您可以检查每个远程挑战者,并根据风险自行选择要加入哪些挑战者。这也意味着没有中心化的许可或白名单会成为为不同 rollup 堆栈添加挑战者的瓶颈。operator 将能够在注销延迟区块过后注销。 + +### 注销工作流程 + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Operator + participant HSM + participant IRemoteChallenger + participant ECDSAStakeRegistry + participant AVSDirectory + end + +Operator->>HSM: startUnenrollment(challenger[]) +Note over Operator,HSM: Operator waits for delay period +Operator->>ECDSAStakeRegistry: deregisterOperatorWithSignature(operator) +ECDSAStakeRegistry->>HSM: deregisterOperatorToAVS(operator) +Operator->>HSM: completeUnenrollment(challenger[]) +HSM->>IRemoteChallenger: challengeDelayBlocks() +HSM->>AVSDirectory: deregisterOperatorToAVS(operator) +``` + +Operator 只能在从他们注册的所有挑战者中注销后才能注销自己,每个挑战者都可以有自己的延迟期。这是为了确保 operator 在任何挑战者的挑战期过去之前无法提取其质押。 + +### 质押工作流程 + +```mermaid +sequenceDiagram + box Ethereum L1 + actor Staker + participant DelegationManager + participant StrategyManager + participant Strategy1 + + end + +Staker->>DelegationManager: delegateTo(operator,approverSignatureAndExpiry) +Staker->>StrategyManager: depositIntoStrategy(strategy,token,amt) +StrategyManager->>Strategy1: token.transferFrom(sender, strategy, amount) +StrategyManager->>DelegationManager: increaseDelegatedShares +``` + +在 EigenLayer 的设计中,staker 资金受到保护,因为在启用罚没之前不会将其提供给 AVS。这确保没有资金过早面临风险。此外,此设计不允许用户单独选择加入 Hyperlane AVS,因为质押通过 StrategyManager 管理并针对特定的 operator。 + +### 罚没工作流程 + +```mermaid +sequenceDiagram + box Origin Chain + actor Watcher + participant NativeChallenger + end + + box Ethereum L1 + participant IRemoteChallenger + participant HSM + participant Slasher + end + + +Watcher->>NativeChallenger: challenge(address, bytes32,bytes32) +NativeChallenger->>IRemoteChallenger: "postChallenge(operator)" via nativeBridge +IRemoteChallenger->>HSM: handleChallenge(operator) +HSM-->>HSM: checkIfEnrolled(operator) +HSM->>Slasher: freezeOperator(operator) +``` + +罚没机制设计为无需许可且灵活。`IRemoteChallenger` 接口允许罚没机制的不同实现。例如,`postChallenge` 函数由源链上的原生挑战者调用,然后在 `HyperlaneServiceManager` 合约上调用 `handleChallenge` 函数。`HyperlaneServiceManager` 合约然后检查 operator 是否已注册到挑战者,并在 `Slasher` 合约上调用 `freezeOperator` 函数以冻结 operator 的质押。 + + + 挑战者和罚没合约尚未在生产环境中上线。此序列图可能会根据最终实现而更改。 + + +### 合约部署 + +#### Ethereum + +| 名称 | Proxy | Implementation | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| [ECDSAStakeRegistry](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [0x272CF0BB70D3B4f79414E0823B426d2EaFd48910](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910) | [0xa11b1a385287b5167ecca6a38f63abeab981d589](https://etherscan.io/address/0xa11b1a385287b5167ecca6a38f63abeab981d589) | +| [HyperlaneServiceManager](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc](https://etherscan.io/address/0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc) | [0x3127e69517ec2268dd5745c97194d387a4fc0c45](https://etherscan.io/address/0x3127e69517ec2268dd5745c97194d387a4fc0c45) | + +#### Holesky + +| 名称 | Proxy | Implementation | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| [ECDSAStakeRegistry](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72](https://holesky.etherscan.io/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | [0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e](https://holesky.etherscan.io/address/0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e) | +| [HyperlaneServiceManager](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [0xc76E477437065093D353b7d56c81ff54D167B0Ab](https://holesky.etherscan.io/address/0xc76E477437065093D353b7d56c81ff54D167B0Ab) | [0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca](https://holesky.etherscan.io/address/0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca) | diff --git a/zh/docs/protocol/ISM/economic-security/overview.mdx b/zh/docs/protocol/ISM/economic-security/overview.mdx new file mode 100644 index 0000000..83599eb --- /dev/null +++ b/zh/docs/protocol/ISM/economic-security/overview.mdx @@ -0,0 +1,28 @@ +--- +title: "概述" +description: "Hyperlane 如何确保经济安全" +--- + + + Hyperlane 致力于让欺诈付出代价。质押和罚没即将推出,尚未实施。本页面仅供参考。随着设计的成熟,细节可能会发生变化。 + + +质押和罚没允许将经济安全添加到依赖 Validator 签名的 ISM,包括[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 和 Optimistic ISM。 + +Hyperlane Validator 可以选择参与 Hyperlane 的质押协议。之后,如果这些 Validator 试图伪造或审查跨链消息,他们的质押以及委托给他们的任何质押都可能被罚没。 + +依赖这些 Validator 签名的[跨链安全模块](/zh/docs/protocol/ISM/modular-security)受益于质押和罚没提供的额外经济安全。 + +### 可验证的欺诈证明 + +与许多其他跨链通信协议不同,Hyperlane 的罚没协议使用**可验证的欺诈证明**。 + +这意味着 Hyperlane 协议能够验证 Validator 是否签署了欺诈性 checkpoint,而无需任何可信方的参与。 + +这是可能的,因为 Validator 提出的质押与他们正在证明的状态(即 Mailbox merkle root)位于**同一条链**上。罚没智能合约可以将 Validator 签名与最新 root 进行比较,并进行一些复杂的 merkle tree 操作来确认 Validator 签署的 checkpoint 是否是欺诈性的。 + +在许多其他跨链通信协议中,Validator 的质押通常位于与跨链消息源链**不同的链**上。 + +这意味着为了让欺诈性 Validator 的质押被罚没,同样的消息传递协议必须将消息中继到质押所在的链。您能看到其中的问题吗?发生欺诈的同一 Validator 集合是传递该欺诈证据的机制,会出什么问题呢? + +Hyperlane 不想允许这种可能性,因此在 Hyperlane 中,Validator 必须将其绑定的质押保留在他们正在验证的源链上。这意味着欺诈证明是无需信任地可验证的。用于罚没检查的欺诈记录与要被罚没的质押存在于同一环境中,欺诈证明过程不会出错。 diff --git a/zh/docs/protocol/ISM/ism-marketplace.mdx b/zh/docs/protocol/ISM/ism-marketplace.mdx new file mode 100644 index 0000000..fda5b4d --- /dev/null +++ b/zh/docs/protocol/ISM/ism-marketplace.mdx @@ -0,0 +1,55 @@ +--- +title: "ISM 市场" +--- + +ISM 市场是跨链安全模块 (ISM) 的注册表,让开发者可以自定义其消息的验证方式。应用团队可以根据其安全性、延迟和成本要求选择 ISM(即对高价值消息使用更严格的验证,对日常转移使用较轻的 ISM)。 + +市场包括来自 Abacus Works 的标准 ISM,以及由合作伙伴团队和社区成员开发的社区贡献 ISM。 + +### 标准 ISM + +标准 ISM 由 Abacus Works 开发和维护。 + +| ISM 名称 | 类型 | 阶段 | 描述 | +| --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Aggregation ISM (Static)](/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM) | Composition | In Production | 将多个 ISM 组合在一起,要求全部或 k-of-n 子集同意才能验证。 | +| [Aggregation ISM (Storage)](/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM#customize) | Composition | In Production | 将多个 ISM 组合在一起,要求全部或 k-of-n 子集同意才能验证。模块集和阈值存储在状态中,可以在部署后更新。 | +| [Routing ISM](/zh/docs/protocol/ISM/standard-ISMs/routing-ISM) | Composition | In Production | 根据源域将消息定向到不同的 ISM。 | +| Amount Routing ISM | Composition | In Development | 根据转移金额将消息路由到不同的 ISM。 | +| [Fallback Routing ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/routing/DefaultFallbackRoutingIsm.sol) | Composition | In Production | 如果路由映射中未配置源域,则提供备用 ISM 路径。 | +| ICA Routing ISM | Composition | In Production | 通过跨链账户 (ICA) 路由消息。 | +| [Pausable ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/PausableIsm.sol) | Composition | In Production | 允许在紧急情况下暂停消息流。 | +| Rate Limited ISM | Composition | In Development | 使用令牌桶速率限制器来限制在给定时间间隔内可以通过 HWR 发送的金额。仅适用于 HWR 应用程序/消息编码。 | +| [Merkle Root Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#merklerootmultisigismmetadata) | Security | In Production | 验证 Merkle root 上的 k-of-n 签名,并使用此 root 中消息 ID 的 Merkle 证明。 | +| [Merkle Root Multisig ISM (Storage)](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#customize) | Security | In Production | 验证 Merkle root 上的 k-of-n 签名,并使用此 root 中消息 ID 的 Merkle 证明。模块集和阈值存储在状态中,可以在部署后更新。 | +| [Message ID Multisig ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#messageidmultisigismmetadata) | Security | In Production | 验证消息 ID 上的 k-of-n 签名。签名来自 checkpoint 结构,并在相关 ISM 之间共享。 | +| [Message ID Multisig ISM (Storage)](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#customize) | Security | In Production | 验证消息 ID 上的 k-of-n 签名。签名来自 checkpoint 结构,并在相关 ISM 之间共享。模块集和阈值存储在状态中,可以在部署后更新。 | +| Weighted Merkle Root Multisig ISM | Security | In Development | 加权投票系统,扩展 Merkle Root 多签,其中每个签名者的影响力由其质押权重决定。 | +| Weighted Message ID Multisig ISM | Security | In Development | Message ID 多签之上的加权投票系统。 | +| [Offchain Lookup ISM](/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM) | Security | In Production | 作为构建利用外部数据源进行验证的验证逻辑的抽象。 | +| [Chainlink CCIP ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/CCIPIsm.sol) | Security | In Production | 利用 Chainlink CCIP 验证消息。 | +| [Arbitrum L2 to L1 ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/ArbL2ToL1Ism.sol) | Security | In Development | 使用 Arbitrum 的原生证明系统验证从 Arbitrum L2 到 Ethereum L1 的跨链消息。 | +| [OP Stack ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/OPStackIsm.sol) | Security | In Production | 使用 OP Stack 原生安全模型验证来自 OP Stack rollup 的跨链消息。 | +| [Noop ISM / Test ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/NoopIsm.sol) | Security | In Production | 用于测试目的的 ISM。 | +| [Trusted Relayer ISM](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/TrustedRelayerIsm.sol) | Security | In Production | 依赖可信 Relayer 在 Mailbox 上传递消息。 | + + + +- Static 变体在字节码中是不可变的。 +- Storage 变体将模块集和阈值保持在状态中可变。 + + + +### 社区 ISM + +社区 ISM 由 Abacus Works 以外的贡献者开发和维护。 + +| ISM 名称 | 类型 | 阶段 | +| ------------------------ | -------- | -------------- | +| Axelar ISM | Security | In Development | +| Celestia ZK ISM | Security | In Development | +| Noble ISM | Security | In Development | +| Polygon zkEVM V2 ISM | Security | In Development | +| Succinct Lightclient ISM | Security | In Development | +| Timelock ISM | Security | In Development | +| Wormhole ISM | Security | In Development | diff --git a/zh/docs/protocol/ISM/modular-security.mdx b/zh/docs/protocol/ISM/modular-security.mdx new file mode 100644 index 0000000..f83df98 --- /dev/null +++ b/zh/docs/protocol/ISM/modular-security.mdx @@ -0,0 +1,45 @@ +--- +title: "ISM 概述" +--- + +import IsmDiagram from "/snippets/messaging-isms.mdx"; + +Hyperlane 由跨链安全模块(ISM)保护。ISM 是智能合约,负责验证在目标链上传递的跨链消息是否存在于源链上。 + + + +## 核心概念 + +### 默认 ISM 与自定义 ISM + +开发者可以使用[邮箱](/zh/docs/protocol/core/mailbox)的默认 ISM,也可以指定自己的应用程序特定 ISM。 + +应用程序特定的 ISM 可以是: + +- **配置的**:使用具有自定义参数的预构建 ISM +- **组合的**:将多个 ISM 组合在一起,就像安全"积木" +- **定制的**:创建完全针对特定需求定制的新 ISM + + + "默认 ISM" 是指邮箱合约上的预配置安全模块(即多重签名 ISM),当应用程序不指定自己的自定义 ISM 时使用。 + + +#### 配置 + +Hyperlane 定义了一组[预构建的 ISM](#standard-isms)。开发者可以"开箱即用"地部署这些合约中的任何一个,并使用自己的参数配置它们。 + +例如,希望对跨链安全拥有更多主权的应用程序开发者可以部署一个[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM),使用来自自己社区的验证器进行配置。 + +#### 组合 + +ISM 充当"安全积木"。开发者可以将不同的 ISM 混合搭配在一起,编码最适合其需求的安全模型。 + +例如,希望额外安全性的应用程序开发者可以部署一个[聚合 ISM](/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM),该 ISM 需要由使用来自 Hyperlane 社区的验证器配置的[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) **和** 验证 [Wormhole](https://wormhole.com/) 验证器集合的法定人数验证了消息的 Wormhole ISM 进行验证。 + +#### 定制 + +ISM 是完全可定制的。开发者可以编写自己的 ISM,根据其应用程序的需求进行定制。 + +例如,应用程序开发者可以构建根据消息内容调整安全模型的 ISM。高价值和不频繁的消息(例如治理)可以通过优先考虑安全性而非延迟和 Gas 成本的安全模型进行验证。较低价值和更频繁的消息可以通过优先考虑延迟和 Gas 成本而非安全性的安全模型进行验证。 + +了解如何[创建您自己的 ISM](/zh/docs/protocol/ISM/custom-ISM) \ No newline at end of file diff --git a/zh/docs/protocol/ISM/sequence-diagram.mdx b/zh/docs/protocol/ISM/sequence-diagram.mdx new file mode 100644 index 0000000..edb8e1c --- /dev/null +++ b/zh/docs/protocol/ISM/sequence-diagram.mdx @@ -0,0 +1,65 @@ +--- +title: "序列图" +--- + +当在链之间发送消息时,它会经过验证过程以确保其真实性。本页面解释该过程的工作原理。 + +## 概述 + +验证过程涉及三个关键组件: + +1. **Mailbox 合约** - 消息处理的主要入口点 +2. **ISM(跨链安全模块)** - 安全验证合约 +3. **接收者合约** - 接收消息的应用程序 + +## 序列图 + + + +- 如果接收者未实现 `ISpecifiesInterchainSecurityModule` 或 `recipient.interchainSecurityModule()` 返回 `address(0)`,则将使用在 [Mailbox](/zh/docs/protocol/core/mailbox) 上配置的默认 ISM 来验证消息。 +- 为清晰起见,这在序列图中省略了。 + + + +```mermaid +sequenceDiagram + participant Relayer + participant Mailbox + participant ISM + participant Recipient + + Relayer-->>ISM: moduleType() + ISM-->>Relayer: ISM type + Relayer->>Mailbox: process(metadata, message) + Mailbox-->>Recipient: interchainSecurityModule() + Recipient-->>Mailbox: ISM address + Mailbox->>ISM: verify(metadata, message) + ISM-->>Mailbox: true + Mailbox->>Recipient: handle(origin, sender, body) +``` + +## 工作原理 + +1. **类型识别** + + - Relayer 在 ISM 上调用 `moduleType()` 以确定其类别 + - 根据此类型(例如 `MULTISIG`、`ROUTING`、`AGGREGATION`),Relayer 知道要收集什么验证证明 + - 对于多重签名 ISM,这意味着从 Validator 收集加密签名 + +2. **消息提交** + + - Relayer 调用 `Mailbox.process()`,提供: + - 原始消息 + - 收集的验证元数据 + +3. **验证过程** + + - Mailbox 通过 `interchainSecurityModule()` 查询接收者合约 + - 如果未指定 ISM,Mailbox 使用默认 ISM + - 然后 Mailbox 将消息和元数据转发到 ISM 的 `verify()` 函数 + - ISM 执行其安全逻辑(例如,签名验证、阈值检查) + +4. **消息传递** + + - 验证成功后(当 `verify()` 返回 `true` 时),Mailbox 调用 `recipient.handle()` + - 如果验证失败,交易回滚,消息被拒绝 diff --git a/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM.mdx b/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM.mdx new file mode 100644 index 0000000..64a05b1 --- /dev/null +++ b/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM.mdx @@ -0,0 +1,52 @@ +--- +title: "聚合 ISM" +--- + +开发者可以使用 `AggregationISM` 来组合多个 ISM 的安全性。简单来说,`AggregationISM` 要求 `n` 个 ISM 中的 `m` 个验证特定的跨链消息。 + +开发者可以为每个源链配置一组 `n` 个 ISM,以及验证消息所需的 ISM 数量。 + +`AggregationISMs` 可以聚合任何 ISM 的安全性。例如,用户可以使用自己的 Validator 集部署[多重签名 ISM](./multisig-ISM),并部署一个 `AggregationISM` 来聚合该 ISM 和 Hyperlane 默认 ISM。 + +## 接口 + +`AggregationISMs` 必须实现 `IAggregationIsm` 接口。 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; + +interface IAggregationIsm is IInterchainSecurityModule { + /** + * @notice Returns the set of ISMs responsible for verifying _message + * and the number of ISMs that must verify + * @dev Can change based on the content of _message + * @param _message Hyperlane formatted interchain message + * @return modules The array of ISM addresses + * @return threshold The number of modules needed to verify + */ + function modulesAndThreshold( + bytes calldata _message + ) external view returns (address[] memory modules, uint8 threshold); +} +``` + +## 配置 + +[Hyperlane monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) 包含应用程序开发者可以开箱即用部署的 `AggregationISM` 实现,指定其所需的配置。 + +开发者可以为每个源链配置一组 `n` 个 ISM,以及验证消息所需的 ISM 数量。 + +`AggregationISMs` 可以聚合任何 ISM 的安全性。例如,用户可以使用自己的 Validator 集部署[多重签名 ISM](./multisig-ISM),并部署一个 `AggregationISM` 来聚合该 ISM 和 Hyperlane 默认 ISM。 + +## 自定义 + +hyperlane-monorepo 包含应用程序开发者可以 fork 的抽象 `AggregationISM` 实现。 + +开发者只需实现 `modulesAndThreshold()` 函数。 + +通过创建自定义实现,应用程序开发者可以定制 `AggregationISM` 提供的安全性以满足其应用程序的需求。 + +例如,自定义实现可以要求低价值消息由[多重签名 ISM](./multisig-ISM) 验证,并要求高价值消息_还_由 Wormhole ISM 验证。 diff --git a/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM.mdx b/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM.mdx new file mode 100644 index 0000000..c7404ab --- /dev/null +++ b/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM.mdx @@ -0,0 +1,88 @@ +--- +title: "多重签名 ISM" +--- + +`MultisigISM` 是最常用的 ISM 类型之一。这些 ISM 验证 `n` 个 [Validator](/zh/docs/protocol/agents/validators) 中的 `m` 个已证明特定跨链消息的有效性。 + +## 多重签名模块类型 + +有两种类型的 `MultisigISM` 模块: + +```solidity +enum Types { + ... + MERKLE_ROOT_MULTISIG, + MESSAGE_ID_MULTISIG, + ... +} +``` + +### MerkleRootMultisigIsmMetadata + +**类型:`Types.MERKLE_ROOT_MULTISIG`** + +**元数据格式:** + +| **组件** | **长度(字节)** | **描述** | +| -------------------------------------------- | ------------------ | ------------------------------------------- | +| 第 1 个组件 | 32 | 源 merkle tree 地址 | +| 第 2 个组件 | 4 | merkle tree 中消息 ID 的索引 | +| 第 3 个组件 | 32 | 已签名的 checkpoint 消息 ID | +| 第 4 个组件 | 1024 | Merkle 证明 | +| 第 5 个组件 | 4 | 已签名的 checkpoint 索引(从证明和索引计算)| +| 第 6 个组件(len == threshold \* 65 字节) | threshold \* 65 | Validator 签名 | + +### MessageIdMultisigIsmMetadata + +**类型:`Types.MESSAGE_ID_MULTISIG`** + +**元数据格式:** + +| **组件** | **长度(字节)** | **描述** | +| -------------------------------------------- | ------------------ | --------------------------- | +| 第 1 个组件 | 32 | 源 merkle tree 地址 | +| 第 2 个组件 | 32 | 已签名的 checkpoint root | +| 第 3 个组件 | 4 | 已签名的 checkpoint 索引 | +| 第 4 个组件(len == threshold \* 65 字节) | threshold \* 65 | Validator 签名 | + +## 接口 + +`MultisigISMs` 必须实现 `IMultisigIsm` 接口。 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; + +interface IMultisigIsm is IInterchainSecurityModule { + /** + * @notice Returns the set of validators responsible for verifying _message + * and the number of signatures required + * @dev Can change based on the content of _message + * @param _message Hyperlane formatted interchain message + * @return validators The array of validator addresses + * @return threshold The number of validator signatures needed + */ + function validatorsAndThreshold( + bytes calldata _message + ) external view returns (address[] memory validators, uint8 threshold); +} +``` + +## 配置 + +hyperlane-monorepo 包含 [`MultisigISM` 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/isms/multisig)(包括[旧版本](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/LegacyMultisigIsm.sol)和可通过工厂部署的更节省 gas 的[版本](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/StaticMultisigIsm.sol)),应用程序开发者可以开箱即用地部署,指定其所需的配置。 + +要配置 `MultisigISM` 实例: + +1. 开发者在每个源链上定义 `n` 个 Validator 的集合。 +2. 设置阈值,指定确认消息所需的 Validator 签名数量(`m`)。 + +Validator 签名**不是** ISM 特定的。换句话说,开发者可以配置其 `MultisigISM` 以使用在 Hyperlane 上运行的**任何** Validator。 + +## 自定义 + +对于更具体的用例,开发者可以 fork Hyperlane monorepo 中提供的抽象 `MultisigISM` 实现。主要自定义涉及实现 `validatorsAndThreshold()` 函数。 + +自定义实现允许开发者调整安全模型以满足其应用程序的需求。例如,自定义实现可以根据正在验证的消息内容来改变所需的签名数量。 diff --git a/zh/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx b/zh/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx new file mode 100644 index 0000000..81df8f4 --- /dev/null +++ b/zh/docs/protocol/ISM/standard-ISMs/multisig-ism-latencies.mdx @@ -0,0 +1,204 @@ +--- +title: "多重签名 ISM 延迟" +--- + +Validator 必须等待一定数量的区块被挖出才能被视为有效且[防重组安全](https://www.alchemy.com/overviews/what-is-a-reorg)。否则,Validator 可能会被罚没,因为他们可能签署了不再有效的 checkpoint。 + +请参阅以下部分以了解 Hyperlane Validator 使用的区块最终确定配置。 + + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| --------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract | 2741 | 0 | 1 | +| Aleph Zero EVM | 1000041455 | 5 | 3 | +| Ancient8 | 888888888 | 5 | 2 | +| ApeChain | 33139 | 5 | 0.2 | +| AppChain | 466 | 0 | 2 | +| Arbitrum | 42161 | 5 | 0.25 | +| Arbitrum Nova | 42170 | 5 | 2 | +| Arcadia | 4278608 | 5 | 2 | +| Artela | 11820 | 5 | 2 | +| Astar | 592 | finalized | 13 | +| Astar zkEVM | 3776 | 5 | 3 | +| Aurora | 1313161554 | 5 | 1 | +| Avalanche | 43114 | 3 | 2 | +| B3 | 8333 | 5 | 1 | +| Base | 8453 | 10 | 2 | +| Berachain | 80094 | 5 | 2 | +| Bitlayer | 200901 | 20 | 3 | +| Blast | 81457 | 5 | 2 | +| BOB | 60808 | 5 | 2 | +| Boba Mainnet | 288 | 5 | 2 | +| Botanix | 3637 | 5 | 6 | +| Binance Smart Chain | 56 | finalized | 3 | +| B² Network | 223 | 5 | 3 | +| Celestia | 1128614981 | 1 | 6 | +| Celo | 42220 | 5 | 1 | +| CheeseChain | 383353 | 1 | 30 | +| Chiliz | 1000088888 | 9 | 3 | +| Core | 1116 | 21 | 3 | +| Corn | 21000000 | 5 | 20 | +| Coti | 2632500 | 5 | 5 | +| Cyber | 7560 | 5 | 2 | +| Degen | 666666666 | 5 | 10 | +| Dogechain | 2000 | 5 | 2 | +| Eclipse | 1408864445 | 0 | 0.4 | +| Endurance | 648 | 15 | 12 | +| Ethereum | 1 | 15 | 13 | +| Everclear | 25327 | 2 | 2 | +| Fantom Opera | 250 | 5 | 2 | +| Flare | 14 | 3 | 2 | +| EVM on Flow | 1000000747 | 25 | 1 | +| Fluence | 9999999 | 5 | 1 | +| Form | 478 | 5 | 2 | +| Fraxtal | 252 | 5 | 2 | +| Fuse | 122 | 19 | 5 | +| Galactica | 613419 | 0 | 1 | +| Game7 | 2187 | 0 | 5 | +| Glue | 1300 | 5 | 6 | +| Gnosis | 100 | 5 | 5 | +| Gravity Alpha Mainnet | 1625 | 5 | 1 | +| Harmony One | 1666600000 | 5 | 2 | +| Hashkey | 177 | 5 | 2 | +| Hemi Network | 43111 | 5 | 12 | +| HyperEVM | 999 | 5 | 2 | +| Immutable zkEVM | 1000013371 | 20 | 2 | +| Injective EVM | 2525 | 3 | 3 | +| Infinity VM | 1032009 | 1 | 1 | +| Infinity VM | 1001032009 | 1 | 1 | +| Injective | 6909546 | 10 | 1 | +| Ink | 57073 | 5 | 1 | +| Kaia | 8217 | 5 | 1 | +| Katana | 747474 | 5 | 1 | +| Linea | 59144 | 5 | 3 | +| Lisk | 1135 | 5 | 2 | +| LUKSO | 42 | 15 | 12 | +| Lumia Prism | 1000073017 | 5 | 4 | +| Manta Pacific | 169 | 5 | 3 | +| Mantle | 5000 | 2 | 2 | +| Matchain | 698 | 5 | 1 | +| Merlin | 4200 | 5 | 3 | +| Metal L2 | 1000001750 | 5 | 2 | +| Metis Andromeda | 1088 | 5 | 5 | +| MilkyWay | 1835625579 | 1 | 6 | +| Mint | 185 | 5 | 2 | +| Miraclechain | 92278 | 0 | 3 | +| Mode | 34443 | 5 | 2 | +| Molten | 360 | 0 | 30 | +| Moonbeam | 1284 | finalized | 12 | +| Morph | 2818 | 5 | 4 | +| Neutron | 1853125230 | 1 | 3 | +| Nibiru | 6900 | 5 | 2 | +| Ontology | 58 | 5 | 1 | +| Oort | 970 | 0 | 2 | +| opBNB | 204 | 5 | 1 | +| Optimism | 10 | 10 | 2 | +| Orderly L2 | 291 | 5 | 2 | +| Paradex | 514051890 | 1 | 30 | +| Peaq | 3338 | finalized | 6 | +| Plume | 98866 | 0 | 2 | +| Polygon | 137 | finalized | 2 | +| Polygon zkEVM | 1101 | 5 | 10 | +| Polynomial | 1000008008 | 5 | 2 | +| Prom | 227 | 5 | 6 | +| Proof of Play Apex | 70700 | 5 | 1 | +| RARI Chain | 1000012617 | 0 | 30 | +| Reactive Mainnet | 1597 | 5 | 7 | +| Redstone | 690 | 5 | 2 | +| Ronin | 2020 | 5 | 3 | +| Scroll | 534352 | 17 | 3 | +| Sei | 1329 | 1 | 1 | +| Shibarium | 109 | finalized | 5 | +| SnaxChain | 2192 | 5 | 2 | +| Solana | 1399811149 | 0 | 0.4 | +| Solaxy | 1936682104 | 0 | 1.2 | +| Soneium | 1868 | 5 | 2 | +| Sonic | 146 | 5 | 2 | +| Sonic SVM | 507150715 | 0 | 0.4 | +| SOON | 50075007 | 0 | 0.05 | +| Sophon | 50104 | 0 | 1 | +| Starknet | 358974494 | 1 | 30 | +| Story Mainnet | 1514 | 5 | 3 | +| Subtensor | 964 | 5 | 12 | +| Superposition | 1000055244 | 0 | 60 | +| Superseed | 5330 | 5 | 2 | +| svmBNB | 574456 | 0 | 0.4 | +| Swell | 1923 | 5 | 2 | +| TAC | 239 | 5 | 1 | +| Taiko | 167000 | 5 | 12 | +| Tangle | 5845 | finalized | 6 | +| Torus | 21000 | finalized | 8 | +| Unichain | 130 | 5 | 1 | +| Vana | 1480 | 5 | 6 | +| Viction | 88 | 3 | 2 | +| World Chain | 480 | 5 | 2 | +| Xai | 660279 | 5 | 1 | +| XLayer | 196 | 5 | 10 | +| XRPL EVM | 1440000 | 5 | 6 | +| Zero Network | 543210 | 0 | 1 | +| ZetaChain | 7000 | 0 | 6 | +| Zircuit | 48900 | 5 | 2 | +| zkSync | 324 | 0 | 1 | +| Zora | 7777777 | 5 | 2 | + + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| ------------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract Testnet | 11124 | 0 | 1 | +| Aleph Zero EVM Testnet | 2039 | 5 | 3 | +| Alfajores | 44787 | 0 | 5 | +| Arbitrum Sepolia | 421614 | 0 | 3 | +| Arcadia Testnet v2 | 1098411886 | 1 | 1 | +| Aurora Testnet | 1313161555 | 1 | 1 | +| Basecamp Testnet | 1000001114 | 1 | 1 | +| Base Sepolia | 84532 | 1 | 2 | +| Berachain Bepolia | 80069 | 5 | 2 | +| BSC Testnet | 97 | 9 | 3 | +| CarrChain Testnet | 76672 | 0 | 1 | +| Celestia Testnet | 1297040200 | 1 | 6 | +| Chronicle Yellowstone | 175188 | 0 | 1 | +| Citrea Testnet | 5115 | 1 | 2 | +| Coti Testnet | 7082400 | 1 | 5 | +| Eco Testnet | 471923 | 0 | 1 | +| Flame Dawn-1 Testnet | 1660473773 | 1 | 2 | +| Form Testnet | 132902 | 1 | 2 | +| Fuji | 43113 | 3 | 2 | +| Holesky | 17000 | 2 | 13 | +| Hyperliquid EVM Testnet | 998 | 1 | 2 | +| Infinity VM Monza Testnet | 96025 | 1 | 1 | +| Ink Sepolia | 763373 | 1 | 1 | +| MegaETH Testnet | 6342 | 1 | 1 | +| Milkyway Testnet | 1162171030 | 1 | 6 | +| Mode Testnet | 919 | 1 | 2 | +| Monad Testnet | 10143 | 1 | 1 | +| Neura Testnet | 267 | 0 | 2 | +| Odyssey Testnet | 911867 | 1 | 1 | +| Optimism Sepolia | 11155420 | 0 | 2 | +| Paradex Sepolia | 12263410 | 1 | 30 | +| Plume Testnet | 98867 | 0 | 2 | +| Polygon Amoy | 80002 | 10 | 2 | +| Scroll Sepolia | 534351 | 1 | 3 | +| Sepolia | 11155111 | 2 | 13 | +| Solana Testnet | 1399811150 | 0 | 0.4 | +| Somnia Testnet | 50312 | 1 | 1 | +| Soneium Minato Testnet | 1946 | 1 | 2 | +| Sonic Blaze Testnet | 57054 | 1 | 1 | +| Sonic SVM Testnet | 15153042 | 0 | 0.4 | +| Sonic Testnet | 64165 | 1 | 1 | +| Starknet Sepolia | 23448591 | 1 | 30 | +| SUAVE Toliman Testnet | 33626250 | 1 | 4 | +| Subtensor Testnet | 945 | 1 | 12 | +| Superposition Testnet | 98985 | 1 | 1 | +| Tangle Testnet | 3799 | 0 | 6 | +| Unichain Testnet | 1301 | 1 | 1 | +| Load Network Alphanet | 9496 | 1 | 2 | + + + + diff --git a/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM.mdx b/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM.mdx new file mode 100644 index 0000000..078b02d --- /dev/null +++ b/zh/docs/protocol/ISM/standard-ISMs/offchain-lookup-ISM.mdx @@ -0,0 +1,149 @@ +--- +title: "链下查找 ISM" +--- + +使用链下查找 ISM 为开发者提供了很大的灵活性来验证跨链消息。最终,每种其他类型的 ISM 都可以实现为链下查找 ISM,因此在构建新类型的 ISM 时,建议构建链下查找 ISM,因为所有 Relayer 集成工作已经完成。 + +链下查找 ISM 需要注意的一个警告是,它们确实引入了对外部(相对于区块链)但可自托管的 API 的依赖。如果这对您的用例来说是一个硬性障碍,您可能需要考虑其他消息验证技术。 + +在构建链下查找 ISM 之前,值得熟悉 [CCIP Read—安全的链下数据检索](https://eips.ethereum.org/EIPS/eip-3668)。该规范描述了一个通用协议,允许 EVM 兼容链上的智能合约查询和使用链下数据。 + +## 工作原理 + +Relayer 将持续监听从 Hyperlane [Mailbox](/zh/docs/protocol/core/mailbox) 发出的 `Dispatch` 事件。当消息被发送并被 Relayer 接收时,Relayer 将查询目标 ISM 以获取有关如何处理消息以及传递是否会成功的信息。 + + + 需要在您的 ISM 上设置正确的 `moduleType` 变量,以便 Relayer 知道它是链下查找 ISM。为确保正确配置,您可以从 `@hyperlane-xyz/core` 中的 `AbstractCcipReadIsm` 继承。 + + +然后 Relayer 将使用正在传递的消息内容在 ISM 上调用 `getOffchainVerifyInfo(bytes)` 函数。此函数应使用下面[接口](#interface)部分中描述的 `OffchainLookup` 错误回滚。 + +Relayer 将查询此回滚消息中指定的端点,并将提供的响应和原始消息传递给目标 `Mailbox` 的 `process(bytes,bytes)` 函数。 + +## 接口 + +链下查找 ISM 必须实现 `ICcipReadIsm` 接口,并应扩展 `AbstractCcipReadIsm`,这是一个正确设置 `moduleType` 的便利合约。 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; + +interface ICcipReadIsm is IInterchainSecurityModule { + /// @dev https://eips.ethereum.org/EIPS/eip-3668 + /// @param sender the address of the contract making the call, usually address(this) + /// @param urls the URLs to query for offchain data + /// @param callData context needed for offchain service to service request + /// @param callbackFunction function selector to call with offchain information + /// @param extraData additional passthrough information to call callbackFunction with + error OffchainLookup( + address sender, + string[] urls, + bytes callData, + bytes4 callbackFunction, + bytes extraData + ); + + /** + * @notice Reverts with the data needed to query information offchain + * and be submitted via the origin mailbox + * @dev See https://eips.ethereum.org/EIPS/eip-3668 for more information + * @param _message data that will help construct the offchain query + */ + function getOffchainVerifyInfo(bytes calldata _message) external view; +} +``` + +## 配置 + +开发链下查找 ISM 时的一个很好的参考示例是 [ChainlinkISM](https://github.com/AlexBHarley/permissionless-chainlink-feeds)。`ChainlinkISM` 使用一组 Chainlink oracle 进行初始化,并验证提供的价格提要数据已由签名者的某个子集签署。 + +### API + +根据 CCIP Read,链下 API 需要返回以下形式的 JSON 数据: + +```json +{ + "data": "..." +} +``` + +Relayer 将把这个 `data` 属性作为 `metadata` 参数传递给 `Mailbox.process(bytes metadata, bytes message)`。 + +请注意,在 Chainlink ISM 的情况下,数据接收者也充当验证 ISM,`data` 只是提交价格提要数据及相关签名的原始交易。`message` 属性有点冗余。 + +### 合约 + +设置 ISM 时,`getOffchainVerifyInfo` 和 `verify` 函数是需要指定的重要函数。 + +- `getOffchainVerifyInfo` 函数应使用 `OffchainLookup` 错误回滚,该错误指示 Relayer 查询给定的 API 端点。`OffchainLookup` 错误允许提供 API 端点数组,因此您可以强制执行任何级别的冗余 + +- `verify` 必须接受提供的 `metadata` 并断言其合法性。同样,[ChainlinkISM 实现](https://github.com/AlexBHarley/permissionless-chainlink-feeds/blob/main/apps/contracts/contracts/ChainlinkAggregator.sol#L114)在为您自己的 ISM 开发此逻辑时可以作为有用的参考点。 + +下面是链下查找 ISM 可能的框架,其中 ISM 也是消息的接收者,就像 Chainlink ISM 一样。 + +```solidity +pragma solidity ^0.8.13; + +import {AbstractCcipReadIsm} from "@hyperlane-xyz/core/contracts/isms/ccip-read/AbstractCcipReadIsm.sol"; +import {IInterchainSecurityModule, ISpecifiesInterchainSecurityModule} from "@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol"; +import {IMailbox} from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol"; +import {Message} from "@hyperlane-xyz/core/contracts/libs/Message.sol"; + +contract MyCcipReadIsm is AbstractCcipReadIsm, ISpecifiesInterchainSecurityModule { + using Message for bytes; + IMailbox mailbox; + + ... + + /** + * No-op, everything happens in the verify function + */ + function handle(uint32, bytes32, bytes calldata _report) public {} + + + /** + * @param _metadata ABI encoded module metadata + * @param _message Formatted Hyperlane message (see Message.sol). + */ + function verify( + bytes calldata _metadata, + bytes calldata _message + ) external returns (bool) { + ... + } + + function interchainSecurityModule() + external + view + returns (IInterchainSecurityModule) + { + return IInterchainSecurityModule(address(this)); + } + + function getOffchainVerifyInfo( + bytes calldata _message + ) external view override { + revert OffchainLookup( + address(this), + offchainUrls, + _message, + MyCcipReadIsm.process.selector, + _message + ); + } + + /** + * Provided for full CCIP Read specification compatibility. Relayers + * will call the Mailbox directly regardless of the selector specified + * in the `OffchainLookup` error + */ + function process( + bytes calldata _metadata, + bytes calldata _message + ) external { + mailbox.process(_metadata, _message); + } +} +``` diff --git a/zh/docs/protocol/ISM/standard-ISMs/routing-ISM.mdx b/zh/docs/protocol/ISM/standard-ISMs/routing-ISM.mdx new file mode 100644 index 0000000..38b420b --- /dev/null +++ b/zh/docs/protocol/ISM/standard-ISMs/routing-ISM.mdx @@ -0,0 +1,46 @@ +--- +title: "路由 ISM" +--- + +开发者可以使用 `RoutingISM` 将消息验证委托给不同的 ISM。这允许开发者根据消息内容或应用程序上下文更改安全模型。 + +此 ISM 根据消息的源链简单地切换安全模型。一个简单的用例是为每条链使用不同的[多重签名 ISM](./multisig-ISM) Validator 集。 + +最终,您可以想象一个 `DomainRoutingIsm` 根据源链上使用的共识协议类型路由到不同的基于轻客户端的 ISM。 + +## 接口 + +`RoutingISMs` 必须实现 `IRoutingIsm` 接口。 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol"; + +interface IRoutingIsm is IInterchainSecurityModule { + /** + * @notice Returns the ISM responsible for verifying _message + * @dev Can change based on the content of _message + * @param _message Hyperlane formatted interchain message + * @return module The ISM to use to verify _message + */ + function route( + bytes calldata _message + ) external view returns (IInterchainSecurityModule module); +} +``` + +## 配置 + +hyperlane-monorepo 包含 `RoutingISM` 实现,`DomainRoutingIsm` 和 `DefaultFallbackRoutingIsm`,应用程序开发者可以开箱即用地部署,指定其所需的配置。 + +## 自定义 + +hyperlane-monorepo 包含应用程序开发者可以 fork 的抽象 `RoutingISM` 实现。 + +开发者只需实现 `route()` 函数。 + +通过创建自定义实现,应用程序开发者可以定制 `RoutingISM` 提供的安全性以满足其应用程序的需求。 + +例如,自定义实现可以根据消息的内容或接收消息的应用程序的状态来更改安全模型。 diff --git a/zh/docs/protocol/agents/overview.mdx b/zh/docs/protocol/agents/overview.mdx new file mode 100644 index 0000000..117a76b --- /dev/null +++ b/zh/docs/protocol/agents/overview.mdx @@ -0,0 +1,10 @@ +--- +title: "概述" +--- + +Hyperlane 协议将跨链消息传递的传输层与安全层解耦。要运行部署,它依赖链下代理来观察链上活动并执行协议的传输或安全方面。 + +这些代理用 Rust 实现,并作为 Docker 镜像和二进制文件分发。 + +1. [中继器](/zh/docs/protocol/agents/relayer)满足协议的消息传输要求。它们为 [`IInterchainSecurityModule` 接口](/zh/docs/protocol/ISM/modular-security#core-concepts)聚合链下安全元数据,并将消息传递给其接收者。 +2. [验证器](/zh/docs/protocol/agents/validators)满足协议的安全要求,作为[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 或 [Hyperlane AVS](/zh/docs/protocol/ISM/economic-security/hyperlane-avs) 的一部分,通过证明[邮箱](/zh/docs/protocol/core/mailbox)消息的有效性并使其签名可供中继器使用。 \ No newline at end of file diff --git a/zh/docs/protocol/agents/relayer.mdx b/zh/docs/protocol/agents/relayer.mdx new file mode 100644 index 0000000..757f200 --- /dev/null +++ b/zh/docs/protocol/agents/relayer.mdx @@ -0,0 +1,106 @@ +--- +title: "Relayer" +--- + +Relayer 通过将消息从源链传递到目标链来运行 Hyperlane 协议的传输层。根据接收者指定的[跨链安全模块 (ISM)](/zh/docs/protocol/ISM/modular-security),可能需要元数据来证明消息的安全性,例如[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 的 Validator 签名、merkle 证明、零知识证明等。因此在尝试传递之前,Relayer 会收集任何 ISM 特定的元数据。 + + + Relayer 将定期重试元数据收集和消息提交。这对于提高对中断的弹性很重要,例如:未支付用于传递的 gas 费用、Relayer 余额不足、目标链上交易费用临时飙升、Validator 宕机。 + + +### Relayer 激励机制 + +消息发送者在源链上为传递付费,Relayer 运营商有责任将收入重新平衡到目标链账户,以便始终可以支付传递交易费用。Relayer 不会从协议中获得直接的代币激励,但运营商可以配置其费用结构以提供关键服务。有关更多信息,请查看[跨链 Gas 支付 (IGP)](/zh/docs/protocol/core/interchain-gas-payment)。 + +### 运营 Relayer + +Relayer 可以轻松配置它们希望处理的消息。目前,Relayer 将支持: + +1. 发送者/接收者白名单。 +2. 发送者/接收者黑名单。 +3. 接受[源链上的支付](../../reference/messaging/send#quote-dispatch)以处理目标链上的消息的能力。 + +虽然运行是无需许可的,但由消息发送者决定为传递支付哪个 Relayer。[Mailbox](/zh/docs/protocol/core/mailbox) 集成通常默认总是支付给同一个 Relayer,但消息发送者可以选择退出。为方便起见,Hyperlane 将运行一个开源且可配置的 Relayer agent,作为 Rust 二进制文件实现。如果您想运行自己的 Relayer,我们已经开源了[二进制文件](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/agents/relayer)。 + +运行自己的 Relayer 涉及部署 [IGP 合约](/zh/docs/protocol/core/interchain-gas-payment)并维护其中的代币汇率和 gas 价格,以准确收取消息传递费用。 + + + 想要运行 Relayer?请遵循 [Relayer](/zh/docs/operate/relayer/run-relayer) 指南。 + + +## 更多细节 + +Relayer 由两个主要任务组成:每个源链的 Indexer 和每个目标链的 Submitter。 + +![High-level Relayer Architecture](/images/docs/operate/relayer-architecture-high-level.png) + +### Indexer + +通过使用 RPC 查询 [Mailbox](/zh/docs/protocol/core/mailbox) 合约事件来索引新消息和历史消息。[Gas 支付](/zh/docs/protocol/core/interchain-gas-payment)也会被索引以确认发送者已支付传递费用,某些 ISM 使用额外的源链数据。多重签名 ISM 就是这种情况,它依赖 Merkle Tree Hook 合约来告知 Relayer 哪个 Validator 签名对应哪条消息。为每种事件类型(Messages、IGP、Merkle Tree insertion)都会生成一个独立的索引任务。 + +Indexer 写入本地数据库 (RocksDB) 作为缓存手段,以及与 Submitter 任务通信 - 后者定期轮询数据库以检查是否调度了新消息。 + +Relayer 优先处理新消息而不是旧消息,假设旧消息更有可能已被传递。这意味着在(重新)启动时,会创建两个指针:一个向前的和一个向后的,两者都初始化为区块链尖端,并使用消息的单调递增 `nonce` 字段进行迭代。类似的方法用于索引其他事件,但有些缺少序列号,如果收到不正确的 RPC 响应可能会被遗漏 - 这种情况经常发生。因此,消息索引任务将找到事件的交易 ID 发送给其他索引任务,保证只要事件发生在与 `Mailbox.dispatch()` 调用相同的交易中,就不会遗漏任何 Hyperlane 事件。 + +### Submitter + +消息作为 Submitter 的一部分经历四个阶段,这些阶段作为独立任务生成,如下所述。 + + + + + + + + + + + + + + + + + + + + + + + + + + +
Submitter 任务描述
Message Processor + 轮询本地数据库以检查是否有任何未传递的消息,并将它们推送到 Prepare 步骤的队列。 +
Prepare Task + 从其队列中弹出消息,确保已支付 gas,获取任何元数据并模拟消息传递交易。如果模拟成功,消息将被推送到 Submit 步骤的队列。否则,消息将被推回 Prepare 队列。 +
Submit Task + 从其队列中弹出消息,并在链上发送传递交易。只要可能就会批量传递。如果广播交易没有错误,消息将被推送到 Confirm 步骤的队列。否则,消息将被推回 Prepare 队列。 +
Confirm Task + 等待最终确定;如果发生链重组或传递交易回滚,消息将被推回 Prepare 队列。 +
+ +通过在目标链上使用上述元数据调用 `Mailbox.process()` 将消息传递给其接收者。 + +消息的重试计数根据指数退避策略确定其下一次传递尝试。目前,没有固定的最大重试次数,超过该次数后 Relayer 将停止尝试处理消息。但是,这并不保证无限重试,运营商不应将此作为服务级别协议 (SLA) 依赖。 + +#### 重试策略 + +如果传递尝试不成功,Relayer 使用自适应退避策略重试传递。此策略经过优化,可支持具有较长最终确定时间或处理时间的 ISM,并确保重试持续足够长的时间以从临时问题中恢复。 + +| 重试次数范围 | 重试之间的延迟 | +| ------------- | ------------------------------------------------ | +| 1 | 5 秒 | +| 2 | 10 秒 | +| 3 | 30 秒 | +| 4 | 1 分钟 | +| 5–24 | 3 分钟 | +| 25–39 | 从 5 分钟开始,线性增加(每次重试增加 1.5 分钟)| +| 40–44 | 30 分钟 | +| 45–49 | 1 小时 | +| 50+ | 逐渐增加到几个小时,最终达到几天 | + +您可以在[此处](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/1d8ada64736b09d9878d2a11568c04d522f515b8/rust/main/agents/relayer/src/msg/pending_message.rs#L733)查看实现。 + +_注意:这些值是近似值,可能会更改。_ diff --git a/zh/docs/protocol/agents/validators.mdx b/zh/docs/protocol/agents/validators.mdx new file mode 100644 index 0000000..f5410df --- /dev/null +++ b/zh/docs/protocol/agents/validators.mdx @@ -0,0 +1,68 @@ +--- +title: "Validators" +--- + +Validator 作为[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 或[经济安全模块](/zh/docs/protocol/ISM/economic-security/overview)的一部分运行,履行 Hyperlane 协议的安全层。如果使用不同的 ISM,则不需要 Validator。当 [Mailbox](/zh/docs/protocol/core/mailbox) 中发生新的调度时,它们负责通过签署 merkle root(也称为 checkpoint)来证明消息。签名必须可供任何人(通常是 Relayer)获取并与消息一起提交到目标链。 + +与许多其他协议不同,Hyperlane **没有**固定的 Validator 集。任何人都可以自由运行自己的 Validator,只要接收者合约指定包含其 Validator 的[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM)。 + +Validator checkpoint 是公开的。这确保了传输层是无需许可的,因为任何人都可以获取签名并调用 `Mailbox.process()` 来传递消息。Relayer 仅为消息发送者提供便利服务。 + +重要的是 Validator 只签署已最终确定的 checkpoint,以避免损害协议的安全性。签署被重组的消息会导致在经济安全模块中被罚没。Validator agent 连接到单个链以检查新消息。如果验证多条链,则必须运行此 agent 的多个实例。 + +Hyperlane 正在开发用 Rust 实现的 Validator 二进制文件,任何人都可以轻松运行。在操作上,Validator 需要运行此二进制文件,并有权访问其正在验证的链的 RPC 提供商或节点。我们希望大多数 Hyperlane Validator 将来自每条链现有的节点运营商社区。 + + + 想要运行 Validator?请遵循 [validators 指南](../../operate/validators/run-validators)。 + + +## 更多细节 + +Validator agent 使用两种密钥类型:一种用于在其正在验证的区块链上签署交易,另一种用于在以太坊兼容的 ECDSA 曲线上签署 checkpoint。由于 checkpoint 是公开的,当 Validator 首次开始运行时,它必须通过链上 `announce` 交易宣布其 checkpoint 位置。这是 Validator agent 提交的唯一交易;特定于区块链的密钥否则根本不使用。也可以选择手动宣布新的 Validator 以避免配置特定于区块链的密钥。Validator 可以由任何人宣布。 + +对于使用[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#interface) 的消息,Validator 通过调用 `MerkleTreeHook.latestCheckpoint()` 读取当前的 merkle root。 + +Validator 使用 `MerkleTreeHook.latestCheckpoint()` 函数来确定何时需要索引新交易。这种轮询机制确保 Validator 可以开始签署新消息,而无需回填整个树。 + +### 多重签名 ISM 先决条件 + +要验证来自源链的消息,Validator 的 checkpoint 签名密钥必须在目标链接收者指定的[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM#interface) 中注册。这只能在部署 ISM 合约时完成,但通过在 [StaticThresholdAddressSetFactory](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/libs/StaticAddressSetFactory.sol#L10) 的任何实现上发送 `deploy(validatorAddresses, threshold)` 交易,这很容易完成。 + +### AVS Operator 先决条件 + +要为 EigenLayer AVS 运行 Validator 并提供[经济安全](/zh/docs/protocol/ISM/economic-security/overview),Validator 必须注册为 AVS operator。有关更多详细信息,请参阅 [AVS Operator 指南](/zh/docs/operate/guides/avs-operator-guide)。 + +## 架构 + +Validator 由两个主要任务组成:源链的 Indexer 和发布已签名 merkle root 的 Checkpoint Submitter。 + +### Indexer + +Validator 索引的唯一事件类型是来自 Merkle Tree Hook [合约](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/hooks/MerkleTreeHook.sol#L32)的 `InsertedIntoTree`,[Mailbox](/zh/docs/protocol/core/mailbox) 在调度新消息时会调用该合约。这通过 RPC 进行,agent 根据 merkle 插入事件构建内存中的 merkle tree,这些事件也会缓存到本地 RocksDB 数据库以实现快速启动。每当调度新消息时,Checkpoint Submitter 从内存中的树生成 checkpoint 并将其添加到队列中进行处理。 + +### Checkpoint Submitter + +Checkpoint submitter 使用 ECDSA 密钥签署 checkpoint 并将其发布到高可用性存储。checkpoint 的模式是 + +```rust +pub struct Checkpoint { + /// The merkle tree hook address + pub merkle_tree_hook_address: H256, + /// The mailbox / merkle tree hook domain + pub mailbox_domain: u32, + /// The checkpointed root + pub root: H256, + /// The index of the checkpoint + pub index: u32, +} +``` + +agent 实现当前支持的 checkpoint 存储是 AWS S3 和 Google Cloud Storage。Azure Blob Storage 贡献仍在[进行中](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/2242)。 + +### 活跃度影响 + +根据多重签名 ISM 中配置的阈值,Validator 宕机可能会停止协议的活跃度。submitter 优先处理新 checkpoint 而不是旧 checkpoint,以便 Relayer 可以首先获取较新消息的元数据,这些消息更有可能尚未传递。 + +### 默认 ISM Validator + +Validator 的数量取决于跨链安全模块 (ISM) 配置。默认 ISM 使用特定的 Validator 集,您可以在[此处](/zh/docs/reference/addresses/validators/mainnet-default-ism-validators)查看 Validator 详细信息,如阈值、运营商和地址。 diff --git a/zh/docs/protocol/core/fees.mdx b/zh/docs/protocol/core/fees.mdx new file mode 100644 index 0000000..c8cc502 --- /dev/null +++ b/zh/docs/protocol/core/fees.mdx @@ -0,0 +1,44 @@ +--- +title: "转移费用" +description: "了解 Hyperlane 跨链转移的源费用和跨链费用" +--- + +## 费用估算 + +当使用 Hyperlane GMP 发送跨链转移时,需要两种费用: + +1. **源费用** – 在源链上提交交易的 Gas +2. [**跨链费用**](/zh/docs/protocol/core/interchain-gas-payment) – 在目标链上传递和执行消息的 Gas,包括中继器费用 + +两种费用都在源链上预先支付给指定的 IGP。 + +这种费用结构确保: + +1. 用户有足够的资金支付源交易 +2. 跨链消息将有足够的 Gas 在目标链上执行并支付消息传递费用 +3. 转移的总成本在执行前对用户透明 + +#### 费用代币考虑 + +发送跨链转移时,费用代币因源链类型和 IGP 而异: + +1. **EVM 链** + + - 对源费用和跨链费用都使用原生 Gas 代币(例如 ETH) + +2. **Sealevel (Solana) 链** + + - 对源费用和跨链费用都使用原生 Gas 代币(例如 SOL) + +3. **Cosmos 链** + + - 支持自定义代币;费用使用 IGP 上的 `denom` 参数指定 + - 费用使用 `denom` 参数指定 + + +阅读更多关于转移费用和计算的信息: + +- [跨链 Gas 支付](/zh/docs/protocol/core/interchain-gas-payment) - 处理链间 Gas 支付和中继器费用 +- [调度后钩子](/zh/docs/protocol/core/post-dispatch-hooks-overview) - 消息调度后执行操作的框架 + + \ No newline at end of file diff --git a/zh/docs/protocol/core/interchain-gas-payment.mdx b/zh/docs/protocol/core/interchain-gas-payment.mdx new file mode 100644 index 0000000..3b6d6b8 --- /dev/null +++ b/zh/docs/protocol/core/interchain-gas-payment.mdx @@ -0,0 +1,106 @@ +--- +title: "跨链 Gas 支付" +description: "如何使用 Hyperlane 的 InterchainGasPaymaster 向 Relayer 支付跨链消息传递费用" +--- + +成功的跨链消息需要两笔交易;一笔在源链上发送消息,另一笔在目标链上传递消息。 + +为方便起见,Hyperlane 在源链上提供了一个链上接口,允许消息发送者向 [Relayer](/zh/docs/protocol/agents/relayer) 支付[费用](#interchain-gas-payment-calculation)以在目标链上传递消息。这笔支付称为**跨链 gas 支付**。 + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + IGP[InterchainGasPaymaster] + Sender -- "dispatch(...)
{value}" --> M_O + M_O -- "postDispatch(..., gasLimit)
{value}" --> IGP + end + + Relayer((Relayer)) + + M_O -. "indexing" .-> Relayer + IGP -. "value" .- Relayer + + subgraph Destination Chain + M_D[(Mailbox)] + M_D -- "handle(...)" --> Recipient + end + + Relayer -- "process{gasLimit}(...)" --> M_D +``` + +## 跨链 Gas 支付流程 + +要[传递消息](/zh/docs/reference/messaging/send),必须在目标链上包含一笔交易,该交易使用编码的消息和 ISM 元数据调用 Mailbox `process` 函数。 + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + IGP[InterchainGasPaymaster] + Sender -- "dispatch(...)
{value}" --> M_O + M_O -- "postDispatch(..., gasLimit)
{value}" --> IGP + end + + Relayer((Relayer)) + + M_O -. "indexing" .-> Relayer + IGP -. "value" .- Relayer +``` + +为方便起见,[Relayer](/zh/docs/operate/relayer/run-relayer) 会监视已调度的消息,如果在源链上收到足够的支付,将代表消息发送者提交 process 交易。这就是_跨链 gas 支付_。 + +```mermaid +flowchart LR + Relayer((Relayer)) + + subgraph Destination Chain + M_D[(Mailbox)] + M_D -- "handle(...)" --> Recipient + end + + Relayer -- "process{gasLimit}(...)" --> M_D +``` + +由于消息可以触发任意代码执行,Relayer 必须使用 `gasLimit` 来计量 [`handle` 调用](/zh/docs/reference/messaging/receive#handle),以便在消息调度时适当收费。 + +## InterchainGasPaymasters + +跨链 gas 支付由 `InterchainGasPaymaster` (IGP) 智能合约促成。 + +这些合约公开了 [InterchainGasPaymaster 接口](/zh/docs/reference/hooks/interchain-gas),允许消息发送者使用源链上的原生代币向 Relayer 支付费用,以支付在目标链上传递消息的成本。 + +每个 `InterchainGasPaymaster` 合约恰好对应一个 Relayer。您可以在[地址](/zh/docs/reference/addresses/deployments/mainnet/interchainGasPaymaster)下找到 Abacus Works 的 Relayer 地址。 + +### 跨链 Gas 支付计算 + +跨链 gas 支付的计算方式如下: + +$$ +destinationTxCost = destinationGasPrice * gasLimit +$$ + +$$ +exchangeRate = \frac{originGasTokenPrice}{destinationGasTokenPrice} +$$ + +$$ +originFee = exchangeRate * destinationTxCost +$$ + +`gasLimit` 和 `exchangeRate` 分别由消息发送者和 Relayer 配置。 + +## 信任假设 + +跨链 gas 支付基于消息发送者和 Relayer 之间的社会契约。换句话说,Relayer 可能会接收跨链 gas 支付而不传递相应的消息。因此,在进行跨链 gas 支付时,建议使用与已知且信誉良好的 Relayer 相关联的 IGP 合约。 + +诚实的 Relayer 实现将履行对其 IGP 进行的任何成功 gas 支付,无论实际支付了多少代币。通过保持 [gas oracles](/zh/docs/reference/hooks/interchain-gas) 最新,Relayer 可以确保 gas 支付成功当且仅当支付了"公平"价格。 + +在 Hyperlane 协议中,对 Relayer 没有信任假设,在任何情况下,恶意 Relayer 都无法审查或伪造消息。Relayer 能做的最坏的事情就是接受支付而不传递消息。 + +## 了解更多 + +- 有关 gas 限制计算、基准测试建议、gas oracles 和目标 gas 配置的详细信息,请参阅[跨链 Gas 支付详细信息](/zh/docs/reference/hooks/interchain-gas)。 +- 有关 Relayer 设置和实现指南,请参阅 [Relayer](/zh/docs/operate/relayer/run-relayer) 部分。 diff --git a/zh/docs/protocol/core/mailbox.mdx b/zh/docs/protocol/core/mailbox.mdx new file mode 100644 index 0000000..b4d035b --- /dev/null +++ b/zh/docs/protocol/core/mailbox.mdx @@ -0,0 +1,189 @@ +--- +title: "邮箱" +description: "在 Hyperlane 中用于发送和接收跨链消息的核心智能合约接口" +--- + +import SimpleMessagingDiagram from "/snippets/core/simple-messaging-diagram.mdx"; + +Hyperlane `邮箱` 智能合约公开了用于发送和接收跨链消息的链上 API。在 Hyperlane 支持的每条链上都部署了一个 `邮箱` 合约。 + +`邮箱` 网络为开发者提供了区块链之间的连接组织,开发者利用它来创建跨链应用程序,并为其现有应用程序添加跨链功能。 + + + +- 要[**发送**](/zh/docs/reference/messaging/send)跨链消息,请调用 `dispatch` 函数。 +- 要[**接收**](/zh/docs/reference/messaging/receive)跨链消息,请实现 `handle` 函数。 + +## 接口 + +[`IMailbox`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) 接口公开了两个状态变更函数;`dispatch()` 和 `process()`,分别用于发送和接收消息。 + + + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {IInterchainSecurityModule} from "./IInterchainSecurityModule.sol"; +import {IPostDispatchHook} from "./hooks/IPostDispatchHook.sol"; + +interface IMailbox { + // ============ 事件 ============ + /** + * @notice 通过 Hyperlane 调度新消息时发出 + * @param sender 调度消息的地址 + * @param destination 消息的目标域 + * @param recipient `destination` 上的消息接收者地址 + * @param message 消息的原始字节 + */ + event Dispatch( + address indexed sender, + uint32 indexed destination, + bytes32 indexed recipient, + bytes message + ); + + /** + * @notice 通过 Hyperlane 调度新消息时发出 + * @param messageId 唯一消息标识符 + */ + event DispatchId(bytes32 indexed messageId); + + /** + * @notice 处理 Hyperlane 消息时发出 + * @param messageId 唯一消息标识符 + */ + event ProcessId(bytes32 indexed messageId); + + /** + * @notice 传递 Hyperlane 消息时发出 + * @param origin 消息的源域 + * @param sender `origin` 上的消息发送者地址 + * @param recipient 处理消息的地址 + */ + event Process( + uint32 indexed origin, + bytes32 indexed sender, + address indexed recipient + ); + + function localDomain() external view returns (uint32); + + function delivered(bytes32 messageId) external view returns (bool); + + function defaultIsm() external view returns (IInterchainSecurityModule); + + function defaultHook() external view returns (IPostDispatchHook); + + function requiredHook() external view returns (IPostDispatchHook); + + function latestDispatchedId() external view returns (bytes32); + + function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody + ) external payable returns (bytes32 messageId); + + function quoteDispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody + ) external view returns (uint256 fee); + + function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata body, + bytes calldata defaultHookMetadata + ) external payable returns (bytes32 messageId); + + function quoteDispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody, + bytes calldata defaultHookMetadata + ) external view returns (uint256 fee); + + function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata body, + bytes calldata customHookMetadata, + IPostDispatchHook customHook + ) external payable returns (bytes32 messageId); + + function quoteDispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody, + bytes calldata customHookMetadata, + IPostDispatchHook customHook + ) external view returns (uint256 fee); + + function process( + bytes calldata metadata, + bytes calldata message + ) external payable; + + function recipientIsm( + address recipient + ) external view returns (IInterchainSecurityModule module); +} +``` + + + +### 消息头 + +邮箱在消息体前添加包含以下字段的头部: + +| **字段** | **描述** | +| ------------- | -------------------------------------------------------------- | +| `version` | 邮箱合约的版本 | +| `nonce` | 从给定邮箱发送的每条消息的唯一标识符 | +| `origin` | 源链的域 | +| `sender` | 源链上发送者的地址 | +| `destination` | 目标链的域 | +| `recipient` | 目标链上接收者的地址 | + +有关消息编码的更多信息,请参见 [`Message` 库](/zh/docs/reference/messaging/send)。 + +### 唯一性 + +`nonce` 是从给定邮箱发送的每条消息的单调递增整数。每次调度消息时都会递增,用作其他相同消息的分隔符。 + + + +```solidity Solidity +function delivered(bytes32 messageId) external view returns (bool); +``` + + + +`messageId` 是全局唯一的消息标识符,从 `dispatch` 调用返回,计算为消息(带头部)的 `keccak256` 哈希。 + +### 重放保护 + +邮箱维护已传递的 `messageId` 值的映射,以防止重放攻击。如果接收到的消息的 `messageId` 已经传递,该消息将被拒绝。 + +## 调度 + +要发送跨链消息,开发者调用 `Mailbox.dispatch()`。 + +此函数接受消息内容、目标链 ID 和接收者地址作为参数。每条消息都作为叶子插入到由 `邮箱` 存储的[增量默克尔树](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f)中。 + +Hyperlane 的权益证明协议使用此默克尔树来验证欺诈证明。 + +## 处理 + +要传递跨链消息,[中继器](/zh/docs/protocol/agents/relayer)调用 `Mailbox.process()`。 + +此函数接受要传递的消息以及中继器可以指定的任意元数据作为参数。 + +`邮箱` 将消息和元数据传递给接收者的跨链安全模块进行验证。如果 ISM 成功验证消息,`邮箱` 通过调用 `recipient.handle()` 将消息传递给接收者。 + + + 有关 Hyperlane 消息编码的更多详细信息,请参见 + [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) + \ No newline at end of file diff --git a/zh/docs/protocol/core/post-dispatch-hooks-overview.mdx b/zh/docs/protocol/core/post-dispatch-hooks-overview.mdx new file mode 100644 index 0000000..97b9b99 --- /dev/null +++ b/zh/docs/protocol/core/post-dispatch-hooks-overview.mdx @@ -0,0 +1,251 @@ +--- +title: "调度后钩子概述" +description: "使用调度后钩子为通过 Mailbox 调度的消息配置额外的源链行为" +--- + +调度后钩子允许开发者使用通过 Mailbox 调度的消息内容配置额外的源链行为。 + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + Hook[IPostDispatchHook] + + Sender -- "dispatch(..., metadata, hook)
{value}" --> M_O + M_O -- "postDispatch(message, metadata)
{value}" --> Hook + end +``` + +这允许开发者集成第三方/原生桥接、进行额外的链承诺或要求自定义费用,同时保持一致的单次调用 Mailbox 接口。 + + + + + +```solidity Solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +/*@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@ HYPERLANE @@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ +@@@@@@@@@ @@@@@@@@*/ + +interface IPostDispatchHook { + enum Types { + UNUSED, + ROUTING, + AGGREGATION, + MERKLE_TREE, + INTERCHAIN_GAS_PAYMASTER, + FALLBACK_ROUTING, + ID_AUTH_ISM, + PAUSABLE, + PROTOCOL_FEE, + LAYER_ZERO_V1, + RATE_LIMITED, + ARB_L2_TO_L1, + OP_L2_TO_L1 + } + + /** + * @notice Returns an enum that represents the type of hook + */ + function hookType() external view returns (uint8); + + /** + * @notice Returns whether the hook supports metadata + * @param metadata metadata + * @return Whether the hook supports metadata + */ + function supportsMetadata( + bytes calldata metadata + ) external view returns (bool); + + /** + * @notice Post action after a message is dispatched via the Mailbox + * @param metadata The metadata required for the hook + * @param message The message passed from the Mailbox.dispatch() call + */ + function postDispatch( + bytes calldata metadata, + bytes calldata message + ) external payable; + + /** + * @notice Compute the payment required by the postDispatch call + * @param metadata The metadata required for the hook + * @param message The message passed from the Mailbox.dispatch() call + * @return Quoted payment for the postDispatch call + */ + function quoteDispatch( + bytes calldata metadata, + bytes calldata message + ) external view returns (uint256); +} +``` + + + + + +## 调度后 + +除了通过 Mailbox 调度的 `message` 之外,`postDispatch` 函数还接收一个 `metadata` 参数。`metadata` 参数从 `dispatch` 调用通过 Mailbox 未经修改地传递。这允许开发者将他们希望的任何上下文传递给钩子。 + + + +```solidity Solidity +function postDispatch( + bytes calldata metadata, + bytes calldata message +) external payable; +``` + + + +如果 `postDispatch` 函数收到的支付不足,它可能会回滚。 + + + 调度后钩子可能是可重放的。创建自定义钩子的开发者应该实现安全检查以防止这种行为。 + [这里](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b69bc23239ecfc8f8a6277bb0f9bc248cffea234/solidity/contracts/hooks/warp-route/RateLimitedHook.sol#L16) + 是一个示例实现。 + + +### Quote Dispatch(费用) + +在 `postDispatch` 中通常会收取费用,以支付目标链交易提交和安全提供等成本。要接收相应 `postDispatch` 调用的报价,您可以查询 `quoteDispatch` 函数。 + + + +```solidity Solidity +function quoteDispatch( + bytes calldata metadata, + bytes calldata message +) external view returns (uint256); +``` + + + +Mailbox 有一个 `quoteDispatch` 函数,返回 `dispatch` 调用成功所需的总费用。 + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + Hook[Hook] + + Sender -- "quoteDispatch(..., metadata, hook)" --> M_O + M_O -- "required = quoteDispatch(message, metadata)" --> R_H + M_O -- "fee = hook.quoteDispatch(message, metadata)" --> Hook + M_O -- "required + fee" --> Sender + end +``` + +转到实现钩子指南[此处。](/zh/docs/protocol/ISM/custom-ISM) + +### 覆盖默认 Hook 元数据 + +要覆盖默认元数据,有一个 `dispatch` 重载,它接受一个可选的 `metadata` 参数。 + + + 钩子目前期望使用 [`StandardHookMetadata` 库](/zh/docs/reference/developer-tools/libraries/hookmetadata)格式化元数据。 + + + + +```solidity Solidity +function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata body, + bytes calldata defaultHookMetadata +) external payable returns (bytes32 messageId); +``` + + + +自定义 `metadata` 将传递给必需钩子的 `quoteDispatch` 和 `postDispatch` 函数,然后传递给默认钩子的 `postDispatch` 函数。 + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + D_H[DefaultHook] + Sender -- "dispatch(..., metadata){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(metadata, ...)
{fee}" --> R_H + M_O -. "postDispatch(metadata, ...)
{value - fee}" ..-> D_H + end +``` + +#### 示例 + + + 查看:[`StandardHookMetadata` 库](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b69bc23239ecfc8f8a6277bb0f9bc248cffea234/solidity/contracts/hooks/libs/StandardHookMetadata.sol) + + + + +```solidity Solidity +// send message from originChain to destinationChain TestRecipient +IMailbox mailbox = IMailbox("mailboxAddress"); +mailbox.dispatch{value: msg.value}( + destinationDomain, + "paddedRecipient", // Convert recipient address to padded bytes32 format + bytes("messageBody"), + StandardHookMetadata.overrideGasLimit(200000) +); +``` + + + +### 自定义钩子和元数据 + +在实现上述接口后,您可以通过在我们的 mailbox 中使用重载的 `dispatch` 调用来覆盖默认钩子和钩子元数据: + + + +```solidity Solidity +function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata body, + bytes calldata customHookMetadata, + IPostDispatchHook customHook +) external payable returns (bytes32 messageId); +``` + + + +#### 示例 + + + +```solidity Example +// send message from originChain to destinationChain TestRecipient +IMailbox mailbox = IMailbox("mailboxAddress"); +IPostDispatchHook merkleTree = IPostDispatchHook("merkleTreeHookAddress"); +mailbox.dispatch( + destinationDomain, + "paddedRecipient", // Convert recipient address to padded bytes32 format + bytes("messageBody"), + "0x", // empty metadata + merkleTree +); +``` + + diff --git a/zh/docs/protocol/protocol-overview.mdx b/zh/docs/protocol/protocol-overview.mdx new file mode 100644 index 0000000..0e20df0 --- /dev/null +++ b/zh/docs/protocol/protocol-overview.mdx @@ -0,0 +1,38 @@ +--- +title: "协议概述" +description: "Hyperlane 跨链消息传递协议和核心组件的概述" +--- + +Hyperlane 是第一个[无需许可的互操作性](/zh/docs/get-started-building)层,允许智能合约开发者在区块链之间发送任意数据。 + +开发者可以使用 Hyperlane 移动代币、执行函数调用以及许多其他功能,从而创建跨链应用程序——用户可以在任何区块链上访问的应用程序。 + +用户通过[邮箱](/zh/docs/protocol/core/mailbox)智能合约与 Hyperlane 协议交互,该合约提供链上消息传递接口来发送和接收跨链消息。 + +Hyperlane 采用模块化的安全方法,允许应用程序配置并从一系列[跨链安全模块](/zh/docs/protocol/ISM/modular-security) (ISM) 中选择。应用程序可以指定一个 ISM 来自定义保护其与 Hyperlane 消息传递接口集成的安全模型。 + +```mermaid +flowchart TB + subgraph Origin + Sender + M_O[(Mailbox)] + + Sender -- "1.dispatch(destination,
recipient, body)" --> M_O + end + + M_O -. "2.emit dispatch(sender,
destination, recipient,
body)" .-> Relayer + + subgraph Destination + Recipient + M_D[(Mailbox)] + ISM[InterchainSecurityModule] + + M_D -. "4.interchainSecurityModule()" .-> Recipient + M_D -- "5.verify(metadata,
message)" --> ISM + M_D -- "6.handle(origin, sender,
body)" --> Recipient + end + + Relayer((Relayer)) -- "3.process(metadata,
message)" --> M_D + + style Sender fill:#efab17 + style Recipient fill:#efab17 \ No newline at end of file diff --git a/zh/docs/protocol/warp-routes/warp-routes-example-usage.mdx b/zh/docs/protocol/warp-routes/warp-routes-example-usage.mdx new file mode 100644 index 0000000..61f423c --- /dev/null +++ b/zh/docs/protocol/warp-routes/warp-routes-example-usage.mdx @@ -0,0 +1,82 @@ +--- +title: "HWR:示例用法" +description: "Hyperlane 跨链路由(HWR)定义了资产如何在链之间移动,无论是作为原生代币、合成表示还是抵押品支持的资产。路由的选择取决于资产类型和目标链上的期望行为。" +--- + +## Hyperlane 跨链路由组合 + +### 1. 原生到原生 + +此路由允许在两条都使用各自原生代币的链之间转移原生代币。 + + + 此类型的路由应仅在两个网络都拥有等值的原生代币时使用, + 例如 inEVM 和 Ethereum。 + + +#### 设置 + +- 在两条链上都部署 **HypNative** 合约。 + +#### 示例流程 + +``` +交易类型:原生到原生转移 +从:Ethereum(ETH) +到:inEVM(ETH) +金额:1 ETH +``` + +#### 流程图 + +#### 用例 + +- Alice 想要快速地将价值从 Ethereum 转移到 inEVM。 + +### 2. 原生到合成 + +此路由在另一条链上创建原生代币的合成表示。 + +#### 设置 + +- 在原生资产所在的原始链上部署 **HypNative** 合约。 +- 在铸造合成代币的目标链上部署 **HypERC20** 合约。 + +#### 示例流程 + +``` +交易类型:从原生代币铸造合成代币 +从:Celo(CELO) +到:Optimism(wCELO) +金额:100 CELO +``` + +#### 流程图 + +#### 用例 + +- 一个基于 Celo 的项目希望使其原生 CELO 代币能够在 Optimism 上使用。 + +### 3. 抵押品到合成[​](#3-collateral-to-synthetic "直接链接到 3. 抵押品到合成") + +此路由允许基于抵押的 ERC20 代币创建合成代币。 + +#### 设置[​](#setup-2 "直接链接到设置") + +- 在原始资产所在的源链上部署**抵押品合约(HypERC20Collateral)**。 +- 在铸造资产的目标链上部署**合成合约(HypERC20)**。 + +#### 示例流程[​](#example-flow-2 "直接链接到示例流程") + +``` +交易类型:从抵押品代币铸造合成代币 +从:Ethereum(USDC - 原始资产)- 抵押品源 +到:Arbitrum(wUSDC - 铸造的合成资产)- 合成目标 +金额:1000 USDC +``` + +#### 流程图[​](#diagram-2 "直接链接到流程图") + +#### 用例[​](#use-case-2 "直接链接到用例") + +- Alice 想要在 Arbitrum 上使用她的 USDC,而不需要将实际的 USDC 转移到 Arbitrum 或依赖 Arbitrum 的桥接 USDC。 \ No newline at end of file diff --git a/zh/docs/protocol/warp-routes/warp-routes-overview.mdx b/zh/docs/protocol/warp-routes/warp-routes-overview.mdx new file mode 100644 index 0000000..1d6ae69 --- /dev/null +++ b/zh/docs/protocol/warp-routes/warp-routes-overview.mdx @@ -0,0 +1,78 @@ +--- +title: "Hyperlane 跨链路由" +--- + +Hyperlane 跨链路由(HWR)是模块化的跨链资产桥接方案,支持使用 Hyperlane 在链之间转移代币。开发者可以使用 Hyperlane 无需许可地部署 HWR,在链之间移动资产。 + +它们支持多种资产类型,包括: + +- ERC20 和 ERC721 代币(用于 EVM 兼容链) +- SVM 基础资产(用于 SVM 兼容链) +- 原生代币(如 ETH 或其他 gas 代币) + +您可以将 HWR 与 Hyperlane 部署相结合,在任何链与通过 Hyperlane 已连接的其他链之间创建经济路由。 + +## 模块化安全[​](#modular-security "直接链接到模块化安全") + +与所有基于 Hyperlane 构建的应用一样,HWR 通过[跨链安全模块](/zh/docs/protocol/ISM/modular-security)具有可定制的安全性。 + +HWR 的部署者可以指定用于验证跨链转移消息的 ISM。这意味着每个 HWR 可能具有独特的安全配置。转移跨链代币的用户应在使用之前了解路由的信任假设。 + + + 同样,Warp 前端应手动筛选其 HWR,以避免 + 支持不安全的路由。详情请参阅 [Warp UI 部署 + 文档](/zh/docs/guides/warp-routes/bridge-ui-guide)。 + + +## HWR 架构 + +HWR 让部署者选择代币如何在链之间转移。根据 HWR 的类型,合约将锁定代币、铸造包装代币、销毁包装代币或释放原始代币。 + +例如: + +1. **抵押品 → 合成**:代币在原始(抵押品)链上被锁定,发送消息,然后在目标(合成)链上铸造包装代币。 +2. **原生 → 合成**:原生 gas 代币(例如 ETH)在原始链上被锁定,发送消息,然后在目标链上铸造合成代币。 +3. **原生 → 抵押品**:原生代币在原始链上被锁定,发送消息,然后在目标链上释放抵押品代币。 + +每个 HWR 都需要在其所在的每条链上部署一个合约,充当进出点。这些合约使用[邮箱合约](/zh/docs/protocol/core/mailbox)相互发送跨链消息。 + +### HWR 类型 + +此表格提供了 HWR 类型的高级概述。详细说明请参见:[Hyperlane 跨链路由类型](/zh/docs/protocol/warp-routes/warp-routes-types)。 + +| **Hyperlane 跨链路由类型** | **描述** | +| ----------------------------- | ------------------------------------------------------------------------------------------------ | +| 原生代币 HWR | 支持原生 gas 代币(如 ETH)在链间直接转移,无需包装。 | +| 抵押品支持的 ERC20 | 在源链上锁定 ERC20 代币作为抵押品,用于跨链转移。 | +| 合成 ERC20 | 在目标链上铸造新的 ERC20 代币以代表原始代币。 | +| Hyperlane 跨链路由 2.0 | 允许从多个抵押品代币中获取流动性。 | +| 专用 HWR | 添加高级功能或集成特定用例(例如,金库、法币支持的代币)。 | + +### 架构示例[​](#example-architecture "直接链接到架构示例") + +让我们通过一个使用锁定和铸造模型在两条链之间转移 ERC20 代币的**抵押品**到**合成** HWR 来演示: + +1. 用户在抵押品链(例如 Ethereum)的 HWR 合约中锁定他们的代币。 +2. 通过 Hyperlane 的邮箱合约发送消息并中继到合成链(例如 Base)。 +3. 在目标链上,HWR 合约为用户铸造包装代币。 + +在下图中,ISM 是一个[多签 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM),它使用一组验证者来批准消息。(注意:并非所有 ISM 都需要验证者,这取决于所选的安全模型。) + +以下是流程的简化视图: + +![跨链路由图](/images/docs/protocol/warp-routes/warp-route.png) + +## 部署 HWR + +HWR 可以在任何拥有 Hyperlane 部署的链之间进行部署。 + +要部署 HWR,请参阅以下指南: + +- [基于 EVM 的 HWR](/zh/docs/guides/quickstart/deploy-warp-route) +- [基于 SVM 的 HWR](/zh/docs/guides/warp-routes/svm/svm-warp-route-guide) +- [EVM-SVM HWR](/zh/docs/guides/warp-routes/evm-svm-warp-route-guide) + + + 如果您想要创建一个包含 Hyperlane 尚未部署的链的 HWR, + 欢迎您自行[部署 Hyperlane](/zh/docs/guides/chains/deploy-hyperlane)! + \ No newline at end of file diff --git a/zh/docs/protocol/warp-routes/warp-routes-types.mdx b/zh/docs/protocol/warp-routes/warp-routes-types.mdx new file mode 100644 index 0000000..48c5ebf --- /dev/null +++ b/zh/docs/protocol/warp-routes/warp-routes-types.mdx @@ -0,0 +1,127 @@ +--- +title: "Hyperlane 跨链路由:类型" +description: "Hyperlane 跨链路由(HWR)是 Hyperlane 对代币桥接的实现,允许通过 Hyperlane 在任意链之间进行原生代币、ERC20 和合成(新部署的 ERC20)资产的无需许可转移。本文档提供了所有跨链路由类型的详细信息。" +--- + +| **Hyperlane 跨链路由类型** | **描述** | +| ----------------------------- | ------------------------------------------------------------------------------------------------ | +| 原生代币 HWR | 支持原生 gas 代币(如 ETH)在链间直接转移,无需包装。 | +| 抵押品支持的 ERC20 | 在源链上锁定 ERC20 代币作为抵押品,用于跨链转移。 | +| 合成 ERC20 | 在目标链上铸造新的 ERC20 代币以代表原始代币。 | +| Hyperlane 跨链路由 2.0 | 允许从多个抵押品代币中获取流动性。 | +| 专用 HWR | 添加高级功能或集成特定用例(例如,金库、法币支持的代币)。 | + +_请注意,本文档不包括 ERC721 HWR。_ + +## 核心 HWR 类型 + +### 原生代币 HWR + +在 `HypNative.sol` 中实现,原生 HWR 处理原生 gas 代币(例如 Ethereum 或 Arbitrum 上的 ETH,Mantle 上的 MNT)在不同链之间的转移。 + +#### 特性 + +- 直接转移原生代币,无需包装。 +- 使用 `msg.value` 作为转移金额。 +- 将多余的 `msg.value` 作为 hook 支付。 +- 通过 `receive()` 函数支持捐赠。 + +有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypNative.sol)。 + +### 抵押品支持的 ERC20 HWR + +在 `HypERC20Collateral.sol` 中实现,抵押品 HWR 使 ERC20 代币能够在源链上作为抵押品锁定,然后用于在目标链上铸造合成表示。 + +#### 特性 + +- 将现有 ERC20 代币包装为抵押品用于转移。 +- 在源链的合约中锁定代币。 +- 在目标链上释放等值代币。 +- 使用 SafeERC20 进行安全的代币转移。 + +有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20Collateral.sol)。 + +### 合成 ERC20 HWR + +在 `HypERC20.sol` 中实现,合成 HWR 在目标链上铸造代表源链原始代币的新代币。原始代币不会被转移,而是保持锁定状态。 + +#### 特性[​](#features-2 "直接链接到特性") + +- 在所有链上保持一致的总供应量。 +- 支持自定义代币属性(名称、符号、小数位数)。 +- 在目标链上铸造新代币。 +- 转移回源链时销毁代币。 + +有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20.sol)。 + +## 高级功能[​](#advanced-features "直接链接到高级功能") + +### TokenRouter 功能 + +所有 HWR 都扩展了 `TokenRouter` 合约,该合约为 HWR 代币转移提供核心功能。 + +#### 特性 + +1. **消息结构**:使用 [TokenMessage](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenMessage.sol) 库来编码和解码代币转移消息。 + +2. **转移发起**:`transferRemote` 函数发起跨链转移。 + +3. **消息处理**:`_handle` 函数处理传入的转移消息。 + +4. **抽象方法**: + + - `_transferFromSender`:由所有 HWR 实现,用于处理代币收集。 + - `_transferTo`:由所有 HWR 实现,用于处理代币分发。 + +#### TokenMessage 格式 + +``` +[32 字节用于接收者][32 字节用于金额][剩余字节用于元数据] +``` + +这种标准化格式确保了不同 HWR 实现之间的一致处理,同时允许通过元数据进行扩展。 + +有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenRouter.sol)。 + +### FastTokenRouter 转移 + +在 `FastTokenRouter.sol` 中实现,该路由器扩展了 TokenRouter,并通过流动性提供者机制提供更快的代币转移。 + +#### 特性 + +- 允许流动性提供者在消息处理之前完成转移请求。 +- 包含 `fastFee` 以激励流动性提供者。 +- 引入 `fastTransferId` 用于唯一转移标识。 + +有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/FastTokenRouter.sol)。 + +## 专用 HWR 扩展 + +### 1. 快速抵押品转移(FastHypERC20Collateral) + +- 将快速转移功能与抵押品支持的 ERC20 功能相结合。 +- 有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/FastHypERC20Collateral.sol)。 + +### 2. 金库集成(HypERC4626OwnerCollateral、HypERC4626Collateral) + +- 通过与 ERC-4626 金库集成,允许在抵押品上产生收益。 +- 有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626OwnerCollateral.sol)和[重新平衡变体](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626Collateral.sol)。 + +### 3. 法币支持的代币(HypFiatToken) + +- 专为稳定币和其他法币支持的代币设计,实现特定的铸造和销毁操作。 +- 有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypFiatToken.sol)。 + +### 4. 缩放的原生代币(HypNativeScaled) + +- 缩放原生代币值,以在具有不同小数位数的链之间保持一致性。 +- 有关更多详情,请参阅[实现代码](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypNativeScaled.sol)。 + +### 5. xERC20 集成(HypXERC20 和 HypXERC20Lockbox) + +- 支持 xERC20 代币的跨链转移,与 lockbox 机制集成以进行转换。 +- 有关更多详情,请参阅 [HypXERC20 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20.sol)和 [HypXERC20Lockbox 实现](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20Lockbox.sol)。 + +## 参考资料 + +有关设置示例和用例,请查看 [Hyperlane 跨链路由:示例用法](/zh/docs/protocol/warp-routes/warp-routes-example-usage)。 \ No newline at end of file diff --git a/zh/docs/reference/addresses/deployments/interchainAccountRouter.mdx b/zh/docs/reference/addresses/deployments/interchainAccountRouter.mdx new file mode 100644 index 0000000..e52958b --- /dev/null +++ b/zh/docs/reference/addresses/deployments/interchainAccountRouter.mdx @@ -0,0 +1,170 @@ +--- +title: "InterchainAccountRouter" +description: "Mainnet 和 Testnet 上的 InterchainAccountRouter 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| Aleph Zero EVM | 1000041455 | 41455 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x25C87e735021F72d8728438C2130b02E3141f2cb` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0x65F1343AC23D4fF48bf6c7E0c55872d245397567` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0xf4035357EB3e3B48E498FA6e1207892f615A2c2f` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x7621e04860F0bDe63311db9D5D8b589AD3458A1f` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x021D2810a758c833080DEc2F1Fa8F571Aae97D45` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0xa82a0227e6d6db53AF4B264A852bfF91C6504a51` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0x4767D22117bBeeb295413000B620B93FD8522d53` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0xB2b0A80b2fa3fC9aB1564A4FaF013d4D6084B325` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0xA0a44cB8Bc0f7EDe788b0Cd29524A5b14fED7b45` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0x2f4Eb04189e11Af642237Da62d163Ab714614498` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celo | 42220 | 42220 | `0x27a6cAe33378bB6A6663b382070427A01fc9cB37` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0xA697222b77cDe62A8C47E627d5A1c49A87018236` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Endurance | 648 | 648 | `0xed9a722c543883FB7e07E78F3879762DE09eA7D5` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0x5E532F7B610618eE73C2B462978e94CB1F7995Ce` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0x87bDFaBbCC36D8B1aEdA871Cd54b2e86C7a4d597` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0x349831a180eE4265008C5FFB9465Ff97c1CF0028` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x5CBD4c5f9CD55747285652f815Cc7b9A2Ef6c586` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x2351FBe24C1212F253b7a300ff0cBCFd97952a19` | [explorer.fuse.io](https://explorer.fuse.io) | +| Game7 | 2187 | 2187 | `0x5CBD4c5f9CD55747285652f815Cc7b9A2Ef6c586` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0x5B24EE24049582fF74c1d311d72c70bA5B76a554` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0xA9Adb480F10547f10202173a49b7F52116304476` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0xdf4aA3905e0391C7763e33CB6A08fFa97221D49B` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0xfB8cea1c7F45608Da30655b50bbF355D123A4358` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0x284226F651eb5cbd696365BC27d333028FCc5D54` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x5CBD4c5f9CD55747285652f815Cc7b9A2Ef6c586` | N/A | +| Ink | 57073 | 57073 | `0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0xEeb5a99a75585fe137c83E7b62b74f87264A5481` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x693A4cE39d99e46B04cb562329e3F0141cA17331` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x45285463352c53a481e882cD5E2AF2E25BBdAd0D` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0xF16E63B42Df7f2676B373979120BBf7e6298F473` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| Mint | 185 | 185 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x40Ca4155c0334F7e0F6d7F80536B59EF8831c9fb` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0xc4482f66191754a8629D35289043C4EB0285F10E` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Nibiru | 6900 | 6900 | `0x64F077915B41479901a23Aa798B30701589C5063` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0x718f11e349374481Be8c8B7589eC4B4316ddDCc2` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0xBCD18636e5876DFd7AAb5F2B2a5Eb5ca168BA1d8` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x5CBD4c5f9CD55747285652f815Cc7b9A2Ef6c586` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0xf303B04d9ad21dAe2658Cf302478A424e0B45368` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0xF163949AD9F88977ebF649D0461398Ca752E64B9` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x20a0A32a110362920597F72974E1E0d7e25cA20a` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x89Ebf977E83087959aD78e5372F4AF15DcdC8143` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x7a4d31a686A36285d68e14EDD53631417eB19603` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x7947b7Fe737B4bd1D3387153f32148974066E591` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x0B48a744698ba8dFa514742dFEB6728f52fD66f7` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Soneium | 1868 | 1868 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [sonicscan.org](https://sonicscan.org) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0x7947b7Fe737B4bd1D3387153f32148974066E591` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0xf303B04d9ad21dAe2658Cf302478A424e0B45368` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| Swell | 1923 | 1923 | `0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0xBa9E76d893f88B42d90b954921118C269D203a2C` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x67F36550b73B731e5b2FC44E4F8f250d89c87bD6` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x473884010F0C1742DA8Ad01E7E295624B931076b` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [www.oklink.com](https://www.oklink.com/xlayer) | +| ZetaChain | 7000 | 7000 | `0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| Zora | 7777777 | 7777777 | `0x11b76D93a9D39Eb51F54eBf5566308640cDe882b` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | -------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0xe036768e48Cb0D42811d2bF0748806FCcBfCd670` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0x20cC3a33C49fa13627303669edf2DcA7F1E76a50` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0xcD19Ff7306E04EA6b8f4B5Ab1c5A198c186aaB42` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0x638A831b4d11Be6a72AcB97d1aE79DA05Ae9B1D3` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0xd876C01aB40e8cE42Db417fBC79c726d45504dE4` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0xB7697612fbfb4ad02a11dCa16e9711eCB6Da4ceA` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x17866ebE0e503784a9461d3e753dEeD0d3F61153` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Chronicle Yellowstone | 175188 | 175188 | `0xB261C52241E133f957630AeeFEd48a82963AC33e` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0xB7697612fbfb4ad02a11dCa16e9711eCB6Da4ceA` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x2C6dD6768E669EDB7b53f26067C1C4534862c3de` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0xF64c33DcC5F9Dd8CE9A7bc61A4DabeB1Ac6CCE27` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0xeEF6933122894fF217a7dd07510b3D64b747e29b` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0xD31eD5a3D26c9787Ab607B0c364B21218D0f8F7b` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0x740bEd6E4eEc7c57a2818177Fba3f9E896D5DE1c` | N/A | +| Ink Sepolia | 763373 | 763373 | `0xE0745955baF7e614707E22c90EA14d329C38941D` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0xc16C0aEe1Cdc684e19232Ed159408bf3A1CD9F6b` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Mode Testnet | 919 | 919 | `0x1681cc382e08a72d4b64A123080896e30f96B740` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0x919Af376D02751bFCaD9CBAD6bad0c3089dAE33f` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x08911d73b443309081d66A878227E20d6DF0f64C` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x3F100cBBE5FD5466BdB4B3a15Ac226957e7965Ad` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Plume Testnet | 98867 | 98867 | `0x2A9E9188C7e76f3345e91fD4650aC654A9FE355C` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0xC60C145f1e1904f9d6483A611BF1416697CCc1FE` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0xe17c37212d785760E8331D4A4395B17b34Ba8cDF` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Somnia Testnet | 50312 | 50312 | `0xD5B70f7Da85F98A5197E55114A38f3eDcDCf020e` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic Testnet | 64165 | 64165 | `0x39c85C84876479694A2470c0E8075e9d68049aFc` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0xD9dc83Ea22C6F1A224e51562B32b580695905A1A` | N/A | +| Superposition Testnet | 98985 | 98985 | `0x3572a9d808738922194921b275B2A55414BcDA57` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Tangle Testnet | 3799 | 3799 | `0x31196df48eb78756C4036aA6b81e8F42b0301fAe` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools/) | +| Unichain Testnet | 1301 | 1301 | `0x4eC139a771eBdD3b0a0b67bb7E08960210882d44` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0x919Af376D02751bFCaD9CBAD6bad0c3089dAE33f` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/interchainGasPaymaster.mdx b/zh/docs/reference/addresses/deployments/interchainGasPaymaster.mdx new file mode 100644 index 0000000..d65bdc6 --- /dev/null +++ b/zh/docs/reference/addresses/deployments/interchainGasPaymaster.mdx @@ -0,0 +1,192 @@ +--- +title: "InterchainGasPaymaster" +description: "Mainnet 和 Testnet 上的 InterchainGasPaymaster 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x874AaCa847B365592B2b9dB7235517c5F3a5c689` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x30a539E2E2d09FB4e68661B1EDD70D266211602a` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0x95519ba800BBd0d34eeAE026fEc620AD978176C0` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0xB3fCcD379ad66CED0c91028520C64226611A48c9` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x23cc88CF424d48fDB05b4f0A8Ff6099aa4D56D8e` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celestia | 1128614981 | celestia | `0x726f757465725f706f73745f6469737061746368000000040000000000000001` | [celenium.io](https://celenium.io) | +| Celo | 42220 | 42220 | `0x571f1435613381208477ac5d6974310d88AC7cB7` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0x8452363d5c78bf95538614441Dc8B465e03A89ca` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Eclipse | 1408864445 | 1408864445 | `ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK` | [eclipsescan.xyz](https://eclipsescan.xyz/) | +| Endurance | 648 | 648 | `0xB30EAB08aa87138D57168D0e236850A530f49921` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0xb58257cc81E47EC72fD38aE16297048de23163b4` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0x6AA10748a036a49Cb290C0e12B77319b76792D5E` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x0DbB60c348DF645c295Fd0ce26F87bB850710185` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0xD233433AeC23F8382DAd87D808F60557Ea35399f` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x0DbB60c348DF645c295Fd0ce26F87bB850710185` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0x8452363d5c78bf95538614441Dc8B465e03A89ca` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0xEa2Bcee14eA30bbBe3018E5E7829F963230F71C3` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0x4eB0d97B48711950ecB01871125c4523939c6Fce` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x0DbB60c348DF645c295Fd0ce26F87bB850710185` | N/A | +| Injective | 6909546 | injective-1 | `0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59` | [www.mintscan.io](https://www.mintscan.io/injective) | +| Ink | 57073 | 57073 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x23cc88CF424d48fDB05b4f0A8Ff6099aa4D56D8e` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0x9629c28990F11c31735765A6FD59E1E1bC197DbD` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| MilkyWay | 1835625579 | milkyway | `0x726f757465725f706f73745f6469737061746368000000040000000000000000` | N/A | +| Mint | 185 | 185 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0xD233433AeC23F8382DAd87D808F60557Ea35399f` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x14760E32C0746094cF14D97124865BC7F0F7368F` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Neutron | 1853125230 | neutron-1 | `0x738a4454e066c3bcb48cb0f03dca1c69b3c3d5ffa4f4470096083f0680a169ac` | [www.mintscan.io](https://www.mintscan.io/neutron) | +| Nibiru | 6900 | 6900 | `0x5887BDA66EC9e854b0da6BFFe423511e69d327DC` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0x11EF91d17c5ad3330DbCa709a8841743d3Af6819` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0xE911e75CECe0eF01df3ceD96BCd362941AE474D4` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x0DbB60c348DF645c295Fd0ce26F87bB850710185` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0xc261Bd2BD995d3D0026e918cBFD44b0Cc5416a57` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0x0071740Bf129b05C4684abfbBeD248D80971cce2` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0xE911e75CECe0eF01df3ceD96BCd362941AE474D4` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x5cD695ADCB156589cde501822C314bFD74398cA1` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Solana | 1399811149 | 1399811149 | `JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M` | [solscan.io](https://solscan.io) | +| Solaxy | 1936682104 | 1936682104 | `3SDcBbfZUF9ykR3yudYN198ja3KJSq17Q3rKw7JKfJR6` | [explorer.solaxy.io](https://explorer.solaxy.io) | +| Soneium | 1868 | 1868 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [sonicscan.org](https://sonicscan.org) | +| Sonic SVM | 507150715 | 507150715 | `Bxof4ZpgLtoHoxBq6AGDCJUtVxUoE9LXkx8iizkDGQPz` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=custom&customUrl=https%3A%2F%2Fapi.mainnet-alpha.sonic.game) | +| SOON | 50075007 | 50075007 | `Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ` | [explorer.soo.network](https://explorer.soo.network/) | +| Sophon | 50104 | 50104 | `0x73a82061Cd258d02BEa145fe183120456e718c2A` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0x5cD695ADCB156589cde501822C314bFD74398cA1` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0x8d7E604460E1133ebB91513a6D1024f3A3ca17F9` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| svmBNB | 574456 | 574456 | `76JNRGvHbER5CL7X4Mw6qpzvvKDW3syyfZ5LNXfY53sC` | [explorer.svmbnbmainnet.soo.network](https://explorer.svmbnbmainnet.soo.network) | +| Swell | 1923 | 1923 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x466b330C2e360c0214A9Da2428415298f720883E` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x3cECBa60A580dE20CC57D87528953a00f4ED99EA` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0xD233433AeC23F8382DAd87D808F60557Ea35399f` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0x318FbdB17d4e743aBF3183658a4730777101B75C` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0xf44AdA86a1f765A938d404699B8070Dd47bD2431` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x44769b0f4a6f01339e131a691cc2eebbb519d297` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0xF61322936D80cd87B49df48F3DE24fD5c02dE9D1` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0xF78deCe5Cf97e1bd61C202A5ba1af33b87454878` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0xF78deCe5Cf97e1bd61C202A5ba1af33b87454878` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0xce0e13f67399375eF0a7acb741E815145A6AAf67` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Celestia Testnet | 1297040200 | mocha-4 | `0x726f757465725f706f73745f6469737061746368000000040000000000000001` | N/A | +| Chronicle Yellowstone | 175188 | 175188 | `0xB589407cf6bEA5CD81AD0946b9F1467933ede74c` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0xA9425D5cBcD2c83EB2a5BF453EAA18968db3ef77` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x39c85C84876479694A2470c0E8075e9d68049aFc` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x6895d3916B94b386fAA6ec9276756e16dAe7480E` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0x48a53E3B176383BC98fcF4a24c9D470c19475164` | N/A | +| Ink Sepolia | 763373 | 763373 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0x638A831b4d11Be6a72AcB97d1aE79DA05Ae9B1D3` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Milkyway Testnet | 1162171030 | ceers-2112 | `0x726f757465725f706f73745f6469737061746368000000040000000000000000` | N/A | +| Mode Testnet | 919 | 919 | `0xB261C52241E133f957630AeeFEd48a82963AC33e` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0xFb55597F07417b08195Ba674f4dd58aeC9B89FBB` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Paradex Sepolia | 12263410 | 0x505249564154455f534e5f504f54435f5345504f4c4941 | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.testnet.paradex.trade](https://voyager.testnet.paradex.trade) | +| Plume Testnet | 98867 | 98867 | `0xD5B70f7Da85F98A5197E55114A38f3eDcDCf020e` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Solana Testnet | 1399811150 | 1399811150 | `9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy` | [explorer.solana.com](https://explorer.solana.com?cluster=testnet) | +| Somnia Testnet | 50312 | 50312 | `0x919Af376D02751bFCaD9CBAD6bad0c3089dAE33f` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x39c85C84876479694A2470c0E8075e9d68049aFc` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic SVM Testnet | 15153042 | 15153042 | `FSy4hQ92ZTPJVG2UmiWiymoogpwEDBcucKnLzLnbrBDt` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=testnet.v1) | +| Sonic Testnet | 64165 | 64165 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| Starknet Sepolia | 23448591 | 0x534e5f5345504f4c4941 | `0x0000000000000000000000000000000000000000000000000000000000000000` | [sepolia.voyager.online](https://sepolia.voyager.online) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0xB589407cf6bEA5CD81AD0946b9F1467933ede74c` | N/A | +| Superposition Testnet | 98985 | 98985 | `0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Unichain Testnet | 1301 | 1301 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/mailbox.mdx b/zh/docs/reference/addresses/deployments/mailbox.mdx new file mode 100644 index 0000000..5056d9f --- /dev/null +++ b/zh/docs/reference/addresses/deployments/mailbox.mdx @@ -0,0 +1,193 @@ +--- +title: "Mailbox" +description: "Mainnet 和 Testnet 上的 Mailbox 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x979Ca5202784112f4738403dBec5D0F3B9daabB9` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celestia | 1128614981 | celestia | `0x68797065726c616e650000000000000000000000000000000000000000000000` | [celenium.io](https://celenium.io) | +| Celo | 42220 | 42220 | `0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Eclipse | 1408864445 | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [eclipsescan.xyz](https://eclipsescan.xyz/) | +| Endurance | 648 | 648 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0xc005dc82818d67AF737725bD4bf75435d065D239` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | N/A | +| Injective | 6909546 | injective-1 | `0x0f7fb53961d70687e352aa55cb329ca76edc0c19` | [www.mintscan.io](https://www.mintscan.io/injective) | +| Ink | 57073 | 57073 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x02d16BC51af6BfD153d67CA61754cF912E82C4d9` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| MilkyWay | 1835625579 | milkyway | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Mint | 185 | 185 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x094d03E751f49908080EFf000Dd6FD177fd44CC3` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Neutron | 1853125230 | neutron-1 | `0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc` | [www.mintscan.io](https://www.mintscan.io/neutron) | +| Nibiru | 6900 | 6900 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0xb129828B9EDa48192D0B2db35D0E40dCF51B3594` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x0375a37caebba07e57cb57690cfe681efcd0641b5cdb310622d776069528d2a8` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0x5d934f4e2f797775e53561bB72aca21ba36B96BB` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Solana | 1399811149 | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io) | +| Solaxy | 1936682104 | 1936682104 | `6VdnmP8MfYkPNMwyU2ZY9S3ickYyewF58LPC38y9FAVU` | [explorer.solaxy.io](https://explorer.solaxy.io) | +| Soneium | 1868 | 1868 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [sonicscan.org](https://sonicscan.org) | +| Sonic SVM | 507150715 | 507150715 | `4MaM9GQZ753NhUcXH1pPsQwof1Mf3ZnjeNF4yx6S3p3N` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=custom&customUrl=https%3A%2F%2Fapi.mainnet-alpha.sonic.game) | +| SOON | 50075007 | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network/) | +| Sophon | 50104 | 50104 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x05520a179658bd81e19d4e41abce2bc397bab5af302dadea70d8918c3cbdcea8` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0xF767D698c510FE5E53b46BA6Fd1174F5271e390A` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| svmBNB | 574456 | 574456 | `GzwNZJ2EXUWQCEoV6zoBGLxkdsnjkLvm6zHReMEC2JSA` | [explorer.svmbnbmainnet.soo.network](https://explorer.svmbnbmainnet.soo.network) | +| Swell | 1923 | 1923 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Celestia Testnet | 1297040200 | mocha-4 | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Chronicle Yellowstone | 175188 | 175188 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xB08d78F439e55D02C398519eef61606A5926245F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0x7FE7EA170cf08A25C2ff315814D96D93C311E692` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | N/A | +| Ink Sepolia | 763373 | 763373 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0xF78deCe5Cf97e1bd61C202A5ba1af33b87454878` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Milkyway Testnet | 1162171030 | ceers-2112 | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Mode Testnet | 919 | 919 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Paradex Sepolia | 12263410 | 0x505249564154455f534e5f504f54435f5345504f4c4941 | `0x03dfd685b4e799f1a6a947285a4be355acbfc1715b1c7c11d249b8abd1a691d1` | [voyager.testnet.paradex.trade](https://voyager.testnet.paradex.trade) | +| Plume Testnet | 98867 | 98867 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0x54148470292C24345fb828B003461a9444414517` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x3C5154a193D6e2955650f9305c8d80c18C814A68` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Solana Testnet | 1399811150 | 1399811150 | `75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR` | [explorer.solana.com](https://explorer.solana.com?cluster=testnet) | +| Somnia Testnet | 50312 | 50312 | `0x7d498740A4572f2B5c6b0A1Ba9d1d9DbE207e89E` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic SVM Testnet | 15153042 | 15153042 | `6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=testnet.v1) | +| Sonic Testnet | 64165 | 64165 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| Starknet Sepolia | 23448591 | 0x534e5f5345504f4c4941 | `0x03c725cd6a4463e4a9258d29304bcca5e4f1bbccab078ffd69784f5193a6d792` | [sepolia.voyager.online](https://sepolia.voyager.online) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0x589C201a07c26b4725A4A829d772f24423da480B` | N/A | +| Superposition Testnet | 98985 | 98985 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Tangle Testnet | 3799 | 3799 | `0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools/) | +| Unichain Testnet | 1301 | 1301 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/merkleTreeHook.mdx b/zh/docs/reference/addresses/deployments/merkleTreeHook.mdx new file mode 100644 index 0000000..2deadd8 --- /dev/null +++ b/zh/docs/reference/addresses/deployments/merkleTreeHook.mdx @@ -0,0 +1,192 @@ +--- +title: "MerkleTreeHook" +description: "Mainnet 和 Testnet 上的 MerkleTreeHook 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x11b69aB33AD8a550dcF9B4A041AA1121255F08A5` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x811808Dd29ba8B0FC6C0ec0b5537035E59745162` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0xcd90D49b046772F710250b9119117169CB2e4D8b` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x748040afB89B8FdBb992799808215419d36A0930` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0x84eea61D679F42D92145fA052C89900CBAccE95A` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x2ed6030D204745aC0Cd6be8301C3a63bf14D97Cc` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celestia | 1128614981 | celestia | `0x726f757465725f706f73745f6469737061746368000000030000000000000000` | [celenium.io](https://celenium.io) | +| Celo | 42220 | 42220 | `0x04dB778f05854f26E67e0a66b740BBbE9070D366` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0x6D48135b7584E8Bf828B6e23110Bc0Da4252704f` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Eclipse | 1408864445 | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [eclipsescan.xyz](https://eclipsescan.xyz/) | +| Endurance | 648 | 648 | `0xC831271c1fB212012811a91Dd43e5926C1020563` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0x2783D98CC073dbcDa90241C804d16982D3d75821` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x2FF6cf2651fec512D0618E33c9d1374aaCd8b310` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0x64F077915B41479901a23Aa798B30701589C5063` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x2FF6cf2651fec512D0618E33c9d1374aaCd8b310` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0xf0F937943Cd6D2a5D02b7f96C9Dd9e04AB633813` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0x5B7a808CaA2C3F1378B07cDd46eB8ccA52F67e3B` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0x3862A9B1aCd89245a59002C2a08658EC1d5690E3` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0xdAa1B65547fB969c9ff5678956AB2FF9771B883D` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0xB2b0A80b2fa3fC9aB1564A4FaF013d4D6084B325` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x2FF6cf2651fec512D0618E33c9d1374aaCd8b310` | N/A | +| Injective | 6909546 | injective-1 | `0x568ad3638447f07def384969f4ea39fae3802962` | [www.mintscan.io](https://www.mintscan.io/injective) | +| Ink | 57073 | 57073 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x2ed6030D204745aC0Cd6be8301C3a63bf14D97Cc` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0xC077A0Cc408173349b1c9870C667B40FE3C01dd7` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0x021D2810a758c833080DEc2F1Fa8F571Aae97D45` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| MilkyWay | 1835625579 | milkyway | `0x726f757465725f706f73745f6469737061746368000000030000000000000001` | N/A | +| Mint | 185 | 185 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x64F077915B41479901a23Aa798B30701589C5063` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Neutron | 1853125230 | neutron-1 | `0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c` | [www.mintscan.io](https://www.mintscan.io/neutron) | +| Nibiru | 6900 | 6900 | `0x72246331d057741008751AB3976a8297Ce7267Bc` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0xb5668713E9BA8bC96f97D691663E70b54CE90b0A` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0xcDD89f19b2d00DCB9510BB3fBd5eCeCa761fe5Ab` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x02e13cb85a987a79ca4dc3ee2d65e3ea52acaccfb678767f290b8c6eca1d09e4` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x2FF6cf2651fec512D0618E33c9d1374aaCd8b310` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0x25C87e735021F72d8728438C2130b02E3141f2cb` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0xf147bBD944C610F86DaE6C7668497D22932C1E4A` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0xcDD89f19b2d00DCB9510BB3fBd5eCeCa761fe5Ab` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Solana | 1399811149 | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io) | +| Solaxy | 1936682104 | 1936682104 | `6VdnmP8MfYkPNMwyU2ZY9S3ickYyewF58LPC38y9FAVU` | [explorer.solaxy.io](https://explorer.solaxy.io) | +| Soneium | 1868 | 1868 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [sonicscan.org](https://sonicscan.org) | +| Sonic SVM | 507150715 | 507150715 | `4MaM9GQZ753NhUcXH1pPsQwof1Mf3ZnjeNF4yx6S3p3N` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=custom&customUrl=https%3A%2F%2Fapi.mainnet-alpha.sonic.game) | +| SOON | 50075007 | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network/) | +| Sophon | 50104 | 50104 | `0x697a90753B7dCf6512189c239E612fC12baaE500` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x03ef761dcfda2295d2f5e7b698df51d380162cbe1cfa5b1f48fba963808f51f1` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0xB2b0A80b2fa3fC9aB1564A4FaF013d4D6084B325` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| svmBNB | 574456 | 574456 | `GzwNZJ2EXUWQCEoV6zoBGLxkdsnjkLvm6zHReMEC2JSA` | [explorer.svmbnbmainnet.soo.network](https://explorer.svmbnbmainnet.soo.network) | +| Swell | 1923 | 1923 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x58CA3F0D65FFd40727cF6Eb2f323151853Ad3D44` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0x64F077915B41479901a23Aa798B30701589C5063` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0x55379421409961Ef129738c24261379ef8A547Df` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0x823500D69D77A52212DC93f8836E9c08581487eE` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0x7fa6009b59F139813eA710dB5496976eE8D80E64` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0x6d6a9bDDea1456673062633b7a4823dB13bDB9fb` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0x86abe4c3493A1eE0Aa42f0231b5594D42aBdA36e` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0x86abe4c3493A1eE0Aa42f0231b5594D42aBdA36e` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0xb3D796584fDeBE2321894eeF31e0C3ec52169C61` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Celestia Testnet | 1297040200 | mocha-4 | `0x726f757465725f706f73745f6469737061746368000000030000000000000000` | N/A | +| Chronicle Yellowstone | 175188 | 175188 | `0x342B5630Ba1C1e4d3048E51Dad208201aF52692c` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0x413c74F3D034dB54A1ecfFbd0Ad74Cb25E59f579` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | N/A | +| Ink Sepolia | 763373 | 763373 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0x0C16e730090cb681460516428c3b2D1BBCB1b647` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Milkyway Testnet | 1162171030 | ceers-2112 | `0x726f757465725f706f73745f6469737061746368000000030000000000000001` | N/A | +| Mode Testnet | 919 | 919 | `0xf83416bA0491C8BC80Dad259Fc7C007bC57Bd766` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0xE1CCB130389f687bf745Dd6dc05E50da17d9ea96` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x36502C6e24C51ba4839c4c4A070aeB52E1adB672` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Paradex Sepolia | 12263410 | 0x505249564154455f534e5f504f54435f5345504f4c4941 | `0x03199cc7c5e3572eff65349a861e3618a91f335b3ec57693867b807fe3d0eb0d` | [voyager.testnet.paradex.trade](https://voyager.testnet.paradex.trade) | +| Plume Testnet | 98867 | 98867 | `0x0b9A4A46f50f91f353B8Aa0F3Ca80E35E253bDd8` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x863E8c26621c52ACa1849C53500606e73BA272F0` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Solana Testnet | 1399811150 | 1399811150 | `75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR` | [explorer.solana.com](https://explorer.solana.com?cluster=testnet) | +| Somnia Testnet | 50312 | 50312 | `0x7d811da36c48cfDc7C445F14252F102bF06E3Fd7` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic SVM Testnet | 15153042 | 15153042 | `6BaTtWPMpWdA6tHqdT2VbogC4XZ9QV5cNCYpBrx6WP7B` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=testnet.v1) | +| Sonic Testnet | 64165 | 64165 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| Starknet Sepolia | 23448591 | 0x534e5f5345504f4c4941 | `0x01eff3a364cb5ec3ebef9267d0cc3ebcb22cb983af981d7c128fc8bad30b6bc2` | [sepolia.voyager.online](https://sepolia.voyager.online) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0x342B5630Ba1C1e4d3048E51Dad208201aF52692c` | N/A | +| Superposition Testnet | 98985 | 98985 | `0x4926a10788306D84202A2aDbd290b7743146Cc17` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Unichain Testnet | 1301 | 1301 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0xE1CCB130389f687bf745Dd6dc05E50da17d9ea96` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/proxyAdmin.mdx b/zh/docs/reference/addresses/deployments/proxyAdmin.mdx new file mode 100644 index 0000000..eab569b --- /dev/null +++ b/zh/docs/reference/addresses/deployments/proxyAdmin.mdx @@ -0,0 +1,177 @@ +--- +title: "ProxyAdmin" +description: "Mainnet 和 Testnet 上的 ProxyAdmin 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x80Cebd56A65e46c474a1A101e89E76C4c51D179c` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x95878Fd41bC26f7045C0b98e381c22f010745A75` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celo | 42220 | 42220 | `0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0xC343A7054838FE9F249D7E3Ec1Fa6f1D108694b8` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Endurance | 648 | 648 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0x5dfcCe8da81B542426211C99fCCfeD647e9AA496` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x6A7398A6a0fB842725afa0A5F1641FC6C9FF89cf` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | N/A | +| Ink | 57073 | 57073 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0x200183De44bf765ECB73cD62A74010EaaBC43146` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x14c3CEee8F431aE947364f43429a98EA89800238` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| Mint | 185 | 185 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Nibiru | 6900 | 6900 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x148CF67B8A242c1360bb2C93fCe203EC4d4f9B56` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0xE047cb95FB3b7117989e911c6afb34771183fC35` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0xC4F7590C5d30BE959225dC75640657954A86b980` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Soneium | 1868 | 1868 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [sonicscan.org](https://sonicscan.org) | +| Sophon | 50104 | 50104 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x0000000000000000000000000000000000000000000000000000000000000000` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0x82825C0884558C9c5A94B545e7563c95aBA49197` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| Swell | 1923 | 1923 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0x72e2A678442Edc65f14476A0E4c94312C0469f4A` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0xA5580D7Af50F3FD869EbEA51e352e2656F8DD5C2` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0xD01274DC164D32F8595bE707F221375E68cE300C` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0x632b4F32d65F7b25B37a27C57dD510f8e4a58Bf9` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | -------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0xfbA0c57A6BA24B5440D3e2089222099b4663B98B` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0x54148470292C24345fb828B003461a9444414517` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x4eDBf5846D973c53AF478cf62aB5bC92807521e3` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0x666a24F62f7A97BA33c151776Eb3D9441a059eB8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0xb12282d2E838Aa5f2A4F9Ee5f624a77b7199A078` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Chronicle Yellowstone | 175188 | 175188 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0x833Dad7FF66884389D5F0cEcba446ffaa7d2837e` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0x54148470292C24345fb828B003461a9444414517` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x378dA02f7dC3c23A8B5ecE32b8056CdF01e8d477` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0x54148470292C24345fb828B003461a9444414517` | N/A | +| Ink Sepolia | 763373 | 763373 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0x2A9E9188C7e76f3345e91fD4650aC654A9FE355C` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Mode Testnet | 919 | 919 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0x54148470292C24345fb828B003461a9444414517` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Plume Testnet | 98867 | 98867 | `0x54148470292C24345fb828B003461a9444414517` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0x97Bbc6bBaFa5Ce3b2FA966c121Af63bD09e940f8` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Somnia Testnet | 50312 | 50312 | `0xD3d062a5dcBA85ae863618d4c264d2358300c283` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic Testnet | 64165 | 64165 | `0x54148470292C24345fb828B003461a9444414517` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0x54148470292C24345fb828B003461a9444414517` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2` | N/A | +| Superposition Testnet | 98985 | 98985 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Tangle Testnet | 3799 | 3799 | `0xF19B75ea28F0f97d3bd267d35F2a8D30A667967C` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools/) | +| Unichain Testnet | 1301 | 1301 | `0x54148470292C24345fb828B003461a9444414517` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/storageGasOracle.mdx b/zh/docs/reference/addresses/deployments/storageGasOracle.mdx new file mode 100644 index 0000000..4201660 --- /dev/null +++ b/zh/docs/reference/addresses/deployments/storageGasOracle.mdx @@ -0,0 +1,174 @@ +--- +title: "StorageGasOracle" +description: "Mainnet 和 Testnet 上的 StorageGasOracle 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------- | -------------------------------------------- | -------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x1cE4d0E16570C362feef85Ce2713555fCbd3dBC7` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x59Bf7c7b458375b1A7c453aE70EaCb376E65CDAF` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0xA376b27212D608324808923Add679A2c9FAFe9Da` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0xD3805207b65d99C075ceA938Fa7c0587026a5DF5` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x3862A9B1aCd89245a59002C2a08658EC1d5690E3` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0x175821F30AdCAA4bbB72Ce98eF76C2E0De2C3f21` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0xb201817dFdd822B75Fa9b595457E6Ee466a7C187` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0xA9Adb480F10547f10202173a49b7F52116304476` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x91d23D603d60445411C06e6443d81395593B7940` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x451dF8AB0936D85526D816f0b4dCaDD934A034A4` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celo | 42220 | 42220 | `0xD9A9966E7dA9a7f0032bF449FB12696a638E673C` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0x5244d3359065C883BDfeEEff5329DE38c0Bd227e` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Endurance | 648 | 648 | `0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0xf8344D85a1429708e0BE6724218E938087e596DF` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0xa2554A53890c0E769e3fa8b9A0b7e72F6A617367` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x4A91738390a3D55CB27c2863e8950c9cD1b89d0e` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x5060eCD5dFAD300A90592C04e504600A7cdcF70b` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0x794Fe7970EE45945b0ad2667f99A5bBc9ddfB5d7` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x4A91738390a3D55CB27c2863e8950c9cD1b89d0e` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0xD0dca420feFda68537695A8D887080eeF4030AF7` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0xBCD18636e5876DFd7AAb5F2B2a5Eb5ca168BA1d8` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0xd766e7C7517f2d0D92754b2fe4aE7AdEf7bDEC3e` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0xEa2Bcee14eA30bbBe3018E5E7829F963230F71C3` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x4A91738390a3D55CB27c2863e8950c9cD1b89d0e` | N/A | +| Ink | 57073 | 57073 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0xA9Adb480F10547f10202173a49b7F52116304476` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x5F954cA945671e48466680eA815727948Ca340ef` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0x3c38fC01159E7BE0685653A0C896eA49F2BAa7c1` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0xf9DbC8776Bc2812c4DBEc45383A1783Ac758Fb55` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0xff72A726Ce261846f2dF6F32113e514b5Ddb0E37` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0xc965292958794f59ec3e9538738dD252873F07CC` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0xE7487b4DF583c63D6841997ab56324D0a825e7F4` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| Mint | 185 | 185 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x794Fe7970EE45945b0ad2667f99A5bBc9ddfB5d7` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x448b7ADB0dA36d41AA2AfDc9d63b97541A7b3819` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Nibiru | 6900 | 6900 | `0xf303B04d9ad21dAe2658Cf302478A424e0B45368` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0xc5068BB6803ADbe5600DE5189fe27A4dAcE31170` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0x7947b7Fe737B4bd1D3387153f32148974066E591` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0x27e88AeB8EA4B159d81df06355Ea3d20bEB1de38` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.orderly.network](https://explorer.orderly.network) | +| Peaq | 3338 | 3338 | `0x4A91738390a3D55CB27c2863e8950c9cD1b89d0e` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0x1e4dE25C3b07c8DF66D4c193693d8B5f3b431d51` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0xA3a24EC5670F1F416AB9fD554FcE2f226AE9D7eB` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x33E0c225A54a0A86E9B267e90A90DE8CBb0fDB8f` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x7947b7Fe737B4bd1D3387153f32148974066E591` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x481171eb1aad17eDE6a56005B7F1aB00C581ef13` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Soneium | 1868 | 1868 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [sonicscan.org](https://sonicscan.org) | +| Sophon | 50104 | 50104 | `0xA1ADFCa9666Bcd68b7b5C8b55e3ecC465DcDfE65` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Story Mainnet | 1514 | 1514 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0xEa2Bcee14eA30bbBe3018E5E7829F963230F71C3` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| Swell | 1923 | 1923 | `0xCDeb368Db32ecCefaf7018e152DA9120565cb572` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0xcF84aa21501483B3D907d16c8102082a0991fC5F` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0x794Fe7970EE45945b0ad2667f99A5bBc9ddfB5d7` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0xe85d65f04D1562f8571d57326d6798e4584aa254` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0x37f4afe769087738f0577A77ffA24abef6fCBF99` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | -------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x8356113754C7aCa297Db3089b89F87CC125499fb` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0xDa5177080f7fC5d9255eB32cC64B9b4e5136A716` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0x36502C6e24C51ba4839c4c4A070aeB52E1adB672` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0x36502C6e24C51ba4839c4c4A070aeB52E1adB672` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0x124EBCBC018A5D4Efe639f02ED86f95cdC3f6498` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x9cA4A31af0f3a8fe2806599467912809D3e17ECB` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Chronicle Yellowstone | 175188 | 175188 | `0xe036768e48Cb0D42811d2bF0748806FCcBfCd670` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0x9667EfF1556A9D092fdbeC09244CB99b677E9D1E` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x9305dE34306886d615B096Bdf23b94a978f6a6c0` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x2b2a158B4059C840c7aC67399B153bb567D06303` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0xce0e13f67399375eF0a7acb741E815145A6AAf67` | N/A | +| Ink Sepolia | 763373 | 763373 | `0xE67CfA164cDa449Ae38a0a09391eF6bCDf8e4e2c` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0x1fe349d93078B26C8c7350A401e2B60f100952F5` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Mode Testnet | 919 | 919 | `0x9450181a7719dAb93483d43a45473Ac2373E25B0` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0xb3D796584fDeBE2321894eeF31e0C3ec52169C61` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0xC5BE013eCE7996Cb8F04FF46ea93c57a04408CD5` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Plume Testnet | 98867 | 98867 | `0xc0Ce04851bF6Ea149fA06bf7a4808c9db81af189` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0xD0680F80F4f947968206806C2598Cbc5b6FE5b03` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0x71775B071F77F1ce52Ece810ce084451a3045FFe` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Somnia Testnet | 50312 | 50312 | `0x83c55cc03cc66aAFE071698F9BE4c51F5b1561c8` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic Testnet | 64165 | 64165 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0xe036768e48Cb0D42811d2bF0748806FCcBfCd670` | N/A | +| Superposition Testnet | 98985 | 98985 | `0xF7561c34f17A32D5620583A3397C304e7038a7F6` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Unichain Testnet | 1301 | 1301 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0xb3D796584fDeBE2321894eeF31e0C3ec52169C61` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/testRecipient.mdx b/zh/docs/reference/addresses/deployments/testRecipient.mdx new file mode 100644 index 0000000..e787a27 --- /dev/null +++ b/zh/docs/reference/addresses/deployments/testRecipient.mdx @@ -0,0 +1,179 @@ +--- +title: "TestRecipient" +description: "Mainnet 和 Testnet 上的 TestRecipient 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0xCDfE1782fDC9E74810D3B69E971d752bC4b4D6E6` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0x783EC5e105234a570eB90f314284E5dBe53bdd90` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0xeF7F4367703cdf4863AD6Be34C1627d8b1C2D67a` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0x2D374F85AE2B80147CffEb34d294ce02d1afd4D8` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0xC49aF4965264FA7BB6424CE37aA06773ad177224` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0x82540c4C1C6956FC4815E583DDc6d88A782E0F3e` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x779B6a921a41ceaFbAE2e2A59B5dFfB951f8C9c8` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x0F9d4704E1Fb25e416042524e594F1cEac6fF597` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celo | 42220 | 42220 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0xE67Dc24970B482579923551Ede52BD35a2858989` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0x2ed6030D204745aC0Cd6be8301C3a63bf14D97Cc` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Endurance | 648 | 648 | `0xD670c00C0Cad3D32436d7cF270e739772314A8CE` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0xa7028308Ff277DB5851a95d82ED5C5256bB721F2` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0xF9aE87E9ACE51aa16AED25Ca38F17D258aECb73f` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0xc8826EA18D9884A1A335b2Cd7d5f44B159084301` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0xF9aE87E9ACE51aa16AED25Ca38F17D258aECb73f` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0xD233433AeC23F8382DAd87D808F60557Ea35399f` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0x4eB0d97B48711950ecB01871125c4523939c6Fce` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x01EBa6D613DC09Cb899aF1e8E8a747416d7250ad` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0x9fE454AA2B01fc7A2a777AE561bc58Ce560CD5a9` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0xF9aE87E9ACE51aa16AED25Ca38F17D258aECb73f` | N/A | +| Ink | 57073 | 57073 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x779B6a921a41ceaFbAE2e2A59B5dFfB951f8C9c8` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0x128Ff1d24665d55f4b77B1FDbb6d8D0Ec4a0c0a1` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x4E1c88DD261BEe2941e6c1814597e30F53330428` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0xc401e251CCa7A364114504A994D6fC7cb1c243AB` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| Mint | 185 | 185 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0xc8826EA18D9884A1A335b2Cd7d5f44B159084301` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Nibiru | 6900 | 6900 | `0xBCD18636e5876DFd7AAb5F2B2a5Eb5ca168BA1d8` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0xdBa3b98DC83fec149c8C8F6617700b9e45937a2b` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x58556AaeB2e3829d52EE5E711D44735412efA43B` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0x76F2cC245882ceFf209A61d75b9F0f1A3b7285fB` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x02ed6a7815eac67136bf8950d91cca4ab1fd3bc98d3852f361f47a6cff6d850f` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0xF9aE87E9ACE51aa16AED25Ca38F17D258aECb73f` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0x8D8979F2C29bA49FAb259A826D0271c43F70288c` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0xD127D4549cb4A5B2781303a4fE99a10EAd13263A` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x83f647970B213675412b76e1cCDB55D0e35365fD` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x76F2cC245882ceFf209A61d75b9F0f1A3b7285fB` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0x674f4698d063cE4C0d604c88dD7D542De72f327f` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Soneium | 1868 | 1868 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [sonicscan.org](https://sonicscan.org) | +| Sophon | 50104 | 50104 | `0xB35eCb9714e8f48332Af22B48C18ca21E2607438` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x07e75bba1a8a48e9246a3a32216a59fba3cb0bec7036610e45787b998b9f7060` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0xcDD89f19b2d00DCB9510BB3fBd5eCeCa761fe5Ab` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0x545E289B88c6d97b74eC0B96e308cae46Bf5f832` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| Swell | 1923 | 1923 | `0xBC53dACd8c0ac0d2bAC461479EAaf5519eCC8853` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x2f4Eb04189e11Af642237Da62d163Ab714614498` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x5fC427653b175F6De5A494DE17d1c7636d7E7965` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x92249B8ed35C2980e58666a3EBF4a075DDD2895f` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0xc8826EA18D9884A1A335b2Cd7d5f44B159084301` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0xC18bE7ac43334F501fd9622877160b085215dECC` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0xD55078c54b0cEAa87Ba5c3fAeAC89861c69F636d` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0x2C6dD6768E669EDB7b53f26067C1C4534862c3de` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0xB6a4129c305056d80fFfea96DdbDCf1F58BC8240` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0xB6a4129c305056d80fFfea96DdbDCf1F58BC8240` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x48a53E3B176383BC98fcF4a24c9D470c19475164` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Chronicle Yellowstone | 175188 | 175188 | `0xcCB305B1f21e5FbC85D1DD7Be5cd8d5bf5B7f863` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0xfc0da0E35Bba1F49318B2207ecaE86eb088dd3Bb` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0x8d4f112cffa338D3c3Ef2Cf443179C5a48E678e4` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0xf83416bA0491C8BC80Dad259Fc7C007bC57Bd766` | N/A | +| Ink Sepolia | 763373 | 763373 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0x5B30De0c322F7720D144df2AB2e82b160Eba0EBF` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Mode Testnet | 919 | 919 | `0xF8E6c1222049AAb68E410E43242449994Cb64996` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0xCCC126d96efcc342BF2781A7d224D3AB1F25B19C` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x3212977FBE6464c2bB60Fdb85ab0a5E06e25cdFB` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0x5e65279Fb7293a058776e37587398fcc3E9184b1` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Paradex Sepolia | 12263410 | 0x505249564154455f534e5f504f54435f5345504f4c4941 | `0x0581bd2065f73576ba98009371de66c8c728977cf8de3b9e40b6ef1a1364132a` | [voyager.testnet.paradex.trade](https://voyager.testnet.paradex.trade) | +| Plume Testnet | 98867 | 98867 | `0x86abe4c3493A1eE0Aa42f0231b5594D42aBdA36e` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Somnia Testnet | 50312 | 50312 | `0x6cB503d97D1c900316583C8D55997A1f17b1ABd1` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0x8d4f112cffa338D3c3Ef2Cf443179C5a48E678e4` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic Testnet | 64165 | 64165 | `0x01812D60958798695391dacF092BAc4a715B1718` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| Starknet Sepolia | 23448591 | 0x534e5f5345504f4c4941 | `0x01c1d7a109c1d67443ec222f65255ce9f5a783a4ad9da2052db5848910a4f18f` | [sepolia.voyager.online](https://sepolia.voyager.online) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0xcCB305B1f21e5FbC85D1DD7Be5cd8d5bf5B7f863` | N/A | +| Superposition Testnet | 98985 | 98985 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Tangle Testnet | 3799 | 3799 | `0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools/) | +| Unichain Testnet | 1301 | 1301 | `0x01812D60958798695391dacF092BAc4a715B1718` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0xCCC126d96efcc342BF2781A7d224D3AB1F25B19C` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/deployments/validatorAnnounce.mdx b/zh/docs/reference/addresses/deployments/validatorAnnounce.mdx new file mode 100644 index 0000000..df8193e --- /dev/null +++ b/zh/docs/reference/addresses/deployments/validatorAnnounce.mdx @@ -0,0 +1,193 @@ +--- +title: "ValidatorAnnounce" +description: "Mainnet 和 Testnet 上的 ValidatorAnnounce 部署" +--- + +## Mainnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| --------------------- | ---------- | ---------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | +| Abstract | 2741 | 2741 | `0x2235662a9a8ED39AE489aafb2feE13Db26f72044` | [abscan.org](https://abscan.org) | +| Aleph Zero EVM | 1000041455 | 41455 | `0x2e542a3DF4fde491faa77da05eD48377aca9E44e` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org) | +| Ancient8 | 888888888 | 888888888 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [scan.ancient8.gg](https://scan.ancient8.gg) | +| ApeChain | 33139 | 33139 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz) | +| AppChain | 466 | 466 | `0x1196055C61af3e3DA6f8458B07b255a72b64Bcf7` | [explorer.appchain.xyz](https://explorer.appchain.xyz) | +| Arbitrum | 42161 | 42161 | `0x1df063280C4166AF9a725e3828b4dAC6c7113B08` | [arbiscan.io](https://arbiscan.io) | +| Arbitrum Nova | 42170 | 42170 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [nova.arbiscan.io](https://nova.arbiscan.io/) | +| Arcadia | 4278608 | 4278608 | `0xEa2Bcee14eA30bbBe3018E5E7829F963230F71C3` | [explorer.arcadia.khalani.network](https://explorer.arcadia.khalani.network) | +| Artela | 11820 | 11820 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [artscan.artela.network](https://artscan.artela.network) | +| Astar | 592 | 592 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [astar.blockscout.com](https://astar.blockscout.com) | +| Astar zkEVM | 3776 | 3776 | `0x59C2dB903937EbE55B59c3415FD55e970FF5f2DC` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com) | +| Aurora | 1313161554 | 1313161554 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev) | +| Avalanche | 43114 | 43114 | `0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f` | [snowtrace.io](https://snowtrace.io) | +| B3 | 8333 | 8333 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.b3.fun](https://explorer.b3.fun) | +| Base | 8453 | 8453 | `0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B` | [basescan.org](https://basescan.org) | +| Berachain | 80094 | 80094 | `0xa377b8269e0A47cdd2fD5AAeAe860b45623c6d82` | [beratrail.io](https://beratrail.io) | +| Bitlayer | 200901 | 200901 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [www.btrscan.com](https://www.btrscan.com) | +| Blast | 81457 | 81457 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [blastscan.io](https://blastscan.io/) | +| BOB | 60808 | 60808 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [explorer.gobob.xyz](https://explorer.gobob.xyz) | +| Boba Mainnet | 288 | 288 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [bobascan.com](https://bobascan.com) | +| Botanix | 3637 | 3637 | `0x466b330C2e360c0214A9Da2428415298f720883E` | [botanixscan.io](https://botanixscan.io) | +| Binance Smart Chain | 56 | 56 | `0x7024078130D9c2100fEA474DAD009C2d1703aCcd` | [bscscan.com](https://bscscan.com) | +| B² Network | 223 | 223 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.bsquared.network](https://explorer.bsquared.network) | +| Celestia | 1128614981 | celestia | `0x68797065726c616e650000000000000000000000000000000000000000000000` | [celenium.io](https://celenium.io) | +| Celo | 42220 | 42220 | `0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1` | [celoscan.io](https://celoscan.io) | +| CheeseChain | 383353 | 383353 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [fetascan.xyz](https://fetascan.xyz) | +| Chiliz | 1000088888 | 88888 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [chiliscan.com](https://chiliscan.com) | +| Core | 1116 | 1116 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [scan.coredao.org](https://scan.coredao.org) | +| Corn | 21000000 | 21000000 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [cornscan.io](https://cornscan.io) | +| Coti | 2632500 | 2632500 | `0xD233433AeC23F8382DAd87D808F60557Ea35399f` | [mainnet.cotiscan.io](https://mainnet.cotiscan.io) | +| Cyber | 7560 | 7560 | `0x062200d92df6bb7ba89ce4d6800110450f94784e` | [cyberscan.co](https://cyberscan.co) | +| Degen | 666666666 | 666666666 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.degen.tips](https://explorer.degen.tips) | +| Dogechain | 2000 | 2000 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [explorer.dogechain.dog](https://explorer.dogechain.dog) | +| Eclipse | 1408864445 | 1408864445 | `Hqnn593pqDZWLy6bKZ4NbY767wFhUNBShDrLktuQa3Q2` | [eclipsescan.xyz](https://eclipsescan.xyz/) | +| Endurance | 648 | 648 | `0x3c7653dD0Ec21A833f99293CDC17495CE249532c` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io) | +| Ethereum | 1 | 1 | `0xCe74905e51497b4adD3639366708b821dcBcff96` | [etherscan.io](https://etherscan.io) | +| Everclear | 25327 | 25327 | `0xC88bAD76EC7acD9fd3b9Bb264f7f5C18097c5710` | [scan.everclear.org](https://scan.everclear.org) | +| Fantom Opera | 250 | 250 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [ftmscan.com](https://ftmscan.com) | +| Flare | 14 | 14 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [flare-explorer.flare.network](https://flare-explorer.flare.network) | +| EVM on Flow | 1000000747 | 747 | `0x5C6699c133A583d389Ba7e0bDD4993e2e63fA804` | [evm.flowscan.io](https://evm.flowscan.io) | +| Fluence | 9999999 | 9999999 | `0x7B8AA8f23Ab6B0757eC6FC71894211376D9335b0` | [blockscout.mainnet.fluence.dev](https://blockscout.mainnet.fluence.dev) | +| Form | 478 | 478 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [explorer.form.network](https://explorer.form.network) | +| Fraxtal | 252 | 252 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [fraxscan.com](https://fraxscan.com) | +| Fuse | 122 | 122 | `0x60bB6D060393D3C206719A7bD61844cC82891cfB` | [explorer.fuse.io](https://explorer.fuse.io) | +| Galactica | 613419 | 613419 | `0x5b1A451c85e5bcCd79A56eb638aBd9998fA215f9` | [galactica-mainnet.explorer.alchemy.com](https://galactica-mainnet.explorer.alchemy.com) | +| Game7 | 2187 | 2187 | `0x7B8AA8f23Ab6B0757eC6FC71894211376D9335b0` | [mainnet.game7.io](https://mainnet.game7.io) | +| Glue | 1300 | 1300 | `0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e` | [explorer.glue.net](https://explorer.glue.net) | +| Gnosis | 100 | 100 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [gnosisscan.io](https://gnosisscan.io) | +| Gravity Alpha Mainnet | 1625 | 1625 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.gravity.xyz](https://explorer.gravity.xyz) | +| Harmony One | 1666600000 | 1666600000 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.harmony.one](https://explorer.harmony.one) | +| Hashkey | 177 | 177 | `0x6c5012B7eDfE317Be53D13Fc730a460f4810e234` | [explorer.hsk.xyz](https://explorer.hsk.xyz) | +| Hemi Network | 43111 | 43111 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [explorer.hemi.xyz](https://explorer.hemi.xyz) | +| HyperEVM | 999 | 999 | `0xf4035357EB3e3B48E498FA6e1207892f615A2c2f` | [hyperliquid.cloud.blockscout.com](https://hyperliquid.cloud.blockscout.com) | +| Immutable zkEVM | 1000013371 | 13371 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [explorer.immutable.com](https://explorer.immutable.com) | +| Injective EVM | 2525 | 2525 | `0x15ab173bDB6832f9b64276bA128659b0eD77730B` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz) | +| Infinity VM | 1032009 | 1032009 | `0x74B2b1fC57B28e11A5bAf32a758bbC98FA7837da` | N/A | +| Infinity VM | 1001032009 | 1032009 | `0x7B8AA8f23Ab6B0757eC6FC71894211376D9335b0` | N/A | +| Injective | 6909546 | injective-1 | `0x1fb225b2fcfbe75e614a1d627de97ff372242eed` | [www.mintscan.io](https://www.mintscan.io/injective) | +| Ink | 57073 | 57073 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.inkonchain.com](https://explorer.inkonchain.com) | +| Kaia | 8217 | 8217 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [kaiascope.com](https://kaiascope.com) | +| Katana | 747474 | 747474 | `0x466b330C2e360c0214A9Da2428415298f720883E` | [explorer.katanarpc.com](https://explorer.katanarpc.com) | +| Linea | 59144 | 59144 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [lineascan.build](https://lineascan.build) | +| Lisk | 1135 | 1135 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [blockscout.lisk.com](https://blockscout.lisk.com) | +| LUKSO | 42 | 42 | `0x3C2b535a49c6827DF0b8e94467e6922c99E3c092` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network) | +| Lumia Prism | 1000073017 | 994873017 | `0x803d2A87429E20d4B52266bF97Ca1c7e4f4F5Dfa` | [explorer.lumia.org](https://explorer.lumia.org) | +| Manta Pacific | 169 | 169 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network) | +| Mantle | 5000 | 5000 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [explorer.mantle.xyz](https://explorer.mantle.xyz) | +| Matchain | 698 | 698 | `0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB` | [matchscan.io](https://matchscan.io) | +| Merlin | 4200 | 4200 | `0xd21192429df453021e896f2897Dc8B1167DD61E5` | [scan.merlinchain.io](https://scan.merlinchain.io) | +| Metal L2 | 1000001750 | 1750 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.metall2.com](https://explorer.metall2.com) | +| Metis Andromeda | 1088 | 1088 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io) | +| MilkyWay | 1835625579 | milkyway | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Mint | 185 | 185 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.mintchain.io](https://explorer.mintchain.io) | +| Miraclechain | 92278 | 92278 | `0x5b1A451c85e5bcCd79A56eb638aBd9998fA215f9` | [explorer.miracleplay.io](https://explorer.miracleplay.io) | +| Mode | 34443 | 34443 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.mode.network](https://explorer.mode.network) | +| Molten | 360 | 360 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz) | +| Moonbeam | 1284 | 1284 | `0x8c1001eBee6F25b31863A55EadfF149aF88B356F` | [moonscan.io](https://moonscan.io) | +| Morph | 2818 | 2818 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.morphl2.io](https://explorer.morphl2.io) | +| Neutron | 1853125230 | neutron-1 | `0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0` | [www.mintscan.io](https://www.mintscan.io/neutron) | +| Nibiru | 6900 | 6900 | `0x4A91738390a3D55CB27c2863e8950c9cD1b89d0e` | [nibiscan.io](https://nibiscan.io) | +| Ontology | 58 | 58 | `0x4e128A1b613A9C9Ecf650FeE461c353612559fcf` | [explorer.ont.io](https://explorer.ont.io/) | +| Oort | 970 | 970 | `0x6f77d5Ef273C38CC19d1d02352785F52565A1A6c` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com) | +| opBNB | 204 | 204 | `0x9fE454AA2B01fc7A2a777AE561bc58Ce560CD5a9` | [opbnb.bscscan.com](https://opbnb.bscscan.com) | +| Optimism | 10 | 10 | `0x30f5b08e01808643221528BB2f7953bf2830Ef38` | [optimistic.etherscan.io](https://optimistic.etherscan.io) | +| Orderly L2 | 291 | 291 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.orderly.network](https://explorer.orderly.network) | +| Paradex | 514051890 | 0x505249564154455f534e5f50415241434c4541525f4d41494e4e4554 | `0x04cc184bc56545c39a71717fc9b62bef3374268d33450095f5b6904788087b68` | [voyager.prod.paradex.trade](https://voyager.prod.paradex.trade) | +| Peaq | 3338 | 3338 | `0x7B8AA8f23Ab6B0757eC6FC71894211376D9335b0` | [peaq.subscan.io](https://peaq.subscan.io/) | +| Plume | 98866 | 98866 | `0xbE58F200ffca4e1cE4D2F4541E94Ae18370fC405` | [explorer.plume.org](https://explorer.plume.org) | +| Polygon | 137 | 137 | `0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5` | [polygonscan.com](https://polygonscan.com) | +| Polygon zkEVM | 1101 | 1101 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com) | +| Polynomial | 1000008008 | 8008 | `0xA166219dF110BDA97b91e65D4BB4Aae4159978b9` | [polynomialscan.io](https://polynomialscan.io) | +| Prom | 227 | 227 | `0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm) | +| Proof of Play Apex | 70700 | 70700 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com) | +| RARI Chain | 1000012617 | 1380012617 | `0x38D361861d321B8B05de200c61B8F18740Daf4D8` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org) | +| Reactive Mainnet | 1597 | 1597 | `0x9fE454AA2B01fc7A2a777AE561bc58Ce560CD5a9` | [reactscan.net](https://reactscan.net) | +| Redstone | 690 | 690 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.redstone.xyz](https://explorer.redstone.xyz) | +| Ronin | 2020 | 2020 | `0xB2b0A80b2fa3fC9aB1564A4FaF013d4D6084B325` | [app.roninchain.com](https://app.roninchain.com) | +| Scroll | 534352 | 534352 | `0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638` | [scrollscan.com](https://scrollscan.com/) | +| Sei | 1329 | 1329 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [seitrace.com](https://seitrace.com) | +| Shibarium | 109 | 109 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [shibariumscan.io](https://shibariumscan.io) | +| SnaxChain | 2192 | 2192 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.snaxchain.io](https://explorer.snaxchain.io) | +| Solana | 1399811149 | 1399811149 | `pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8` | [solscan.io](https://solscan.io) | +| Solaxy | 1936682104 | 1936682104 | `28S9ToSehVxdE7rTGEAA3vAX3AchHJh1MXcq9AeM1rL8` | [explorer.solaxy.io](https://explorer.solaxy.io) | +| Soneium | 1868 | 1868 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [soneium.blockscout.com](https://soneium.blockscout.com) | +| Sonic | 146 | 146 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [sonicscan.org](https://sonicscan.org) | +| Sonic SVM | 507150715 | 507150715 | `4LxdrQjqUzueko4MEn3cYCniEtcAZ6AxuHot2Fp3jskH` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=custom&customUrl=https%3A%2F%2Fapi.mainnet-alpha.sonic.game) | +| SOON | 50075007 | 50075007 | `GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz` | [explorer.soo.network](https://explorer.soo.network/) | +| Sophon | 50104 | 50104 | `0x54E88f2ab58E0Ab4B7Ce081FB20D85b16af041d2` | [explorer.sophon.xyz](https://explorer.sophon.xyz) | +| Starknet | 358974494 | 0x534e5f4d41494e | `0x03bcb0295d31170c5d51f6edce35d5802ce62527e0f15bd8b9f1b979db32e53a` | [voyager.online](https://voyager.online/) | +| Story Mainnet | 1514 | 1514 | `0xB2b0A80b2fa3fC9aB1564A4FaF013d4D6084B325` | [www.storyscan.xyz](https://www.storyscan.xyz) | +| Subtensor | 964 | 964 | `0x8D8979F2C29bA49FAb259A826D0271c43F70288c` | [evm.taostats.io](https://evm.taostats.io) | +| Superposition | 1000055244 | 55244 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [explorer.superposition.so](https://explorer.superposition.so/) | +| Superseed | 5330 | 5330 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [explorer.superseed.xyz](https://explorer.superseed.xyz) | +| svmBNB | 574456 | 574456 | `Gh4LUk91bj4QGYWsBY4QyDGhs68n8Maf8oeTRZoQZAEf` | [explorer.svmbnbmainnet.soo.network](https://explorer.svmbnbmainnet.soo.network) | +| Swell | 1923 | 1923 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io) | +| TAC | 239 | 239 | `0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8` | [explorer.tac.build](https://explorer.tac.build) | +| Taiko | 167000 | 167000 | `0x01aE937A7B05d187bBCBE80F44F41879D3D335a4` | [taikoscan.io](https://taikoscan.io) | +| Tangle | 5845 | 5845 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.tangle.tools](https://explorer.tangle.tools) | +| Torus | 21000 | 21000 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [blockscout.torus.network](https://blockscout.torus.network) | +| Unichain | 130 | 130 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [uniscan.xyz](https://uniscan.xyz) | +| Vana | 1480 | 1480 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [vanascan.io](https://vanascan.io) | +| Viction | 88 | 88 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [www.vicscan.xyz](https://www.vicscan.xyz) | +| World Chain | 480 | 480 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [worldscan.org](https://worldscan.org) | +| Xai | 660279 | 660279 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.xai-chain.net](https://explorer.xai-chain.net) | +| XLayer | 196 | 196 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [www.oklink.com](https://www.oklink.com/xlayer) | +| XRPL EVM | 1440000 | 1440000 | `0x5b1A451c85e5bcCd79A56eb638aBd9998fA215f9` | [explorer.xrplevm.org](https://explorer.xrplevm.org) | +| Zero Network | 543210 | 543210 | `0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app) | +| ZetaChain | 7000 | 7000 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.zetachain.com](https://explorer.zetachain.com) | +| Zircuit | 48900 | 48900 | `0x5366362c41e34869BDa231061603E4356D66079D` | [explorer.zircuit.com](https://explorer.zircuit.com) | +| zkSync | 324 | 324 | `0x576aF402c97bFE452Dcc203B6c3f6F4EBC92A0f5` | [explorer.zksync.io](https://explorer.zksync.io) | +| Zora | 7777777 | 7777777 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.zora.energy](https://explorer.zora.energy) | + +## Testnet + +| Chain | Domain ID | Chain ID | Address | Explorer | +| ------------------------- | ---------- | ------------------------------------------------ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Abstract Testnet | 11124 | 11124 | `0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz) | +| Aleph Zero EVM Testnet | 2039 | 2039 | `0xBF2C366530C1269d531707154948494D3fF4AcA7` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org) | +| Alfajores | 44787 | 44787 | `0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0` | [explorer.celo.org](https://explorer.celo.org/alfajores) | +| Arbitrum Sepolia | 421614 | 421614 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io) | +| Arcadia Testnet v2 | 1098411886 | 1098411886 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [explorer.khalani.network](https://explorer.khalani.network) | +| Aurora Testnet | 1313161555 | 1313161555 | `0x711166cE892CBa0Fc01FdD74cFBE73b027678e15` | [explorer.testnet.aurora.dev](https://explorer.testnet.aurora.dev) | +| Basecamp Testnet | 1000001114 | 123420001114 | `0xe63844Ca06Ce8E6D4097Cb33E9b3d62704122307` | [basecamp.cloud.blockscout.com](https://basecamp.cloud.blockscout.com) | +| Base Sepolia | 84532 | 84532 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia.basescan.org](https://sepolia.basescan.org) | +| Berachain Bepolia | 80069 | 80069 | `0xe63844Ca06Ce8E6D4097Cb33E9b3d62704122307` | [bepolia.beratrail.io](https://bepolia.beratrail.io) | +| BSC Testnet | 97 | 97 | `0xf09701B0a93210113D175461b6135a96773B5465` | [testnet.bscscan.com](https://testnet.bscscan.com) | +| CarrChain Testnet | 76672 | 76672 | `0x4da6f7E710137657008D5BCeF26151aac5c9884f` | [testnet.carrscan.io](https://testnet.carrscan.io) | +| Celestia Testnet | 1297040200 | mocha-4 | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Chronicle Yellowstone | 175188 | 175188 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | [yellowstone-explorer.litprotocol.com](https://yellowstone-explorer.litprotocol.com) | +| Citrea Testnet | 5115 | 5115 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz) | +| Coti Testnet | 7082400 | 7082400 | `0x6202f54B22b72526dEC5364F6b7bE2bd0abEd8A6` | [testnet.cotiscan.io](https://testnet.cotiscan.io) | +| Eco Testnet | 471923 | 471923 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz/) | +| Flame Dawn-1 Testnet | 1660473773 | 16604737732183 | `0xB589407cf6bEA5CD81AD0946b9F1467933ede74c` | [explorer.flame.dawn-1.astria.org](https://explorer.flame.dawn-1.astria.org) | +| Form Testnet | 132902 | 132902 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network) | +| Fuji | 43113 | 43113 | `0x4f7179A691F8a684f56cF7Fed65171877d30739a` | [testnet.snowtrace.io](https://testnet.snowtrace.io) | +| Holesky | 17000 | 17000 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [holesky.etherscan.io](https://holesky.etherscan.io) | +| Hyperliquid EVM Testnet | 998 | 998 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance) | +| Infinity VM Monza Testnet | 96025 | 96025 | `0x17866ebE0e503784a9461d3e753dEeD0d3F61153` | N/A | +| Ink Sepolia | 763373 | 763373 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com) | +| MegaETH Testnet | 6342 | 6342 | `0xf3e31239257b300Daa566131aA6b9e45Ef2A4266` | [www.megaexplorer.xyz](https://www.megaexplorer.xyz) | +| Milkyway Testnet | 1162171030 | ceers-2112 | `0x68797065726c616e650000000000000000000000000000000000000000000000` | N/A | +| Mode Testnet | 919 | 919 | `0x6AD4DEBA8A147d000C09de6465267a9047d1c217` | [testnet.modescan.io](https://testnet.modescan.io) | +| Monad Testnet | 10143 | 10143 | `0xA9999B4abC373FF2BB95B8725FABC96CA883d811` | [explorer.monad-testnet.category.xyz](https://explorer.monad-testnet.category.xyz) | +| Neura Testnet | 267 | 267 | `0x6202f54B22b72526dEC5364F6b7bE2bd0abEd8A6` | [testnet-blockscout.infra.neuraprotocol.io](https://testnet-blockscout.infra.neuraprotocol.io) | +| Odyssey Testnet | 911867 | 911867 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz) | +| Optimism Sepolia | 11155420 | 11155420 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io) | +| Paradex Sepolia | 12263410 | 0x505249564154455f534e5f504f54435f5345504f4c4941 | `0x03606e11cfdec0745e8c49cf3179df9b4c37528baf0131ae1ec079055a7cab0b` | [voyager.testnet.paradex.trade](https://voyager.testnet.paradex.trade) | +| Plume Testnet | 98867 | 98867 | `0xF8E6c1222049AAb68E410E43242449994Cb64996` | [testnet-explorer.plume.org](https://testnet-explorer.plume.org) | +| Polygon Amoy | 80002 | 80002 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [amoy.polygonscan.com](https://amoy.polygonscan.com) | +| Scroll Sepolia | 534351 | 534351 | `0x527768930D889662Fe7ACF64294871e86e4C2381` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev/) | +| Sepolia | 11155111 | 11155111 | `0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9` | [sepolia.etherscan.io](https://sepolia.etherscan.io) | +| Solana Testnet | 1399811150 | 1399811150 | `8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3` | [explorer.solana.com](https://explorer.solana.com?cluster=testnet) | +| Somnia Testnet | 50312 | 50312 | `0x0b9A4A46f50f91f353B8Aa0F3Ca80E35E253bDd8` | [shannon-explorer.somnia.network](https://shannon-explorer.somnia.network) | +| Soneium Minato Testnet | 1946 | 1946 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org) | +| Sonic Blaze Testnet | 57054 | 57054 | `0xB589407cf6bEA5CD81AD0946b9F1467933ede74c` | [testnet.sonicscan.org](https://testnet.sonicscan.org) | +| Sonic SVM Testnet | 15153042 | 15153042 | `84NjUotjZcNBVGBhvwERPNS6zaAfhkJkG33aSiNxPma2` | [explorer.sonic.game](https://explorer.sonic.game/?cluster=testnet.v1) | +| Sonic Testnet | 64165 | 64165 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [testnet.soniclabs.com](https://testnet.soniclabs.com) | +| Starknet Sepolia | 23448591 | 0x534e5f5345504f4c4941 | `0x06587686d7270349bf233976265fa6bd53d73c9f13b5fc916f541ad9b297dce8` | [sepolia.voyager.online](https://sepolia.voyager.online) | +| SUAVE Toliman Testnet | 33626250 | 33626250 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net) | +| Subtensor Testnet | 945 | 945 | `0x8584590ad637C61C7cDF72eFF3381Ee1c3D1bC8E` | N/A | +| Superposition Testnet | 98985 | 98985 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so) | +| Tangle Testnet | 3799 | 3799 | `0x6D35A0f235aa0fBf0163C8b5171eF6E55843849b` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools/) | +| Unichain Testnet | 1301 | 1301 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com) | +| Load Network Alphanet | 9496 | 9496 | `0xA9999B4abC373FF2BB95B8725FABC96CA883d811` | [explorer.load.network](https://explorer.load.network) | diff --git a/zh/docs/reference/addresses/validators/latencies.mdx b/zh/docs/reference/addresses/validators/latencies.mdx new file mode 100644 index 0000000..b5209b4 --- /dev/null +++ b/zh/docs/reference/addresses/validators/latencies.mdx @@ -0,0 +1,204 @@ +--- +title: "延迟" +--- + +Validator 必须等待一定数量的区块被挖出后才被视为有效和[防重组](https://www.alchemy.com/overviews/what-is-a-reorg)。如果没有这个机制,validator 可能会被惩罚,因为他们可能签署了一个不再有效的检查点。 + +有关 Hyperlane validator 使用的区块最终性配置,请参阅以下部分。 + + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| --------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract | 2741 | 0 | 1 | +| Aleph Zero EVM | 1000041455 | 5 | 3 | +| Ancient8 | 888888888 | 5 | 2 | +| ApeChain | 33139 | 5 | 0.2 | +| AppChain | 466 | 0 | 2 | +| Arbitrum | 42161 | 5 | 0.25 | +| Arbitrum Nova | 42170 | 5 | 2 | +| Arcadia | 4278608 | 5 | 2 | +| Artela | 11820 | 5 | 2 | +| Astar | 592 | finalized | 13 | +| Astar zkEVM | 3776 | 5 | 3 | +| Aurora | 1313161554 | 5 | 1 | +| Avalanche | 43114 | 3 | 2 | +| B3 | 8333 | 5 | 1 | +| Base | 8453 | 10 | 2 | +| Berachain | 80094 | 5 | 2 | +| Bitlayer | 200901 | 20 | 3 | +| Blast | 81457 | 5 | 2 | +| BOB | 60808 | 5 | 2 | +| Boba Mainnet | 288 | 5 | 2 | +| Botanix | 3637 | 5 | 6 | +| Binance Smart Chain | 56 | finalized | 3 | +| B² Network | 223 | 5 | 3 | +| Celestia | 1128614981 | 1 | 6 | +| Celo | 42220 | 5 | 1 | +| CheeseChain | 383353 | 1 | 30 | +| Chiliz | 1000088888 | 9 | 3 | +| Core | 1116 | 21 | 3 | +| Corn | 21000000 | 5 | 20 | +| Coti | 2632500 | 5 | 5 | +| Cyber | 7560 | 5 | 2 | +| Degen | 666666666 | 5 | 10 | +| Dogechain | 2000 | 5 | 2 | +| Eclipse | 1408864445 | 0 | 0.4 | +| Endurance | 648 | 15 | 12 | +| Ethereum | 1 | 15 | 13 | +| Everclear | 25327 | 2 | 2 | +| Fantom Opera | 250 | 5 | 2 | +| Flare | 14 | 3 | 2 | +| EVM on Flow | 1000000747 | 25 | 1 | +| Fluence | 9999999 | 5 | 1 | +| Form | 478 | 5 | 2 | +| Fraxtal | 252 | 5 | 2 | +| Fuse | 122 | 19 | 5 | +| Galactica | 613419 | 0 | 1 | +| Game7 | 2187 | 0 | 5 | +| Glue | 1300 | 5 | 6 | +| Gnosis | 100 | 5 | 5 | +| Gravity Alpha Mainnet | 1625 | 5 | 1 | +| Harmony One | 1666600000 | 5 | 2 | +| Hashkey | 177 | 5 | 2 | +| Hemi Network | 43111 | 5 | 12 | +| HyperEVM | 999 | 5 | 2 | +| Immutable zkEVM | 1000013371 | 20 | 2 | +| Injective EVM | 2525 | 3 | 3 | +| Infinity VM | 1032009 | 1 | 1 | +| Infinity VM | 1001032009 | 1 | 1 | +| Injective | 6909546 | 10 | 1 | +| Ink | 57073 | 5 | 1 | +| Kaia | 8217 | 5 | 1 | +| Katana | 747474 | 5 | 1 | +| Linea | 59144 | 5 | 3 | +| Lisk | 1135 | 5 | 2 | +| LUKSO | 42 | 15 | 12 | +| Lumia Prism | 1000073017 | 5 | 4 | +| Manta Pacific | 169 | 5 | 3 | +| Mantle | 5000 | 2 | 2 | +| Matchain | 698 | 5 | 1 | +| Merlin | 4200 | 5 | 3 | +| Metal L2 | 1000001750 | 5 | 2 | +| Metis Andromeda | 1088 | 5 | 5 | +| MilkyWay | 1835625579 | 1 | 6 | +| Mint | 185 | 5 | 2 | +| Miraclechain | 92278 | 0 | 3 | +| Mode | 34443 | 5 | 2 | +| Molten | 360 | 0 | 30 | +| Moonbeam | 1284 | finalized | 12 | +| Morph | 2818 | 5 | 4 | +| Neutron | 1853125230 | 1 | 3 | +| Nibiru | 6900 | 5 | 2 | +| Ontology | 58 | 5 | 1 | +| Oort | 970 | 0 | 2 | +| opBNB | 204 | 5 | 1 | +| Optimism | 10 | 10 | 2 | +| Orderly L2 | 291 | 5 | 2 | +| Paradex | 514051890 | 1 | 30 | +| Peaq | 3338 | finalized | 6 | +| Plume | 98866 | 0 | 2 | +| Polygon | 137 | finalized | 2 | +| Polygon zkEVM | 1101 | 5 | 10 | +| Polynomial | 1000008008 | 5 | 2 | +| Prom | 227 | 5 | 6 | +| Proof of Play Apex | 70700 | 5 | 1 | +| RARI Chain | 1000012617 | 0 | 30 | +| Reactive Mainnet | 1597 | 5 | 7 | +| Redstone | 690 | 5 | 2 | +| Ronin | 2020 | 5 | 3 | +| Scroll | 534352 | 17 | 3 | +| Sei | 1329 | 1 | 1 | +| Shibarium | 109 | finalized | 5 | +| SnaxChain | 2192 | 5 | 2 | +| Solana | 1399811149 | 0 | 0.4 | +| Solaxy | 1936682104 | 0 | 1.2 | +| Soneium | 1868 | 5 | 2 | +| Sonic | 146 | 5 | 2 | +| Sonic SVM | 507150715 | 0 | 0.4 | +| SOON | 50075007 | 0 | 0.05 | +| Sophon | 50104 | 0 | 1 | +| Starknet | 358974494 | 1 | 30 | +| Story Mainnet | 1514 | 5 | 3 | +| Subtensor | 964 | 5 | 12 | +| Superposition | 1000055244 | 0 | 60 | +| Superseed | 5330 | 5 | 2 | +| svmBNB | 574456 | 0 | 0.4 | +| Swell | 1923 | 5 | 2 | +| TAC | 239 | 5 | 1 | +| Taiko | 167000 | 5 | 12 | +| Tangle | 5845 | finalized | 6 | +| Torus | 21000 | finalized | 8 | +| Unichain | 130 | 5 | 1 | +| Vana | 1480 | 5 | 6 | +| Viction | 88 | 3 | 2 | +| World Chain | 480 | 5 | 2 | +| Xai | 660279 | 5 | 1 | +| XLayer | 196 | 5 | 10 | +| XRPL EVM | 1440000 | 5 | 6 | +| Zero Network | 543210 | 0 | 1 | +| ZetaChain | 7000 | 0 | 6 | +| Zircuit | 48900 | 5 | 2 | +| zkSync | 324 | 0 | 1 | +| Zora | 7777777 | 5 | 2 | + + + + + +| Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | +| ------------------------- | ---------- | --------------------- | ------------------------------ | +| Abstract Testnet | 11124 | 0 | 1 | +| Aleph Zero EVM Testnet | 2039 | 5 | 3 | +| Alfajores | 44787 | 0 | 5 | +| Arbitrum Sepolia | 421614 | 0 | 3 | +| Arcadia Testnet v2 | 1098411886 | 1 | 1 | +| Aurora Testnet | 1313161555 | 1 | 1 | +| Basecamp Testnet | 1000001114 | 1 | 1 | +| Base Sepolia | 84532 | 1 | 2 | +| Berachain Bepolia | 80069 | 5 | 2 | +| BSC Testnet | 97 | 9 | 3 | +| CarrChain Testnet | 76672 | 0 | 1 | +| Celestia Testnet | 1297040200 | 1 | 6 | +| Chronicle Yellowstone | 175188 | 0 | 1 | +| Citrea Testnet | 5115 | 1 | 2 | +| Coti Testnet | 7082400 | 1 | 5 | +| Eco Testnet | 471923 | 0 | 1 | +| Flame Dawn-1 Testnet | 1660473773 | 1 | 2 | +| Form Testnet | 132902 | 1 | 2 | +| Fuji | 43113 | 3 | 2 | +| Holesky | 17000 | 2 | 13 | +| Hyperliquid EVM Testnet | 998 | 1 | 2 | +| Infinity VM Monza Testnet | 96025 | 1 | 1 | +| Ink Sepolia | 763373 | 1 | 1 | +| MegaETH Testnet | 6342 | 1 | 1 | +| Milkyway Testnet | 1162171030 | 1 | 6 | +| Mode Testnet | 919 | 1 | 2 | +| Monad Testnet | 10143 | 1 | 1 | +| Neura Testnet | 267 | 0 | 2 | +| Odyssey Testnet | 911867 | 1 | 1 | +| Optimism Sepolia | 11155420 | 0 | 2 | +| Paradex Sepolia | 12263410 | 1 | 30 | +| Plume Testnet | 98867 | 0 | 2 | +| Polygon Amoy | 80002 | 10 | 2 | +| Scroll Sepolia | 534351 | 1 | 3 | +| Sepolia | 11155111 | 2 | 13 | +| Solana Testnet | 1399811150 | 0 | 0.4 | +| Somnia Testnet | 50312 | 1 | 1 | +| Soneium Minato Testnet | 1946 | 1 | 2 | +| Sonic Blaze Testnet | 57054 | 1 | 1 | +| Sonic SVM Testnet | 15153042 | 0 | 0.4 | +| Sonic Testnet | 64165 | 1 | 1 | +| Starknet Sepolia | 23448591 | 1 | 30 | +| SUAVE Toliman Testnet | 33626250 | 1 | 4 | +| Subtensor Testnet | 945 | 1 | 12 | +| Superposition Testnet | 98985 | 1 | 1 | +| Tangle Testnet | 3799 | 0 | 6 | +| Unichain Testnet | 1301 | 1 | 1 | +| Load Network Alphanet | 9496 | 1 | 2 | + + + + diff --git a/zh/docs/reference/addresses/validators/mainnet-default-ism-validators.mdx b/zh/docs/reference/addresses/validators/mainnet-default-ism-validators.mdx new file mode 100644 index 0000000..19cb157 --- /dev/null +++ b/zh/docs/reference/addresses/validators/mainnet-default-ism-validators.mdx @@ -0,0 +1,1309 @@ +--- +title: "Mainnet" +description: "Mainnet 链的默认 ISM validator 配置" +--- + +## Abstract (2741) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2ef8ece5b51562e65970c7d36007baa43a1de685` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Aleph Zero EVM (1000041455) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x33f20e6e775747d60301c6ea1c50e51f0389740c` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Aleph Zero | `0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa` | + +## Ancient8 (888888888) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbb5842ae0e05215b53df4787a29144efb7e67551` | +| Coin98 | `0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969` | +| Ancient8 | `0x95c7bf235837cb5a609fe6c95870410b9f68bcff` | + +## ApeChain (33139) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## AppChain (466) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Arbitrum (42161) + +Threshold: 3 of 5 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1` | +| DSRV | `0xec68258a7c882ac2fc46b81ce80380054ffb4ef2` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | + +## Arbitrum Nova (42170) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd2a5e9123308d187383c87053811a2c21bd8af1f` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Arcadia (4278608) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xe16ee9618f138cc2dcf9f9a95462099a8bf33a38` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Artela (11820) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x8fcc1ebd4c0b463618db13f83e4565af3e166b00` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Astar (592) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x4d1b2cade01ee3493f44304653d8e352c66ec3e7` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Aurora (1313161554) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Avalanche (43114) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x3fb8263859843bffb02950c492d492cae169f4cf` | +| DSRV | `0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | + +## B3 (8333) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd77b516730a836fc41934e7d5864e72c165b934e` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Base (8453) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9` | +| Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| DSRV | `0xcff391b4e516452d424db66beb9052b041a9ed79` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | + +## Berachain (80094) + +Threshold: 3 of 5 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x0190915c55d9c7555e6d2cb838f04d18b5e2260e` | +| Luganodes | `0xa7341aa60faad0ce728aa9aeb67bb880f55e4392` | +| Renzo | `0xae09cb3febc4cad59ef5a56c1df741df4eb1f4b6` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Bitlayer (200901) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | + +## Blast (81457) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf20c0b09f597597c8d2430d3d72dfddaf09177d1` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Everclear | `0x1652d8ba766821cf01aeea34306dfc1cab964a32` | +| Renzo | `0x54bb0036f777202371429e062fe6aee0d59442f9` | + +## BOB (60808) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x20f283be1eb0e81e22f51705dcb79883cfdd34aa` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Boba Mainnet (288) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xebeb92c94ca8408e73aa16fd554cb3a7df075c59` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Binance Smart Chain (56) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x570af9b7b36568c8877eebba6c6727aa9dab7268` | +| DSRV | `0x8292b1a53907ece0f76af8a50724e9492bcdc8a3` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## B² Network (223) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xcadc90933c9fbe843358a4e70e46ad2db78e28aa` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Celo (42220) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x63478422679303c3e4fc611b771fa4a707ef7f4a` | +| Imperator | `0xeb0c31e2f2671d724a2589d4a8eca91b97559148` | +| Enigma | `0x033e391e9fc57a7b5dd6c91b69be9a1ed11c4986` | +| Luganodes | `0x4a2423ef982b186729e779b6e54b0e84efea7285` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## CheeseChain (383353) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x478fb53c6860ae8fc35235ba0d38d49b13128226` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | + +## Chiliz (1000088888) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Core (1116) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbd6e158a3f5830d99d7d2bce192695bc4a148de2` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Corn (21000000) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xc80b2e3e38220e02d194a0effa9d5bfe89894c07` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Coti (2632500) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x3c89379537f8beafc54e7e8ab4f8a1cf7974b9f0` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Cyber (7560) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x94d7119ceeb802173b6924e6cc8c4cd731089a27` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Degen (666666666) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x433e311f19524cd64fb2123ad0aa1579a4e1fc83` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Dogechain (2000) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xe43f742c37858746e6d7e458bc591180d0cba440` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Eclipse (1408864445) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0` | +| Luganodes | `0x3571223e745dc0fcbdefa164c9b826b90c0d2dac` | +| Imperator | `0xea83086a62617a7228ce4206fae2ea8b0ab23513` | +| Eclipse | `0x4d4629f5bfeabe66edc7a78da26ef5273c266f97` | + +## Endurance (648) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x28c5b322da06f184ebf68693c5d19df4d4af13e5` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Fusionist | `0x7419021c0de2772b763e554480158a82a291c1f2` | + +## Ethereum (1) + +Threshold: 6 of 9 + +| Operator | Address | +| -------------- | -------------------------------------------- | +| Abacus Works | `0x03c842db86a6a3e524d4a6615390c1ea8e2b9541` | +| DSRV | `0x94438a7de38d4548ae54df5c6010c4ebc5239eae` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | +| AVS: Luganodes | `0xb683b742b378632a5f73a2a5a45801b3489bba44` | +| AVS: Pier Two | `0xbf1023eff3dba21263bf2db2add67a0d6bcda2de` | +| P2P | `0x5d7442439959af11172bf92d9a8d21cf88d136e3` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | + +## Everclear (25327) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Everclear | `0xD79DFbF56ee2268f061cc613027a44A880f61Ba2` | + +## Fantom Opera (250) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa779572028e634e16f26af5dfd4fa685f619457d` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Flare (14) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb65e52be342dba3ab2c088ceeb4290c744809134` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## EVM on Flow (1000000747) + +Threshold: 3 of 4 + +| Operator | Address | +| --------------- | -------------------------------------------- | +| Abacus Works | `0xe132235c958ca1f3f24d772e5970dd58da4c0f6e` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Flow Foundation | `0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59` | + +## Fluence (9999999) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xabc8dd7594783c90a3c0fb760943f78c37ea6d75` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Form (478) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x58554b2e76167993b5fc000d0070a2f883cd333a` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Fraxtal (252) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | +| Enigma | `0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82` | +| Imperator | `0x573e960e07ad74ea2c5f1e3c31b2055994b12797` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Luganodes | `0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91` | + +## Fuse (122) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9` | +| Fuse | `0x1FE988A1A20cE4141B2081fF8446DA99e11D61d7` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | + +## Game7 (2187) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x691dc4e763514df883155df0952f847b539454c0` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Glue (1300) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbe2ded12f7b023916584836506677ea89a0b6924` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Gnosis (100) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd4df66a859585678f2ea8357161d896be19cc1ca` | +| DSRV | `0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | + +## Gravity Alpha Mainnet (1625) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x23d549bf757a02a6f6068e9363196ecd958c974e` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Harmony One (1666600000) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd677803a67651974b1c264171b5d7ca8838db8d5` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Hashkey (177) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x55007cab8788cdba22844e7a2499cf43347f487a` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Hemi Network (43111) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x312dc72c17d01f3fd0abd31dd9b569bc473266dd` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## HyperEVM (999) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x01be14a9eceeca36c9c1d46c056ca8c87f77c26f` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Imperator | `0x36f2bd8200ede5f969d63a0a28e654392c51a193` | + +## Immutable zkEVM (1000013371) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbdda85b19a5efbe09e52a32db1a072f043dd66da` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Injective EVM (2525) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf9e35ee88e4448a3673b4676a4e153e3584a08eb` | +| Decentrio | `0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc` | +| Imperator | `0x9ab11f38a609940153850df611c9a2175dcffe0f` | + +## Infinity VM (1001032009) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x777c19c87aaa625486dff5aab0a479100f4249ad` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Injective (6909546) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbfb8911b72cfb138c7ce517c57d9c691535dc517` | +| Decentrio | `0xd6f6dee54443632490eddc82680d8917544bcb5a` | +| Imperator | `0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9` | + +## Ink (57073) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb533b8b104522958b984fb258e0684dec0f1a6a5` | +| Imperator | `0xd207a6dfd887d91648b672727ff1aef6223cb15a` | +| Enigma | `0xa40203b5301659f1e201848d92f5e81f64f206f5` | +| Luganodes | `0xff9c1e7b266a36eda0d9177d4236994d94819dc0` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Kaia (8217) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9de0b3abb221d19719882fa4d61f769fdc2be9a4` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Linea (59144) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xf2d5409a59e0f5ae7635aff73685624904a77d94` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | + +## Lisk (1135) + +Threshold: 4 of 7 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | +| Enigma | `0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e` | +| Imperator | `0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Luganodes | `0xf0da628f3fb71652d48260bad4691054045832ce` | +| Lisk | `0xead4141b6ea149901ce4f4b556953f66d04b1d0c` | + +## LUKSO (42) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa5e953701dcddc5b958b5defb677a829d908df6d` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | + +## Lumia Prism (1000073017) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb69731640ffd4338a2c9358a935b0274c6463f85` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Manta Pacific (169) + +Threshold: 5 of 7 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0x8e668c97ad76d0e28375275c41ece4972ab8a5bc` | +| Cosmostation | `0x521a3e6bf8d24809fde1c1fd3494a859a16f132c` | +| P2P | `0x14025fe092f5f8a401dd9819704d9072196d2125` | +| Neutron | `0x25b9a0961c51e74fd83295293bc029131bf1e05a` | +| Cosmos Spaces | `0xa0eE95e280D46C14921e524B075d0C341e7ad1C8` | +| DSRV | `0xcc9a0b6de7fe314bd99223687d784730a75bb957` | +| SG-1 | `0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf` | + +## Mantle (5000) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | + +## Matchain (698) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x8a052f7934b0626105f34f980c875ec03aaf82e8` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Merlin (4200) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Metal L2 (1000001750) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd9f7f1a05826197a93df51e86cefb41dfbfb896a` | +| Imperator | `0x01e3909133d20c05bbc94247769235d30101f748` | +| Enigma | `0xaba06266f47e3ef554d218b879bd86114a8dabd4` | +| Luganodes | `0x05d91f80377ff5e9c6174025ffaf094c57a4766a` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Metis Andromeda (1088) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xc4a3d25107060e800a43842964546db508092260` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | + +## MilkyWay (1835625579) + +Threshold: 3 of 5 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9985e0c6df8e25b655b46a317af422f5e7756875` | +| Nodes.Guru | `0x55010624d5e239281d0850dc7915b78187e8bc0e` | +| B-Harvest | `0x9ecf299947b030f9898faf328e5edbf77b13e974` | +| DSRV | `0x56fa9ac314ad49836ffb35918043d6b2dec304fb` | +| CryptoCrew | `0xb69c0d1aacd305edeca88b482b9dd9657f3a8b5c` | + +## Mint (185) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mint | `0x0230505530b80186f8cdccfaf9993eb97aebe98a` | + +## Miraclechain (92278) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0x8fc655174e99194399822ce2d3a0f71d9fc2de7b` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Miracle Chain | `0x7e592830cc7b26b428eea0297889e195f8438016` | + +## Mode (34443) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | +| Enigma | `0x65C140e3a05F33192384AffEF985696Fe3cDDE42` | +| Imperator | `0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Luganodes | `0x485a4f0009d9afbbf44521016f9b8cdd718e36ea` | + +## Molten (360) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Moonbeam (1284) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2225e2f4e9221049456da93b71d2de41f3b6b2a8` | +| DSRV | `0x645428d198d2e76cbd9c1647f5c80740bb750b97` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | + +## Morph (2818) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x4884535f393151ec419add872100d352f71af380` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Neutron (1853125230) + +Threshold: 4 of 7 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0` | +| Cosmostation | `0xb65438a014fb05fbadcfe35bc6e25d372b6ba460` | +| P2P | `0x42fa752defe92459370a052b6387a87f7de9b80c` | +| Neutron | `0xc79503a3e3011535a9c60f6d21f76f59823a38bd` | +| DSRV | `0x47aa126e05933b95c5eb90b26e6b668d84f4b25a` | +| Cosmos Spaces | `0x54b2cca5091b098a1a993dec03c4d1ee9af65999` | +| SG-1 | `0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf` | + +## Nibiru (6900) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xba9779d84a8efba1c6bc66326d875c3611a24b24` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Ontology (58) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2578b0a330c492e1a1682684e27e6a93649befd5` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Ontology | `0x69bbf7d6d8ebf9d60da9607722e8f9c1b0ce7520` | + +## Oort (970) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Oort | `0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1` | + +## opBNB (204) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x1bdf52749ef2411ab9c28742dea92f209e96c9c4` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Optimism (10) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x20349eadc6c72e94ce38268b96692b1a5c20de4f` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | +| Enigma | `0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB` | +| Imperator | `0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Luganodes | `0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12` | + +## Orderly L2 (291) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Peaq (3338) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7f7fe70b676f65097e2a1e2683d0fc96ea8fea49` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Plume (98866) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x63c9b5ea28710d956a51f0f746ee8df81215663f` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Polygon (137) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac` | +| DSRV | `0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | + +## Polygon zkEVM (1101) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x86f2a44592bb98da766e880cfd70d3bbb295e61a` | +| DSRV | `0x865818fe1db986036d5fd0466dcd462562436d1a` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | + +## Polynomial (1000008008) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x23d348c2d365040e56f3fee07e6897122915f513` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Prom (227) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb0c4042b7c9a95345be8913f4cdbf4043b923d98` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Proof of Play Apex (70700) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xcda40baa71970a06e5f55e306474de5ca4e21c3b` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## RARI Chain (1000012617) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xeac012df7530720dd7d6f9b727e4fe39807d1516` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Reactive Mainnet (1597) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x45768525f6c5ca2e4e7cc50d405370eadee2d624` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Redstone (690) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x1400b9737007f7978d8b4bbafb4a69c83f0641a7` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | + +## Ronin (2020) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xa3e11929317e4a871c3d47445ea7bb8c4976fd8a` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | + +## Scroll (534352) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xad557170a9f2f21c35e03de07cb30dcbcc3dff63` | +| Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| DSRV | `0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948` | + +## Sei (1329) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Shibarium (109) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xfa33391ee38597cbeef72ccde8c9e13e01e78521` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## SnaxChain (2192) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Solana (1399811149) + +Threshold: 3 of 5 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x28464752829b3ea59a497fca0bdff575c534c3ff` | +| Luganodes | `0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659` | +| DSRV | `0xd90ea26ff731d967c5ea660851f7d63cb04ab820` | +| Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | +| Eclipse | `0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d` | + +## Soneium (1868) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd4b7af853ed6a2bfc329ecef545df90c959cbee8` | +| Imperator | `0x9f4fa50ce49815b0932428a0eb1988382cef4a97` | +| Enigma | `0x8d2f8ebd61d055d58768cf3b07cb2fb565d87716` | +| Luganodes | `0x6c5f6ab7a369222e6691218ad981fe08a5def094` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Sonic (146) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | + +## Sonic SVM (507150715) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf21f46905d8d09f76bc8c503f856e5466bc5ffea` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Sonic SVM | `0x85c7a16790cfd9dad6d4abdd4e2d3f1d550c7606` | + +## SOON (50075007) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Sophon (50104) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb84c5d02120ed0b39d0f78bbc0e298d89ebcd10b` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Story Mainnet (1514) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x501eda013378c60557d763df98d617b6ba55447a` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Subtensor (964) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd5f8196d7060b85bea491f0b52a671e05f3d10a2` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Superposition (1000055244) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Superseed (5330) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88` | +| Imperator | `0x68f3a3b244f6ddc135130200a6b8729e290b4240` | +| Enigma | `0x6ff4554cffbc2e4e4230b78e526eab255101d05a` | +| Luganodes | `0x55880ac03fdf15fccff54ed6f8a83455033edd22` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## svmBNB (574456) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xabcd4dac2d06ae30c011d25b0c2c193873116a14` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Swell (1923) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed` | +| Luganodes | `0x9eadf9217be22d9878e0e464727a2176d5c69ff8` | +| Imperator | `0xa5a23fa2a67782bbf1a540cb5ca6a47a0f3f66fb` | +| Enigma | `0x3f707633ccab09d2978e29107c0bbef8a993e7a0` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Taiko (167000) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa930073c8f2d0b2f7423ea32293e0d1362e65d79` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Luganodes | `0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a` | + +## Tangle (5845) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Tangle | `0xe271ef9a6e312540f099a378865432fa73f26689` | + +## Torus (21000) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x96982a325c28a842bc8cf61b63000737bb9f1f7d` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Unichain (130) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9773a382342ebf604a2e5de0a1f462fb499e28b1` | +| Imperator | `0xa2549be30fb852c210c2fe8e7639039dca779936` | +| Enigma | `0xbcbed4d11e946844162cd92c6d09d1cf146b4006` | +| Luganodes | `0xa9d517776fe8beba7d67c21cac1e805bd609c08e` | +| Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | +| Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | + +## Vana (1480) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| P2P | `0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354` | + +## Viction (88) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | +| RockX | `0xa3f93fe365bf99f431d8fde740b140615e24f99b` | +| Abacus Works | `0x1f87c368f8e05a85ef9126d984a980a20930cb9c` | + +## World Chain (480) + +Threshold: 4 of 6 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0x31048785845325b22817448b68d08f8a8fe36854` | +| Imperator | `0x11e2a683e83617f186614071e422b857256a9aae` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| ZKV | `0x761980c3debdc8ddb69a2713cf5126d4db900f0f` | +| Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | +| BlockPI | `0x6d113ae51bfea7b63a8828f97e9dce393b25c189` | + +## Xai (660279) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## XLayer (196) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa2ae7c594703e988f23d97220717c513db638ea3` | +| Imperator | `0xfed056cC0967F5BC9C6350F6C42eE97d3983394d` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | + +## Zero Network (543210) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## ZetaChain (7000) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | + +## Zircuit (48900) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------- | -------------------------------------------- | +| Abacus Works | `0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb` | +| Luganodes | `0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061` | +| Hashkey Cloud | `0x0180444c9342BD672867Df1432eb3dA354413a6E` | +| Renzo | `0x1da9176C2CE5cC7115340496fa7D1800a98911CE` | + +## zkSync (324) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | +| Imperator | `0x75237d42ce8ea27349a0254ada265db94157e0c1` | + +## Zora (7777777) + +Threshold: 3 of 4 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x35130945b625bb69b28aee902a3b9a76fa67125f` | +| Imperator | `0x7089b6352d37d23fb05a7fee4229c78e038fba09` | +| Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | +| Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | diff --git a/zh/docs/reference/addresses/validators/testnet-default-ism-validators.mdx b/zh/docs/reference/addresses/validators/testnet-default-ism-validators.mdx new file mode 100644 index 0000000..7de21fd --- /dev/null +++ b/zh/docs/reference/addresses/validators/testnet-default-ism-validators.mdx @@ -0,0 +1,366 @@ +--- +title: "Testnet" +description: "Testnet 链的默认 ISM validator 配置" +--- + +## Abstract Testnet (11124) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e` | + +## Aleph Zero EVM Testnet (2039) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x556cd94bcb6e5773e8df75e7eb3f91909d266a26` | + +## Alfajores (44787) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2233a5ce12f814bd64c9cdd73410bb8693124d40` | +| Abacus Works | `0xba279f965489d90f90490e3c49e860e0b43c2ae6` | +| Abacus Works | `0x86485dcec5f7bb8478dd251676372d054dea6653` | + +## Arbitrum Sepolia (421614) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x09fabfbca0b8bf042e2a1161ee5010d147b0f603` | + +## Arcadia Testnet v2 (1098411886) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff` | + +## Aurora Testnet (1313161555) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xab1a2c76bf4cced43fde7bc1b5b57b9be3e7f937` | + +## Basecamp Testnet (1000001114) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x84441e39ed5251410aa2baa72e7747c46d1e5e9d` | + +## Base Sepolia (84532) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921` | + +## Berachain Bepolia (80069) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xdb0128bb3d3f204eb18de7e8268e94fde0382daf` | + +## BSC Testnet (97) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x242d8a855a8c932dec51f7999ae7d1e48b10c95e` | +| Abacus Works | `0xf620f5e3d25a3ae848fec74bccae5de3edcd8796` | +| Abacus Works | `0x1f030345963c54ff8229720dd3a711c15c554aeb` | + +## CarrChain Testnet (76672) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xa96dfc4d8c6cabb510701732ee01e52a75776205` | + +## Chronicle Yellowstone (175188) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf11cfeb2b6db66ec14c2ef7b685b36390cd648b4` | + +## Citrea Testnet (5115) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x60d7380a41eb95c49be18f141efd2fde5e3dba20` | + +## Coti Testnet (7082400) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x5c535dff16237a2cae97c97f9556404cd230c9c0` | + +## Eco Testnet (471923) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb3191420d463c2af8bd9b4a395e100ec5c05915a` | + +## Flame Dawn-1 Testnet (1660473773) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x0272625243bf2377f87538031fed54e21853cc2d` | + +## Form Testnet (132902) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x72ad7fddf16d17ff902d788441151982fa31a7bc` | + +## Fuji (43113) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e` | +| Abacus Works | `0x895ae30bc83ff1493b9cf7781b0b813d23659857` | +| Abacus Works | `0x43e915573d9f1383cbf482049e4a012290759e7f` | + +## Holesky (17000) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7ab28ad88bb45867137ea823af88e2cb02359c03` | + +## Hyperliquid EVM Testnet (998) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xea673a92a23ca319b9d85cc16b248645cd5158da` | + +## Infinity VM Monza Testnet (96025) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x635e1ad8646f80ac7bdcd0be9bb69b6f229a31bb` | + +## Ink Sepolia (763373) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xe61c846aee275070207fcbf43674eb254f06097a` | + +## MegaETH Testnet (6342) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf5c8a82f966d2ec8563a2012ccf556ee3f4b25ef` | + +## Milkyway Testnet (1162171030) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x65c7581e14efdf4d9c5320882170f022835bd742` | + +## Mode Testnet (919) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x9a9de3e406ab3e4ff12aa03ca9b868b48dc40402` | + +## Monad Testnet (10143) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x734628f55694d2a5f4de3e755ccb40ecd72b16d9` | + +## Neura Testnet (267) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xc14514a91d0ee90ba3070abb6bfb45a10e6d341d` | + +## Odyssey Testnet (911867) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3` | + +## Optimism Sepolia (11155420) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x03efe4d0632ee15685d7e8f46dea0a874304aa29` | + +## Paradex Sepolia (12263410) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x7d49abcceafa5cd82f6615a9779f29c76bfc88e8` | + +## Plume Testnet (98867) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x16637c78e1ea169132efcf4df8ebd03de349e740` | + +## Polygon Amoy (80002) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xf0290b06e446b320bd4e9c4a519420354d7ddccd` | + +## Scroll Sepolia (534351) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbe18dbd758afb367180260b524e6d4bcd1cb6d05` | +| Abacus Works | `0x9a11ed23ae962974018ab45bc133caabff7b3271` | +| Abacus Works | `0x7867bea3c9761fe64e6d124b171f91fd5dd79644` | + +## Sepolia (11155111) + +Threshold: 2 of 3 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb22b65f202558adf86a8bb2847b76ae1036686a5` | +| Abacus Works | `0x469f0940684d147defc44f3647146cb90dd0bc8e` | +| Abacus Works | `0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83` | + +## Solana Testnet (1399811150) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5` | + +## Somnia Testnet (50312) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xb3b27a27bfa94002d344e9cf5217a0e3502e018b` | + +## Soneium Minato Testnet (1946) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x2e2101020ccdbe76aeda1c27823b0150f43d0c63` | + +## Sonic Blaze Testnet (57054) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xe5b98110d0688691ea280edea9a4faa1e3617ba1` | + +## Sonic SVM Testnet (15153042) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x83d4ef35f170ec822a0eaadb22a0c40003d8de23` | + +## Starknet Sepolia (23448591) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xd07272cc3665d6e383a319691dcce5731ecf54a5` | + +## Subtensor Testnet (945) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0xbe2cd57e9fd46b12107cfec7a2db61aa23edbe33` | + +## Superposition Testnet (98985) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a` | + +## Unichain Testnet (1301) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x5e99961cf71918308c3b17ef21b5f515a4f86fe5` | + +## Load Network Alphanet (9496) + +Threshold: 1 of 1 + +| Operator | Address | +| ------------ | -------------------------------------------- | +| Abacus Works | `0x6d2ee6688de903bb31f3ae2ea31da87b697f7f40` | diff --git a/zh/docs/reference/developer-tips/token-faucets.mdx b/zh/docs/reference/developer-tips/token-faucets.mdx new file mode 100644 index 0000000..4117a9f --- /dev/null +++ b/zh/docs/reference/developer-tips/token-faucets.mdx @@ -0,0 +1,29 @@ +--- +title: "代币来源和水龙头" +description: "查找用于开发的 Mainnet 和 Testnet 代币来源和水龙头" +--- + +## Mainnet 代币来源 + +| 网络 | 还需要问吗? | +| --------- | ---------------------------- | +| Avalanche | 大多数主流交易所 | +| BSC | Binance、FTX、Kucoin | +| Polygon | 大多数主流交易所 | +| Celo | Binance、Coinbase、Kucoin | +| Arbitrum | 大多数主流交易所或官方桥 | +| Optimism | 大多数主流交易所或官方桥 | +| Ethereum | 大多数主流交易所 | +| Moonbeam | Binance、Coinbase、Kucoin | + +## Testnet 代币来源 + +| 测试网 | 水龙头链接 | 数量 | +| -------------- | ----------------------------------------------------------------------------- | ---------------------------- | +| Alfajores | [Alfrajores Token Faucet](https://faucet.celo.org/) | 5 CELO | +| Mumbai | [Polygon Faucet](https://faucet.polygon.technology/) | 2 MATIC(需要 alchemy 账户) | +| Fuji | [Avalanche Faucet](https://core.app/tools/testnet-faucet/) | 2 AVAX | +| BSC Testnet | [BNB Smart Chain Faucet](https://testnet.bnbchain.org/faucet-smart) | 0.5 BNB | +| Moonbase Alpha | [Moonbase Alpha Faucet](https://apps.moonbeam.network/moonbase-alpha/faucet/) | 1 DEV | +| Calibration | [Filecoin Faucet](https://faucet.calibnet.chainsafe-fil.io/) | 5 tFIL | +| Sepolia | [Sepolia Faucet](https://sepoliafaucet.com/) | 0.5 ETH | diff --git a/zh/docs/reference/developer-tips/unit-testing.mdx b/zh/docs/reference/developer-tips/unit-testing.mdx new file mode 100644 index 0000000..bfb6dac --- /dev/null +++ b/zh/docs/reference/developer-tips/unit-testing.mdx @@ -0,0 +1,131 @@ +--- +title: "单元测试 - EVM" +--- + +对于 Foundry 的多链设置,单元测试可能具有挑战性。因此,我们提供了一个轻量级测试环境 [`MockHyperlaneEnvironment`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/mock/MockHyperlaneEnvironment.sol),让您可以对跨链应用进行单元测试,而无需 fork 多个网络。 + +大多数多链应用都会构建在我们的 Mailbox 合约之上。因此,我们使用 `MockMailbox` 抽象了已部署 mailbox 的细节,我们的环境在同一条链上包含一个 `originMailbox` 和一个 `destinationMailbox`。在内部,我们将到达目标的消息存储在目标 mailbox 的 `inboundMessages` 映射中。我们通过将消息加入队列并使用 `MockMailbox.processNextInboundMessage()` 递增 `inboundProcessedNonce` 来模拟消息传递。 + +简单消息传递的 forge 测试设置如下: + +## 发送消息 + +```solidity +contract SimpleMessagingTest is Test { + // origin and destination domains (recommended to be the chainId) + uint32 origin = 1; + uint32 destination = 2; + + // both mailboxes will be on the same chain but different addresses + MockMailbox originMailbox; + MockMailbox destinationMailbox; + + // contract which can receive messages + TestRecipient receiver; + + function setUp() public { + originMailbox = new MockMailbox(origin); + destinationMailbox = new MockMailbox(destination); + originMailbox.addRemoteMailbox(destination, destinationMailbox); + + receiver = new TestRecipient(); + } + + function testSendMessage() public { + string _message = "Aloha!"; + originMailbox.dispatch( + destination, + TypeCasts.addressToBytes32(address(receiver)), + bytes(_message) + ); + // simulating message delivery to the destinationMailbox + destinationMailbox.processNextInboundMessage(); + assertEq(string(receiver.lastData()), _message); + } +} +``` + +## 测试基于 Router 的应用 + +假设您正在测试继承自 `Router` 的 `TestCrosschainApp`: + +```solidity +contract CrosschainAppTest is Test { + // origin and destination domains (recommended to be the chainId) + uint32 origin = 1; + uint32 destination = 2; + + function setUp() public { + environment = new MockHyperlaneEnvironment(origin, destination); + + // your cross-chain app + TestCrosschainApp originTelephone = new TestCrosschainApp(environment.mailboxes(origin)); + TestCrosschainApp destinationTelephone = new TestCrosschainApp(environment.mailboxes(destination)); + + // assuming you're inheriting the Router pattern from https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/client/Router.sol + originTelephone.enrollRemoteRouter(destinationTelephone); + destinationTelephone.enrollRemoteRouter(originTelephone); + } +} +``` + +调用 `processNextPendingMessage()` 和 `processNextPendingMessageFromDestination()` 分别处理目标和源 mailbox 的入站消息。现在,您可以从源到目标以及反向进行跨链调用: + +```solidity + function testRemoteTelephoneCallFromOrigin() public { + // check behavior on origin + vm.expectEmit(true, true, true, false); + emit TelephoneRinging(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); // example event on origin + originTelephone.callRemote(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); + + // simulating message delivery origin -> destination + environment.processNextPendingMessage(); + + // check behavior on destination + assertEq(destinationTelephone.latestMessage(originTelephone) == "Hello!"); + } + + function testRemoteTelephoneCallFromDestination() public { + // check behavior on destination + vm.expectEmit(true, true, true, false); + emit TelephoneRinging(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); // example event on destination + destinationTelephone.callRemote(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); + + // simulating message delivery destination -> origin + environment.processNextPendingMessageFromDestination(); + + // check behavior on origin + assertEq(originTelephone.latestMessage(destinationTelephone) == "Howdy!"); + } +``` + +如果您想为您的应用使用自己的 ISM,可以通过将其传递给 Router 的 `initialize` 方法来覆盖 mailbox 提供的 `defaultIsm`,如下所示: + +```solidity +contract CrosschainAppTest is Test { + // origin and destination domains (recommended to be the chainId) + uint32 origin = 1; + uint32 destination = 2; + + function setUp() public { + ... + + TestIgp igp = new TestIgp(); // example InterchainGasPaymaster passed as the hook + + // deploy your own ISM contracts to verify messages between originTelephone and destinationTelephone + TelephoneISM originIsm = new TelephoneISM(); // local ISM for origin + TelephoneISM destinationIsm = new TelephoneISM(); // local ISM for destination + + + originTelephone.initialize(address(igp), address(originIsm), msg.sender); + originTelephone.initialize(address(igp), address(destinationIsm), msg.sender); + + ... + } +} +``` + + + 您可以在此处找到我们的单元测试设置示例: + [InterchainAccountRouterTest](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/dae8b26ed65383844e4fbed7585deeb52da4e454/solidity/test/InterchainAccountRouter.t.sol#L38)。 + diff --git a/zh/docs/reference/developer-tools/cli.mdx b/zh/docs/reference/developer-tools/cli.mdx new file mode 100644 index 0000000..44d8ff8 --- /dev/null +++ b/zh/docs/reference/developer-tools/cli.mdx @@ -0,0 +1,50 @@ +--- +title: "Hyperlane CLI" +--- + +## 概述[​](#overview "Direct link to Overview") + +Hyperlane CLI 是用于将 Hyperlane 合约部署到新链的官方命令行工具。它还包括与已部署合约和注册表交互的实用工具。 + +发布版本可在 [NPM 上](https://www.npmjs.com/package/@hyperlane-xyz/cli)获得。源代码可在 [GitHub 单体库中](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/cli)获得。 + +## 设置[​](#setup "Direct link to Setup") + +需要 [Node 18](https://nodejs.org/en/download) 或更新版本 + +要全局安装 CLI,请使用 `npm install -g` 命令。这将使 `hyperlane` 命令在您的终端中的任何地方都可用。 + +``` +# 使用 NPM 安装 +npm install -g @hyperlane-xyz/cli + +# 或卸载旧版本 +npm uninstall -g @hyperlane-xyz/cli +``` + +或者,对于运行单个命令,您可以使用 `npx` 或 `dlx`: + +``` +# 通过 NPM 的 npx 命令运行 +npx @hyperlane-xyz/cli + +# 或通过 Yarn 的 dlx 命令 +yarn dlx @hyperlane-xyz/cli +``` + +## 用法[​](#usage "Direct link to Usage") + +要查看可用命令及其参数的列表,运行 `hyperlane --help`。 + +一些常见的命令选项包括: + +- `--version`:显示您当前安装的 CLI 版本 +- `--registry`:设置用于链元数据和合约地址的注册表 URI +- `--overrides`:为规范注册表数据的覆盖设置额外路径 +- `log`:设置 CLI 的日志格式(默认为 pretty) +- `verbosity`:设置 CLI 的日志级别(默认为 info) +- `key`:设置用于签署交易的密钥(默认为 HYP_KEY 环境变量) + +## 注册表[​](#registries "Direct link to Registries") + +默认情况下,CLI 将从[规范 Hyperlane 注册表](https://github.com/hyperlane-xyz/hyperlane-registry)提取链元数据和合约地址,但会将新配置和部署写入您的本地文件系统。有关更多信息,请参见[注册表页面](/zh/docs/reference/registries)。 \ No newline at end of file diff --git a/zh/docs/reference/developer-tools/libraries/hookmetadata.mdx b/zh/docs/reference/developer-tools/libraries/hookmetadata.mdx new file mode 100644 index 0000000..a2bd867 --- /dev/null +++ b/zh/docs/reference/developer-tools/libraries/hookmetadata.mdx @@ -0,0 +1,166 @@ +--- +title: "StandardHookMetadata 库" +--- + +`StandardHookMetadata` 库提供了用于处理和格式化 Hyperlane hook 中使用的元数据的实用工具。该库使您能够打包和提取消息的 gas 限制、退款地址和自定义元数据等信息。 + +- **解析元数据**:像 `variant`、`msgValue`、`gasLimit` 和 `refundAddress` 这样的函数帮助您从 ABI 编码的数据中提取特定的元数据字段。 +- **自定义元数据**:`getCustomMetadata` 检索标准字段之外的任何附加元数据。 +- **格式化元数据**:`formatMetadata` 让您构造包含 gas 限制、退款地址和自定义数据等字段的 ABI 编码元数据。 + +## StandardHookMetadata 库 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +/*@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@ HYPERLANE @@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ + @@@@@@@@@ @@@@@@@@@ +@@@@@@@@@ @@@@@@@@*/ + +/** + * Format of metadata: + * + * [0:1] variant + * [2:33] msg.value + * [34:65] Gas limit for message (IGP) + * [66:85] Refund address for message (IGP) + * [86:] Custom metadata + */ +library StandardHookMetadata { + uint8 private constant VARIANT_OFFSET = 0; + uint8 private constant MSG_VALUE_OFFSET = 2; + uint8 private constant GAS_LIMIT_OFFSET = 34; + uint8 private constant REFUND_ADDRESS_OFFSET = 66; + uint256 private constant MIN_METADATA_LENGTH = 86; + + uint16 public constant VARIANT = 1; + + /** + * @notice Returns the variant of the metadata. + * @param _metadata ABI encoded global hook metadata. + * @return variant of the metadata as uint8. + */ + function variant(bytes calldata _metadata) internal pure returns (uint16) { + if (_metadata.length < VARIANT_OFFSET + 2) return 0; + return uint16(bytes2(_metadata[VARIANT_OFFSET:VARIANT_OFFSET + 2])); + } + + /** + * @notice Returns the specified value for the message. + * @param _metadata ABI encoded global hook metadata. + * @param _default Default fallback value. + * @return Value for the message as uint256. + */ + function msgValue( + bytes calldata _metadata, + uint256 _default + ) internal pure returns (uint256) { + if (_metadata.length < MSG_VALUE_OFFSET + 32) return _default; + return + uint256(bytes32(_metadata[MSG_VALUE_OFFSET:MSG_VALUE_OFFSET + 32])); + } + + /** + * @notice Returns the specified gas limit for the message. + * @param _metadata ABI encoded global hook metadata. + * @param _default Default fallback gas limit. + * @return Gas limit for the message as uint256. + */ + function gasLimit( + bytes calldata _metadata, + uint256 _default + ) internal pure returns (uint256) { + if (_metadata.length < GAS_LIMIT_OFFSET + 32) return _default; + return + uint256(bytes32(_metadata[GAS_LIMIT_OFFSET:GAS_LIMIT_OFFSET + 32])); + } + + /** + * @notice Returns the specified refund address for the message. + * @param _metadata ABI encoded global hook metadata. + * @param _default Default fallback refund address. + * @return Refund address for the message as address. + */ + function refundAddress( + bytes calldata _metadata, + address _default + ) internal pure returns (address) { + if (_metadata.length < REFUND_ADDRESS_OFFSET + 20) return _default; + return + address( + bytes20( + _metadata[REFUND_ADDRESS_OFFSET:REFUND_ADDRESS_OFFSET + 20] + ) + ); + } + + /** + * @notice Returns the specified refund address for the message. + * @param _metadata ABI encoded global hook metadata. + * @return Refund address for the message as address. + */ + function getCustomMetadata( + bytes calldata _metadata + ) internal pure returns (bytes calldata) { + if (_metadata.length < MIN_METADATA_LENGTH) return _metadata[0:0]; + return _metadata[MIN_METADATA_LENGTH:]; + } + + /** + * @notice Formats the specified gas limit and refund address into global hook metadata. + * @param _msgValue msg.value for the message. + * @param _gasLimit Gas limit for the message. + * @param _refundAddress Refund address for the message. + * @param _customMetadata Additional metadata to include in the global hook metadata. + * @return ABI encoded global hook metadata. + */ + function formatMetadata( + uint256 _msgValue, + uint256 _gasLimit, + address _refundAddress, + bytes memory _customMetadata + ) internal pure returns (bytes memory) { + return + abi.encodePacked( + VARIANT, + _msgValue, + _gasLimit, + _refundAddress, + _customMetadata + ); + } + + /** + * @notice Formats the specified gas limit and refund address into global hook metadata. + * @param _msgValue msg.value for the message. + * @return ABI encoded global hook metadata. + */ + function formatMetadata( + uint256 _msgValue + ) internal view returns (bytes memory) { + return formatMetadata(_msgValue, uint256(0), msg.sender, ""); + } + + /** + * @notice Formats the specified gas limit and refund address into global hook metadata. + * @param _gasLimit Gas limit for the message. + * @param _refundAddress Refund address for the message. + * @return ABI encoded global hook metadata. + */ + function formatMetadata( + uint256 _gasLimit, + address _refundAddress + ) internal pure returns (bytes memory) { + return formatMetadata(uint256(0), _gasLimit, _refundAddress, ""); + } +} +``` diff --git a/zh/docs/reference/developer-tools/libraries/mailbox-client.mdx b/zh/docs/reference/developer-tools/libraries/mailbox-client.mdx new file mode 100644 index 0000000..b62cf18 --- /dev/null +++ b/zh/docs/reference/developer-tools/libraries/mailbox-client.mdx @@ -0,0 +1,156 @@ +--- +title: "MailboxClient 库" +--- + +继承 [`MailboxClient`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/v3/solidity/contracts/client/MailboxClient.sol) 是一种简单的方式,可以确保您的合约知道向哪里发送或从哪里接收跨链消息。 + +这个混入合约维护了指向 Hyperlane 开发者可能需要与之交互的三个合约的指针: + +1. [`Mailbox`](/zh/docs/protocol/core/mailbox)(必需) +2. [`IPostDispatchHook`](/zh/docs/protocol/core/post-dispatch-hooks-overview)(可选) +3. [`IInterchainSecurityModule`](/zh/docs/protocol/ISM/modular-security)(可选) + +`MailboxClient` 公开了允许子类通过 `mailbox` 存储变量轻松向 `Mailbox` 发送消息的函数,并通过 `onlyMailbox` 修饰符授权消息传递。 + +## MailboxClient 库 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.11; + +// ============ Internal Imports ============ +import {IMailbox} from "../interfaces/IMailbox.sol"; +import {IPostDispatchHook} from "../interfaces/hooks/IPostDispatchHook.sol"; +import {IInterchainSecurityModule} from "../interfaces/IInterchainSecurityModule.sol"; +import {Message} from "../libs/Message.sol"; + +// ============ External Imports ============ +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +abstract contract MailboxClient is OwnableUpgradeable { + using Message for bytes; + + IMailbox public immutable mailbox; + + uint32 public immutable localDomain; + + IPostDispatchHook public hook; + + IInterchainSecurityModule public interchainSecurityModule; + + // ============ Modifiers ============ + modifier onlyContract(address _contract) { + require( + Address.isContract(_contract), + "MailboxClient: invalid mailbox" + ); + _; + } + + modifier onlyContractOrNull(address _contract) { + require( + Address.isContract(_contract) || _contract == address(0), + "MailboxClient: invalid contract setting" + ); + _; + } + + /** + * @notice Only accept messages from an Hyperlane Mailbox contract + */ + modifier onlyMailbox() { + require( + msg.sender == address(mailbox), + "MailboxClient: sender not mailbox" + ); + _; + } + + constructor(address _mailbox) onlyContract(_mailbox) { + mailbox = IMailbox(_mailbox); + localDomain = mailbox.localDomain(); + _transferOwnership(msg.sender); + } + + /** + * @notice Sets the address of the application's custom hook. + * @param _hook The address of the hook contract. + */ + function setHook(address _hook) public onlyContractOrNull(_hook) onlyOwner { + hook = IPostDispatchHook(_hook); + } + + /** + * @notice Sets the address of the application's custom interchain security module. + * @param _module The address of the interchain security module contract. + */ + function setInterchainSecurityModule( + address _module + ) public onlyContractOrNull(_module) onlyOwner { + interchainSecurityModule = IInterchainSecurityModule(_module); + } + + // ======== Initializer ========= + function _MailboxClient_initialize( + address _hook, + address _interchainSecurityModule, + address _owner + ) internal onlyInitializing { + __Ownable_init(); + setHook(_hook); + setInterchainSecurityModule(_interchainSecurityModule); + _transferOwnership(_owner); + } + + function _isLatestDispatched(bytes32 id) internal view returns (bool) { + return mailbox.latestDispatchedId() == id; + } + + function _metadata( + uint32 /*_destinationDomain*/ + ) internal view virtual returns (bytes memory) { + return ""; + } + + function _dispatch( + uint32 _destinationDomain, + bytes32 _recipient, + bytes memory _messageBody + ) internal virtual returns (bytes32) { + return + _dispatch(_destinationDomain, _recipient, msg.value, _messageBody); + } + + function _dispatch( + uint32 _destinationDomain, + bytes32 _recipient, + uint256 _value, + bytes memory _messageBody + ) internal virtual returns (bytes32) { + return + mailbox.dispatch{value: _value}( + _destinationDomain, + _recipient, + _messageBody, + _metadata(_destinationDomain), + hook + ); + } + + function _quoteDispatch( + uint32 _destinationDomain, + bytes32 _recipient, + bytes memory _messageBody + ) internal view virtual returns (uint256) { + return + mailbox.quoteDispatch( + _destinationDomain, + _recipient, + _messageBody, + _metadata(_destinationDomain), + hook + ); + } +} +``` diff --git a/zh/docs/reference/developer-tools/libraries/message.mdx b/zh/docs/reference/developer-tools/libraries/message.mdx new file mode 100644 index 0000000..2346e37 --- /dev/null +++ b/zh/docs/reference/developer-tools/libraries/message.mdx @@ -0,0 +1,167 @@ +--- +title: "Message 库" +--- + +`Message` 库帮助您格式化和解析跨链消息,以便与 Hyperlane `Mailbox` 合约一起使用。 + +- **构造消息**:`formatMessage` 让您将所有关键字段打包成单个可发送的消息。 +- **提取字段**:像 `version`、`nonce`、`origin`、`senderAddress`、`recipientAddress` 和 `body` 这样的函数帮助您提取消息的特定部分进行处理。 +- **获取消息 ID**:`id` 使用 `keccak256` 为每条消息生成唯一标识符。 + +## Message 库 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.8.0; + +import {TypeCasts} from "./TypeCasts.sol"; + +/** + * @title Hyperlane Message Library + * @notice Library for formatted messages used by Mailbox + **/ +library Message { + using TypeCasts for bytes32; + + uint256 private constant VERSION_OFFSET = 0; + uint256 private constant NONCE_OFFSET = 1; + uint256 private constant ORIGIN_OFFSET = 5; + uint256 private constant SENDER_OFFSET = 9; + uint256 private constant DESTINATION_OFFSET = 41; + uint256 private constant RECIPIENT_OFFSET = 45; + uint256 private constant BODY_OFFSET = 77; + + /** + * @notice Returns formatted (packed) Hyperlane message with provided fields + * @dev This function should only be used in memory message construction. + * @param _version The version of the origin and destination Mailboxes + * @param _nonce A nonce to uniquely identify the message on its origin chain + * @param _originDomain Domain of origin chain + * @param _sender Address of sender as bytes32 + * @param _destinationDomain Domain of destination chain + * @param _recipient Address of recipient on destination chain as bytes32 + * @param _messageBody Raw bytes of message body + * @return Formatted message + */ + function formatMessage( + uint8 _version, + uint32 _nonce, + uint32 _originDomain, + bytes32 _sender, + uint32 _destinationDomain, + bytes32 _recipient, + bytes calldata _messageBody + ) internal pure returns (bytes memory) { + return + abi.encodePacked( + _version, + _nonce, + _originDomain, + _sender, + _destinationDomain, + _recipient, + _messageBody + ); + } + + /** + * @notice Returns the message ID. + * @param _message ABI encoded Hyperlane message. + * @return ID of `_message` + */ + function id(bytes memory _message) internal pure returns (bytes32) { + return keccak256(_message); + } + + /** + * @notice Returns the message version. + * @param _message ABI encoded Hyperlane message. + * @return Version of `_message` + */ + function version(bytes calldata _message) internal pure returns (uint8) { + return uint8(bytes1(_message[VERSION_OFFSET:NONCE_OFFSET])); + } + + /** + * @notice Returns the message nonce. + * @param _message ABI encoded Hyperlane message. + * @return Nonce of `_message` + */ + function nonce(bytes calldata _message) internal pure returns (uint32) { + return uint32(bytes4(_message[NONCE_OFFSET:ORIGIN_OFFSET])); + } + + /** + * @notice Returns the message origin domain. + * @param _message ABI encoded Hyperlane message. + * @return Origin domain of `_message` + */ + function origin(bytes calldata _message) internal pure returns (uint32) { + return uint32(bytes4(_message[ORIGIN_OFFSET:SENDER_OFFSET])); + } + + /** + * @notice Returns the message sender as bytes32. + * @param _message ABI encoded Hyperlane message. + * @return Sender of `_message` as bytes32 + */ + function sender(bytes calldata _message) internal pure returns (bytes32) { + return bytes32(_message[SENDER_OFFSET:DESTINATION_OFFSET]); + } + + /** + * @notice Returns the message sender as address. + * @param _message ABI encoded Hyperlane message. + * @return Sender of `_message` as address + */ + function senderAddress( + bytes calldata _message + ) internal pure returns (address) { + return sender(_message).bytes32ToAddress(); + } + + /** + * @notice Returns the message destination domain. + * @param _message ABI encoded Hyperlane message. + * @return Destination domain of `_message` + */ + function destination( + bytes calldata _message + ) internal pure returns (uint32) { + return uint32(bytes4(_message[DESTINATION_OFFSET:RECIPIENT_OFFSET])); + } + + /** + * @notice Returns the message recipient as bytes32. + * @param _message ABI encoded Hyperlane message. + * @return Recipient of `_message` as bytes32 + */ + function recipient( + bytes calldata _message + ) internal pure returns (bytes32) { + return bytes32(_message[RECIPIENT_OFFSET:BODY_OFFSET]); + } + + /** + * @notice Returns the message recipient as address. + * @param _message ABI encoded Hyperlane message. + * @return Recipient of `_message` as address + */ + function recipientAddress( + bytes calldata _message + ) internal pure returns (address) { + return recipient(_message).bytes32ToAddress(); + } + + /** + * @notice Returns the message body. + * @param _message ABI encoded Hyperlane message. + * @return Body of `_message` + */ + function body( + bytes calldata _message + ) internal pure returns (bytes calldata) { + return bytes(_message[BODY_OFFSET:]); + } +} +``` diff --git a/zh/docs/reference/developer-tools/libraries/router.mdx b/zh/docs/reference/developer-tools/libraries/router.mdx new file mode 100644 index 0000000..82796dd --- /dev/null +++ b/zh/docs/reference/developer-tools/libraries/router.mdx @@ -0,0 +1,233 @@ +--- +title: "Router 库" +--- + +希望编写一次合约并将其部署到多条链上的应用开发者应考虑使用 [`Router`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/v3/solidity/contracts/client/Router.sol) 模式进行构建。 + +在此模式中,应用合约的实例部署在每条应用支持的链上。每个实例都知道其他链上实例的地址。这些实例使用 Hyperlane 与远程链上的实例相互通信信息和状态。 + +```mermaid +graph BT + subgraph "Ethereum" + R_E[Router] + Mailbox_E[(Mailbox)] + Mailbox_E -. "mailbox()" .- R_E + end + + subgraph "Polygon" + R_P[Router] + Mailbox_P[(Mailbox)] + Mailbox_P -. "mailbox()" .- R_P + end + + subgraph "Gnosis" + R_G[Router] + Mailbox_G[(Mailbox)] + Mailbox_G -. "mailbox()" .- R_G + end + + R_E -. "routers()" .- R_P -. "routers()" .- R_G + R_G -. "routers()" .- R_E +``` + +使用此模式的开发者可以继承 `Router` 混入合约。`Router` 是一个 [`MailboxClient`](./mailbox-client),它跟踪远程链上其他 `Router` 合约地址。这允许 `Router` 直接向其他 Router 发送消息,而无需指定地址。它还允许 `Router` 拒绝来自其他不受信任发送者的消息。 + +## Router 库 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.11; + +// ============ Internal Imports ============ +import {IMessageRecipient} from "../interfaces/IMessageRecipient.sol"; +import {IPostDispatchHook} from "../interfaces/hooks/IPostDispatchHook.sol"; +import {IInterchainSecurityModule} from "../interfaces/IInterchainSecurityModule.sol"; +import {MailboxClient} from "./MailboxClient.sol"; +import {EnumerableMapExtended} from "../libs/EnumerableMapExtended.sol"; +import {StandardHookMetadata} from "../hooks/libs/StandardHookMetadata.sol"; + +// ============ External Imports ============ +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +abstract contract Router is MailboxClient, IMessageRecipient { + using EnumerableMapExtended for EnumerableMapExtended.UintToBytes32Map; + using Strings for uint32; + + // ============ Mutable Storage ============ + EnumerableMapExtended.UintToBytes32Map internal _routers; + + uint256[48] private __GAP; // gap for upgrade safety + + constructor(address _mailbox) MailboxClient(_mailbox) {} + + // ============ External functions ============ + function domains() external view returns (uint32[] memory) { + return _routers.uint32Keys(); + } + + /** + * @notice Returns the address of the Router contract for the given domain + * @param _domain The remote domain ID. + * @dev Returns 0 address if no router is enrolled for the given domain + * @return router The address of the Router contract for the given domain + */ + function routers(uint32 _domain) public view virtual returns (bytes32) { + (, bytes32 _router) = _routers.tryGet(_domain); + return _router; + } + + /** + * @notice Unregister the domain + * @param _domain The domain of the remote Application Router + */ + function unenrollRemoteRouter(uint32 _domain) external virtual onlyOwner { + _unenrollRemoteRouter(_domain); + } + + /** + * @notice Register the address of a Router contract for the same Application on a remote chain + * @param _domain The domain of the remote Application Router + * @param _router The address of the remote Application Router + */ + function enrollRemoteRouter( + uint32 _domain, + bytes32 _router + ) external virtual onlyOwner { + _enrollRemoteRouter(_domain, _router); + } + + /** + * @notice Batch version of `enrollRemoteRouter` + * @param _domains The domains of the remote Application Routers + * @param _addresses The addresses of the remote Application Routers + */ + function enrollRemoteRouters( + uint32[] calldata _domains, + bytes32[] calldata _addresses + ) external virtual onlyOwner { + require(_domains.length == _addresses.length, "!length"); + uint256 length = _domains.length; + for (uint256 i = 0; i < length; i += 1) { + _enrollRemoteRouter(_domains[i], _addresses[i]); + } + } + + /** + * @notice Batch version of `unenrollRemoteRouter` + * @param _domains The domains of the remote Application Routers + */ + function unenrollRemoteRouters( + uint32[] calldata _domains + ) external virtual onlyOwner { + uint256 length = _domains.length; + for (uint256 i = 0; i < length; i += 1) { + _unenrollRemoteRouter(_domains[i]); + } + } + + /** + * @notice Handles an incoming message + * @param _origin The origin domain + * @param _sender The sender address + * @param _message The message + */ + function handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _message + ) external payable virtual override onlyMailbox { + bytes32 _router = _mustHaveRemoteRouter(_origin); + require(_router == _sender, "Enrolled router does not match sender"); + _handle(_origin, _sender, _message); + } + + // ============ Virtual functions ============ + function _handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _message + ) internal virtual; + + // ============ Internal functions ============ + + /** + * @notice Set the router for a given domain + * @param _domain The domain + * @param _address The new router + */ + function _enrollRemoteRouter( + uint32 _domain, + bytes32 _address + ) internal virtual { + _routers.set(_domain, _address); + } + + /** + * @notice Remove the router for a given domain + * @param _domain The domain + */ + function _unenrollRemoteRouter(uint32 _domain) internal virtual { + require(_routers.remove(_domain), _domainNotFoundError(_domain)); + } + + /** + * @notice Return true if the given domain / router is the address of a remote Application Router + * @param _domain The domain of the potential remote Application Router + * @param _address The address of the potential remote Application Router + */ + function _isRemoteRouter( + uint32 _domain, + bytes32 _address + ) internal view returns (bool) { + return routers(_domain) == _address; + } + + /** + * @notice Assert that the given domain has a Application Router registered and return its address + * @param _domain The domain of the chain for which to get the Application Router + * @return _router The address of the remote Application Router on _domain + */ + function _mustHaveRemoteRouter( + uint32 _domain + ) internal view returns (bytes32) { + (bool contained, bytes32 _router) = _routers.tryGet(_domain); + require(contained, _domainNotFoundError(_domain)); + return _router; + } + + function _domainNotFoundError( + uint32 _domain + ) internal pure returns (string memory) { + return + string.concat( + "No router enrolled for domain: ", + _domain.toString() + ); + } + + function _dispatch( + uint32 _destinationDomain, + bytes memory _messageBody + ) internal virtual returns (bytes32) { + return _dispatch(_destinationDomain, msg.value, _messageBody); + } + + function _dispatch( + uint32 _destinationDomain, + uint256 _value, + bytes memory _messageBody + ) internal virtual returns (bytes32) { + bytes32 _router = _mustHaveRemoteRouter(_destinationDomain); + return + super._dispatch(_destinationDomain, _router, _value, _messageBody); + } + + function _quoteDispatch( + uint32 _destinationDomain, + bytes memory _messageBody + ) internal view virtual returns (uint256) { + bytes32 _router = _mustHaveRemoteRouter(_destinationDomain); + return super._quoteDispatch(_destinationDomain, _router, _messageBody); + } +} +``` diff --git a/zh/docs/reference/developer-tools/libraries/typecasts.mdx b/zh/docs/reference/developer-tools/libraries/typecasts.mdx new file mode 100644 index 0000000..888767f --- /dev/null +++ b/zh/docs/reference/developer-tools/libraries/typecasts.mdx @@ -0,0 +1,26 @@ +--- +title: "Typecasts 库" +--- + +`TypeCasts` 库提供了在 `address` 和 `bytes32` 类型之间转换的简单高效函数。 + +此库适用于需要在智能合约中使用 `bytes32` 类型但仍需要将其转换回 `address` 类型或反之的情况。 + +## `TypeCasts` 库 + +```solidity +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.11; + +library TypeCasts { + // alignment preserving cast + function addressToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } + + // alignment preserving cast + function bytes32ToAddress(bytes32 _buf) internal pure returns (address) { + return address(uint160(uint256(_buf))); + } +} +``` diff --git a/zh/docs/reference/developer-tools/typescript-sdk/overview.mdx b/zh/docs/reference/developer-tools/typescript-sdk/overview.mdx new file mode 100644 index 0000000..49f2308 --- /dev/null +++ b/zh/docs/reference/developer-tools/typescript-sdk/overview.mdx @@ -0,0 +1,13 @@ +--- +title: "Hyperlane Typescript SDK" +--- + +对于希望进一步为自己的项目定制 Warp UI 或构建自己的跨链应用的开发者,我们鼓励您探索 [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk)。 + +SDK 包含一组不断增长的实用工具和抽象,用于跨不同协议(EVM、Cosmos、Solana)与 Hyperlane 交互。 + +它为以下内容提供高级抽象: + +- 跨链代币转移 +- 链元数据和提供者 +- 核心协议合约 diff --git a/zh/docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation.mdx b/zh/docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation.mdx new file mode 100644 index 0000000..b89ef1a --- /dev/null +++ b/zh/docs/reference/developer-tools/typescript-sdk/transfer-fee-calculation.mdx @@ -0,0 +1,57 @@ +--- +title: "消息转账费用计算" +--- + + + 有关转账费用的概述,请访问:[GMP 转账 + 费用](/zh/docs/protocol/core/fees) + + +## 估算费用 + +要估算两种费用,请使用 `estimateTransferRemoteFees`: + +```ts +const { interchainQuote, localQuote } = + await warpCore.estimateTransferRemoteFees({ + originToken, + destination, + sender, + }); +``` + +- `interchainQuote`:将消息路由到目标链的费用(通过 IGP) +- `localQuote`:在源链上发送交易的 gas 成本 + +每个返回值都是一个 TokenAmount,包括: + +- `amount`:所需的代币数量 +- `token`:代币元数据(包括链、小数位数和符号) + +## 在转账中使用费用 + +进行转账时,您可以提供预先计算的费用报价: + +```ts +const txs = await warpCore.getTransferRemoteTxs({ + originTokenAmount, + destination, + sender, + recipient, +}); +``` + + + +**重要注意事项:** + +- 不同链类型之间的费用可能有所不同 +- 某些链需要额外参数 +- 缺少费用或支付不足将导致交易回滚 +- 费用代币可能与转账代币不同 + + + +## 工作原理 + +在底层,SDK 使用 [`Mailbox.quoteDispatch()`](/zh/docs/reference/messaging/send#quote-dispatch) 来计算跨链费用。这是必须传递给 `dispatch` 的相同值。 diff --git a/zh/docs/reference/domains.mdx b/zh/docs/reference/domains.mdx new file mode 100644 index 0000000..7630bb0 --- /dev/null +++ b/zh/docs/reference/domains.mdx @@ -0,0 +1,33 @@ +--- +title: "Domain 标识符" +--- + +import DomainsTable from "/snippets/addresses/domains.mdx"; + +## 核心 Domain + +此列表仅包含由 Abacus Works(我们的法律实体)管理的链上部署。任何人都可以在任何链上[无需许可地部署 Hyperlane](/zh/docs/guides/chains/deploy-hyperlane) - 我们正在构建一个注册表来反映社区的无需许可部署。 + +Hyperlane 为每个 Hyperlane 支持的链使用唯一的 ID。在可能的情况下,Hyperlane domain ID 与 EVM chain ID 匹配,但这**并不保证**,因为我们也支持非 EVM 链。 + + + 某些 Hyperlane domain ID 与其对应的 EVM chain ID 不匹配,例如: + +- `immutablezkevmmainnet` +- `rarichain` +- `rootstockmainnet` +- `alephzeroevmmainnet` +- `chilizmainnet` +- `lumiaprism` +- `superpositionmainnet` +- `flowmainnet` +- `metal` +- `polynomialfi` + +请参阅下表以获取 Hyperlane domain ID 的完整列表。 + + + +发送消息时,用户必须提供目标链的 domain ID。当[接收消息](/zh/docs/reference/messaging/receive)时,接收者将获得源链的 domain ID。 + + diff --git a/zh/docs/reference/explorer/configuring-pi-chains.mdx b/zh/docs/reference/explorer/configuring-pi-chains.mdx new file mode 100644 index 0000000..309ec60 --- /dev/null +++ b/zh/docs/reference/explorer/configuring-pi-chains.mdx @@ -0,0 +1,63 @@ +--- +title: "在 Hyperlane Explorer 中配置新链" +--- + +Hyperlane 可以由任何人部署到任何链,这种开放访问被称为无需许可的互操作性(PI)。然而,PI 链上的消息无法被默认的 Hyperlane Agent 识别。要查看来自 PI 链的消息详情,首先需要使用该链的元数据配置 explorer。 + +## 向 Hyperlane Explorer 添加链元数据 + +1. 在 Explorer 主页上,点击源链或目标链按钮打开链选择。这将打开链选择模态框。然后,点击右上角的加号图标。 + +![](/images/docs/guides/explorer/explorer-add-metadata.png) + +2. 在出现的表单中,使用符合 [ChainMetadata 模式](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts)的 JSON 或 YAML 输入链的元数据。 + +3. 如果提供了有效的基于 Etherscan 的区块浏览器配置,Hyperlane Explorer 将利用它来查找所需的消息。如果没有,它将使用 RPC URL。注意,具有 API 密钥(即使只是免费层密钥)的浏览器执行速度更快且更可靠。 + +### 链元数据示例 + +**JSON 中的最小示例:** + +```json +{ + "chainId": 11155111, + "name": "sepolia", + "protocol": "ethereum", + "rpcUrls": [{ "http": "https://foobar.com" }] +} +``` + +**YAML 中的详细示例:** + +```yaml +# Yaml metadata example +blockExplorers: + - apiUrl: https://api-sepolia.etherscan.io/api + family: etherscan + name: Etherscan + url: https://sepolia.etherscan.io +blocks: + confirmations: 1 + estimateBlockTime: 13 + reorgPeriod: 2 +chainId: 11155111 +deployer: + name: Abacus Works + url: https://www.hyperlane.xyz +displayName: Sepolia +domainId: 11155111 +isTestnet: true +name: sepolia +nativeToken: + decimals: 18 + name: Ether + symbol: ETH +protocol: ethereum +rpcUrls: + - http: https://ethereum-sepolia.publicnode.com + - http: https://ethereum-sepolia.blockpi.network/v1/rpc/public +``` + + + 如果消息中链的源或目标 `domainId` 与其 `chainId` 不匹配,则必须在链配置中包含 `domainId` 字段。 + diff --git a/zh/docs/reference/explorer/explorer-debugging.mdx b/zh/docs/reference/explorer/explorer-debugging.mdx new file mode 100644 index 0000000..d3dce9c --- /dev/null +++ b/zh/docs/reference/explorer/explorer-debugging.mdx @@ -0,0 +1,54 @@ +--- +title: "Explorer 调试" +--- + +您会知道消息处理失败,因为页面顶部附近的消息状态将显示为"错误",并且页面右上角部分将指定消息无法处理的原因。 + +如果您的消息未被传递,可能是由于几个因素。 + +### 无效的目标 + +如果 relay 客户端不知道目标域标识符(`uint32`),它们将无法传递您的消息。请参阅 [domains](../../reference/domains) 以了解已知域以及向这些目标发送消息时使用的规范标识符。 + +### 无效的接收者 + +如果接收者地址(`bytes32`)不是实现 `IMessageRecipient` 的合约地址,relayer 将无法传递您的消息。 + +```solidity +// IMessageRecipient interface +interface IMessageRecipient { + function handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _message + ) external; +} +``` + + + EVM 地址(`address`)必须用零左填充才能符合要求。 + 请参阅 [TypeCasts + 库](/zh/docs/reference/developer-tools/libraries/typecasts)以获取 `pure + addressToBytes32` 实用函数,以及消息 + [dispatch](../../reference/messaging/send#dispatch) 部分了解其他详情。 + + +### 无法处理 + +如果消息接收者的 `IMessageRecipient.handle()` 函数的 gas 估算失败,[relayer](../../protocol/agents/relayer) 将无法传递消息。Relayer 将继续估算消息传递的 gas,因为状态变化可能允许成功传递以前无法传递的消息。 + + + 如果您有此行为无法满足的用例,**请联系我们** [在 Discord 上](https://discord.com/invite/hyperlane)。 + + +### 资金不足 + +资金不足的消息意味着为传递此消息所进行的[跨链 gas 支付](../../reference/hooks/interchain-gas)不足。 + +Relayer 在目标链上使用 [`eth_estimateGas`](https://ethereum.github.io/execution-apis/api-documentation/) RPC 来确定中继消息的绝对成本。如果此金额超过源链上支付的 gas 总量,relayer 通常会拒绝传递消息。 + +您可以[手动支付跨链 gas](../../reference/hooks/interchain-gas#retrying) 来解决此问题。 + +## 使用 Etherscan + +您还可以查看目标链上接收者的 [Etherscan](https://etherscan.io/) 页面,但请注意,处理交易不会像您通常想象的那样显示在交易列表中。原因是 relayer 实际上调用 Mailbox 合约,后者反过来调用接收者上的 `handle` 函数。因此,您会在 `Internal Txns` 选项卡下找到处理的证据。 diff --git a/zh/docs/reference/explorer/graphql-api.mdx b/zh/docs/reference/explorer/graphql-api.mdx new file mode 100644 index 0000000..3bf8aef --- /dev/null +++ b/zh/docs/reference/explorer/graphql-api.mdx @@ -0,0 +1,173 @@ +--- +title: "GraphQL API" +--- + +Hyperlane agent 收集有关系统上活动的有用信息,包括所有消息。可以通过 API 查询这些数据。这些 API 目前免费提供,无需任何身份验证。连接您首选的 GraphQL 客户端或库来查询数据! + +### 示例查询 + +以下查询将检索有关消息的有用信息: + +```graphql +query MyQuery { + message_view(limit: 10, where: {msg_id: {_eq: "\xYOUR_MSG_ID"}}) { + msg_id + nonce + sender + recipient + is_delivered + message_body + origin_mailbox + origin_domain_id + origin_chain_id + origin_block_id + origin_block_height + origin_block_hash + origin_tx_sender + origin_tx_recipient + origin_tx_nonce + origin_tx_max_priority_fee_per_gas + origin_tx_max_fee_per_gas + origin_tx_id + origin_tx_hash + origin_tx_gas_used + origin_tx_gas_price + origin_tx_gas_limit + origin_tx_effective_gas_price + origin_tx_cumulative_gas_used + destination_block_id + destination_block_hash + destination_block_height + destination_chain_id + destination_domain_id + destination_mailbox + destination_tx_cumulative_gas_used + destination_tx_effective_gas_price + destination_tx_gas_limit + destination_tx_gas_price + destination_tx_gas_used + destination_tx_hash + destination_tx_id + destination_tx_max_fee_per_gas + destination_tx_max_priority_fee_per_gas + destination_tx_nonce + destination_tx_recipient + destination_tx_sender + send_occurred_at + delivery_occurred_at + delivery_latency + num_payments + total_payment + total_gas_amount + } +} +``` + +### GraphQL Schema Types + +````graphql +type message_view { + msg_id: bytea + nonce: Int! + sender: bytea + recipient: bytea + is_delivered: Boolean! + message_body: bytea + origin_mailbox: bytea + origin_domain_id: Int! + origin_chain_id: Int! + origin_block_id: Int! + origin_block_height: Int! + origin_block_hash: bytea + origin_tx_sender: bytea + origin_tx_recipient: bytea + origin_tx_nonce: Int! + origin_tx_max_priority_fee_per_gas: Int! + origin_tx_max_fee_per_gas: Int! + origin_tx_id: Int! + origin_tx_hash: bytea + origin_tx_gas_used: Int! + origin_tx_gas_price: Int! + origin_tx_gas_limit: Int! + origin_tx_effective_gas_price: Int! + origin_tx_cumulative_gas_used: Int! + destination_block_id: Int! + destination_block_hash: bytea + destination_block_height: Int! + destination_chain_id: Int! + destination_domain_id: Int! + destination_mailbox: bytea + destination_tx_cumulative_gas_used: Int! + destination_tx_effective_gas_price: Int! + destination_tx_gas_limit: Int! + destination_tx_gas_price: Int! + destination_tx_gas_used: Int! + destination_tx_hash: bytea + destination_tx_id: Int! + destination_tx_max_fee_per_gas: Int! + destination_tx_max_priority_fee_per_gas: Int! + destination_tx_nonce: Int! + destination_tx_recipient: bytea + destination_tx_sender: bytea + send_occurred_at: timestamp! + delivery_occurred_at: timestamp! + delivery_latency: Int! + num_payments: Int! + total_payment: Int! + total_gas_amount: Int! +} + +type block { + domain: Int! + domainByDomain: domain! + hash: String! + height: bigint! + id: bigint! + time_created: timestamp! + timestamp: timestamp! +} + +type domain { + chain_id: bigint + id: Int! + is_deprecated: Boolean! + is_test_net: Boolean! + name: String! + native_token: String! + time_created: timestamp! + time_updated: timestamp! +} + +type gas_payment { + amount: numeric! + domain: Int! + domainByDomain: domain! + id: bigint! + msg_id: String + time_created: timestamp! + transaction: transaction! + tx_id: bigint! +} + +type transaction { + block: block! + block_id: bigint! + checkpoint_updates: [checkpoint_update!]! + cumulative_gas_used: float8! + delivered_messages: [delivered_message!]! + effective_gas_price: float8 + gas_limit: float8! + gas_payments: [gas_payment!]! + gas_price: float8 + gas_used: float8! + hash: String! + id: bigint! + max_fee_per_gas: float8 + max_priority_fee_per_gas: float8 + messages: [message!]! + nonce: bigint! + recipient: String + sender: String! + time_created: timestamp! +}``` +```` diff --git a/zh/docs/reference/explorer/overview.mdx b/zh/docs/reference/explorer/overview.mdx new file mode 100644 index 0000000..ea17ef2 --- /dev/null +++ b/zh/docs/reference/explorer/overview.mdx @@ -0,0 +1,37 @@ +--- +title: "概述" +description: "本指南可用于在任何部署了 Hyperlane 的网络上查找消息。深入了解消息的详细属性和状态。" +--- + +来往[核心链](/zh/docs/reference/domains)的消息可通过交易哈希、消息 ID 或发送者/接收者地址进行搜索。对于其他链,可以通过提供链配置来配置 explorer 以搜索消息。 + +### 搜索消息 + +[Hyperlane Explorer](https://explorer.hyperlane.xyz/) 支持使用以下任一值搜索消息: + +- 发起消息的交易哈希(源交易) +- 传递消息的交易哈希(目标交易) +- 发送源交易的账户地址 +- 发送目标交易的账户地址 +- 消息发送者地址 +- 消息接收者地址 +- 消息 ID + +要搜索,请在顶部搜索栏中输入您的查询。您可以使用源链、目标链和时间筛选选项来缩小搜索范围。 + +![Explorer search bar](/images/docs/guides/explorer/explorer-search-bar.png) + + + 注意,默认情况下,explorer 只会在[核心 Hyperlane 链](/zh/docs/reference/domains)上查找消息。 + +要查看发送到其他链和/或从其他链发送的消息,请参阅[配置 PI 链](/zh/docs/reference/explorer/configuring-pi-chains)。 + + + +### 无需许可的互操作性[​](#permissionless-interoperability "Direct link to Permissionless Interoperability") + +可以配置 explorer 以在任何部署了 Hyperlane 的链上搜索消息。详情请参阅[配置 PI 链](/zh/docs/reference/explorer/configuring-pi-chains)。 + +### 调试消息[​](#debugging-messages "Direct link to Debugging Messages") + +如果您正在尝试调试消息传递问题,[explorer 调试](/zh/docs/reference/explorer/explorer-debugging)页面有有用的提示。 diff --git a/zh/docs/reference/hooks/arbitrum-L2-to-L1.mdx b/zh/docs/reference/hooks/arbitrum-L2-to-L1.mdx new file mode 100644 index 0000000..a2296d1 --- /dev/null +++ b/zh/docs/reference/hooks/arbitrum-L2-to-L1.mdx @@ -0,0 +1,93 @@ +--- +title: "Arbitrum L2 to L1 Hook" +--- + +Arbitrum 的 Outbox 系统允许在乐观挑战期之后进行任意的 L2 到 L1 合约调用,即在 L2 链上发起的消息最终在 L1 上执行。更多详情请参阅[这里](https://docs.arbitrum.io/how-arbitrum-works/arbos/l2-l1-messaging)。Hyperlane 可以封装 Outbox 系统,利用 Arbitrum L2 的乐观安全性(具有 7 天提款期和可操作的欺诈证明)来保护来自任何 Arbitrum Nitro rollup 的 L2 到 L1 消息。我们已经实现了 [ArbL2ToL1Hook](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/ArbL2ToL1Hook.sol) 和 [ArbL2ToL1Ism](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/ArbL2ToL1Ism.sol)。 + +## 工作原理 + + + 来自 L2 的出站消息无法提供协议内自动 L1 执行, + 因为 Ethereum 不通过 L1 + 节点提供计划执行功能。 + + +`ArbL2ToL1Hook` 将带有 `messageId` 的编码函数调用发送到 L2 上的 `ArbSys` 预编译合约。等待提款期后,您可以在 L2 上使用 `getOutboxProof()` 获取消息的默克尔证明。从这里开始,您有两个选项: + +- **选项 A.** 您可以通过 `mailbox.process()` 调用 `ArbL2ToL1Ism` 的 verify 函数,使用证明和其他编码数据,这反过来会调用 `outbox.executeTransaction()` 检查消息发送者和消息数据的有效性。 +- **选项 B.** 您可以直接使用证明和其他编码数据调用 `outbox.executeTransaction()`。但是,您需要第二次调用 `ArbL2ToL1Ism` 的 verify 函数来传递消息。此选项还允许您将消息值传递给接收者合约。 + +### 选项 A + +```mermaid +flowchart TB + subgraph Origin L2 + Sender + M_O[(Mailbox)] + Hook[ArbL2ToL1Hook] + L_2[(ArbSys)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_2 + end + + M_O -. "process (relayer) + after 7 days" .-> M_D + L_2 -. "executeTransaction(3rd party relayer) + after 7 days" .-> L_1 + + subgraph Destination L1 + Recipient + M_D[(Mailbox)] + ISM{ArbL2ToL1Ism} + L_1[(ArbOutbox)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_1 -- "verifyMessageId(messageId)" --> ISM + end + + style L_1 fill: #162c4f + style L_2 fill: #162c4f +``` + +### 选项 B + +注意:在这里,relayer 负责从 `arbSys.getOutboxProof()` 编码消息证明并调用 `outbox.executeTransaction()` 函数。 + +```mermaid +flowchart TB + subgraph Origin L2 + Sender + M_O[(Mailbox)] + Hook[ArbL2ToL1Hook] + L_2[(ArbSys)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_2 + end + + M_O -. "process(relayer) + after 7 days" .-> M_D + M_O -. "getOutboxProof()" .-> L_2 + + subgraph Destination L1 + Recipient + M_D[(Mailbox)] + ISM{ArbL2ToL1Ism} + L_1[(ArbOutbox)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_1 -- "verifyMessageId(messageId)" --> ISM + end + + style L_1 fill: #162c4f + style L_2 fill: #162c4f +``` diff --git a/zh/docs/reference/hooks/interchain-gas.mdx b/zh/docs/reference/hooks/interchain-gas.mdx new file mode 100644 index 0000000..bbf24ca --- /dev/null +++ b/zh/docs/reference/hooks/interchain-gas.mdx @@ -0,0 +1,202 @@ +--- +title: "Post-Dispatch 跨链 Gas" +description: "使用 InterchainGasPaymaster 合约配置跨链消息传递的 gas 支付" +--- + +在 post-dispatch hook 期间,如果支付不足以覆盖 relayer 的_预期_成本,`InterchainGasPaymaster` 合约将回滚。在 `dispatch` 时计算的 gas 报价必须与 relayer 的预期成本一致。 + +## Gas 限制 + +`gasLimit` 是根据给定消息在目标链上调用 `handle` 的成本设置的。这可能因消息内容和处理器的逻辑而异。 + +用于计量 handle 调用的默认 `gasLimit` 是静态默认值 `50_000` gas。这对于简单操作来说足够了,但对于更复杂的 `handle` 函数可能不够。 + +如果您的 `handle` 函数执行复杂操作或需要更多 gas,您必须覆盖[元数据中的默认 `gasLimit`](#metadata) 以避免交易回滚。在单元测试中对您的 [`handle` 实现](../messaging/receive#handle)进行基准测试,以确定要使用的合理 `gasLimit`。 + +### 元数据 + +此 hook 期望元数据采用 `StandardHookMetadata` 的**打包编码**。有关如何传递元数据覆盖的信息,请参阅 Mailbox [dispatch 重载](../messaging/send#overriding-default-hook-metadata)。 + +```solidity +struct StandardHookMetadata { + uint16 variant; + uint256 msgValue; + uint256 gasLimit; + address refundAddress; +} +``` + +`StandardHookMetadata` 结构定义了元数据编码所需的字段: + +- `variant`:指定元数据格式版本。 +- `msgValue`:随消息发送的原生代币数量。 +- `gasLimit`:目标链上 `handle` 函数的 gas 限制。确保这与您的模拟结果匹配。 +- `refundAddress`:退还未使用 gas 支付的地址。 + +要编码此元数据,请使用 `StandardHookMetadata.formatMetadata` 库函数。Solidity 不支持使用 `abi.encodePacked` 直接编码结构体。 + +#### 使用示例 + +```solidity +// 示例:使用 StandardHookMetadata 编码元数据 +bytes memory metadata = StandardHookMetadata.formatMetadata( + 0, // ETH 消息值 + 200000, // 自定义 gas 限制 + address(this), // 退款地址 + bytes("") // 可选的自定义元数据 +); +``` + +### 确定并覆盖 Gas 限制 + +1. **模拟和基准测试 Gas 使用**: + +- 使用 Tenderly 或 Foundry 等工具模拟消息接收者上的 `handle` 函数。确保 `from` 地址设置为您链上的 Mailbox 合约。 +- 如果 gas 使用超过 `50,000` gas,计算适当的 `gasLimit` 并更新您的元数据。 +- 使用 [Hyperlane Explorer 中的操作提示](https://github.com/hyperlane-xyz/hyperlane-explorer/blob/03634076049bfce1611b4e41d1aa81910eab2962/src/features/messages/cards/TransactionCard.tsx#L326-L333)从消息详情模拟交易。 + +2. **更新您的元数据**: + +- 根据模拟计算所需的 `gasLimit`。 +- 在元数据中传递更新的 `gasLimit`,以确保 relayer 将传递您的消息。 + +## 目标 Gas 配置 + +对于每个远程域,InterchainGasPaymaster 设置域 gas 配置。 + +```solidity +struct DomainGasConfig { + IGasOracle gasOracle; + uint96 gasOverhead; +} +``` + +### Gas 开销 + +gas 开销作为目标 gas 配置的一部分设置。这对应于在目标链上处理消息的操作成本。 + + + - 您应确保 `gasOverhead` 充分覆盖目标链上的 ISM 范围。- 由于您可以为不同的消息类型配置不同的 ISM,每个 ISM 的 `verify` 函数可能有不同的 gas 开销。 + + +## Gas Oracle + +跨链 Gas 支付要求是使用源链和目标链之间的预言机化 gas 价格和汇率计算的。 + +IGP 合约可以配置 gas oracle,负责跟踪远程代币 gas 价格和汇率。开发者应使用 Mailbox 合约上的 [`quoteDispatch`](/zh/docs/protocol/core/post-dispatch-hooks-overview#quote-dispatch-fees) 函数来计算 gas 费用。`quoteDispatch` 考虑了系统级开销,并确保整个 `dispatch` 过程的准确费用计算。 + + + 汇率和 gas 价格由 relayer 决定。可能会收取价差以考虑漂移和运营成本。 + + +最终,relayer 将能够自动更新其 gas oracle,以确保其 IGP 始终为远程 gas 报出公平价格。 + +### `getExchangeRateAndGasPrice` + +```solidity +function getExchangeRateAndGasPrice( + uint32 destinationDomain +) external view returns (uint128 tokenExchangeRate, uint128 gasPrice); +``` + +**参数** + +- `destinationDomain`:消息的目标域 + +**返回值** + +- `tokenExchangeRate`:源链和目标链 gas 代币之间的汇率 +- `gasPrice`:目标链的 gas 价格 + +### `quoteGasPayment` + +`quoteGasPayment` 函数计算 relayer 预期成本的费用。 + +```solidity +function quoteGasPayment( + uint32 destinationDomain, + uint256 gasLimit +) external view returns (uint256 fee); +``` + +**参数** + +- `destinationDomain`:消息的目标域 +- `gasLimit`:用于计量 `handle` 调用的 gas 限制 + +**返回值** + +- `fee`:`postDispatch` 成功所需的支付 + + +`quoteGasPayment` 根据 `destinationDomain` 和 `gasLimit` 给出估算费用。但是,它**不**包括 Interchain Gas Paymaster(IGP)为默认 ISM 支付添加的额外 gas 成本。 + +要获得完整费用,请使用 Mailbox 合约的 `quoteDispatch()`。它提供包括这些额外成本的完整报价。 + +👉 有关更多详情,请参阅 [Quote Dispatch](/zh/docs/reference/messaging/send#quote-dispatch)。 + + + +## 重试 + +如果 `handle` 调用消耗的 gas 超过报价,relayer 将不会提交处理交易。此问题通常是由于初始 `dispatch` 期间 gas 支付不足造成的。 + +在这种情况下,可以使用 `payForGas` 函数支付额外的 gas。 + +```solidity +function payForGas( + bytes32 messageId, + uint32 destinationDomain, + uint256 gasAmount, + address refundAddress +) external payable; +``` + +**参数** + +- `messageId`:从 `dispatch` 调用返回的消息标识符 +- `destinationDomain`:消息的目标域 +- `gasAmount`:要支付的额外 gas 数量 +- `refundAddress`:退还多余支付的地址 + +## 使用 Hyperlane Explorer 进行调试 + +Hyperlane Explorer 是调试跨链消息问题(包括 gas 支付和 relayer 行为)的强大工具。 + +### 关键功能 + +- **消息状态**:查看消息的当前状态(例如,"Retry: GasPaymentRequirementNotMet")。 +- **Gas 支付详情**:检查已支付的 gas 数量(源 IGP gas 数量)和 relayer 所需的数量。 +- **模拟 Calldata**:使用"查看 calldata 详情"选项在 Tenderly 等工具上模拟交易。 + +## 故障排除 + +本节涵盖开发者在跨链 Gas 支付中遇到的常见问题及潜在解决方案。 + +### `GasPaymentRequirementNotMet` 警告 + +- **原因:** 当 `dispatch` 期间提供的 gas 支付不满足 relayer 的计算要求时发生。 + +- **解决方案:** + - 使用 `quoteDispatch` 计算 `dispatch` 调用成功所需的总费用。 + - 验证元数据中的 `msg.value` 覆盖 relayer 的报价费用。 + - 在 Hyperlane Explorer 中检查消息状态。查找:`Retry(GasPaymentRequirementNotMet)`。 + +### 回退路由和超额支付警告 + +- **原因:** `msg.value` 超过所需的 gas 支付,触发回退路由 hook。 + +- **解决方案:** + - 验证您的报价逻辑(`quoteDispatch`)与 relayer 的预期费用匹配。 + - 避免在未首先对 `handle` 函数进行基准测试的情况下高估 `gasLimit` 值。 + - 模拟交易以确认适当的支付。 + +### 意外大的 Gas 报价 + +- **原因:** 设置了非常高的 `gasLimit`,导致过高的 gas 报价。 + +- **解决方案:** + + - 仔细检查元数据中指定的 `gasLimit`。 + - 验证您的报价逻辑(`quoteDispatch`)与 relayer 的预期费用匹配。 + - 调整 `gasLimit` 以匹配 `handle` 函数的估计 gas 消耗。 diff --git a/zh/docs/reference/hooks/op-stack.mdx b/zh/docs/reference/hooks/op-stack.mdx new file mode 100644 index 0000000..6e9e57a --- /dev/null +++ b/zh/docs/reference/hooks/op-stack.mdx @@ -0,0 +1,57 @@ +--- +title: "OP Stack Hook" +--- + +Optimism 和其他 [OP Stack](https://stack.optimism.io/) rollup 拥有自己的在 L1 和 L2 之间传递消息的接口,称为 `CrossDomainMessenger`。通过此接口传递的消息受益于 rollup [结算层](https://stack.optimism.io/docs/understand/landscape/#execution)的安全性。 + +```solidity +interface ICrossDomainMessenger { + function sendMessage( + address target, + bytes calldata message, + uint32 gasLimit + ) external; +} +``` + +为了在 Hyperlane 中提供此安全性选项,我们创建了一个 Hook 和 ISM 组合,可以透明地配置以重用原生 OP Stack 接口。 + +有关 Hook 和 ISM 地址,请参阅[地址](/zh/docs/reference/addresses/deployments/mainnet/mailbox)页面。 + +## 工作原理 + +OPStackHook 将 messageId 发送到 L1CrossDomainMessenger,后者将其注册为 Optimism `TransactionDeposited` 事件,包含 ETH 存款和消息数据,由 rollup 节点接收。 +rollup 节点调用预编译合约 `L2CrossDomainMessenger` 的 relayMessage 函数,后者反过来调用配置的 OptimismISM 合约,将 messageId 在 verifiedMessageId 的映射中设置为原始 L1 发送者(即用户)。relayer 只携带消息而不带元数据,等待 Optimism 节点接收并对 Optimism 进行存储写入,然后验证消息传递。 + +```mermaid +flowchart TB + subgraph Origin L1 + Sender + M_O[(Mailbox)] + Hook[OPStackHook] + L_1[(L1CrossDomainMessenger)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> L_1 + end + + M_O -. "relay" .-> M_D + L_1 -. "rollup node" .-> L_2 + + subgraph Destination L2 + Recipient + M_D[(Mailbox)] + ISM{OPStackISM} + L_2[(L2CrossDomainMessenger)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + L_2 -- "verifyMessageId(messageId)" --> ISM + end + + style L_1 fill: #ff0402 + style L_2 fill: #ff0402 +``` diff --git a/zh/docs/reference/hooks/polygon-pos.mdx b/zh/docs/reference/hooks/polygon-pos.mdx new file mode 100644 index 0000000..402e502 --- /dev/null +++ b/zh/docs/reference/hooks/polygon-pos.mdx @@ -0,0 +1,49 @@ +--- +title: "Polygon PoS Hook" +--- + +Polygon PoS 拥有自己的在 Ethereum 和 Polygon 之间传递消息的接口,称为 [`fx portal`](https://github.com/0xPolygon/fx-portal)。通过此接口传递的消息受益于 Polygon [状态同步机制](https://docs.polygon.technology/pos/architecture/bor/state-sync/)的安全性。 + +为了在 Hyperlane 中提供此安全性选项,我们创建了一个 Hook 和 ISM 组合,可以透明地配置以重用 fx-portal 接口。 + +有关 Hook 和 ISM 地址,请参阅[地址](/zh/docs/reference/addresses/deployments/mainnet/mailbox)页面。 + +## 工作原理 + +Polygon FX-Portal 提供 FxChild (FxChild.sol) 和 FxRoot (FxRoot.sol) 作为桥接工作的主要合约。它调用并将数据传递给另一条链上的用户定义方法,无需映射。 + +FxChild/FxRoot 合约由 Polygon 团队提供和维护。您可以在 Polygon 的 [Fx-Portal 仓库](https://github.com/0xPolygon/fx-portal)中找到此合约的地址。 +PolygonPosHook 使用 FxRoot 发送有效载荷。Validator 将接收消息并将其传递到另一条链。您可以在[文档](https://docs.polygon.technology/pos/how-to/bridging/l1-l2-communication/state-transfer/)中找到详细的状态同步机制。位于 `0x0000000000000000000000000000000000001001` 的 `StateReceiver` 被允许调用 FxChild 合约中的 `onStateReceive`。FxChild 调用抽象 `CrossChainEnabledPolygonChild` 中的 `processMessageFromRoot`,PolygonPosISM 实现了该抽象合约。`CrossChainEnabledPolygonChild` 由 [OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/crosschain#) 维护。 + +```mermaid +flowchart TB + subgraph Origin Ethereum + Sender + M_O[(Mailbox)] + Hook[PolygonPosHook] + Eth[(FxRoot)] + + Sender -- "dispatch(...)" --> M_O + M_O -- "postDispatch(message)" --> Hook + Hook -- "sendMessage(messageId)" --> Eth + end + + M_O -. "relay" .-> M_D + Eth -. "validator node" .-> Polygon + + subgraph Destination Polygon PoS + Recipient + M_D[(Mailbox)] + ISM{PolygonPosISM} + Polygon[(FxChild)] + + M_D -- "verify(..., message)" --> ISM + M_D -- "handle(...)" --> Recipient + ISM -. "interchainSecurityModule()" .- Recipient + + Polygon -- "verifyMessageId(messageId)" --> ISM + end + + style Eth fill: #ff0402 + style Polygon fill: #ff0402 +``` diff --git a/zh/docs/reference/messaging/receive.mdx b/zh/docs/reference/messaging/receive.mdx new file mode 100644 index 0000000..554fff3 --- /dev/null +++ b/zh/docs/reference/messaging/receive.mdx @@ -0,0 +1,92 @@ +--- +title: "接收消息" +description: "如何使用 Hyperlane 的邮箱合约处理和验证传入的跨链消息" +--- + +要传递跨链消息,[中继器](/zh/docs/operate/relayer/run-relayer)调用 `Mailbox.process()`。 + +此函数接受要传递的消息以及中继器可以指定的任意元数据作为参数。 + +`邮箱` 将消息和元数据传递给接收者的跨链安全模块(ISM)进行验证。如果 ISM 成功验证消息,`邮箱` 通过调用 `recipient.handle()` 将消息传递给接收者。 + + + 有关 Hyperlane 消息编码的更多详细信息,请参见 + [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) + + +## 处理 + +此函数由 `邮箱` 合约在接收到消息时调用。 + + + 为确保只接受有效的跨链消息,限制对邮箱地址的[访问控制](#access-control)非常重要。 + + +### Solidity + +```solidity +function handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _messageBody +) external; +``` + +**参数** + +- `origin`:源链的域 +- `sender`:源链上发送者的地址,以 bytes32 格式 +- `messageBody`:消息体的原始字节内容 + + +发送者地址左填充为 `bytes32`,以兼容地址不同的虚拟机。为方便起见,在 [`TypeCasts` 库](/zh/docs/reference/developer-tools/libraries/typecasts)中提供了以下实用工具。 + +```solidity +function bytes32ToAddress(bytes32 _bytes32) internal pure returns (address) { + return address(uint160(uint256(_bytes32))); +} +``` + + + +### 访问控制 + +如果合约应该只接受来自跨链消息的调用,`handle` 函数应该限制为邮箱地址。 + +为方便起见,在 [`MailboxClient` 库](/zh/docs/reference/developer-tools/libraries/mailbox-client)中提供了以下实用工具。 + +```solidity +modifier onlyMailbox() { + require( + msg.sender == address(mailbox), + "MailboxClient: sender not mailbox" + ); + _; +} +``` + +### 示例 + +```solidity +function handle( + uint32 _origin, + bytes32 _sender, + bytes calldata _messageBody +) external override onlyMailbox { + lastSender = _sender; + lastData = _messageBody; + emit ReceivedMessage(_origin, _sender, _messageBody); +} +``` + +## 验证 + +当接收到消息时,邮箱将在调用消息接收者的 `handle` 之前使用[跨链安全模块](/zh/docs/protocol/ISM/modular-security)验证安全性。 + +### 默认安全 + +要查询默认 ISM 地址,您可以调用 `defaultIsm` 函数。 + +### 模块化安全 + +为了利用 Hyperlane 的模块化安全性,消息接收者可以指定自定义跨链安全模块来**验证传入消息的任何内容**。指定时,邮箱将遵从此 ISM。 \ No newline at end of file diff --git a/zh/docs/reference/messaging/send.mdx b/zh/docs/reference/messaging/send.mdx new file mode 100644 index 0000000..c5b34f0 --- /dev/null +++ b/zh/docs/reference/messaging/send.mdx @@ -0,0 +1,133 @@ +--- +title: "发送消息" +description: "如何使用 Hyperlane 的 Mailbox.dispatch() 函数发送跨链消息" +--- + +要发送跨链消息,开发者调用 `Mailbox.dispatch()`。 + +此函数接受消息内容、目标链 ID 和接收者地址作为参数。每条消息都作为叶子插入到由 `邮箱` 存储的[增量默克尔树](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f)中。Hyperlane 的权益证明协议使用此默克尔树来验证欺诈证明。 + +## 调度 + +调用此函数将消息调度到目标域和接收者。 + + + Hyperlane 只能将消息传递给实现 `handle` 函数的智能合约。有关更多信息,请参见[接收消息](./receive)文档。 + + +根据[调度后钩子配置](#post-dispatch-hook-config),可能需要一些支付。有关更多信息,请参见 [`quoteDispatch`](#quote-dispatch) 部分。 + +### Solidity + +```solidity +function dispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody +) external payable returns (bytes32 messageId); +``` + + +接收者地址左填充为 `bytes32`,以兼容地址不同的虚拟机。为方便起见,在 [`TypeCasts` 库](/zh/docs/reference/developer-tools/libraries/typecasts)中提供了以下实用工具。 + +```solidity +function addressToBytes32(address _address) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_address))); +} +``` + + + +### 示例 + +```solidity +// 从以太坊向 Polygon TestRecipient 发送消息 +IMailbox mailbox = IMailbox("0xc005dc82818d67AF737725bD4bf75435d065D239"); +bytes32 messageId = mailbox.dispatch{value: msg.value}( + 137, + "0x000000000000000000000000f90cB82a76492614D07B82a7658917f3aC811Ac1", + bytes("Hello World") +); +``` + +## 报价调度 + +费用通常配置为涵盖跨链 Gas 支付(IGP)以及协议成本。这些包括目标链上的交易提交、安全供应和维护。要获得相应 `dispatch` 调用的报价,您可以查询 `quoteDispatch` 函数。 + +```mermaid +flowchart TB + subgraph Origin Chain + Sender + M_O[(Mailbox)] + Sender <-- "fee = quoteDispatch(...)" --> M_O + Sender -- "dispatch(...){fee}" --> M_O + end +``` + +### Solidity + +```solidity +function quoteDispatch( + uint32 destinationDomain, + bytes32 recipientAddress, + bytes calldata messageBody +) external view returns (uint256 fee); +``` + +引用的 `fee` 必须作为值传递给 `dispatch` 调用,以确保它不会回滚。 + +### 示例 + +```solidity +// 报价从以太坊向 Polygon TestRecipient 发送消息 +IMailbox mailbox = IMailbox("0xc005dc82818d67AF737725bD4bf75435d065D239"); +uint32 destination = 137; +bytes32 recipient = "0x000000000000000000000000f90cB82a76492614D07B82a7658917f3aC811Ac1"; +bytes memory body = bytes("Hello World"); +uint256 fee = mailbox.quoteDispatch(destination, recipient, body); +mailbox.dispatch{value: fee}(destination, recipient, body); +``` + + + 向 `dispatch` 支付不足将回滚。如果您正在组合钩子,过量支付**可能不会**退还给消息发送者。 + + +## 调度后钩子配置 + +邮箱上配置了两个钩子 + +- `required`:为所有涵盖必需费用的 `dispatch` 调用调用 +- `default`:(除非被覆盖)在 `required` 钩子后使用剩余值调用 + +```mermaid +flowchart LR + subgraph Origin Chain + Sender + M_O[(Mailbox)] + R_H[RequiredHook] + D_H[DefaultHook] + Sender -- "dispatch(...){value}" --> M_O + + M_O -. "fee = quoteDispatch(...)" .- R_H + M_O -- "postDispatch(...)
{fee}" --> R_H + M_O -- "postDispatch(...)
{value - fee}" --> D_H + end +``` + +### 必需钩子 + +要查询必需钩子配置,您可以调用 `requiredHook` 函数。 + +```solidity +function requiredHook() external view returns (IPostDispatchHook); +``` + +### 默认钩子 + +要查询默认钩子配置,您可以调用 `defaultHook` 函数。 + +```solidity +function defaultHook() external view returns (IPostDispatchHook); +``` + +要在 `dispatch` 调用中使用自定义钩子覆盖默认钩子,请参见[钩子参考](/zh/docs/reference/hooks/interchain-gas)。 \ No newline at end of file diff --git a/zh/docs/reference/registries.mdx b/zh/docs/reference/registries.mdx new file mode 100644 index 0000000..9502c3c --- /dev/null +++ b/zh/docs/reference/registries.mdx @@ -0,0 +1,66 @@ +--- +title: "Hyperlane 注册表" +--- + +## 概述 + +Hyperlane 可以由任何人在任何地方部署。但是,为了使这些部署有用,它们的详细信息必须是众所周知的。注册表是链元数据、合约地址和其他与 Hyperlane 合约和工具交互的有用信息的集合。有一个由 Hyperlane 核心团队维护的[规范注册表](https://github.com/hyperlane-xyz/hyperlane-registry)。CLI、[Explorer](https://explorer.hyperlane.xyz) 和其他工具可以使用注册表数据。 + +## 规范注册表 + +Hyperlane 核心团队完成的部署的元数据和构件将在此处提供: +https://github.com/hyperlane-xyz/hyperlane-registry + +但是,我们鼓励社区成员将自己的部署添加到此规范注册表中。贡献步骤如下: + +1. Fork 并克隆注册表仓库 +2. 使用 CLI 并将 `--registry` 标志设置为克隆仓库的本地路径 +3. 根据需要执行您的命令 +4. 将更改推送到您的 fork 并创建 pull request + +## 自定义注册表 + +只要注册表符合与规范注册表相同的布局和文件模式,就可以使用任何 GitHub 仓库 URL 或本地文件路径。 + +CLI 有两个用于配置其使用的注册表的命令行参数: + +- `--registry` 标志设置主注册表,如果未设置则使用默认的 GitHub 注册表 +- `--overrides` 标志设置一个可选的附加路径,这对于强制覆盖默认数据的特定设置很有用,例如在链的元数据中使用不同的 RPC URL + +一旦您的自定义注册表添加/更新完成并经过测试,请考虑向规范注册表提交 pull request,以便其他人可以从您的部署中受益。 + +有关更多信息,请参阅 CLI 参考页面。 + +## 使用方法(Javascript 和 Typescript) + +### 安装 + +```bash +# 使用 npm +npm install @hyperlane-xyz/registry +# 或使用 yarn +yarn add @hyperlane-xyz/registry +``` + +### 获取内容 + +#### 通过包(静态) + +访问注册表数据最简单的方法是直接从包中导入所需的部分: + +```ts +// 通过基础包 +import { ethereum, ethereumAddresses } from "@hyperlane-xyz/registry"; +// 或者如果您的打包工具允许,通过子导出以获得更优化的包 +import { metadata, addresses } from "@hyperlane-xyz/registry/chains/ethereum"; +``` + +#### 通过实用工具(动态) + +如果您需要确保拥有最新数据,可以使用 `GithubRegistry` 类即时获取注册表内容。 + +```ts +import { GithubRegistry } from "@hyperlane-xyz/registry"; +const registry = new GithubRegistry(); +const chainMetadata = await registry.getMetadata(); +``` diff --git a/zh/docs/resources/audits.mdx b/zh/docs/resources/audits.mdx new file mode 100644 index 0000000..1b2572a --- /dev/null +++ b/zh/docs/resources/audits.mdx @@ -0,0 +1,69 @@ +--- +title: "审计" +--- + +### Hyperlane Q2 2025 安全审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/ChainLight_Hyperlane_2Q_2025_Security_Audit_v1.0.pdf?raw=true) + +### HyperToken 审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/ChainLight_Hyperlane_HyperToken_Security_Audit_v1.0.pdf?raw=true) + +### Yield Routes 审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/ChainLight_Hyperlane_PR_5752_5757_Security_Audit_v1.0.pdf?raw=true) + +### Compound Staker Rewards 审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/Offbeat_Security_Hyperlane_Compound_Staker_Rewards.pdf?raw=true) + +### USDT 审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/ChainSecurity_Hyperlane_Superchain_USDT_audit_draft.pdf?raw=true) + +### CCIP 审计 [v5.12.0](https://github.com/hyperlane-xyz/hyperlane-monorepo/releases/tag/%40hyperlane-xyz%2Fcore%405.12.0) + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/ChainLight_Hyperlane_CCIP_Warp_Route_Security_Audit_v1.1.pdf?raw=true) + +### Hook 和 ISM 审计 + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/chainlight-v3.1-protocol-audit.pdf?raw=true) + +### 协议 v3 审计 + +[原文](https://github.com/trailofbits/publications/blob/master/reviews/2023-09-hyperlane-securityreview.pdf) + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/hyperlane-v3-protocol-audit.pdf?raw=true) + +### 协议 v2 审计 + +[原文](https://audits.hacken.io/hyperlane/sca-hyperlane-interchain-message-service-apr2023/) + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/hyperlane-v2-protocol-audit.pdf?raw=true) + +### 协议 v1 审计 + +[原文](https://www.fyeo.io/post/fyeo-security-assessment-of-the-hyperlane-formerly-abacus-smart-contracts-in-august-2022) + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/hyperlane-v1-protocol-audit.pdf?raw=true) + +### Sealevel 协议审计 + +[原文](https://github.com/sec3-service/reports/blob/master/reports/sec3_hyperlane-sealevel.pdf) + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/sealevel-hyperlane-audit.pdf?raw=true) + +### Sealevel 审计 - Sherlock + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/sealeval-audit-hyperlane-20250327.pdf?raw=true) + +### CosmWasm 协议审计 + +[原文](https://github.com/oak-security/audit-reports/blob/main/Hyperlane/2024-02-13%20Audit%20Report%20-%20cw-hyperlane%20v1.0.pdf) + +[镜像](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/cw-hyperlane-audit.pdf?raw=true) + +### Starknet 协议审计 + +[原文](https://github.com/hyperlane-xyz/v4-docs/blob/main/assets/starknet-hyperlane-audit-draft.pdf?raw=true) diff --git a/zh/docs/resources/faq.mdx b/zh/docs/resources/faq.mdx new file mode 100644 index 0000000..0cc8847 --- /dev/null +++ b/zh/docs/resources/faq.mdx @@ -0,0 +1,111 @@ +--- +title: "常见问题" +--- + +## 一般问题 + +**什么是 Hyperlane?** + +Hyperlane 是为模块化区块链栈构建的第一个通用且无需许可的互操作性框架。任何人都可以[部署 Hyperlane](/zh/docs/guides/chains/deploy-hyperlane) 到任何区块链环境,无论是一层、rollup 还是应用链,允许该链与已部署 Hyperlane 的任何其他链无缝通信。 + +**使用 Hyperlane 对区块链开发者有什么好处?** + +Hyperlane 为区块链和 dapp 开发者都提供了好处。 + +- 对于区块链开发者,Hyperlane 部署扩展了对用户、资产和来自已部署 Hyperlane 的其他连接区块链的宝贵状态的可访问性。 +- 对于 dapp 开发者,Hyperlane 提供跨多个区块链的无缝连接,允许开发者创建跨链网络效应和流动性,用户可以从其首选链与应用程序交互。 + +**什么是 Abacus Works?** + +Abacus Works 是致力于 Hyperlane 的法律实体名称。您可能在较旧的帖子和代码库中遇到一些对 Abacus 的引用。Hyperlane 在 2022 年秋季从 Abacus 更名为 Hyperlane。 + +**我可以用 Hyperlane 构建什么?** + +Hyperlane 的[消息传递接口](/zh/docs/protocol/core/mailbox)允许 dapp 开发者在不同链上的智能合约之间发送任意字节。这可以用来创建跨链应用程序,即跨越多个链的 dapp。 + +为了灵感,看看一些构建在 Hyperlane 之上的预构建应用程序,包括: + +- **Hyperlane Warp 路由 (HWR)**:让用户将代币从一条链移动到另一条链。 +- **跨链账户**:让用户进行跨链函数调用。 +- **跨链查询**:让用户进行跨链视图调用。 + +**我是开发者。我的团队如何使用 Hyperlane 构建?** 如果您正在阅读此 FAQ,您已经找到了文档,这是一个很好的开始地方。也就是说,我们知道在实施过程中会出现问题,我们很乐意在您的路上帮助您。Hyperlane 社区在 [Discord](https://discord.gg/hyperlane) 中定期活跃。来自开发者的反馈直接影响产品路线图。 + +## 技术问题 + +### 消息传递 + +**当我在 Hyperlane 上发送消息时会发生什么?** + +有关更多详细信息,请参见[发送](/zh/docs/reference/messaging/send)和[接收](/zh/docs/reference/messaging/receive)页面。总结: + +1. 应用程序在源链上调用 `dispatch()` 函数,将消息插入邮箱的默克尔树中。 +2. Hyperlane 中继器观察调度的消息并为接收者的跨链安全模块(ISM)组装元数据。 +3. 中继器通过调用 `Mailbox.process()` 将消息传递给接收者。 +4. 邮箱使用接收者的 ISM 验证消息并调用 `recipient.handle()` 传递消息。 + +**如何查看我发送的消息状态?** + +将地址或交易哈希粘贴到 [Hyperlane 消息浏览器](https://explorer.hyperlane.xyz/) 的搜索栏中,查看消息状态和历史的详细信息。 + +如果消息因某种原因发送失败,将有错误消息指示可能出了什么问题。有关更多信息,请参见[浏览器调试](/zh/docs/reference/explorer/explorer-debugging)。 + +**使用 Hyperlane 发送跨链消息意味着实时聊天和文本吗?** + +不,Hyperlane 是一个旨在允许不同链上的智能合约相互交互的协议。当我们提到消息传递时,它是智能合约之间发送任意字节,而不是点对点或文本消息传递。 + +对于聊天用例,请考虑 [XMTP](https://xmtp.org/)、[Push](https://push.org/) 或 [Orbis](https://useorbis.com/)。 + +**Hyperlane 是代币桥吗?** + +不完全是。Hyperlane 是一个通用消息传递(GMP)协议,允许区块链之间的通信。代币桥只是可以构建在 Hyperlane 之上的众多应用程序类型之一! + +### 部署 + +**Hyperlane 部署在哪里?** + +已知部署的列表可以在[合约地址](/zh/docs/reference/addresses/deployments/mailbox)页面找到。 + +### 高级主题 + +**Hyperlane 如何保护?** + +Hyperlane 由其模块化安全栈保护,具有跨链安全模块(ISM)功能。开发者可以配置各种预构建的 ISM,将它们相互组合,甚至根据其应用程序的需求创建自定义 ISM。模块化的安全方法确保 Hyperlane 将继续跟上安全模型的最新行业进展。 + +**Hyperlane 有多少验证器,谁运营它们?** + +验证器的数量取决于跨链安全模块(ISM)配置。默认 ISM 使用特定的验证器集,您可以在[这里](/zh/docs/reference/addresses/validators/mainnet-default-ism-validators)查看阈值、运营商和地址等详细信息。 + +**我们如何确保消息完整性?** + +Hyperlane 的消息安全由跨链安全模块(ISM)配置驱动。默认情况下,消息依赖于默认 ISM 的验证器集,需要验证器的法定人数签署以确保安全。在验证器泄露的不太可能事件中,消息的安全性可能受到影响。但是,开发者有灵活性配置自己的 ISM,使他们能够定制和加强安全模型以适应其应用程序的需求。 + +**源链是否接收交易是否在目标链上执行的确认?** + +目前,源链不会自动接收来自目标链的执行确认。但是,通过在目标链上自定义 `handle` 函数可以添加此功能。有关更多信息,请参考 [handle 函数](/zh/docs/reference/messaging/receive#handle)。 + +**为什么出站消息 ID 存储在默克尔树中?** + +出站消息 ID 存储在默克尔树中以有效跟踪和验证消息。这种机制确保验证器可以准确检测和签署创建的新消息。 + +**`为什么验证器调用 MerkleTreeHook.latestCheckpoint()?`** + +验证器使用 [`MerkleTreeHook.latestCheckpoint()`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/5e9b8ba7ab0f54e92b3cf32806fae95eb23ad0f8/solidity/contracts/hooks/MerkleTreeHook.sol#L49) 函数来确定何时需要索引新交易。这种轮询机制确保验证器可以立即开始签署新消息,而无需回填整个树。 + +## 社区和贡献[​](#community--contributions) + +**我如何加入 Hyperlane 社区?** + +您可以加入 [Discord](https://discord.gg/hyperlane) 或在 [Twitter](https://x.com/hyperlane) 上关注 Hyperlane,在那里您可以找到不断增长的开发者和爱好者社区,讨论跨链未来。 + +**我有兴趣为 Hyperlane 工作。我在哪里可以看到职位空缺?** + +在[这里](https://jobs.lever.co/Hyperlane)查看我们的开放职位。 + +**我如何贡献改进此文档?** + +您可以通过[文档仓库](https://github.com/hyperlane-xyz/v3-docs)直接提交 PR 来编辑此文档。 + +**我在哪里可以获得支持或询问有关 Hyperlane 的问题?** + +您可以在我们的 [Hyperlane Discord](https://discord.com/invite/hyperlane) 上获得支持和提问,社区和团队在那里活跃并准备提供帮助。 \ No newline at end of file diff --git a/zh/docs/resources/glossary.mdx b/zh/docs/resources/glossary.mdx new file mode 100644 index 0000000..edd320e --- /dev/null +++ b/zh/docs/resources/glossary.mdx @@ -0,0 +1,109 @@ +--- +title: "术语表" +--- + +## 代理 + +Hyperlane [代理](/zh/docs/protocol/agents)是读取和写入 Hyperlane 智能合约状态的链下参与者。 + +示例代理包括[验证器](/zh/docs/protocol/agents/validators)和[中继器](/zh/docs/protocol/agents/relayer)。 + +## 聚合 ISM + +[聚合 ISM](/zh/docs/protocol/ISM/standard-ISMs/aggregation-ISM) 是一种跨链安全模块,通过要求 `n` 个 [ISM](/zh/docs/resources/glossary#interchain-security-module) 中的 `m` 个验证特定跨链消息,从许多 ISM 聚合安全性。 + +## 检查点 + +检查点是一个(默克尔根,索引)元组,对应于特定时间点[邮箱](/zh/docs/resources/glossary#mailbox)增量默克尔树的状态。 + +[验证器](/zh/docs/resources/glossary#validator)的检查点签名用于[多重签名 ISM](/zh/docs/resources/glossary#multisig-ism)。 + +## 抵押品链 + +对于 [Hyperlane Warp 路由](/zh/docs/resources/glossary#warp-route),将[抵押品代币](/zh/docs/resources/glossary#collateral-token)存入 Warp 路由的链。 + +## 抵押品代币 + +对于 [Hyperlane Warp 路由](/zh/docs/resources/glossary#warp-route),存入[抵押品链](/zh/docs/resources/glossary#collateral-chain)以在远程[合成链](/zh/docs/resources/glossary#synthetic-chain)上创建包装代币的代币。 + +## 默认 ISM + +如果消息接收者没有指定自己的 ISM,将用于验证入站消息的[跨链安全模块](/zh/docs/resources/glossary#interchain-security-module)。 + +## 域 + +特定链的唯一标识符,Hyperlane 协议用它来确定消息的源和目标。 + +可能与 EVM 链 ID 相同,但并非总是如此。有关已知 Hyperlane 域 ID 的列表,请参见[域](/zh/docs/reference/domains/)。 + +## 跨链账户 (ICA) + +允许用户进行跨链智能合约调用的[中间件](/zh/docs/resources/glossary#middleware)智能合约。 + +例如,DAO 可以使用跨链账户拥有远程链上的合约。 + +有关更多信息,请参见[跨链账户](/zh/docs/applications/interchain-account)。 + +## 跨链 Gas 支付主 + +由[中继器](/zh/docs/resources/glossary#relayer)部署的智能合约,接受源链上的支付以在目标链上传递消息。 + +有关更多信息,请参见[跨链 Gas 支付](/zh/docs/protocol/core/interchain-gas-payment) + +## 跨链查询 (IQS) + +允许用户进行跨链视图调用的[中间件](/zh/docs/resources/glossary#middleware)智能合约。 + +例如,智能合约可以使用跨链查询从远程链查找预言机汇率或代币余额。 + +## 跨链安全模块 (ISM)[​](#interchain-security-module-ism "Direct link to Interchain Security Module (ISM)") + +[跨链安全模块](/zh/docs/protocol/ISM/modular-security) (ISM) 是为 Hyperlane 的跨链[邮箱](/zh/docs/protocol/core/mailbox)提供安全性的智能合约。 + +ISM 负责验证在目标链上传递的跨链消息_确实在_源链上发送。 + +## 邮箱 + +可以说是最重要的 Hyperlane 智能合约,[邮箱](/zh/docs/protocol/core/interchain-gas-payment)公开了开发者可用于[发送](/zh/docs/reference/messaging/send)和[接收](/zh/docs/reference/messaging/receive)跨链消息的接口。 + +## 中间件[​](#middleware "Direct link to Middleware") + +发送和接收消息并公开面向开发者的 API 的智能合约。开发者应使用此 API,而不是直接与[邮箱](/zh/docs/resources/glossary#mailbox)交互。 + +示例中间件包括[跨链账户-ica](/zh/docs/resources/glossary#interchain-accounts-ica)和[跨链查询-iqs](/zh/docs/resources/glossary#interchain-queries-iqs)。 + +## 多重签名 ISM + +[多重签名 ISM](/zh/docs/protocol/ISM/standard-ISMs/multisig-ISM) 是一种[跨链安全模块](/zh/docs/resources/glossary#interchain-security-module),使用 `n` 个[验证器](/zh/docs/resources/glossary#validator)签名中的 `m` 个来验证特定跨链消息。 + +## 无需许可互操作性[​](#permissionless-interoperability "Direct link to Permissionless Interoperability") + +Hyperlane 可以由任何人部署到任何链,无论是一层、rollup 还是应用链,允许该链无缝通信。Hyperlane 协议的开放设计被称为无需许可互操作性 (PI)。由 Hyperlane 核心团队以外的机构部署的链被称为"PI 链"。 + +## 中继器 + +[中继器](/zh/docs/protocol/agents/relayer)是负责将消息从其源链传递到目标链的 Hyperlane [代理](/zh/docs/resources/glossary#agent)。 + +中继器是不受信任的,任何人都可以操作中继器。 + +## 路由 ISM + +[路由 ISM](/zh/docs/protocol/ISM/standard-ISMs/routing-ISM) 是一种[跨链安全模块](/zh/docs/resources/glossary#interchain-security-module),根据正在传递的消息委托给不同的 ISM。 + +例如,路由 ISM 可以根据消息发送的源链使用不同的 ISM。 + +## 合成链 + +对于 [Hyperlane Warp 路由](/zh/docs/resources/glossary#warp-route),铸造包装代币的链。这些包装代币由已在[抵押品链](/zh/docs/resources/glossary#collateral-chain)上锁定的[抵押品代币](/zh/docs/resources/glossary#collateral-token)支持。 + +## 验证器 + +[验证器](/zh/docs/protocol/agents/validators)是负责证明从源链发送的消息的 Hyperlane [代理](/zh/docs/resources/glossary#agent)。 + +[多重签名 ISM](/zh/docs/resources/glossary#multisig-ism) 使用验证器签名为入站消息提供安全性。 + +## Hyperlane Warp 路由 + +[Hyperlane Warp 路由](/zh/docs/applications/warp-routes/overview)是 Hyperlane 对代币桥接概念的实现,允许您通过 Hyperlane 无需许可地将任何类似 ERC20 的资产转移到任何链。 + +阅读更多关于如何[部署 Hyperlane Warp 路由](/zh/docs/guides/quickstart/deploy-warp-route)的信息。 \ No newline at end of file diff --git a/zh/docs/resources/message-debugging.mdx b/zh/docs/resources/message-debugging.mdx new file mode 100644 index 0000000..b2a50ed --- /dev/null +++ b/zh/docs/resources/message-debugging.mdx @@ -0,0 +1,130 @@ +--- +title: "消息调试" +--- + +### + + + * EVM 源链 + * Cosmos 源链 + +最简单的方法是使用 [Hyperlane 浏览器](https://explorer.hyperlane.xyz),如果您的链受支持的话。如果您的链不受支持,可以通过查看原始交易来找到消息 ID。 + +在源链的区块浏览器中查看原始交易时,导航到 **日志** 标签页。 + +**`DispatchId`** 日志在主题编号 1(第二个主题)中包含消息 ID。 + +有时,链的区块浏览器不会显示人性化的 "DispatchId" 名称。在这种情况下,您可以通过主题 0 找到日志:`0x788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a`。 + +![](/images/docs/guides/dispatch-id-log-evm.png) + +Arbiscan 上显示原始交易中 DispatchId 日志的示例。 + +在源链的区块浏览器中查看原始交易时,导航到 **事件日志** 标签页。 + +**Wasm Mailbox Dispatch Id** 日志包含消息 ID。 + +![](/images/docs/guides/dispatch-id-log-cosmos.png) + +Mintscan 上显示原始交易中日志的示例。 + + + + + 目前,[Hyperlane 浏览器](https://explorer.hyperlane.xyz) 不支持非 EVM 链。 + +要检查您的消息是否已被传递,请选择目标链并在下方输入您的消息 ID: + +目标链: + +neutron + +- [neutron](<#Destination Chain=neutron>) +- [injective](<#Destination Chain=injective>) + +消息 ID:0x... + +检查是否已传递 + + + + + 我们可以通过两个步骤来调试这个问题: + +**验证是否收到了资金:** + +- EVM 目标链 +- Cosmos 目标链 + +1. 打开目标链的区块浏览器,导航到您期望的接收者地址。 +2. 如果您期望收到代币(例如 ERC-20),请检查代币转账标签页中转移到您地址的代币。 +3. 如果您期望收到原生代币(例如以太坊上的 ETH),请检查"内部交易"标签页中转移到您地址的原生代币。 + +4. 打开目标链的区块浏览器,导航到您期望的接收者地址。 +5. 查看您的"币"或"代币"标签页,寻找期望的余额。 +6. 如果不清楚您的余额是否符合期望,请检查交易列表。寻找任何包含"Process"的交易。 + +**验证您转账的接收者** + +- EVM 源链 +- Cosmos 源链 + +在源链的区块浏览器中查看原始交易时,导航到 **日志** 标签页。 + +**`SentTransferRemote`** 日志在主题编号 1(第二个主题)中包含接收者。 + +有时,链的区块浏览器不会显示人性化的 "SentTransferRemote" 名称。在这种情况下,您可以通过主题 0 找到日志:`0xd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec`。 + +接收者地址是目标链上将接收包装代币的账户。如果需要,地址左侧填充零。 + +如果您的目标链是 EVM 链,日志将显示 `0x0000000000000000000000ffffffffffffffffffffffffffffffffffffffff` 表示 `0xffffffffffffffffffffffffffffffffffffffff` 是转账接收者。 + +如果您的目标链是 Cosmos 链,您可以获取十六进制内容并使用诸如[此工具](https://www.bech32converter.com)之类的工具将其转换为 bech32 地址。一些 Cosmos 链具有不同的地址长度,因此请注意要复制多少个字符。 + +![](/images/docs/guides/transfer-remote-evm.png) + +Arbiscan 上显示原始交易中 DispatchId 日志的示例。 + +在源链的区块浏览器中查看原始交易时,导航到 **事件日志** 标签页。 + +包含 **Transfer Remote** 的日志包含消息 ID,例如:`Wasm Hpl Warp Native Transfer Remote`。 + +接收者地址是目标链上将接收包装代币的账户。如果需要,地址左侧填充零。 + +如果您的目标链是 EVM 链,日志将显示 `0x0000000000000000000000ffffffffffffffffffffffffffffffffffffffff` 表示 `0xffffffffffffffffffffffffffffffffffffffff` 是转账接收者。 + +如果您的目标链是 Cosmos 链,您可以获取十六进制内容并使用诸如[此工具](https://www.bech32converter.com)之类的工具将其转换为 bech32 地址。一些 Cosmos 链具有不同的地址长度,因此请注意要复制多少个字符。 + +![](/images/docs/guides/transfer-remote-cosmos.png) + +Mintscan 上显示原始交易中日志的示例。 + + + + + 有时浏览器扩展钱包可能会相互争用,您通常不使用的钱包地址会优先于您预期的钱包。我们已经看到这种情况在 **OKX 钱包** 中发生过几次。请检查您所有钱包地址中的接收者地址。 + + + + 使用 [Hyperlane CLI](/zh/docs/reference/developer-tools/cli),如果消息在两个 EVM 链之间,您可以自己中继消息。 + +1. 按照[这些说明](/zh/docs/reference/developer-tools/cli)在本地设置 CLI。 +2. 按照[上述说明](#从原始交易中查找消息-id)查找您的消息 ID +3. 获取在目标链上有资金的账户的私钥。 +4. 运行命令来中继消息: + +``` +HYP_KEY= hyperlane status --relay --origin --destination --id +``` + +例如: + +``` +HYP_KEY=0xffff00000000000000000000000000000000000000000000000000000000ffff hyperlane status --relay --origin base --destination blast --id 0xabcd00000000000000000000000000000000000000000000000000000000abcd +``` + + + + + 如果上述步骤没有帮助,您可以加入我们的 [Discord](https://discord.com/invite/hyperlane) 并在 **#support-forum** 频道中创建新帖子。 + diff --git a/zh/index.mdx b/zh/index.mdx new file mode 100644 index 0000000..1a07bf1 --- /dev/null +++ b/zh/index.mdx @@ -0,0 +1,77 @@ +--- +title: 介绍 +description: "欢迎来到 Hyperlane 文档。探索我们用于构建跨链应用程序的工具、指南和参考资料。" +--- + +Hero Light +Hero Dark + +## 快速开始 + + + + 快速将 Hyperlane 部署到新链 + + + 跨链转移资产 + + + + + 运行 Hyperlane 验证器的分步指南 + + + 探索组件和架构 + + + +## 您可以构建什么? + + + + 使用 Hyperlane Warp 路由在链之间进行桥接 + + + 跨链发送任意数据和函数调用。 + + + 使源链上的账户能够对另一条链上的合约进行身份验证的调用 + + + \ No newline at end of file