# postgresql_gbase_go **Repository Path**: barlon/postgresql_gbase_go ## Basic Information - **Project Name**: postgresql_gbase_go - **Description**: 测试使用 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-14 - **Last Updated**: 2026-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # postgresql_gbase_go 一套开箱即用的开发环境组合:web3 编译工具链(go-ethereum/geth + abigen)、Go 编写的 IAM(认证与访问控制)服务脚手架,以及基于本机 PostgreSQL 的 Go 集成测试。 ## 环境组成 | 组件 | 版本 | 说明 | |------|------|------| | Go | 1.25.5 | 编译运行环境 | | geth | 1.17.5-stable | 以太坊节点,位于 `/usr/local/bin/geth` | | abigen | 1.17.5 | go-ethereum 合约绑定生成器,位于 `/go/bin/abigen` | | solc | 0.8.36 | Solidity 编译器,位于 `/usr/local/bin/solc` | | PostgreSQL | 15.19 | 数据库,端口 5432 | | IAM 服务 | - | JWT 认证 + RBAC 权限控制,Go 标准库 HTTP 服务 | ## 目录结构 ``` ├── cmd/server/ # 服务入口 ├── internal/ │ ├── auth/ # JWT 签发与解析 │ ├── config/ # 环境变量配置 │ ├── db/ # pgx 连接池 + SQL 迁移 │ ├── handler/ # HTTP 处理器与路由 │ ├── middleware/ # JWT 鉴权中间件 │ └── rbac/ # RBAC 权限判定 ├── migrations/ # SQL 迁移脚本(表结构 + 种子数据) ├── tests/ # PostgreSQL 集成测试(API + 数据库层) ├── web3/ # web3 测试模块(独立 Go module) │ ├── contracts/ # Solidity 测试合约(Storage / Token) │ ├── build/ # solc 编译产物(ABI + Bin) │ ├── bindings/ # abigen 生成的 Go 绑定 │ ├── cmd/ │ │ ├── deploy_storage/ # Storage 合约部署工具(本地 dev 链 / Sepolia) │ │ ├── devkey/ # 从 geth keystore 导出开发账户私钥 │ │ └── genkey/ # 生成部署账户密钥对 │ ├── wallet_test.go # 钱包用例 │ ├── transfer_test.go # 转账用例 │ └── contract_test.go # 智能合约用例 ├── scripts/ # setup_db.sh / test.sh └── Makefile # deps / run / test 等目标 ``` ## 快速开始 ### 1. 安装依赖与数据库 ```bash # 安装 Go 依赖 make deps # 创建数据库账号与库(iam、iam_test) bash scripts/setup_db.sh ``` PostgreSQL 连接信息(默认值,可用环境变量覆盖): - 数据库:`postgres://iam:iam_pass@127.0.0.1:5432/iam` - 测试库:`postgres://iam:iam_pass@127.0.0.1:5432/iam_test` ### 2. 启动 IAM 服务 ```bash go run ./cmd/server ``` 启动时自动建表并写入种子数据(admin/viewer/editor 三个角色)。服务监听 `:8080`。 ### 3. 运行集成测试 主模块测试会自动重建 `iam_test` 库的 schema 并执行迁移: ```bash make test-verbose # 或 bash scripts/test.sh ``` ### 4. 运行 web3 测试 web3 是独立 Go module,测试基于 go-ethereum 的模拟链(SimulatedBackend),无需真实节点: ```bash cd web3 go test -v ./... ``` ## 测试用例概览 | 模块 | 数量 | 覆盖内容 | |------|------|---------| | tests(API) | 9 | 注册/登录/鉴权/RBAC 接口 | | tests(数据库层) | 17 | 迁移建表/种子/CRUD/唯一约束/级联删除/权限判定/多角色/事务/并发 | | web3 钱包 | 9 | 地址生成/签名与恢复/验签/keystore/EIP-55 | | web3 合约 | 10 | Storage 部署读写/事件/Token 部署/transfer/approve/transferFrom/异常场景 | | web3 转账 | 7 | 余额查询/ETH 转账/余额不足/签名交易/链 ID/nonce 冲突 | 共 52 个用例,全部基于本机 PostgreSQL 与内存模拟链运行。 ## API 一览 | 方法 | 路径 | 权限 | 说明 | |------|------|------|------| | GET | `/healthz` | 公开 | 健康检查 | | POST | `/api/v1/auth/register` | 公开 | 注册(密码至少 8 位) | | POST | `/api/v1/auth/login` | 公开 | 登录,返回 JWT | | GET | `/api/v1/me` | JWT | 当前用户信息与角色 | | GET | `/api/v1/users` | `user:read` | 用户列表 | | POST | `/api/v1/users/{id}/roles` | `role:assign` | 为用户分配角色 | RBAC 规则:权限挂在角色上,`admin` 角色隐式拥有全部权限;权限判定实时查询数据库,角色变更无需重新登录即生效。 ### 使用示例 ```bash # 注册 curl -X POST http://127.0.0.1:8080/api/v1/auth/register \ -H 'Content-Type: application/json' \ -d '{"username":"alice","email":"alice@example.com","password":"password123"}' # 登录拿 token curl -X POST http://127.0.0.1:8080/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"username":"alice","password":"password123"}' # 带 token 访问受保护接口 curl http://127.0.0.1:8080/api/v1/me -H "Authorization: Bearer " ``` ## web3 编译环境 ```bash # 查看版本 geth version /go/bin/abigen version solc --version # 启动开发节点(HTTP-RPC 8545) geth --dev --http --http.api eth,web3,net ``` 合约编译到 Go 绑定的一站式流程(仓库内 `web3/` 即按此流程生成): ```bash # 1. solc 编译 Solidity 合约生成 ABI 与字节码 solc --abi --bin contracts/Storage.sol contracts/Token.sol -o build/ # 2. abigen 生成 Go 绑定代码 /go/bin/abigen --abi build/Storage.abi --bin build/Storage.bin --pkg bindings --type Storage --out bindings/storage.go /go/bin/abigen --abi build/Token.abi --bin build/Token.bin --pkg bindings --type Token --out bindings/token.go # 3. 基于模拟链跑钱包/合约/转账测试 cd web3 && go test -v ./... ``` ## Storage 合约部署(本地测试链) `web3/cmd` 提供三个工具,可在本地 geth dev 链上完成 Storage 合约的部署与读写验证,流程与真实 Sepolia 部署一致。 ### 1. 生成部署账户密钥(可选) 如需自备部署私钥,用 genkey 生成新密钥对: ```bash cd web3 go run ./cmd/genkey -out /root/.sepolia-deploy.key ``` ### 2. 启动本地 geth dev 链 dev 模式预置余额充足的随机账户,即时出块、完全本地,无需充值: ```bash geth --dev --dev.period 0 --datadir /tmp/geth-dev --http --http.addr 127.0.0.1 --http.port 8545 --http.api eth,web3,net ``` 开发账户密钥位于 datadir 的 keystore(密码为空),用 devkey 导出为部署工具可读的私钥文件: ```bash cd web3 go run ./cmd/devkey -datadir /tmp/geth-dev -out /root/.dev-deploy.key ``` ### 3. 部署并验证 deploy_storage 自动执行:部署合约 → 校验上链代码 → 读取初始值 → `setValue(42)` 写交易 → 读回结果: ```bash cd web3 go run ./cmd/deploy_storage ``` 默认连接本地 `http://127.0.0.1:8545`,并从 `/root/.dev-deploy.key` 读取私钥。成功输出示例: ```text Storage deployed at 0x3A220f351252089D385b29beca14e27F204c296A in block 1 (gas used 139955) contract code size at 0x3A220f351252089D385b29beca14e27F204c296A: 401 bytes read-back check ok: getValue() = 0 after deploy write check ok: setValue(42) mined in block 2, getValue() = 42 ``` ### 4. 切换到 Sepolia 测试网 通过环境变量切换即可部署到真实 Sepolia(账户需持有 Sepolia 测试 ETH): ```bash RPC_URL=https://ethereum-sepolia-rpc.publicnode.com EXPECTED_CHAIN_ID=11155111 PRIVATE_KEY_FILE=/path/to/your-sepolia.key go run ./cmd/deploy_storage ``` | 环境变量 | 默认值 | 说明 | |----------|--------|------| | `RPC_URL` | `http://127.0.0.1:8545` | 节点 RPC 地址 | | `EXPECTED_CHAIN_ID` | 空(不校验) | 期望链 ID,如 Sepolia 为 11155111 | | `PRIVATE_KEY` | - | 直接以环境变量提供私钥(优先于文件) | | `PRIVATE_KEY_FILE` | `/root/.dev-deploy.key` | 私钥文件路径 | ### 5. 实时 Web 控制台 `web3/cmd/storage-web` 提供浏览器端控制台,可实时查看并调用 Storage 合约: ```bash cd web3 go run ./cmd/storage-web ``` 默认监听 `:8090`。若未指定 `CONTRACT_ADDR`,启动时会自动用当前账户部署一份新的 Storage;也可以复用已部署的合约: ```bash CONTRACT_ADDR=0x3A220f351252089D385b29beca14e27F204c296A go run ./cmd/storage-web ``` 页面每秒轮询链上状态,展示合约地址、签名账户、链 ID、区块高度与当前 `value`;输入数字点击"写入 setValue"即签名上链,交易确认后前端自动刷新。 | 接口 | 方法 | 说明 | |------|------|------| | `/` | GET | 控制台页面 | | `/api/value` | GET | 合约地址、账户、区块与当前 value | | `/api/setvalue` | POST | 入参 `{"value":N}`,签名写入并返回 tx 与确认区块 | | 环境变量 | 默认值 | 说明 | |----------|--------|------| | `HTTP_ADDR` | `:8090` | Web 控制台监听地址 | | `CONTRACT_ADDR` | 空(自动部署) | 指定复用已部署的合约地址 | ## 配置项 | 环境变量 | 默认值 | 说明 | |----------|--------|------| | `HTTP_ADDR` | `:8080` | 监听地址 | | `DATABASE_URL` | `postgres://iam:iam_pass@127.0.0.1:5432/iam` | 业务库连接 | | `JWT_SECRET` | `dev-secret-change-me` | JWT 签名密钥(生产必改) | | `TEST_DATABASE_URL` | `postgres://iam:iam_pass@127.0.0.1:5432/iam_test` | 测试库连接 |