前言本文基于Solidity0.8.24(Cancun升级版)与OpenZeppelinV5,拆解分析PEPE和DOGE两大现象级项目的代币模型——还原PEPE的固定总量模型、DOGE的持续通胀模型,并结合Viem+Node:test搭建测试闭环。本文仅做纯技
本文基于 Solidity 0.8.24(Cancun 升级版)与 OpenZeppelin V5,拆解分析 PEPE 和 DOGE 两大现象级项目的代币模型 —— 还原 PEPE 的固定总量模型、DOGE 的持续通胀模型,并结合 Viem + Node:test 搭建测试闭环。本文仅做纯技术层面的项目拆解,不构成任何投资建议,不鼓励任何虚拟货币炒作行为,提醒读者理性看待加密项目,警惕投资风险。
一、 Pepe vs Dogecoin
1. 底层平台(区块链)不同
Pepe (PEPE) :是一个 ERC-20 代币,运行在 以太坊 (Ethereum) 链上。它没有自己的独立账本,而是依赖于以太坊的智能合约框架和安全性。
Dogecoin (DOGE) :拥有自己的独立 Layer-1 区块链。它最初是基于莱特币(Litecoin)代码库开发的,拥有自己的矿工、节点网络和共识机制(工作量证明 PoW)。
| 特性 | Pepe (PEPE) | Dogecoin (DOGE) |
|---|---|---|
| 网络类型 | 以太坊上的代币 (Token) | 独立公链 (Coin) |
| 共识机制 | 权益证明 (PoS) - 随以太坊 | 工作量证明 (PoW) - 独立挖矿 |
| 供应模型 | 固定总量 + 通缩销毁 | 无上限 + 持续通胀增发 |
| 智能合约 | 支持复杂逻辑(如 OpenZeppelin 实现) | 原生链不支持复杂合约(需通过 Dogechain 扩展) |
它们唯一的共同点是同属于 Meme 币(模因币) 类别,且在某些去中心化交易平台(如 Uniswap)或中心化交易所(如 Binance)上可以同时被交易。
此外,市场上存在一些同名或跨链包装代币(如 BNB 链上的 Doge-PEPE 或以太坊上的 Wrapped DOGE),但这些都不是原生 DOGE 或 PEPE。
| 维度 | Pepe (PEPE) —— “极致模因” | Dogecoin (DOGE) —— “模因鼻祖” |
|---|---|---|
| 诞生背景 | 2023 年诞生,旨在回归纯粹的模因文化。 | 2013 年诞生,最初用于嘲讽比特币。 |
| 底层架构 | ERC-20 代币(运行在以太坊链上)。 | 独立 Layer-1 公链(基于 PoW 机制)。 |
| 供应机制 | 固定总量(约 420.69 万亿枚)。 | 无限供应(每年固定产出约 50 亿枚)。 |
| 核心特色 | 极致去中心化:通常销毁 LP 并丢弃权限。<br> 无税交易:0% 买卖税,纯靠流动性驱动。 <br>通缩预期:通过销毁多签钱包代币制造稀缺。 | 文化底蕴:10 年社区积累 + 马斯克背书。 <br>极高流动性:全球主流交易所全覆盖。<br> 打赏文化:适合作为小费或日常支付媒介。 |
| 生态兼容 | 完美接入所有 DeFi 基础设施(Uniswap 等)。 | 独立主网,不支持复杂智能合约,扩展性较弱。 |
| 核心风险 | 筹码集中度:早期巨鲸控盘严重,易暴涨暴跌。<br> 共识脆弱:缺乏实际场景,高度依赖社交情绪。 <br>合约隐患:若初始 LP 未锁定,存在归零风险。 | 持续贬值压力:无上限产出带来的长期抛压。<br> 马斯克效应:受个人言论操纵感强,波动剧烈。<br> 技术滞后:开发进度较慢,应用场景受限。 |
| 暴力美学 | 通缩 + 极简:部署后即“听天由命”。 | 通胀 + 实用:更倾向于一种“互联网货币”。 |
Memecoin 属于高波动资产。在 Pepe 的代码实现(Solidity 0.8.24)中,虽然我们可以模拟其逻辑,但其价值的核心在于社区共识的深度。对于 Doge,其核心风险在于长期的通胀抛压;而对于 Pepe,核心风险在于热度衰退后的流动性枯竭。
虽然 PEPE 和 DOGE 都属于模因币(Meme Coin),但在智能合约逻辑上有着本质区别:
在 OpenZeppelin V5 中,Ownable 模块要求在构造函数中显式初始化 initialOwner。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
/**
* @dev PEPE:代表固定供应量的 ERC20 模型
*/
contract PepeToken is ERC20, Ownable {
constructor() ERC20("Pepe", "PEPE") Ownable(msg.sender) {
// 420.69 万亿,经典的模因数字
_mint(msg.sender, 420_690_000_000_000 * 10**18);
}
}
/**
* @dev DOGE (ERC20版):代表持续通胀的增发模型
*/
contract DogeToken is ERC20, Ownable {
constructor() ERC20("Dogecoin", "DOGE") Ownable(msg.sender) {
_mint(msg.sender, 100_000_000_000 * 10**18);
}
// 允许通过 Owner 权限模拟矿工奖励或协议增发
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
}
采用更轻量、类型安全的 Viem 配合 Node.js 原生的测试运行器。
测试要点:
n 后缀。OwnableUnauthorizedAccount 错误。import assert from "node:assert/strict";
import { describe, it, beforeEach } from "node:test";
import { network } from "hardhat";
import { parseEther } from "viem";
describe("Meme Tokens 核心功能测试", function () {
let pepe, doge, admin, user, publicClient;
beforeEach(async function () {
const { viem: v } = await (network as any).connect();
[admin, user] = await v.getWalletClients();
publicClient = await v.getPublicClient();
pepe = await v.deployContract("PepeToken");
doge = await v.deployContract("DogeToken");
});
it("验证 PEPE:总量一次性分发", async function () {
const expectedTotal = 420_690_000_000_000n * 10n**18n;
const balance = await pepe.read.balanceOf([admin.account.address]);
assert.strictEqual(balance, expectedTotal, "PEPE 初始分发数据错误");
});
it("验证 DOGE:管理员具备增发权限(通胀模型)", async function () {
const mintAmount = parseEther("1000");
await doge.write.mint([user.account.address, mintAmount], { account: admin.account });
const userBal = await doge.read.balanceOf([user.account.address]);
assert.strictEqual(userBal, mintAmount, "DOGE 增发未能正确到达账上");
});
it("安全性测试:非管理员增发应触发 OZ V5 自定义错误", async function () {
try {
await doge.write.mint([user.account.address, parseEther("1")], { account: user.account });
assert.fail("应在非 Owner 调用时回滚");
} catch (e: any) {
// 验证是否抛出了 OpenZeppelin V5 的特定错误
assert.ok(e.message.includes("OwnableUnauthorizedAccount"), "未抛出预期的权限错误");
}
});
});
// scripts/deploy.js
import { network, artifacts } from "hardhat";
async function main() {
// 连接网络
const { viem } = await network.connect({ network: network.name });//指定网络进行链接
// 获取客户端
const [deployer] = await viem.getWalletClients();
const publicClient = await viem.getPublicClient();
const deployerAddress = deployer.account.address;
console.log("部署者的地址:", deployerAddress);
// 加载合约
const pepeartifact = await artifacts.readArtifact("PepeToken");
const dogeartifact = await artifacts.readArtifact("DogeToken");
// 部署(构造函数参数:recipient, initialOwner)
const pepehash = await deployer.deployContract({
abi: pepeartifact.abi,//获取abi
bytecode: pepeartifact.bytecode,//硬编码
args: [],//process.env.RECIPIENT, process.env.OWNER
});
// 等待确认并打印地址
const pepeReceipt = await publicClient.waitForTransactionReceipt({ hash: pepehash });
console.log("合约地址:", pepeReceipt.contractAddress);
const dogehash = await deployer.deployContract({
abi: dogeartifact.abi,//获取abi
bytecode: dogeartifact.bytecode,//硬编码
args: [],//process.env.RECIPIENT, process.env.OWNER
});
// 等待确认并打印地址
const dogeReceipt = await publicClient.waitForTransactionReceipt({ hash: dogehash });
console.log("合约地址:", dogeReceipt.contractAddress);
}
main().catch(console.error);
至此,关于 Pepe 与 Dogecoin 两大现象级项目的代币模型,已完成从理论拆解、项目深度对比分析,到合约开发、测试、部署落地的全流程讲解。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!