深度实战:使用 Solidity 0.8.24 + OpenZeppelin V5 实现 Pepe 与 Dogecoin 的核心逻辑

  • 木西
  • 发布于 5小时前
  • 阅读 39

前言本文基于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)。 

2. 技术特性对比

特性  Pepe (PEPE) Dogecoin (DOGE)
网络类型 以太坊上的代币 (Token) 独立公链 (Coin)
共识机制 权益证明 (PoS) - 随以太坊 工作量证明 (PoW) - 独立挖矿
供应模型 固定总量 + 通缩销毁 无上限 + 持续通胀增发
智能合约 支持复杂逻辑(如 OpenZeppelin 实现) 原生链不支持复杂合约(需通过 Dogechain 扩展)

3. 关联性

它们唯一的共同点是同属于 Meme 币(模因币)  类别,且在某些去中心化交易平台(如 Uniswap)或中心化交易所(如 Binance)上可以同时被交易。 

此外,市场上存在一些同名或跨链包装代币(如 BNB 链上的 Doge-PEPE 或以太坊上的 Wrapped DOGE),但这些都不是原生 DOGE 或 PEPE。 

4. Pepe vs Dogecoin 深度对比表

维度 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> 技术滞后:开发进度较慢,应用场景受限。
暴力美学 通缩 + 极简:部署后即“听天由命”。 通胀 + 实用:更倾向于一种“互联网货币”。

5. 投资预警

Memecoin 属于高波动资产。在 Pepe 的代码实现(Solidity 0.8.24)中,虽然我们可以模拟其逻辑,但其价值的核心在于社区共识的深度。对于 Doge,其核心风险在于长期的通胀抛压;而对于 Pepe,核心风险在于热度衰退后的流动性枯竭

二、 核心架构设计

虽然 PEPE 和 DOGE 都属于模因币(Meme Coin),但在智能合约逻辑上有着本质区别:

  • Pepe (PEPE) :追求极简主义。在构造函数中一次性铸造(Mint)全量代币,随后通常会丢弃所有权(Renounce Ownership),实现真正的去中心化。
  • Dogecoin (DOGE) :模拟原生公链的通胀特性。除了初始发行外,保留了管理员(Owner/Miner)持续增发的接口,以实现无限供应。

三、 合约实现:Solidity 0.8.24

在 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:test 闭环

采用更轻量、类型安全的 Viem 配合 Node.js 原生的测试运行器。

测试要点

  1. BigInt 精度:处理 PEPE 这种天文数字供应量时,必须使用原生 n 后缀。
  2. 错误捕捉:利用 Viem 捕获 OpenZeppelin V5 自定义的 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 两大现象级项目的代币模型,已完成从理论拆解、项目深度对比分析,到合约开发、测试、部署落地的全流程讲解。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
木西
木西
0x5D5C...2dD7
江湖只有他的大名,没有他的介绍。