提币的总体时序图大概是这样的:

<以太坊(eth)交易所钱包开发 - 5 - 获取冲币地址>中已经介绍了API请求数据的验证方式,这部分验证都是一样的,用gin的自定义的中间件完成就可以了。

提币请求的参数为:

1
2
3
4
5
6
var req struct {
    Symbol    string `json:"symbol" binding:"required" validate:"oneof=eth"`
    OutSerial string `json:"out_serial" binding:"required" validate:"max=40"`
    Address   string `json:"address" binding:"required"`
    Balance   string `json:"balance" binding:"required"`
}

我们需要注意OutSerial字段,这个字段是为了避免同一提币请求被多次处理添加的,数据库会给这个字段做一个唯一索引,相同的提币便无法被重复插入了。

之后我们只需要验证一下参数是否合法,然后插入数据库就可以了。

  1. 把地址小写,验证地址是否合法。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    // 验证地址
    req.Address = strings.ToLower(req.Address)
    re := regexp.MustCompile("^0x[0-9a-fA-F]{40}$")
    if !re.MatchString(req.Address) {
        c.JSON(http.StatusOK, gin.H{
            "error":   hcommon.ErrorAddressWrong,
            "err_msg": hcommon.ErrorAddressWrongMsg,
        })
        return
    }
    
  2. 验证提币金额。eth支持的小数位数最大为18位。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    // 验证金额
    balanceObj, err := decimal.NewFromString(req.Balance)
    if err != nil {
        hcommon.Log.Errorf("err: [%T] %s", err, err.Error())
        c.JSON(
            http.StatusOK, 
            gin.H{
                "error":   hcommon.ErrorBalanceFormat,
                "err_msg": hcommon.ErrorBalanceFormatMsg,
            },
        )
        return
    }
    if balanceObj.LessThanOrEqual(decimal.NewFromInt(0)) {
        c.JSON(
            http.StatusOK, 
            gin.H{
                "error":   hcommon.ErrorBalanceFormat,
                "err_msg": hcommon.ErrorBalanceFormatMsg,
            },
        )
        return
    }
    if balanceObj.Exponent() < -18 {
        c.JSON(
            http.StatusOK, 
            gin.H{
                "error":   hcommon.ErrorBalanceFormat,
                "err_msg": hcommon.ErrorBalanceFormatMsg,
            },
        )
        return
    }
    

插入成功后以太坊(eth)交易所钱包开发 - 4 - 提币就可以去处理了

具体实现的代码已经传到了github https://github.com/moremorefun/go-dc-wallet

功能入口在 cmd/api/main.go