基于NFC卡片的Injective钱包管理系统。当用户首次将NFC卡片贴近设备时,系统会自动生成Injective钱包并关联NFC UID,用户可以设置个性化的.inj域名作为身份标识。
- 后端框架: NestJS + TypeScript
- 数据库: PostgreSQL + Prisma ORM
- 区块链: Injective Protocol + ethers.js
- 加密: AES-256-GCM私钥加密存储
- 部署: Docker + Docker Compose + Nginx
- 通过NFC UID自动生成Injective钱包
- 支持双地址格式 (inj地址 + eth兼容地址)
- 私钥AES-256-GCM加密存储
- 支持重复读取已注册的NFC卡片
- 用户名唯一性验证
- 支持用户名编辑和删除
- 用户名格式验证(3-50字符,字母数字下划线连字符)
- 私钥加密存储,不明文落库
- API文档自动生成(Swagger)
- 请求验证和错误处理
- 安全HTTP头设置
- Node.js 18+
- Docker & Docker Compose
- PostgreSQL 15+
git clone <repository-url>
cd nfc-wallet-backend# 复制环境变量配置
cp env.example .env
# 编辑配置文件
nano .env重要配置项:
# 数据库连接
DATABASE_URL="postgresql://nfc_user:secure_password_123@localhost:5432/nfc_wallet?schema=public"
# AES加密密钥 (64字符十六进制字符串)
AES_ENCRYPTION_KEY="a1b2c3d4e5f6789012345678901234567890123456789012345678901234567890"
# JWT密钥
JWT_SECRET="your-super-secret-jwt-key-change-in-production"# 启动数据库
docker-compose up postgres redis -d
# 安装依赖
npm install
# 生成Prisma客户端
npm run prisma:generate
# 数据库迁移
npm run prisma:migrate
# 启动开发服务器
npm run start:dev# 一键启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f api# 推送数据库架构
npm run prisma:push
# 或者使用迁移
npm run prisma:migrate
# 打开Prisma Studio(可选)
npm run prisma:studio服务启动后,访问 http://localhost:3000/api 查看完整的API文档。
POST /api/nfc/register- 注册NFC卡片并生成钱包GET /api/nfc/wallet/:uid- 根据UID获取钱包信息GET /api/nfc/stats- 获取钱包统计信息
PUT /api/user/username- 更新用户名GET /api/user/profile/:uid- 获取用户资料GET /api/user/check-username/:username- 检查用户名可用性DELETE /api/user/username/:uid- 删除用户名
curl -X POST http://localhost:3000/api/nfc/register \
-H "Content-Type: application/json" \
-d '{"uid": "04:1a:2b:3c:4d:5e:6f"}'响应:
{
"address": "0x742d35Cc6bb7C582D60",
"uid": "04:1a:2b:3c:4d:5e:6f",
"username": null,
"isNewWallet": true,
"createdAt": "2024-01-01T00:00:00.000Z"
}curl -X PUT http://localhost:3000/api/user/username \
-H "Content-Type: application/json" \
-d '{"uid": "04:1a:2b:3c:4d:5e:6f", "username": "alice123"}'CREATE TABLE nfc_wallets (
id SERIAL PRIMARY KEY,
uid VARCHAR(255) UNIQUE NOT NULL, -- NFC UID
address VARCHAR(42) NOT NULL, -- 以太坊地址
private_key_enc TEXT NOT NULL, -- 加密的私钥
username VARCHAR(50) UNIQUE, -- 用户名(可选且唯一)
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);- 私钥使用AES-256-GCM算法加密
- 加密密钥存储在环境变量中
- 私钥不会通过API返回给客户端
- 更改默认密钥: 生产环境必须更改所有默认密码和密钥
- HTTPS配置: 启用SSL/TLS加密传输
- 防火墙设置: 限制数据库端口访问
- 定期备份: 配置数据库自动备份
- 服务器准备
# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose- SSL证书配置
# 创建SSL目录
mkdir ssl
# 获取Let's Encrypt证书(示例)
sudo certbot certonly --standalone -d your-domain.com
sudo cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ssl/cert.pem
sudo cp /etc/letsencrypt/live/your-domain.com/privkey.pem ssl/key.pem- 生产环境配置
# 修改docker-compose.yml中的环境变量
# 启用nginx.conf中的HTTPS配置
# 设置强密码和密钥
# 启动服务
docker-compose up -d# 查看服务状态
docker-compose ps
# 查看API日志
docker-compose logs -f api
# 查看Nginx日志
docker-compose logs -f nginx
# 查看数据库日志
docker-compose logs -f postgressrc/
├── app.module.ts # 应用主模块
├── main.ts # 应用入口
├── prisma/ # 数据库服务
│ ├── prisma.module.ts
│ └── prisma.service.ts
├── crypto/ # 加密服务
│ ├── crypto.module.ts
│ └── crypto.service.ts
├── nfc/ # NFC钱包管理
│ ├── dto/
│ ├── nfc.controller.ts
│ ├── nfc.service.ts
│ └── nfc.module.ts
└── user/ # 用户管理
├── dto/
├── user.controller.ts
├── user.service.ts
└── user.module.ts
# 安装依赖
npm install
# 启动开发服务器
npm run start:dev
# 运行测试
npm run test
# 代码格式化
npm run format
# 代码检查
npm run lint
# 构建项目
npm run build-
数据库连接失败
- 检查DATABASE_URL配置
- 确认PostgreSQL服务运行状态
- 验证网络连接
-
私钥加密失败
- 检查AES_ENCRYPTION_KEY长度(必须64字符)
- 确认密钥为有效的十六进制字符串
-
Docker启动失败
- 检查端口占用:
netstat -tlnp | grep :3000 - 查看容器日志:
docker-compose logs api
- 检查端口占用:
-
数据库优化
- 为常用查询字段添加索引
- 定期执行VACUUM和ANALYZE
- 配置连接池
-
应用优化
- 启用Redis缓存
- 配置负载均衡
- 使用CDN加速静态资源
- Fork项目
- 创建功能分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add some amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交Pull Request
本项目采用MIT许可证 - 详见 LICENSE 文件。
如有问题或建议,请提交Issue或联系开发团队。