一套用于测试 Arweave 数据上传链路的全栈工具,包含 Go 后端 + React 前端,数据持久化使用 SQLite,链上交互通过 goar SDK 对接 Arweave。
web3/
├── backend/
│ ├── main.go # 服务入口,Gin 路由配置
│ ├── go.mod / go.sum # Go 模块依赖
│ ├── handlers/
│ │ └── handlers.go # API 处理器(上传/查询/状态)
│ ├── db/
│ │ └── db.go # SQLite 数据库操作
│ └── models/
│ └── models.go # 数据结构定义
├── frontend/
│ ├── src/
│ │ ├── App.tsx # 主应用组件
│ │ ├── api/
│ │ │ └── client.ts # Axios API 封装
│ │ └── components/
│ │ ├── UploadForm.tsx # 上传表单 + 状态轮询
│ │ ├── QueryForm.tsx # 数据查询(TxID / 本地ID)
│ │ └── RecordsTable.tsx # 本地 SQLite 记录列表
│ └── package.json
├── start-backend.sh # 后端启动脚本
├── start-frontend.sh # 前端启动脚本
└── README.md
你需要一个 Arweave JWK 格式钱包(.json 文件)并确保钱包内有 AR 余额用于支付 Gas 费。
- 免费领取测试 AR:faucet.arweave.net
- 将钱包文件放到:
backend/wallet.json
如果没有钱包,后端会以只读模式启动(可查询,不可上传)。
# 方式一:使用脚本
./start-backend.sh
# 方式二:手动指定
cd backend
WALLET_PATH=./wallet.json DB_PATH=./arweave_test.db PORT=8080 go run .# 在新终端窗口执行
./start-frontend.sh
# 或手动
cd frontend
npm run dev前端访问地址:http://localhost:5173
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/upload |
上传文本内容到 Arweave |
GET |
/api/status/:id |
查询本地记录状态(含链上确认) |
GET |
/api/arweave/:txid |
直接从 Arweave 网关获取数据 |
GET |
/api/records |
列出所有本地上传记录 |
GET |
/health |
服务健康检查 |
POST /api/upload
{
"content": "Hello, Arweave!",
"tags": {
"My-Tag": "my-value"
}
}{
"id": 1,
"tx_id": "",
"status": "pending",
"arweave_url": "",
"message": "Upload submitted. Use the record ID to poll status."
}- 输入文本内容,点击 上传到 Arweave
- 后端异步提交交易并返回本地记录 ID
- 前端每 5 秒自动轮询状态,直到
confirmed或failed
- 通过 Arweave TxID:直接从 Arweave 网关拉取链上数据
- 通过本地记录 ID:查询 SQLite 中存储的记录及状态
- 展示所有上传记录,包含状态徽章和 Arweave 链接
| 变量 | 默认值 | 说明 |
|---|---|---|
WALLET_PATH |
./wallet.json |
Arweave JWK 钱包路径 |
DB_PATH |
./arweave_test.db |
SQLite 数据库文件路径 |
PORT |
8080 |
后端监听端口 |
| 层 | 技术 |
|---|---|
| 前端框架 | React 18 + TypeScript + Vite |
| HTTP 客户端 | Axios |
| 后端框架 | Go + Gin |
| Arweave SDK | goar |
| 本地持久化 | SQLite (go-sqlite3) |
| 跨域处理 | gin-contrib/cors |
Arweave 交易通常需要 10-30 分钟才能获得链上确认。上传后状态流转:
pending(提交) → pending(待挖矿) → confirmed(已确认)