☰
从 0 到 1 实现链上大额交易监测系统(一):Go 服务与 PostgreSQL 环境搭建
2026/10/15 4:54:15 网站建设 项目流程

前言

最近开始准备毕业设计项目,方向暂定为:

基于 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-alpine

compose.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 代码提交与推送

九、当前阶段总结

本阶段主要完成了项目的基础环境搭建。

虽然还没有正式进入链上事件监听部分,但后续开发所需的基础能力已经打通:

  1. Go 服务可以正常启动;

  2. /health接口可以检查服务状态;

  3. PostgreSQL 可以通过 Docker Compose 启动;

  4. Go 服务可以连接 PostgreSQL;

  5. /db/ping可以验证数据库连接;

  6. 项目代码已经接入 GitHub 管理;

  7. Docker 镜像拉取、curl 代理、数据库密码不一致等问题已经解决。

这些内容是后续实现链上大额交易监测系统的基础。


十、下一步计划

接下来准备进入核心业务开发阶段,主要包括:

1. 设计 transfers 表,保存 ERC20 转账事件 2. 设计 sync_state 表,保存区块同步进度 3. 设计 alerts 表,保存大额交易告警 4. 接入 Ethereum RPC 5. 解析 ERC20 Transfer 事件 6. 根据金额阈值生成告警 7. 提供 /transfers 和 /alerts 查询接口

后续希望逐步实现完整闭环:

链上发生转账 → Go 服务同步事件 → 转账事件入库 → 判断是否超过大额阈值 → 生成告警 → API 查询展示

本篇文章记录的是项目第一阶段:Go 服务与 PostgreSQL 基础环境搭建。下一篇将继续整理数据库表结构设计。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询