部署第一个合约(Hardhat)
本指南带你用 Hardhat 把一个简单的 ERC-20 部署到 OXN 测试网。预估时间:钱包充值好后 5 分钟。
前置条件
- Node.js 18+ 和 npm
- 一个持有测试网 TBLUAI 的钱包——见配置钱包和领取测试币
- 私钥导出到环境变量
PRIVATE_KEY。永远不要把私钥提交到仓库。 用一个.env文件通过dotenv加载,并确保.env在.gitignore里。
1. 创建工程
mkdir my-oxn-dapp && cd my-oxn-dapp
npm init -y
npm install --save-dev hardhat@^2.22.0
npx hardhat init
# 选 "Create a JavaScript project",所有选项按默认
2. 安装 OXN Hardhat 插件与 OpenZeppelin
npm install --save-dev @oasisprotocol/sapphire-hardhat@^2.22.0 @openzeppelin/contracts dotenv
插件会自动包裹 Hardhat 的 provider 和 signer,所以每一笔 --network oxn_testnet 的交易都是端到端加密的,不需要按调用手动 opt-in。
在 hardhat.config.js 旁边建一个 .env 文件放私钥,并确保它被 git 忽略:
.env
PRIVATE_KEY=0x你的测试网私钥
.gitignore
.env
永远不要提交私钥
每天都有账户因为不小心把 .env 提交进仓库而被盗。第一次 git add 之前先仔细核对 .gitignore。
3. 配置 hardhat.config.js
用下面的内容替换生成的文件:
hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");
require("@oasisprotocol/sapphire-hardhat"); // 必须在 toolbox 之后 require
require("dotenv").config();
const PRIVATE_KEY = process.env.PRIVATE_KEY;
if (!PRIVATE_KEY) {
throw new Error("在 .env 里设置 PRIVATE_KEY(并把 .env 加进 .gitignore)。");
}
module.exports = {
solidity: {
version: "0.8.24",
settings: {
evmVersion: "paris", // 必需——OXN 尚未支持 PUSH0
optimizer: { enabled: true, runs: 200 },
},
},
networks: {
oxn_testnet: {
url: "https://rpc.bout.network",
chainId: 186,
accounts: [PRIVATE_KEY],
},
},
};
两个必调的设置
evmVersion: "paris"——OXN 运行时尚未支持 Shanghai 引入的PUSH0opcode。用了 PUSH0 的合约会在运行时以invalid coderevert。见 EVM 兼容性。require("@oasisprotocol/sapphire-hardhat")必须在hardhat-toolbox之后——否则 toolbox 会覆盖插件的 provider wrap。
4. 写合约
创建 contracts/MyToken.sol:
contracts/MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply);
}
}