From 3091597c606f3b325eb50ab4dd7f7a0a66b4bc0d Mon Sep 17 00:00:00 2001 From: scorpiotzh <835598264@qq.com> Date: Mon, 3 Jun 2024 15:55:10 +0800 Subject: [PATCH] feat: support btc reverse --- dao/t_reverse_info.go | 12 +++++- http_server/handle/batch_reverse_record.go | 2 +- http_server/handle/batch_reverse_record_v2.go | 37 ++++++++++++++++--- http_server/handle/reverse_record.go | 2 +- http_server/handle/reverse_record_v2.go | 36 +++++++++++++++--- 5 files changed, 73 insertions(+), 16 deletions(-) diff --git a/dao/t_reverse_info.go b/dao/t_reverse_info.go index f71bc31..2b9251d 100644 --- a/dao/t_reverse_info.go +++ b/dao/t_reverse_info.go @@ -42,8 +42,16 @@ func (d *DbDao) DeleteReverseInfo(outpoints []string) error { return d.db.Where(" outpoint IN (?) ", outpoints).Delete(&tables.TableReverseInfo{}).Error } -func (d *DbDao) FindLatestReverseRecord(chainType common.ChainType, address string) (r tables.TableReverseInfo, err error) { - err = d.db.Where(" chain_type=? AND address=? ", chainType, address).Order(" block_number DESC,outpoint DESC ").Limit(1).Find(&r).Error +func (d *DbDao) FindLatestReverseRecord(chainType common.ChainType, address, btcAddr string) (r tables.TableReverseInfo, err error) { + if btcAddr != "" { + err = d.db.Where("chain_type=? AND (p2sh_p2wpkh=? OR p2tr=?)", + chainType, btcAddr, btcAddr). + Order(" block_number DESC, outpoint DESC ").Limit(1).Find(&r).Error + } else { + err = d.db.Where(" chain_type=? AND address=? ", chainType, address). + Order(" block_number DESC,outpoint DESC ").Limit(1).Find(&r).Error + } + return } diff --git a/http_server/handle/batch_reverse_record.go b/http_server/handle/batch_reverse_record.go index 9e3befa..5c08b69 100644 --- a/http_server/handle/batch_reverse_record.go +++ b/http_server/handle/batch_reverse_record.go @@ -110,7 +110,7 @@ func (h *HttpHandle) doBatchReverseRecord(req *ReqBatchReverseRecord, apiResp *c } func (h *HttpHandle) checkReverse(chainType common.ChainType, addressHex string, apiResp *code.ApiResp) (account, errMsg string) { - reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex) + reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex, "") if err != nil { log.Error("FindLatestReverseRecord err: ", err.Error(), addressHex) apiResp.ApiRespErr(http_api.ApiCodeDbError, "find reverse record err") diff --git a/http_server/handle/batch_reverse_record_v2.go b/http_server/handle/batch_reverse_record_v2.go index 1764b20..5936c0e 100644 --- a/http_server/handle/batch_reverse_record_v2.go +++ b/http_server/handle/batch_reverse_record_v2.go @@ -83,22 +83,43 @@ func (h *HttpHandle) doBatchReverseRecordV2(req *ReqBatchReverseRecordV2, apiRes // check params var listKeyInfo []*core.DasAddressHex + var listBtcAddr []string for _, v := range req.BatchKeyInfo { addrHex, err := v.FormatChainTypeAddress(config.Cfg.Server.Net, false) if err != nil { log.Warn("FormatChainTypeAddress err: %s", err.Error()) listKeyInfo = append(listKeyInfo, nil) + listBtcAddr = append(listBtcAddr, "") continue - } else if addrHex.DasAlgorithmId == common.DasAlgorithmIdAnyLock { + } + switch addrHex.DasAlgorithmId { + case common.DasAlgorithmIdAnyLock: anyLockAddrHex, err := addrHex.FormatAnyLock() if err != nil { log.Warn("FormatAnyLock err: %s", err.Error()) listKeyInfo = append(listKeyInfo, nil) + listBtcAddr = append(listBtcAddr, "") continue } listKeyInfo = append(listKeyInfo, anyLockAddrHex) - } else { + listBtcAddr = append(listBtcAddr, "") + case common.DasAlgorithmIdEth, common.DasAlgorithmIdTron, + common.DasAlgorithmIdDogeChain, common.DasAlgorithmIdWebauthn: listKeyInfo = append(listKeyInfo, addrHex) + listBtcAddr = append(listBtcAddr, "") + case common.DasAlgorithmIdBitcoin: + log.Info("doReverseInfoV2:", addrHex.DasAlgorithmId, addrHex.DasSubAlgorithmId, addrHex.AddressHex) + switch addrHex.DasSubAlgorithmId { + case common.DasSubAlgorithmIdBitcoinP2PKH, common.DasSubAlgorithmIdBitcoinP2WPKH: + listKeyInfo = append(listKeyInfo, addrHex) + listBtcAddr = append(listBtcAddr, "") + default: + listKeyInfo = append(listKeyInfo, addrHex) + listBtcAddr = append(listBtcAddr, v.KeyInfo.Key) + } + default: + listKeyInfo = append(listKeyInfo, nil) + listBtcAddr = append(listBtcAddr, "") } } @@ -108,7 +129,7 @@ func (h *HttpHandle) doBatchReverseRecordV2(req *ReqBatchReverseRecordV2, apiRes if v == nil { tmp.ErrMsg = "address is invalid" } else { - account, errMsg := h.checkReverseV2(v.ChainType, v.AddressHex, req.BatchKeyInfo[i].KeyInfo.Key, apiResp) + account, errMsg := h.checkReverseV2(v.ChainType, v.AddressHex, req.BatchKeyInfo[i].KeyInfo.Key, listBtcAddr[i], apiResp) if apiResp.ErrNo != http_api.ApiCodeSuccess { return nil } @@ -126,9 +147,9 @@ func (h *HttpHandle) doBatchReverseRecordV2(req *ReqBatchReverseRecordV2, apiRes return nil } -func (h *HttpHandle) checkReverseV2(chainType common.ChainType, addressHex, reqKey string, apiResp *http_api.ApiResp) (account, errMsg string) { +func (h *HttpHandle) checkReverseV2(chainType common.ChainType, addressHex, reqKey, btcAddr string, apiResp *http_api.ApiResp) (account, errMsg string) { // reverse - reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex) + reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex, btcAddr) if err != nil { log.Error("FindAccountInfoByAccountId err: ", err.Error(), reverse.Account) apiResp.ApiRespErr(http_api.ApiCodeDbError, "find reverse record err") @@ -138,6 +159,10 @@ func (h *HttpHandle) checkReverseV2(chainType common.ChainType, addressHex, reqK return } + if btcAddr != "" { + addressHex = reverse.Address + } + // check account var owner, manager string accountId := common.Bytes2Hex(common.GetAccountIdByAccount(reverse.Account)) @@ -165,7 +190,7 @@ func (h *HttpHandle) checkReverseV2(chainType common.ChainType, addressHex, reqK owner = accountInfo.Owner manager = accountInfo.Manager } - log.Info("owner manager:", owner, manager) + log.Info("owner manager:", owner, manager, addressHex) if strings.EqualFold(addressHex, owner) || strings.EqualFold(addressHex, manager) { account = accountInfo.Account diff --git a/http_server/handle/reverse_record.go b/http_server/handle/reverse_record.go index 5a722e4..a90dd80 100644 --- a/http_server/handle/reverse_record.go +++ b/http_server/handle/reverse_record.go @@ -123,7 +123,7 @@ func (h *HttpHandle) doReverseRecord(req *ReqReverseRecord, apiResp *code.ApiRes return nil } - reverse, err := h.DbDao.FindLatestReverseRecord(res.ChainType, res.AddressHex) + reverse, err := h.DbDao.FindLatestReverseRecord(res.ChainType, res.AddressHex, "") if err != nil { log.Error("FindLatestReverseRecord err:", err.Error(), res.ChainType, res.AddressHex) apiResp.ApiRespErr(http_api.ApiCodeDbError, "find reverse record err") diff --git a/http_server/handle/reverse_record_v2.go b/http_server/handle/reverse_record_v2.go index 1941c98..0acb51e 100644 --- a/http_server/handle/reverse_record_v2.go +++ b/http_server/handle/reverse_record_v2.go @@ -71,13 +71,17 @@ func (h *HttpHandle) doReverseRecordV2(req *ReqReverseRecordV2, apiResp *http_ap var resp RespReverseRecordV2 var chainType common.ChainType var addressHex string + var btcAddr string addrHex, err := req.FormatChainTypeAddress(h.DasCore.NetType(), false) if err != nil { log.Error("FormatChainTypeAddress err:", req.KeyInfo.Key) - apiResp.ApiRespErr(http_api.ApiCodeParamsInvalid, "params invalid") - return err - } else if addrHex.DasAlgorithmId == common.DasAlgorithmIdAnyLock { + apiResp.ApiRespOK(resp) + return nil + } + + switch addrHex.DasAlgorithmId { + case common.DasAlgorithmIdAnyLock: res, err := addrHex.FormatAnyLock() if err != nil { log.Error("addrHex.FormatAnyLock err: %s", err.Error()) @@ -86,14 +90,31 @@ func (h *HttpHandle) doReverseRecordV2(req *ReqReverseRecordV2, apiResp *http_ap } chainType = res.ChainType addressHex = res.AddressHex - } else { + case common.DasAlgorithmIdEth, common.DasAlgorithmIdTron, + common.DasAlgorithmIdDogeChain, common.DasAlgorithmIdWebauthn: chainType = addrHex.ChainType addressHex = addrHex.AddressHex + case common.DasAlgorithmIdBitcoin: + log.Info("doReverseRecordV2:", addrHex.DasAlgorithmId, addrHex.DasSubAlgorithmId, addrHex.AddressHex) + switch addrHex.DasSubAlgorithmId { + case common.DasSubAlgorithmIdBitcoinP2PKH, common.DasSubAlgorithmIdBitcoinP2WPKH: + chainType = addrHex.ChainType + addressHex = addrHex.AddressHex + default: + chainType = addrHex.ChainType + addressHex = addrHex.AddressHex + btcAddr = req.KeyInfo.Key + } + default: + log.Error("default address invalid") + apiResp.ApiRespOK(resp) + return nil } - log.Info("doReverseInfoV2:", chainType, addressHex, req.KeyInfo.Key) + + log.Info("doReverseRecordV2:", chainType, addressHex, req.KeyInfo.Key, btcAddr) // reverse - reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex) + reverse, err := h.DbDao.FindLatestReverseRecord(chainType, addressHex, btcAddr) if err != nil { apiResp.ApiRespErr(http_api.ApiCodeDbError, "find reverse record err") return fmt.Errorf("FindLatestReverseRecord err: %s", err.Error()) @@ -101,6 +122,9 @@ func (h *HttpHandle) doReverseRecordV2(req *ReqReverseRecordV2, apiResp *http_ap apiResp.ApiRespOK(resp) return nil } + if btcAddr != "" { + addressHex = reverse.Address + } // check account var owner, manager string