前言PiNetwork自2019年诞生以来,凭借“手机挖矿”和“社交安全圈”模式积累了大量用户。本文仅对其产品机制、用户增长逻辑、经济模型与系统架构做客观拆解与技术分析,不构成任何投资建议,不涉及项目估值与未来预期。2026年,随着OpenZeppelinV5与以太坊坎
Pi Network 自 2019 年诞生以来,凭借 “手机挖矿” 和 “社交安全圈” 模式积累了大量用户。本文仅对其产品机制、用户增长逻辑、经济模型与系统架构做客观拆解与技术分析,不构成任何投资建议,不涉及项目估值与未来预期 。2026 年,随着 OpenZeppelin V5 与以太坊坎昆升级(Cancun)的成熟,我们可以基于 EVM 兼容链的智能合约技术,对其核心运行逻辑进行完整复现与原理研究。
Pi 的成功并非源于高深的密码学突破,而是对行为经济学的极致利用:
优势:极低的用户准入门槛、极强的社交黏性、庞大的实名用户池。
劣势:中心化色彩浓厚、主网开放进度极慢、早期缺乏实际价值支撑导致的“单机积分”质疑。
要复刻 Pi 的核心,我们需要解决三个技术挑战:社交加成算法、无感准入(Permit)以及原子化批处理(Multicall)。
基于 OpenZeppelin V5 构建两大核心合约,解决 “社交加成、无感准入、原子化批处理” 三大技术挑战:
PiToken合约:基础代币层
继承 ERC20 + ERC20Permit(支持无感授权),完成代币发行与基础交互,初始铸造 1 亿枚 PI 给部署者作为奖励池。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
// 确保这里的名称是 PiToken
contract PiToken is ERC20, ERC20Permit {
constructor(string memory name, string memory symbol)
ERC20(name, symbol)
ERC20Permit(name)
{
// 初始铸造给部署者,用于注入奖励池
_mint(msg.sender, 100000000 * 10**decimals());
}
}
PiNetworkFull合约:核心业务层
整合 AccessControl(权限控制)、Multicall(原子化批处理)、EnumerableSet(安全圈管理),实现核心逻辑:
权限管控:仅授权节点(SETTLEMENT_ROLE)可执行 KYC 验证、安全圈管理、奖励结算;
安全圈加成:每个安全圈成员提供 20% 奖励加成,最多 5 人(总加成 100%);
双结算模式:
settleDirect:直接结算(核心常用),验证 KYC 后按安全圈规模计算奖励并发放;claimWithPermit:带 EIP-712 Permit 授权的结算(演示用),保留签名验证作为存证,避免冗余授权逻辑;边界防护:校验 KYC 状态、安全圈最大容量,自定义异常提示(KYCRequired/CircleFull 等)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/Multicall.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
contract PiNetworkFull is AccessControl, Multicall { using EnumerableSet for EnumerableSet.AddressSet;
bytes32 public constant SETTLEMENT_ROLE = keccak256("SETTLEMENT_ROLE");
IERC20 public immutable piToken;
uint256 public constant BOOST_PER_MEMBER = 20; // 每人加成 20%
uint256 public constant MAX_CIRCLE_SIZE = 5;
mapping(address => bool) public hasPassedKYC;
mapping(address => EnumerableSet.AddressSet) private _securityCircles;
error KYCRequired();
error CircleFull();
error TransferFailed();
constructor(address _token) {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
piToken = IERC20(_token);
}
// 核心业务:带有 Permit 授权的原子化结算
function claimWithPermit( address user, uint256 baseAmount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external onlyRole(SETTLEMENT_ROLE) { if (!hasPassedKYC[user]) revert KYCRequired();
uint256 finalAmount = calculateBoostedAmount(user, baseAmount);
// 修复点:如果奖励已经在合约里,不需要 permit 用户给合约授权再 transferFrom
// 这里 permit 的逻辑通常用于“用户授权合约销毁其旧币”或“用户授权扣除手续费”
// 如果是发放奖励,直接用 transfer:
// 如果你坚持要演示 permit 逻辑,确保 permit 的 owner 是奖励的持有者
// 在本例中,我们改为直接发放奖励:
if (!piToken.transfer(user, finalAmount)) revert TransferFailed();
// 为了通过编译器的 unused 检查,可以保留 permit 验证(作为用户签名的存证)
IERC20Permit(address(piToken)).permit(user, address(this), finalAmount, deadline, v, r, s);
}
// 独立结算函数(直接从池子发放,非 Permit 模式)
function settleDirect(address user, uint256 baseAmount) external onlyRole(SETTLEMENT_ROLE) {
if (!hasPassedKYC[user]) revert KYCRequired();
uint256 finalAmount = calculateBoostedAmount(user, baseAmount);
if (!piToken.transfer(user, finalAmount)) revert TransferFailed();
}
function verifyKYC(address user) external onlyRole(SETTLEMENT_ROLE) {
hasPassedKYC[user] = true;
}
function addToSecurityCircle(address user, address member) external onlyRole(SETTLEMENT_ROLE) {
if (_securityCircles[user].length() >= MAX_CIRCLE_SIZE) revert CircleFull();
_securityCircles[user].add(member);
}
function calculateBoostedAmount(address user, uint256 baseAmount) public view returns (uint256) {
uint256 size = _securityCircles[user].length();
unchecked {
return (baseAmount * (100 + (size * BOOST_PER_MEMBER))) / 100;
}
}
function getCircleSize(address user) external view returns (uint256) {
return _securityCircles[user].length();
}
}
### 2. 自动化测试与验证 (基于 Viem + Node.js)
**测试用例**:
- **加成算法验证**:测试 0 人 / 5 人安全圈的奖励计算(0 加成 vs 100% 加成);
- **原子化批处理**:通过 Multicall 单次交易完成 “KYC 验证 + 安全圈加人 + 奖励结算”;
- **Permit 授权测试**:模拟离线签名授权的奖励领取流程;
- **权限边界测试**:验证非授权账户调用核心功能时的拦截效果。
import assert from "node:assert/strict"; import { describe, it, beforeEach } from "node:test"; import { network } from "hardhat"; import { parseEther, encodeFunctionData, hexToBytes } from "viem";
describe("Pi Network 2026 全流程综合压力测试", function () { let piToken: any, core: any; let admin: any, user: any, node: any, friends: any[]; let vClient: any, pClient: any;
beforeEach(async function () {
const { viem } = await (network as any).connect();
vClient = viem;
[admin, user, node, ...friends] = await vClient.getWalletClients();
pClient = await vClient.getPublicClient();
// 1. 部署 OpenZeppelin V5 代币并给合约注资
piToken = await vClient.deployContract("PiToken", ["Pi Network", "PI"]);
core = await vClient.deployContract("PiNetworkFull", [piToken.address]);
const SETTLEMENT_ROLE = await core.read.SETTLEMENT_ROLE();
await core.write.grantRole([SETTLEMENT_ROLE, node.account.address]);
// 模拟代币池准备 (注资到合约)
await piToken.write.transfer([core.address, parseEther("100000")]);
});
it("用例 1: 基础加成算法验证 (0人 vs 5人)", async function () {
const base = parseEther("100");
// 验证 0 人
assert.strictEqual(await core.read.calculateBoostedAmount([user.account.address, base]), base);
// 批量加入 5 人
for (let i = 0; i < 5; i++) {
await core.write.addToSecurityCircle([user.account.address, friends[i].account.address], { account: node.account });
}
// 验证 5 人加成 (100% + 5*20% = 200%)
const boosted = await core.read.calculateBoostedAmount([user.account.address, base]);
assert.strictEqual(boosted, parseEther("200"));
});
it("用例 2: 复杂 Multicall (KYC + Circle + Settle) 原子化闭环", async function () {
const base = parseEther("100");
const nodeAccount = { account: node.account };
// 准备 3 个动作的编码数据
const data1 = encodeFunctionData({ abi: core.abi, functionName: "verifyKYC", args: [user.account.address] });
const data2 = encodeFunctionData({ abi: core.abi, functionName: "addToSecurityCircle", args: [user.account.address, friends[0].account.address] });
const data3 = encodeFunctionData({ abi: core.abi, functionName: "settleDirect", args: [user.account.address, base] });
// 执行原子交易:验证 -> 加人 -> 结算 (120%)
await core.write.multicall([[data1, data2, data3]], nodeAccount);
const balance = await piToken.read.balanceOf([user.account.address]);
assert.strictEqual(balance, parseEther("120"), "原子化加成结算失败");
});
it("用例 3: EIP-712 Permit 离线签名冒烟测试", async function () {
await core.write.verifyKYC([user.account.address], { account: node.account });
const base = parseEther("100");
const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600);
// 签名逻辑 (EIP-2612)
const domain = { name: "Pi Network", version: "1", chainId: await pClient.getChainId(), verifyingContract: piToken.address };
const types = { Permit: [{name:"owner",type:"address"},{name:"spender",type:"address"},{name:"value",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"}] };
const nonce = await piToken.read.nonces([user.account.address]);
const sig = await user.signTypedData({
domain, types, primaryType: "Permit",
message: { owner: user.account.address, spender: core.address, value: base, nonce, deadline }
});
const r = sig.slice(0, 66);
const s = `0x${sig.slice(66, 130)}`;
const v = parseInt(sig.slice(130, 132), 16);
// 注意:此处需要 PiToken 内部支持从池子地址(address(piToken)) permit 授权,
// 脚本演示了 Permit 逻辑的完整流转,实际 Pi 场景多采用 settleDirect。
await core.write.claimWithPermit([user.account.address, base, deadline, v, r, s], { account: node.account });
assert.ok(await piToken.read.balanceOf([user.account.address]) > 0n);
});
it("用例 4: 安全边界与权限拦截", async function () {
try {
// 普通用户尝试调用只有节点能调用的 KYC 函数
await core.write.verifyKYC([admin.account.address], { account: user.account });
assert.fail("非法权限未拦截");
} catch (e: any) {
assert.ok(e.message.includes("AccessControlUnauthorizedAccount"));
}
});
});
### 3.部署脚本
// 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 PiTokenArtifact = await artifacts.readArtifact("PiToken");
// 部署(构造函数参数:recipient, initialOwner) const PiTokenHash = await deployer.deployContract({ abi: PiTokenArtifact.abi,//获取abi bytecode: PiTokenArtifact.bytecode,//硬编码 args: ["Pi Network", "PI"],//process.env.RECIPIENT, process.env.OWNER });
// 等待确认并打印地址 const PiTokenReceipt = await publicClient.waitForTransactionReceipt({ hash : PiTokenHash }); console.log("PiToken合约地址:", PiTokenReceipt.contractAddress);
const PiNetworkFullArtifact = await artifacts.readArtifact("PiNetworkFull"); // 1. 部署合约并获取交易哈希 const PiNetworkFullHash = await deployer.deployContract({ abi: PiNetworkFullArtifact.abi, bytecode: PiNetworkFullArtifact.bytecode, args: [PiTokenReceipt.contractAddress], }); const lockerReceipt = await publicClient.waitForTransactionReceipt({ hash: PiNetworkFullHash }); console.log("PiNetworkFull合约地址:", lockerReceipt.contractAddress); }
main().catch(console.error);
# 三、 现象级进阶:从 Pi 走向 Pipin (AI + DePIN)
2026 年的 X2E 赛道已经发生了范式转移。纯粹的人工点击(如早期 Pi)正在被更高效的模型取代:
1. **AI 代理 (Pipin 模式)** :复刻 Pi 时,可以引入 AI Agent。AI 代理根据用户的社交活跃度、推文影响力自动在链上触发 `settle` 逻辑,实现真正的“Social-to-Earn”。
1. **DePIN 结合 (Grass 模式)** :Pi 的手机挖矿是虚构的算力,而 Grass 则是实时的带宽共享。未来的复刻项目可以将 Pi 的社交裂变与实际的硬件资源共享(如带宽、存储)结合,利用 Solidity 0.8.24 的高效账本进行实时结算。
# 四、 结语
至此,基于 Solidity 对 Pi Network 核心业务的智能合约复刻与项目机制拆解已全部完成。
复刻 Pi Network 的本质,并非简单实现代币发行,而是还原其**社交资产化**的核心逻辑:
- **技术层面**:借助 OpenZeppelin V5 的 `AccessControl` 与 `Multicall`,可高效实现其权限管理与批量结算逻辑;
- **商业层面**:Pi 的核心壁垒,在于其超 6000 万实名用户构建的社交网络护城河;
- **风险提示**:所有 X2E 模式若无法从博弈闭环转向真实价值创造(如数据服务、生态收益回购等),终将难以持续。 如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!