目录(点击展开/折叠)
Artist NFT 是一个基于以太坊的去中心化数字艺术品交易平台,为艺术家提供完整的NFT创作、发行和交易解决方案。平台采用现代化的全栈技术架构,集成了IPFS和Arweave双重存储方案,确保数字艺术品的永久保存和快速访问。
- 🎨 艺术家友好 - 简化NFT创作流程,支持富文本编辑和图片上传
- 🏪 交易透明 - 去中心化交易,智能合约自动执行,无中间商
- 💰 版税保护 - 内置ERC-2981版税标准,保障艺术家长期收益
- 🌊 生态集成 - 无缝对接OpenSea等主流NFT市场
- 🔐 数据永存 - IPFS+Arweave双重存储,确保艺术作品永久可访问
- ⚡ 开发体验 - 基于Vite的现代化开发环境,TypeScript类型安全
| 功能模块 | 特性描述 | 技术实现 |
|---|---|---|
| 🎨 创作铸造 | 富文本编辑器 + 图片上传 + 一键铸造 | Jodit Editor + File Upload + ERC721 |
| 🏪 交易市场 | NFT浏览 + 分类筛选 + 搜索功能 | React Grid + Filter System |
| 🌊 OpenSea集成 | 实时市场数据 + 收藏集统计 + 事件追踪 | OpenSea API v2 + WebSocket |
| 💰 版税管理 | ERC-2981标准 + 费用设置 + 资金提取 | Smart Contract + Royalty System |
| 🔐 去中心化存储 | IPFS快速访问 + Arweave永久保存 | Dual Storage + Auto Switch |
| 💳 Web3集成 | MetaMask连接 + 多网络支持 + 状态管理 | Ethers.js v6 + Wallet Connect |
graph TD
A[React 18] --> B[TypeScript]
B --> C[Vite 5]
C --> D[Ant Design]
D --> E[Ethers.js v6]
E --> F[Web3 Integration]
graph LR
A[Solidity 0.8.28] --> B[OpenZeppelin]
B --> C[ERC721 + ERC2981]
C --> D[Hardhat 3.0]
D --> E[TypeChain]
graph TB
A[NFT Metadata] --> B{Storage Router}
B -->|Fast Access| C[IPFS]
B -->|Permanent| D[Arweave]
C --> E[Content Addressing]
D --> F[Blockweave]
ArtistNFT合约采用OpenZeppelin模块化设计模式,通过多重继承实现功能的高度解耦和复用:
contract ArtistNFT is ERC721URIStorage, ERC721Enumerable, ERC721Royalty, Ownable {
// Contract implementation
}继承层级分析:
- ERC721URIStorage: 提供NFT元数据存储功能,支持tokenURI管理
- ERC721Enumerable: 支持NFT枚举查询,提供totalSupply、tokenByIndex等方法
- ERC721Royalty: 集成ERC-2981版税标准,支持二级市场版税分成
- Ownable: 实现权限控制机制,确保关键操作的安全性
- 标准兼容: 完全兼容以太坊版税标准,支持所有主流NFT市场
- 动态配置: 默认2%版税(basis points为200),合约所有者可调整
- 艺术家受益: 每个NFT独立设置版税接收者,确保艺术家在二级市场持续获益
- 市场集成: 与OpenSea、LooksRare等主流NFT交易平台无缝集成
- 铸造收费: 用户铸造NFT需支付指定费用(默认1 gwei),防止恶意铸造
- 费用收集: 独立设置费用收集地址,支持DAO治理或团队资金管理
- 资金提取: 仅费用收集者可提取合约余额,确保资金安全
- 动态费率: 合约所有者可根据市场情况调整铸造费用
// 使用OpenZeppelin经过审计的Ownable模式
require(msg.sender == owner(), "Not authorized");// 通过低级call函数返回值检查,防止重入攻击
(bool success, ) = recipient.call{value: amount}("");
require(success, "Transfer failed");// 铸造时严格验证支付金额,避免逻辑漏洞
require(msg.value == mintFee, "Incorrect payment amount");// 实现supportsInterface,确保合约互操作性
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return super.supportsInterface(interfaceId);
}- 原子递增: 使用
_tokenIdCounter.increment()实现自动递增的token ID - 数据一致性: 铸造过程中同时设置元数据和版税信息
- Gas优化: 合理的状态变量布局,减少存储操作成本
- 事件驱动: 关键操作触发事件,便于链下应用监听和索引
// 关键操作事件定义
event NFTMinted(uint256 indexed tokenId, address indexed owner, string tokenURI);
event RoyaltyUpdated(uint256 tokenId, address recipient, uint96 royaltyFraction);
event FeeCollected(address indexed collector, uint256 amount);ArtistCoin 是一个创新的分红型ERC20代币,为平台生态提供激励机制:
| 经济要素 | 详细说明 | 技术实现 |
|---|---|---|
| 最大供应量 | 100 ether | maxSupply = 100 ether |
| 分红来源 | 平台交易手续费 | 自动分配机制 |
| 放大因子 | 2^128 | 精确计算小额分红 |
| 锁定机制 | 防止恶意提取 | locked 状态控制 |
| 治理功能 | DAO投票权 | 按持有量加权投票 |
graph TB
A[ArtistCoin ERC20] --> B[Dividend System]
A --> C[Governance Module]
A --> D[Minting Control]
B --> E[Auto Distribution]
B --> F[Withdraw System]
C --> G[Voting Power]
D --> H[Supply Management]
- 🔄 自动分红: 通过
receive()函数自动触发分红分配 - 💎 精确计算: 使用放大因子确保微小金额的精确分配
- 🛡️ 安全防护: ReentrancyGuard + 权限控制 + 输入验证
- 🗳️ 治理集成: 持有者可参与平台治理决策
- 🔒 资金安全: 多重安全机制防止资金风险
- ✅ ERC20基本功能实现
- ✅ 分红分配机制
- ✅ 安全防护措施
- ✅ 智能合约测试
- ArtistCoin钱包界面
- 代币铸造和转账功能
- 分红提取界面
- 余额和交易历史
- 提案创建和管理
- 投票系统实现
- 治理数据分析
- 社区治理工具
- 去中心化交易所上市
- 跨链桥接支持
- DeFi协议集成
- 生态激励计划
graph TB
subgraph Frontend[前端展示层]
A[React 18] --> B[TypeScript]
B --> C[Ant Design]
C --> D[响应式UI]
end
subgraph Services[业务服务层]
E[NFT服务] --> F[存储服务]
F --> G[钱包服务]
G --> H[工具函数]
end
subgraph Blockchain[区块链交互层]
I[Ethers.js v6] --> J[MetaMask集成]
J --> K[合约交互]
end
subgraph Contracts[智能合约层]
L[ArtistNFT] --> M[ERC721标准]
M --> N[版税系统]
N --> O[权限控制]
end
subgraph Storage[去中心化存储]
P[IPFS] --> Q[快速访问]
R[Arweave] --> S[永久存储]
end
D --> E
D --> I
D --> P
K --> L
artist-nft/
├── 📁 contracts/ # 智能合约源码
│ ├── 📄 ArtistNFT.sol # 主要NFT合约
│ └── 📄 Lock.sol # 示例锁合约
├── 📁 src/ # 前端应用源码
│ ├── 📁 components/ # React组件
│ ├── 📁 service/ # 业务逻辑服务
│ ├── 📁 artifacts/ # 编译后的合约ABI
│ └── 📁 typechain-types/# TypeScript类型定义
├── 📁 test/ # 测试文件
│ ├── 📄 ArtistNFT.ts # NFT合约测试
│ └── 📄 Lock.ts # 锁合约测试
├── 📁 scripts/ # 部署脚本
├── 📁 docs/ # 项目文档
└── 📄 配置文件... # 各种配置文件
| 层级 | 组件 | 功能描述 | 技术实现 |
|---|---|---|---|
| 展示层 | ArticleEditor | 富文本编辑器 | Jodit + NFT铸造 |
| NftCard | NFT展示卡片 | React + CSS Grid | |
| MarketBrowser | 市场浏览器 | OpenSea API集成 | |
| 业务层 | NFTService | NFT操作服务 | Ethers.js交互 |
| StorageService | 存储服务 | IPFS/Arweave双存储 | |
| WalletService | 钱包服务 | MetaMask集成 | |
| 数据层 | ContractAPI | 合约接口 | TypeChain类型安全 |
| StorageAPI | 存储接口 | RESTful API | |
| EventListener | 事件监听 | WebSocket实时更新 |
- 连接钱包 - 使用MetaMask连接您的数字钱包
- 上传作品 - 选择您的数字艺术品文件
- 设置元数据 - 添加作品标题、描述等信息
- 铸造NFT - 一键将作品铸造为NFT

- 管理作品 - 在个人中心查看和管理您的作品集

- 版税设置 - 合约所有者可设置版税比例(如2%),确保艺术家在二级市场持续获益
- 费用管理 - 设置铸造费用和费用收集者地址,管理合约资金
- 资金提取 - 合约所有者可提取合约中的资金
- 实时查看 - 显示合约余额和可提取金额

| 组件 | 版本 | 说明 |
|---|---|---|
| Node.js | ≥ 18.0.0 | JavaScript运行环境 |
| npm | ≥ 9.0.0 | 包管理工具 |
| Git | 最新版本 | 版本控制 |
| MetaMask | 最新版本 | Web3钱包插件 |
| IPFS | 可选 | 去中心化文件存储 |
| Arweave | 可选 | 永久数据存储 |
# 1. 克隆项目
git clone https://github.com/ciphermagic/artist-nft.git
cd artist-nft
# 2. 安装依赖
npm install
# 3. 配置环境变量
cp .env.example .env
# 编辑 .env 文件,添加您的 OpenSea API Key# 启动本地Hardhat网络
npx hardhat node网络配置详情:
- 本地网络:
http://localhost:8545(Chain ID: 0x7A69) - Ganache网络:
http://localhost:8545(Chain ID: 0x539) - Sepolia测试网: 需要配置私钥和Infura/Alchemy API
# 安装并启动IPFS
npm install -g ipfs
ipfs init
ipfs daemon
# 验证IPFS状态
curl http://127.0.0.1:8080/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readmedocker run -d \
--name arweave-local \
-p 1984:1984 \
-v $(pwd)/arweave-data:/data \
arweave/deploy:latest
# 生成钱包并充值
docker exec -it arweave-local arweave wallet create > wallet.json
WALLET_ADDR=$(jq -r .address wallet.json)
docker exec -it arweave-local arweave wallet mint 1000 $WALLET_ADDR
# 验证
curl http://127.0.0.1:1984/info
curl http://127.0.0.1:1984/wallet/$WALLET_ADDR/balance
# 停止 / 删除
docker stop arweave-local && docker rm arweave-local# 在 .env 文件中添加API密钥
VITE_OPENSEA_API_KEY=your_api_key_here获取API密钥:
- 访问 OpenSea开发者门户
- 注册账号并创建API项目
- 复制API密钥到环境变量
# 编译智能合约
npm run compile
# 部署合约到本地网络
npm run deploy
# 启动前端开发服务器
npm run dev# 构建生产版本
npm run build
# 预览构建结果
npm run preview# 运行所有测试
npm run htest
# 仅运行智能合约测试
npx hardhat test solidity
# 仅运行前端集成测试
npx hardhat test mocha| 服务 | 地址 | 端口 | 功能 |
|---|---|---|---|
| 前端应用 | http://localhost:5173 | 5173 | NFT交易平台 |
| 区块链RPC | http://localhost:8545 | 8545 | 以太坊节点 |
| IPFS API | http://localhost:8080 | 8080 | 文件存储 |
| IPFS Gateway | http://localhost:8080/ipfs | 8080 | 文件访问 |
- 连接钱包 - 打开应用后点击"连接钱包"按钮
- 选择网络 - 切换到本地Hardhat网络(Chain ID: 31337)
- 开始创作 - 点击"创建NFT"开始您的第一个作品
- 浏览市场 - 在市场页面查看其他艺术家的作品
# 查看开发服务器状态
npm run dev --status
# 监控合约部署状态
npx hardhat node --watch
# 查看存储节点状态
curl http://localhost:8080/api/v0/version| 指标 | 目标值 | 监控方式 |
|---|---|---|
| 前端加载时间 | < 3秒 | Chrome DevTools |
| 合约部署时间 | < 30秒 | Hardhat输出 |
| IPFS上传速度 | > 1MB/s | IPFS Dashboard |
| 交易确认时间 | < 15秒 | MetaMask |
# 完整测试套件
npm test # 前端单元测试
npm run htest # 智能合约测试
npm run test:e2e # 端到端测试
# 分层测试
npm run test:unit # 单元测试
npm run test:integration # 集成测试
npm run test:contract # 合约测试# 生成覆盖率报告
npm run test:coverage
# 查看详细报告
open coverage/lcov-report/index.html# 代码检查
npm run lint # ESLint检查
npm run lint:fix # 自动修复
# 类型检查
npx tsc --noEmit # TypeScript类型检查
# 格式化
npm run format # Prettier格式化# 依赖安全检查
npm audit
# 合约安全扫描
npx hardhat verify # 合约验证
slither . # 智能合约安全分析# 开发模式构建
npm run build:dev
# 分析构建结果
npm run build:analyze# 生产模式构建
npm run build
# 预览生产构建
npm run preview# 部署到测试环境
npm run deploy:test
# 部署到生产环境
npm run deploy:prod
# 回滚部署
npm run deploy:rollback| 网络类型 | 配置文件 | Chain ID | RPC URL | 说明 |
|---|---|---|---|---|
| 本地开发 | hardhat.config.ts |
31337 | http://localhost:8545 |
Hardhat网络 |
| Ganache | hardhat.config.ts |
1337 | http://localhost:8545 |
本地模拟网络 |
| Sepolia | .env |
11155111 | 自定义 | 以太坊测试网 |
| Mainnet | .env |
1 | 自定义 | 以太坊主网 |
# OpenSea API配置
VITE_OPENSEA_API_KEY=your_api_key_here # API密钥// src/config/storage.ts
export const ipfsConfig = {
host: 'localhost',
port: 5001,
protocol: 'http',
apiPath: '/api/v0'
};// src/config/storage.ts
export const arweaveConfig = {
host: 'localhost',
port: 1984,
protocol: 'http'
};// src/config/wallet.ts
export const walletConfig = {
chains: [
{
chainId: '0x7A69', // Hardhat本地网络
chainName: 'Hardhat Network',
rpcUrls: ['http://localhost:8545'],
nativeCurrency: {
name: 'ETH',
symbol: 'ETH',
decimals: 18
}
}
]
};我们欢迎社区贡献!请遵循以下步骤:
- Fork 项目仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交您的修改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- 🐛 Bug修复 - 修复代码中的问题
- ✨ 新功能 - 添加新的功能特性
- 📝 文档改进 - 完善项目文档
- 🎨 UI/UX优化 - 改善用户界面和体验
- ⚡ 性能优化 - 提升系统性能
| 安全层面 | 实现方式 | 安全保障 |
|---|---|---|
| 智能合约安全 | OpenZeppelin标准 + 重入保护 | ✅ 经过审计的合约模板 |
| 前端安全 | 输入验证 + XSS防护 | ✅ 防止恶意代码注入 |
| 钱包安全 | MetaMask集成 + 签名验证 | ✅ 私钥永不离开钱包 |
| 数据安全 | 去中心化存储 + 加密传输 | ✅ 数据永久可验证 |
| 网络传输 | HTTPS + API密钥保护 | ✅ 通信加密和认证 |
// 使用OpenZeppelin安全库
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
// 输入验证
require(msg.value == mintFee, "Incorrect payment amount");
// 重入保护
nonReentrant modifier for sensitive operations// 输入验证和清理
const validateInput = (input: string) => {
return DOMPurify.sanitize(input);
};
// API密钥保护
const getSecureHeaders = () => ({
'Authorization': `Bearer ${process.env.VITE_OPENSEA_API_KEY}`,
'Content-Type': 'application/json'
});// 安全的钱包连接
const connectWallet = async () => {
try {
// 请求账户访问
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts'
});
// 验证网络
await verifyNetwork();
return accounts[0];
} catch (error) {
console.error('Wallet connection failed:', error);
throw new Error('用户拒绝连接钱包');
}
};问题: 无法连接到本地网络 解决方案:
- ✅ 检查Hardhat节点: 确保
npx hardhat node正在运行 - ✅ 配置自定义网络: 在MetaMask中添加:
- Network Name:
Hardhat Local - RPC URL:
http://localhost:8545 - Chain ID:
31337 - Currency Symbol:
ETH
- Network Name:
- ✅ 清除缓存: 清除浏览器缓存和MetaMask连接状态
问题: 文件无法上传到IPFS 解决方案:
- ✅ 启动IPFS守护进程:
ipfs daemon - ✅ 验证节点状态:
curl http://localhost:8080/webui - ✅ 检查端口: 确保端口8080和5001未被占用
- ✅ 防火墙设置: 允许IPFS相关端口通信
# 查找占用端口的进程
lsof -ti:8545 # Mac/Linux
netstat -ano | findstr :8545 # Windows
# 终止占用进程
kill -9 $(lsof -ti:8545) # Mac/Linux
taskkill /PID <进程ID> /F # Windows问题: npm install 报错或超时
解决方案:
- ✅ 清除缓存:
npm cache clean --force - ✅ 删除依赖:
rm -rf node_modules package-lock.json - ✅ 重新安装:
npm install - ✅ 使用镜像: 配置npm镜像源加速下载
问题: npm run compile 报错
解决方案:
- ✅ 检查Solidity版本: 确保使用0.8.28版本
- ✅ 验证导入路径: 检查所有import语句
- ✅ 清理编译缓存:
npx hardhat clean - ✅ 重新编译:
npm run compile
问题: 无法获取OpenSea市场数据 解决方案:
- ✅ 检查API密钥: 在
.env文件中正确设置VITE_OPENSEA_API_KEY - ✅ 网络连接: 确认能够访问
https://api.opensea.io - ✅ API限制: 注意每分钟调用次数限制
- ✅ 错误处理: 查看浏览器控制台的详细错误信息
问题: 无法连接到指定网络 解决方案:
- ✅ 检查RPC端点: 验证网络配置中的RPC URL
- ✅ 网络状态: 确认目标网络是否正常运行
- ✅ 钱包配置: 在MetaMask中正确配置网络参数
- ✅ 代理设置: 检查是否有代理或防火墙阻挡
问题: 修改代码后页面不自动刷新 解决方案:
- ✅ 重启开发服务器:
npm run dev - ✅ 检查文件监听: 确保Vite正确监听文件变化
- ✅ 浏览器缓存: 强制刷新浏览器缓存 (Ctrl+F5)
- ✅ 端口占用: 检查5173端口是否被其他程序占用
问题: 出现TypeScript编译错误 解决方案:
- ✅ 类型检查: 运行
npx tsc --noEmit查看详细错误 - ✅ 类型定义: 确保安装了正确的@types包
- ✅ 重新生成: 运行
npm run typechain重新生成类型 - ✅ 编辑器配置: 检查VSCode的TypeScript配置
# 启用调试模式
DEBUG=* npm run dev
# 合约调试
npx hardhat node --verbose
# 浏览器调试
# 打开开发者工具,查看Console和Network标签# 查看环境变量
echo $VITE_NETWORK
printenv | grep VITE
# 检查服务状态
curl http://localhost:8545
curl http://localhost:8080/api/v0/version
# 查看进程占用
ps aux | grep node
lsof -i :5173 -i :8545 -i :8080本项目基于 MIT License 开源协议发布。
感谢以下开源项目的贡献:
- Hardhat - 以太坊开发环境
- OpenZeppelin - 智能合约安全标准
- Vite - 现代前端构建工具
- React - 用户界面库
- TypeScript - 类型安全的JavaScript
- Ant Design - 企业级UI设计语言
- Jodit Editor - 富文本编辑器
- React Router - 路由管理
- Tailwind CSS - 实用优先CSS框架
- CryptoPunks - NFT先驱项目
- Bored Ape Yacht Club - 现象级NFT项目
- Art Blocks - 生成艺术NFT平台
如有问题或建议,欢迎通过以下方式联系我们:
| 联系方式 | 链接 | 响应时间 | 说明 |
|---|---|---|---|
| 🐛 问题反馈 | GitHub Issues | 24小时内 | 技术问题和Bug报告 |
| 💬 讨论交流 | GitHub Discussions | 48小时内 | 功能建议和使用讨论 |
| 📧 邮件联系 | [email protected] | 72小时内 | 商务合作和技术咨询 |
| 🌐 项目主页 | ciphermagic.github.io/artist-nft | 实时 | 在线演示和文档 |
| 指标 | 数值 | 更新时间 |
|---|---|---|
| ⭐ GitHub Stars | 查看统计 | 实时 |
| 🐛 Issues | 查看问题 | 实时 |
| 🎉 Pull Requests | 查看PR | 实时 |
| 📊 Contributors | 查看贡献者 | 实时 |



