前言
最近开始准备毕业设计项目,方向暂定为:
基于 Go 的区块链大额交易监测与告警系统的设计与实现
这个项目可以理解为一个轻量版的链上大额交易监测工具。系统后续会监听区块链上的 ERC20Transfer事件,将转账记录解析并存入 PostgreSQL,再根据金额阈值、重点地址等规则生成告警。
本篇文章主要记录项目第一阶段的基础环境搭建过程,包括:
创建 Go 后端项目;
实现
/health健康检查接口;使用 Docker Compose 启动 PostgreSQL;
接入 Go 数据库连接;
实现
/db/ping数据库连通性测试接口;解决开发过程中遇到的基础环境问题。
一、项目目标
本项目最终希望实现的核心流程是:
链上发生转账 → Go 服务同步事件 → 解析 ERC20 Transfer 日志 → 写入 PostgreSQL → 判断是否为大额交易 → 生成告警记录 → 通过 API 查询转账和告警数据当前第一阶段不直接实现链上监听,而是先搭建后续开发所需的基础能力:
Go Web 服务 PostgreSQL 数据库 Docker Compose 本地环境 健康检查接口 数据库连接测试接口 GitHub 代码管理二、开发环境
当前开发环境如下:
操作系统:Windows 项目目录:D:\projects\chainpay 开发语言:Go 数据库:PostgreSQL 容器工具:Docker Desktop 代码管理:Git + GitHub项目目录:
D:\projects\chainpay三、初始化 Go 项目
首先进入项目目录,并初始化 Go 模块:
cd D:\projects\chainpay go mod init example.com/chainpay项目初期先实现一个最基础的 HTTP 服务,监听本地8080端口,并提供/health接口。
/health接口用于检查服务是否正常运行,返回结果类似:
{"status":"ok","service":"chainpay"}这个接口虽然简单,但在后续开发中很重要。无论是本地调试、Docker 部署,还是未来部署到云服务器,都可以通过健康检查接口快速判断服务是否启动成功。
四、启动 Go 服务
运行项目:
go run .服务启动后,终端输出类似:
chainpay listening on http://127.0.0.1:8080测试/health接口:
curl.exe --noproxy "*" http://127.0.0.1:8080/health返回结果:
{"status":"ok","service":"chainpay"}这里遇到过一个小问题:直接使用curl访问本地服务时,请求被代理到了127.0.0.1:8545,导致连接失败。后面通过添加--noproxy "*"解决:
curl.exe --noproxy "*" http://127.0.0.1:8080/health五、验证 Docker 环境
由于后续需要使用 Docker Compose 启动 PostgreSQL,因此先验证 Docker 是否可用。
使用hello-world镜像进行测试:
docker pull hello-world docker run --rm hello-world如果终端输出:
Hello from Docker!说明 Docker 客户端和 Docker daemon 已经可以正常通信。
六、使用 Docker Compose 启动 PostgreSQL
后续链上转账记录、同步状态、告警规则和告警结果都需要存储到数据库中,因此项目选择 PostgreSQL 作为数据库。
一开始尝试拉取 Docker Hub 的 PostgreSQL 镜像时,遇到过网络中断问题:
short read: unexpected EOF为了解决镜像拉取不稳定的问题,后续改用了 AWS ECR Public 的 PostgreSQL 镜像:
public.ecr.aws/docker/library/postgres:17-alpinecompose.yaml配置如下:
services: db: image: public.ecr.aws/docker/library/postgres:17-alpine environment: POSTGRES_USER: ${POSTGRES_USER:?POSTGRES_USER is required} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} POSTGRES_DB: ${POSTGRES_DB:?POSTGRES_DB is required} ports: - "127.0.0.1:15432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: - CMD-SHELL - pg_isready -h 127.0.0.1 -U $$POSTGRES_USER -d $$POSTGRES_DB interval: 5s timeout: 5s retries: 12 start_period: 10s volumes: postgres_data:数据库环境变量放在.env文件中。注意:真实项目中不要把密码、私钥、RPC Key 等敏感信息发布到博客或公开仓库。
示例:
POSTGRES_USER=chainpay POSTGRES_PASSWORD=<your-password> POSTGRES_DB=chainpay启动 PostgreSQL:
docker compose up --build查看容器状态:
docker compose ps如果看到数据库容器处于healthy状态,说明 PostgreSQL 已经正常启动。
七、接入 Go 数据库连接
为了让 Go 服务连接 PostgreSQL,引入pgx:
go get github.com/jackc/pgx/v5项目中新增/db/ping接口,用来测试 Go 服务是否能够成功连接数据库。
测试命令:
curl.exe --noproxy "*" http://127.0.0.1:8080/db/ping数据库连接正常时,返回结果类似:
{"database":"ok"}开发过程中也遇到过数据库认证失败的问题,日志提示:
password authentication failed for user "chainpay"原因是 Go 程序中的数据库连接配置和.env中的 PostgreSQL 密码不一致。后续统一数据库用户名、密码、端口和数据库名后,问题解决。
八、代码提交到 GitHub
基础功能完成后,将代码提交到 GitHub:
git status git add . git commit -m "feat: add database ping endpoint" git push目前项目已经完成:
Go 服务基础结构 /health 健康检查接口 PostgreSQL Docker Compose 环境 /db/ping 数据库连接测试接口 GitHub 代码提交与推送九、当前阶段总结
本阶段主要完成了项目的基础环境搭建。
虽然还没有正式进入链上事件监听部分,但后续开发所需的基础能力已经打通:
Go 服务可以正常启动;
/health接口可以检查服务状态;PostgreSQL 可以通过 Docker Compose 启动;
Go 服务可以连接 PostgreSQL;
/db/ping可以验证数据库连接;项目代码已经接入 GitHub 管理;
Docker 镜像拉取、curl 代理、数据库密码不一致等问题已经解决。
这些内容是后续实现链上大额交易监测系统的基础。
十、下一步计划
接下来准备进入核心业务开发阶段,主要包括:
1. 设计 transfers 表,保存 ERC20 转账事件 2. 设计 sync_state 表,保存区块同步进度 3. 设计 alerts 表,保存大额交易告警 4. 接入 Ethereum RPC 5. 解析 ERC20 Transfer 事件 6. 根据金额阈值生成告警 7. 提供 /transfers 和 /alerts 查询接口后续希望逐步实现完整闭环:
链上发生转账 → Go 服务同步事件 → 转账事件入库 → 判断是否超过大额阈值 → 生成告警 → API 查询展示本篇文章记录的是项目第一阶段:Go 服务与 PostgreSQL 基础环境搭建。下一篇将继续整理数据库表结构设计。