下面是一篇实战教程:教你如何在 X Layer(由 OKX / Polygon CDK 提供的 EVM-兼容 zkEVM L2) 上部署智能合约,并演示如何把资产从以太坊桥到 X Layer(包含可运行的代码与生产实务建议)。我同时在要点处标注了官方文档/资源链接作为出处 — 你可以复制粘贴并立即执行(在 testnet 先试验,再上主网)。
关键事实(来源):
-
X Layer 是一个 EVM-兼容的 zkEVM L2(由 OKX/Polygon CDK 推出)。
-
Mainnet Chain ID = 196,常用 RPC:https://rpc.xlayer.tech(Testnet 也有专用 RPC 与 Faucet)。
-
X Layer 有官方桥(Bridge)与文档,支持把资产从 L1 ↔ X Layer 转移(USDC.e 等示例代币在 L2 有对应地址)。
一、准备工作(先在 Testnet 练手,主网再上线)
-
安装 Node.js(建议 18+)、yarn / npm、Hardhat、ethers.js:
# node & npm already installed
npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethers dotenv
-
创建项目目录:
mkdir xlayer-deploy && cd xlayer-deploy
npx hardhat # choose "Create a basic sample project"
-
获取 RPC / 钱包:
-
Testnet RPC(示例):https://testrpc.xlayer.tech/terigon 或 https://xlayertestrpc.okx.com/terigon(见官方 network info)。
-
Mainnet RPC:https://rpc.xlayer.tech 或其它第三方 provider(Chainlist / thirdweb 列出)。
-
准备一个账户私钥(测试时用小额测试 token;生产用 KMS/HSM)。
-
在 Testnet 上获取测试 OKB(Faucet):官方有 Testnet faucet 可领测试 OKB。
二、Hardhat 配置(连接 X Layer testnet/mainnet)
在项目根创建 .env:
PRIVATE_KEY=0x...your_test_key...
XLAYERT_TESTNET_RPC=https://testrpc.xlayer.tech/terigon
XLAYERT_MAINNET_RPC=https://rpc.xlayer.tech
修改 hardhat.config.js(或创建):
require("@nomiclabs/hardhat-ethers");
require('dotenv').config();
module.exports = {
solidity: "0.8.17",
networks: {
xlayer_testnet: {
url: process.env.XLAYERT_TESTNET_RPC,
chainId: 195, // 注意:官方 testnet chainId 文档显示为 195 / 1952(以官方页面为准),以页面为准替换
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : []
},
xlayer_mainnet: {
url: process.env.XLAYERT_MAINNET_RPC,
chainId: 196,
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : []
}
}
};
注:官方 Testnet chainId 在文档若有差异(195 / 1952),以 X Layer 官方 network page 为准,请在部署前核对。
三、示例智能合约(简单的 ERC20 或一个 Demo 合约)
示例:contracts/SimpleStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract SimpleStorage {
uint256 public value;
event Set(uint256 v, address indexed setter);
function set(uint256 v) external {
value = v;
emit Set(v, msg.sender);
}
}
或者如果你要部署代币: contracts/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 initial) ERC20("MyToken", "MTK") {
_mint(msg.sender, initial);
}
}
安装 OpenZeppelin(如果用 token):
npm install @openzeppelin/contracts
四、部署脚本(Hardhat + ethers)
示例 scripts/deploy.js:
const hre = require("hardhat");
async functionmain() {
const [deployer] = await hre.ethers.getSigners();
console.log("Deploying with", deployer.address);
// Deploy SimpleStorage
const Simple = await hre.ethers.getContractFactory("SimpleStorage");
const simple = await Simple.deploy();
await simple.deployed();
console.log("SimpleStorage deployed to:", simple.address);
}
main()
.then(() => process.exit(0))
.catch(err => {
console.error(err);
process.exit(1);
});
部署到 X Layer Testnet:
npx hardhat run --network xlayer_testnet scripts/deploy.js
部署到 Mainnet(只有在你确认并有资金的情况下):
npx hardhat run --network xlayer_mainnet scripts/deploy.js
五、验证合约(在 X Layer 的区块浏览器上)
X Layer 有 Explorer(OKLink / OKX explorer)。部署后,将合约地址在对应 explorer 上进行源码验证(通常 explorer 提供“Verify Contract”功能,或使用 Hardhat 的插件 hardhat-etherscan 配合相应的 API key)。官方 explorer 文档见:X Layer explorer。
六、把资产从以太坊桥到 X Layer(Bridge 工作流程与实操)
X Layer 提供官方 Bridge(文档:Bridge Overview / Flow of assets)。总体流程(高层)如下:
-
用户在 L1(以太坊)将资产(例如 USDC)approve 给 X Layer 的 L1 Bridge 合约并发起 deposit/lock;
-
Bridge 系统(守护/验证/证明)在 L2 上铸造对应的 bridged token(例如 USDC.e),或在 L2 释放已挂钩代币;
-
反向(从 L2 回 L1)通常是 burn/wait/withdraw 流程(可能涉及确认与证明机制)。详细流程与合约接口参见官方 Bridge 文档。
最简单且推荐的方式(开发者 & 用户):使用官方 Bridge UI(网页)或官方 SDK;这些工具封装了 approve、deposit、等待证明并在 L2 mint 的全部步骤。官方文档里有“Get testnet tokens and bridge / USDC on X Layer” 教程。
6.1 使用官方 Bridge UI(推荐)
-
打开 X Layer 的 Bridge 页面(官方 docs / web app)。
-
连接你的钱包(MetaMask 或 OKX Wallet)。
-
选择要桥的资产(ETH / USDC / OKB 等),输入数量并确认 approve + deposit。
-
等待 Bridge 完成流程(可在 explorer 跟踪 L1 的 deposit 交易,以及 L2 的 mint/receipt)。
优点:不用自己处理签名证明 / relayer 逻辑;适合绝大多数 DApp 场景与普通用户。官方桥会展示状态和 tx 链接。 OKX Wallet
6.2 程序化调用桥(进阶 — 适合做自动化 & 集成)
如果你要在后端自动化桥资产(例如为 DApp 后端实现托管桥),可以用 ethers.js 调用 L1 的 Bridge 合约接口。要点:
-
你需要知道 L1 Bridge 合约地址与 ABI(在官方文档 / GitHub / explorer 中可查)。 OKX Wallet
流程示例(伪码):
// 1) Approve token to bridge
const erc20 = new ethers.Contract(L1_USDC_ADDRESS, erc20Abi, signer);
await (await erc20.approve(L1_BRIDGE_ADDRESS, amount)).wait(1);
// 2) Call deposit/lock on L1 Bridge
const bridge = new ethers.Contract(L1_BRIDGE_ADDRESS, bridgeAbi, signer);
const tx = await bridge.deposit(recipientOnL2, amount); // 函数名视具体 bridge 合约而定
await tx.wait(CONFIRMATIONS); // 等待足够的确认深度
// 3) Poll until L2 mint event appears (or listen on L2 explorer/event)
安全提示:不要在后端私钥直接使用单个私钥操作巨量资金。生产应使用 KMS/HSM、并设计多签或阈值签名来保护资金。桥是高风险点,务必审计桥合约与 relayer 流程。
6.3 L2 上的对应代币示例
官方文档列出了一些在 X Layer 上存在的 bridged 代币,例如 USDC.e(X Layer 上地址示例:0xA8CE8aee21bC2A48a5EF670afCc9274C7bbbC035)。使用桥把以太坊 USDC 桥到 X Layer 后,你会在 L2 上看到这样的地址与代币。 OKX Wallet
七、校验 & 调试步骤(开发者常用)
-
在 L1 发起 deposit 后,用 L1 explorer(Etherscan)查看 tx,确认完成(等待 N 个确认,取决于桥策略)。
-
用 X Layer 的 explorer(OKLink / OKX explorer)查询 L2 的 mint / deposit 对应 tx(Bridge UI 通常会给出链接)。
-
若用脚本:在 L2 上监听 Transfer 事件或桥合约的 Minted/Deposited 事件,持久化入库,并在出现错误时做补偿逻辑。
-
在 Testnet 多做异常测试(网络回滚、重放攻击、半成功场景),并做恢复计划。
❝本公众号发布的内容除特别标明外版权归原作者所有。若涉及版权问题,请联系我们。所有信息及评论区内容仅供参考,请读者自行判断信息真伪,不构成任何投资建议。据此产生的任何损失,本公众号概不负责,亦不负任何法律责任。

