关键词:以太坊交易所钱包、充值地址、API 安全、签名校验、地址池、Go-Doc
在构建「以太坊交易所钱包」时,第一步往往不是炫酷的链上功能,而是 如何让用户拿到一个干净的、可审计的充值地址。本篇聚焦「获取冲币地址」的全链路实现:从签名验证、地址池管理,到高并发下的防重与事务安全。读完即可将代码无缝接入现有的 RestFul API 体系。
一、为什么需要签名校验
交易所开放充值接口,本质是把资产入口交给了外部系统。如果不做 签名校验,恶意调用者可以:
- 无限刷新地址,造成地址池耗尽
- 伪造回调,干扰账务核对
- 重放请求,产生脏数据
因此,在客户端生成签名、服务器端验签是 第一道防线。
请求结构示例
{
"app_name": "eth_pay_demo",
"nonce": "168991",
"sign": "22CD7336F14FB1F4"
}服务器端用 与客户端一致的私钥 本地运算 sign,比较是否一致,一致即视为合法来源。
二、数据库准备:产品表与地址池
新建
t_product存储接入方信息app_name:唯一业务标识app_sk:32–64 位平台级密钥cb_url、whitelist_ip:对接回调与 IP 白名单
- 预生成地址池,字段说明见下:
| id | address | 使用标识 |
|---|---|---|
| 1 | 0x1…A1 | -1(占位,已禁用) |
| 2 | 0x1…A2 | 0(可分配) |
| 3 | 0x1…A3 | 0(可分配) |
三、签名校验的 4 步细节
算法逻辑与 微信支付 V2 相同,Go、Python、Node 均可共用。
① 过滤空值并排序
对所有非空参数按字典序升序排列。
app_name=eth_pay_demo
nonce=168991拼接得到 stringA:
app_name=eth_pay_demo&nonce=168991② 拼接密钥
stringSignTemp = stringA + "&key=192006250b4c09247ec02edce69f6a2d"③ MD5 运算并大写
sign = md5(stringSignTemp).ToUpper() // 得到 32 位 HEX④ 验证
将客户端送来的 sign 与本地计算结果比对即可。
如果接口未来新增字段,排序逻辑保持不变,验签代码无须更改。
四、地址发放的核心事务逻辑
为保证 同一个地址永不重复分配,必须将 读 + 写 封装进数据库事务。
伪代码(Gin + GORM)
func GetDepositAddr(c *gin.Context) {
tx := db.Begin()
var addr model.Address
// 使用乐观锁 or SELECT ... FOR UPDATE
tx.Where("flag = ?", 0).First(&addr)
if addr.ID == 0 {
tx.Rollback()
c.JSON(500, "地址池耗尽")
return
}
addr.Flag = productID // 标记已占用
if err := tx.Save(&addr).Error; err != nil {
tx.Rollback()
} else {
tx.Commit()
c.JSON(200, addr.Address)
}
}事务提交成功即返回地址,失败则回滚并返回错误,确保 0 重复。
五、完整接口地址
已开源至 示例仓库,逻辑集中在:
cmd/api/main.go若想复用,仅需修改:
t_product中的应用密钥.env里的 MySQL 连接串
小提示:生产级注意事项
- 地址池需定时监控,低于 10% 立即预警
- 私钥
app_sk必须 KMS 加密存储,禁止出现在 repo - 高频场景下,可做 Redis 层缓存 先锁定地址,再异步 DB 写入
常见问题 FAQ
Q1:nonce 一定要每次都不一样吗?
A:是的。nonce 的唯一性能防止重放攻击;建议用时间戳加随机数,40 字节内即可。
Q2:地址池应当预生成多少个地址?
A:规模业务建议 「日活跃地址数 × 7 」 作为底线,再多预留 3 倍空间,便于灰度扩容。
Q3:回滚后地址是否再次被标记?
A:事务失败时地址 flag 仍为 0,可被后续请求重新获取;不会出现悬置。
Q4:我能否不使用 MD5 而使用 HMAC-SHA256?
A:可以。只需把 md5 替换为 hmac-sha256,同时客户端同步改动即可。
Q5:如何查看地址的使用流水?
A:额外建表 t_deposit_log(address, product_id, create_time),方便对账。
Q6:接口限频怎么做?
A:网关层用 Nginx + Redis 做滑动窗口,300 r/min 足够日常业务。
结语与下一步
搞定 充值地址 后,下一篇将拆解 提币接口的 gas 预估、离线签名及事务广播。
👉 提前收藏这份「交易所钱包开发核心源码剖析」,开发快车道不迷路!
祝开发愉快,钱包零宕机、资产零丢失!