From 2c86d804e005a62591fcc6a78c845d7a295aebcf Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Thu, 26 May 2022 19:40:45 +0800 Subject: [PATCH] add dapp login --- src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java | 2 src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java | 23 + src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java | 235 +++++++------- src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java | 58 +++ src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java | 17 pom.xml | 6 src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java | 162 +++++----- src/main/java/cc/mrbird/febs/dapp/chain/EthService.java | 32 + /dev/null | 133 -------- src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java | 5 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java | 40 ++ src/main/java/cc/mrbird/febs/job/ChainListenerJob.java | 2 src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java | 8 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java | 74 ++-- src/main/java/cc/mrbird/febs/common/contants/AppContants.java | 1 src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java | 8 src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java | 16 src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java | 30 + 18 files changed, 442 insertions(+), 410 deletions(-) diff --git a/pom.xml b/pom.xml index 7d0606b..231899c 100644 --- a/pom.xml +++ b/pom.xml @@ -359,6 +359,12 @@ <scope>system</scope> <systemPath>${basedir}/lib/huobi-client-1.0.8-SNAPSHOT.jar</systemPath> </dependency> + + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcpkix-jdk15on</artifactId> + <version>1.70</version> + </dependency> </dependencies> <build> diff --git a/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java b/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java index 3c8c7a0..0d9a366 100644 --- a/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java +++ b/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java @@ -1,81 +1,81 @@ -package cc.mrbird.febs.common.aspect; - -import cc.mrbird.febs.common.annotation.SubmitRepeat; -import cc.mrbird.febs.common.contants.AppContants; -import cc.mrbird.febs.common.exception.FebsException; -import cc.mrbird.febs.common.utils.RedisUtils; -import cc.mrbird.febs.modules.api.entity.MemberEntity; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import com.alibaba.fastjson.JSON; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - -@Slf4j -@Aspect -@Component -public class SubmitRepeatAspect { - - @Resource - private RedisUtils redisUtil; - - private String key; - - @Pointcut("@annotation(submitRepeat)") - public void submitRepeatPointCut(SubmitRepeat submitRepeat) { - - } - - @Before("submitRepeatPointCut(submitRepeat)") - public void before(SubmitRepeat submitRepeat) { - } - - @Around("submitRepeatPointCut(submitRepeat)") - public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - HttpServletRequest request = attributes.getRequest(); - - String headerToken = request.getHeader("token"); - String token = resolveToken(headerToken); - if(StrUtil.isEmpty(token)) { - throw new FebsException("系统繁忙"); - } - String object = (String)redisUtil.get(token); - MemberEntity member = JSON.parseObject(object, MemberEntity.class); - String mId = member.getId().toString(); - - String uri = request.getRequestURI(); - log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId); - key = mId + "_" + uri; - boolean flag = redisUtil.setNotExist(key, "1", 5); - log.info("#mid : {}, flag : {}#", mId, flag); - if (flag) { - return joinPoint.proceed(); - } else { - throw new FebsException("请勿重复提交"); - } - } - - @After("submitRepeatPointCut(submitRepeat)") - public void after(SubmitRepeat submitRepeat) { - - } - - private static String resolveToken(String token) { - try { - RSA rsa = new RSA(AppContants.PRIVATE_KEY, null); - String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_"); - return tokens[0]; - } catch (Exception e) { - return null; - } - } -} +//package cc.mrbird.febs.common.aspect; +// +//import cc.mrbird.febs.common.annotation.SubmitRepeat; +//import cc.mrbird.febs.common.contants.AppContants; +//import cc.mrbird.febs.common.exception.FebsException; +//import cc.mrbird.febs.common.utils.RedisUtils; +////import cc.mrbird.febs.modules.api.entity.MemberEntity; +//import cn.hutool.core.util.StrUtil; +//import cn.hutool.crypto.asymmetric.KeyType; +//import cn.hutool.crypto.asymmetric.RSA; +//import com.alibaba.fastjson.JSON; +//import lombok.extern.slf4j.Slf4j; +//import org.aspectj.lang.ProceedingJoinPoint; +//import org.aspectj.lang.annotation.*; +//import org.springframework.stereotype.Component; +//import org.springframework.web.context.request.RequestContextHolder; +//import org.springframework.web.context.request.ServletRequestAttributes; +// +//import javax.annotation.Resource; +//import javax.servlet.http.HttpServletRequest; +// +//@Slf4j +//@Aspect +//@Component +//public class SubmitRepeatAspect { +// +// @Resource +// private RedisUtils redisUtil; +// +// private String key; +// +// @Pointcut("@annotation(submitRepeat)") +// public void submitRepeatPointCut(SubmitRepeat submitRepeat) { +// +// } +// +// @Before("submitRepeatPointCut(submitRepeat)") +// public void before(SubmitRepeat submitRepeat) { +// } +// +// @Around("submitRepeatPointCut(submitRepeat)") +// public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// HttpServletRequest request = attributes.getRequest(); +// +// String headerToken = request.getHeader("token"); +// String token = resolveToken(headerToken); +// if(StrUtil.isEmpty(token)) { +// throw new FebsException("系统繁忙"); +// } +// String object = (String)redisUtil.get(token); +// MemberEntity member = JSON.parseObject(object, MemberEntity.class); +// String mId = member.getId().toString(); +// +// String uri = request.getRequestURI(); +// log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId); +// key = mId + "_" + uri; +// boolean flag = redisUtil.setNotExist(key, "1", 5); +// log.info("#mid : {}, flag : {}#", mId, flag); +// if (flag) { +// return joinPoint.proceed(); +// } else { +// throw new FebsException("请勿重复提交"); +// } +// } +// +// @After("submitRepeatPointCut(submitRepeat)") +// public void after(SubmitRepeat submitRepeat) { +// +// } +// +// private static String resolveToken(String token) { +// try { +// RSA rsa = new RSA(AppContants.PRIVATE_KEY, null); +// String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_"); +// return tokens[0]; +// } catch (Exception e) { +// return null; +// } +// } +//} diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java index 888a4d8..6e7d01e 100644 --- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java +++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java @@ -101,4 +101,5 @@ public static final String REDIS_KEY_ETH_NEW_PRICE = "ETH_NEW_PRICE"; public static final String REDIS_KEY_CHANGE_FEE = "DAPP_CHANGE_FEE"; + public static final String REDIS_KEY_SIGN = "LOGIN_SIGN"; } diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java index a997db1..2c4927e 100644 --- a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java +++ b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java @@ -1,5 +1,6 @@ package cc.mrbird.febs.common.interceptor; +import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextUtil; @@ -8,12 +9,15 @@ import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.servlet.HandlerInterceptor; +import org.web3j.crypto.Hash; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Map; /** * @author @@ -23,22 +27,40 @@ public class DappInterceptor implements HandlerInterceptor { private final DappMemberDao dappMemberDao = SpringContextUtil.getBean(DappMemberDao.class); + private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("OPTIONS".equals(request.getMethod().toUpperCase())) { return true; } + String headAddress = request.getHeader("address"); + String key = request.getHeader("key"); + String path = request.getServletPath().replace("/dapi", ""); + log.info("进入拦截:{}, {}", headAddress, path); - String headAddress = request.getHeader("token"); String chain = request.getHeader("chain"); - log.info("进入拦截:{}", headAddress); - if (StrUtil.isBlank(headAddress)) { + if (StrUtil.isBlank(headAddress) || StrUtil.isBlank(key)) { responseUnAuth(response); return false; } - DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, chain); + Map<Object, Object> signKey = redisUtils.hmget(AppContants.REDIS_KEY_SIGN); + Object signObj = signKey.get(headAddress); + + if (signObj == null) { + responseUnAuth(response); + return false; + } + String sign = (String) signObj; + + String calKey = Hash.sha3(sign + path + headAddress).replace("0x", ""); + if (!calKey.equals(key)) { + responseUnAuth(response); + return false; + } + + DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, null); if (memberEntity == null) { responseUnAuth(response); return false; diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java index 412fcf3..8ed6ab5 100644 --- a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java +++ b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java @@ -4,7 +4,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextUtil; -import cc.mrbird.febs.modules.api.entity.MemberEntity; +import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; @@ -31,25 +31,19 @@ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - String headerToken = request.getHeader("token"); + System.out.println(request.getHeader(":path")); + String headerToken = request.getHeader("key"); if (StringUtils.isBlank(headerToken)) { responseUnAuth(response); return false; } - String token = resolveToken(headerToken); - - if (token == null || AppContants.TIME_OUT.equals(token)) { - responseUnAuth(response); - return false; - } - - String userJsonStr = redisUtils.getString(token); + String userJsonStr = redisUtils.getString(headerToken); if (StringUtils.isBlank(userJsonStr)) { responseUnAuth(response); return false; } - MemberEntity member = JSON.parseObject(userJsonStr, MemberEntity.class); + DappMemberEntity member = JSON.parseObject(userJsonStr, DappMemberEntity.class); request.getSession().setAttribute("member", member); return true; diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java index d4de897..e3df1c7 100644 --- a/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java +++ b/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java @@ -1,118 +1,117 @@ -package cc.mrbird.febs.common.interceptor; - -import cc.mrbird.febs.common.entity.BaseEntity; -import cc.mrbird.febs.modules.api.entity.MemberEntity; -import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.executor.Executor; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlCommandType; -import org.apache.ibatis.plugin.*; -import org.apache.ibatis.session.defaults.DefaultSqlSession; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 - * - * @author xxx - * @date 2020-05-13 - **/ -@Slf4j -//@Component -//@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) -public class MybatisInterceptor implements Interceptor { - @Override - public Object intercept(Invocation invocation) throws Throwable { - MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; - SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); - - Object parameter = invocation.getArgs()[1]; - if (parameter == null) { - return invocation.proceed(); - } - - if (SqlCommandType.INSERT == sqlCommandType) { - if (parameter instanceof DefaultSqlSession.StrictMap) { - Map map = (Map) parameter; - List list = (List) map.get("list"); - for (Object o : list) { - injectForInsert(o); - } - } else { - injectForInsert(parameter); - } - } - - if (SqlCommandType.UPDATE == sqlCommandType) { - if (parameter instanceof DefaultSqlSession.StrictMap) { - Map map = (Map) parameter; - List list = (List) map.get("list"); - for (Object o : list) { - injectForUpdate(o); - } - } else { - injectForUpdate(parameter); - } - } - - return invocation.proceed(); - } - - @Override - public Object plugin(Object o) { - return Plugin.wrap(o, this); - } - - @Override - public void setProperties(Properties properties) { - - } - - public void injectForInsert(Object o) { - MemberEntity member = getLoginUser(); - if (o instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) o; - if (member != null) { - String by = member.getPhone(); - baseEntity.setCreateBy(by); - baseEntity.setUpdateBy(by); - } else { - baseEntity.setCreateBy("system"); - baseEntity.setUpdateBy("system"); - } - baseEntity.setCreateTime(new Date()); - baseEntity.setUpdateTime(new Date()); - } - } - - public void injectForUpdate(Object o) { - MemberEntity member = getLoginUser(); - if (o instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) o; - if (member != null) { - String by = member.getPhone(); - baseEntity.setUpdateBy(by); - } else { - baseEntity.setUpdateBy("system"); - } - baseEntity.setUpdateTime(new Date()); - } - } - - private MemberEntity getLoginUser() { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attributes == null) { - return null; - } - - HttpServletRequest request = attributes.getRequest(); - return (MemberEntity) request.getSession().getAttribute("member"); - } -} +//package cc.mrbird.febs.common.interceptor; +// +//import cc.mrbird.febs.common.entity.BaseEntity; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.ibatis.executor.Executor; +//import org.apache.ibatis.mapping.MappedStatement; +//import org.apache.ibatis.mapping.SqlCommandType; +//import org.apache.ibatis.plugin.*; +//import org.apache.ibatis.session.defaults.DefaultSqlSession; +//import org.springframework.stereotype.Component; +//import org.springframework.web.context.request.RequestContextHolder; +//import org.springframework.web.context.request.ServletRequestAttributes; +// +//import javax.servlet.http.HttpServletRequest; +//import java.util.Date; +//import java.util.List; +//import java.util.Map; +//import java.util.Properties; +// +///** +// * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 +// * +// * @author xxx +// * @date 2020-05-13 +// **/ +//@Slf4j +////@Component +////@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) +//public class MybatisInterceptor implements Interceptor { +// @Override +// public Object intercept(Invocation invocation) throws Throwable { +// MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; +// SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); +// +// Object parameter = invocation.getArgs()[1]; +// if (parameter == null) { +// return invocation.proceed(); +// } +// +// if (SqlCommandType.INSERT == sqlCommandType) { +// if (parameter instanceof DefaultSqlSession.StrictMap) { +// Map map = (Map) parameter; +// List list = (List) map.get("list"); +// for (Object o : list) { +// injectForInsert(o); +// } +// } else { +// injectForInsert(parameter); +// } +// } +// +// if (SqlCommandType.UPDATE == sqlCommandType) { +// if (parameter instanceof DefaultSqlSession.StrictMap) { +// Map map = (Map) parameter; +// List list = (List) map.get("list"); +// for (Object o : list) { +// injectForUpdate(o); +// } +// } else { +// injectForUpdate(parameter); +// } +// } +// +// return invocation.proceed(); +// } +// +// @Override +// public Object plugin(Object o) { +// return Plugin.wrap(o, this); +// } +// +// @Override +// public void setProperties(Properties properties) { +// +// } +// +// public void injectForInsert(Object o) { +// MemberEntity member = getLoginUser(); +// if (o instanceof BaseEntity) { +// BaseEntity baseEntity = (BaseEntity) o; +// if (member != null) { +// String by = member.getPhone(); +// baseEntity.setCreateBy(by); +// baseEntity.setUpdateBy(by); +// } else { +// baseEntity.setCreateBy("system"); +// baseEntity.setUpdateBy("system"); +// } +// baseEntity.setCreateTime(new Date()); +// baseEntity.setUpdateTime(new Date()); +// } +// } +// +// public void injectForUpdate(Object o) { +// MemberEntity member = getLoginUser(); +// if (o instanceof BaseEntity) { +// BaseEntity baseEntity = (BaseEntity) o; +// if (member != null) { +// String by = member.getPhone(); +// baseEntity.setUpdateBy(by); +// } else { +// baseEntity.setUpdateBy("system"); +// } +// baseEntity.setUpdateTime(new Date()); +// } +// } +// +// private MemberEntity getLoginUser() { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// if (attributes == null) { +// return null; +// } +// +// HttpServletRequest request = attributes.getRequest(); +// return (MemberEntity) request.getSession().getAttribute("member"); +// } +//} diff --git a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java index e65affa..d1dbba0 100644 --- a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java +++ b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.dapp.entity.DappMemberEntity; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import org.web3j.crypto.Hash; import javax.servlet.http.HttpServletRequest; @@ -16,4 +17,11 @@ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); return (DappMemberEntity) request.getSession().getAttribute("member"); } + + public static String getLoginKey(String address, String nonce, String sign) { + StringBuilder sb = new StringBuilder(); + StringBuilder append = sb.append(address).append(":").append(nonce).append(":").append(sign); + + return append.toString(); + } } diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java index 135f689..df323cf 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java @@ -65,7 +65,7 @@ switch (chainType) { case "ETH" : return ETH; - case "BSC" : + case "BSC_USDT" : return BSC; case "TRX" : return TRX; diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java index c616545..c3ef26a 100644 --- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java +++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; -import org.apache.commons.lang3.StringUtils; +import org.bouncycastle.jcajce.provider.digest.SHA3; import org.web3j.abi.FunctionEncoder; import org.web3j.abi.FunctionReturnDecoder; import org.web3j.abi.TypeReference; @@ -12,17 +12,12 @@ import org.web3j.abi.datatypes.Function; import org.web3j.abi.datatypes.Type; import org.web3j.abi.datatypes.generated.Uint256; -import org.web3j.crypto.Credentials; -import org.web3j.crypto.RawTransaction; -import org.web3j.crypto.TransactionEncoder; +import org.web3j.crypto.*; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.Request; import org.web3j.protocol.core.methods.request.Transaction; -import org.web3j.protocol.core.methods.response.EthBlockNumber; -import org.web3j.protocol.core.methods.response.EthCall; -import org.web3j.protocol.core.methods.response.EthGetTransactionCount; -import org.web3j.protocol.core.methods.response.EthSendTransaction; +import org.web3j.protocol.core.methods.response.*; import org.web3j.protocol.http.HttpService; import org.web3j.utils.Convert; import org.web3j.utils.Numeric; @@ -31,6 +26,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -63,10 +59,22 @@ public static void main(String[] args) throws IOException { HttpService service = new HttpService("https://bsc-dataseed1.ninicoin.io"); Web3j web3j = Web3j.build(service); - Request<?, EthBlockNumber> request = web3j.ethBlockNumber(); - EthBlockNumber send = request.send(); - BigInteger bigInteger = Numeric.decodeQuantity(send.getResult()); - System.out.println("0x113d6d0"); +// Request<?, EthBlockNumber> request = web3j.ethBlockNumber(); +// EthBlockNumber send = request.send(); +// BigInteger bigInteger = Numeric.decodeQuantity(send.getResult()); +// System.out.println("0x113d6d0"); + + String s1 = Hash.sha3("0xf6b06a30196aa5e318232a3b61319eab0fd4a3bf_llE4"); + + System.out.println(s1); + String str = "0xc2cd497cbbbc8bd0eb00a1b7340af86eb8f40f4fd1ee8f8660831d3841cb84be306dd15ceda42acf5d1f1add31793f17d2123c8e321f855dc41e6f44318841e71b_" + s1; +// Web3Sha3 send = web3j.web3Sha3("0x0d694bf4095e1dd854f7ba365db340308c4b4e5c990df0cd2e91465dd080935b").send(); + + String s = Hash.sha3(str); + // 0x515415edb1d3ae67a97f995b71bd09feaed27319722e55c4817f88273679a9e2 + // 0x64296f548bf487d8e1fa8548572d316ffab08f92fe7d4438e747e9948778f802 + // 0xb3b7c4bb00a80a646ecb803139a4e81eb5857dad30b299520fbd30f6eeeafd81 + System.out.println(s); } @Override diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java index f5e10d2..1c4613d 100644 --- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java +++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java @@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.dapp.dto.ApproveDto; +import cc.mrbird.febs.dapp.dto.ConnectDto; import cc.mrbird.febs.dapp.service.DappMemberService; import cc.mrbird.febs.dapp.service.DappSimulateDataService; import cc.mrbird.febs.dapp.service.DappSystemService; @@ -41,6 +42,13 @@ // return new FebsResponse().success().message("获取成功").data(dappMemberService.isApprove(address, chain)); // } + @ApiOperation(value = "链接接口", notes = "链接接口") + @PostMapping(value = "/connect") + public FebsResponse connect(@RequestBody ConnectDto connectDto) { + dappMemberService.connect(connectDto); + return new FebsResponse().success(); + } + @ApiOperation(value = "头部数据", notes = "头部数据") @GetMapping(value = "/totalIncome") public FebsResponse totalIncome() { diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java new file mode 100644 index 0000000..dc77af7 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java @@ -0,0 +1,23 @@ +package cc.mrbird.febs.dapp.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wzy + * @date 2022-05-26 + **/ +@Data +@ApiModel(value = "ConnectDto", description = "连接参数接收类") +public class ConnectDto { + + @ApiModelProperty(value = "地址", example = "123") + private String address; + + @ApiModelProperty(value ="随机字符串", example = "123") + private String nonce; + + @ApiModelProperty(value = "签名", example = "123") + private String sign; +} diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java index ed70cd5..265d5f9 100644 --- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java @@ -22,17 +22,16 @@ public DappFundFlowEntity() {} public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee) { + new DappFundFlowEntity(memberId, amount, type, status, fee, null); + } + + public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee, String fromHash) { this.memberId = memberId; this.amount = amount; this.type = type; this.status = status; this.fee = fee; - - this.setCreateBy("system"); - this.setUpdateBy("system"); - this.setCreateTime(new Date()); - this.setUpdateTime(new Date()); - this.setVersion(1); + this.fromHash = fromHash; } private Long memberId; @@ -40,7 +39,7 @@ private BigDecimal amount; /** - * 类型 1-兑换 2-提现 3-采矿 + * 类型 1-买入 2-卖出 3-采矿 */ private Integer type; @@ -53,4 +52,8 @@ private String address; private Integer fee; + + private String toHash; + + private String fromHash; } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java index a9a2279..b29af8f 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java @@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.dapp.dto.ApproveDto; +import cc.mrbird.febs.dapp.dto.ConnectDto; import cc.mrbird.febs.dapp.dto.PriceSettingDto; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity; @@ -13,6 +14,8 @@ public interface DappMemberService extends IService<DappMemberEntity> { void approve(ApproveDto approveDto); + + void connect(ConnectDto connectDto); int isApprove(String address, String chain); @@ -31,4 +34,6 @@ IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request); void setNewestPrice(PriceSettingDto priceSettingDto); + + DappMemberEntity insertMember(String address, String refererId); } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java index c8ba7de..bb60950 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java @@ -5,24 +5,38 @@ import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.chain.ContractEventService; import cc.mrbird.febs.dapp.chain.EthUsdtContract; +import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DappMemberEntity; +import cc.mrbird.febs.dapp.mapper.DappFundFlowDao; import cc.mrbird.febs.dapp.mapper.DappMemberDao; +import cc.mrbird.febs.dapp.service.DappMemberService; import cn.hutool.core.util.StrUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.math.BigDecimal; import java.math.BigInteger; +import java.math.RoundingMode; @Service public class BscCoinContractEvent implements ContractEventService { - @Autowired + @Resource private DappMemberDao dappMemberDao; + + @Resource + private DappMemberService dappMemberService; + + @Resource + private DappFundFlowDao dappFundFlowDao; private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25"; int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); + @Transactional(rollbackFor = Exception.class) @Override public void compile(EthUsdtContract.TransferEventResponse e) { if (e.to != null) { @@ -30,61 +44,37 @@ return; } - DappMemberEntity fromMember = dappMemberDao.selectByAddress(e.from, null); + DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null); if (fromMember == null) { - fromMember = insertMember(e.from, null); + fromMember = dappMemberService.insertMember(e.from, null); } if (!e.to.equals(ADDRESS)) { DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null); if (toMember == null) { - toMember = insertMember(e.to, fromMember.getInviteId()); + toMember = dappMemberService.insertMember(e.to, fromMember.getInviteId()); } } + // // 卖币 if (e.to.equals(ADDRESS)) { BigInteger tokens = e.tokens; + + BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(4), decimals, RoundingMode.HALF_DOWN); + + DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash()); + dappFundFlowDao.insert(fundFlow); + + // TODO price + BigDecimal newPrice = BigDecimal.valueOf(1); + + BigDecimal transferAmount = amount.multiply(newPrice); + String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(e.from, transferAmount); + fundFlow.setToHash(hash); + dappFundFlowDao.updateById(fundFlow); } } - } - - private DappMemberEntity insertMember(String address, String refererId) { - DappMemberEntity member = new DappMemberEntity(); - member.setAddress(address); - - dappMemberDao.insert(member); - - member.setInviteId(ShareCodeUtil.toSerialCode(member.getId())); - member.setRefererId(refererId); - if (StrUtil.isNotBlank(refererId)){ - boolean flag = false; - String parentId = refererId; - String ids = ""; - while (!flag && StringUtils.isNotBlank(parentId)) { - if (StrUtil.isBlank(ids)) { - ids += parentId; - } else { - ids += ("," + parentId); - } - - DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId); - if (parentMember == null) { - break; - } - parentId = parentMember.getRefererId(); - if(StringUtils.isBlank(parentId)){ - break; - } - if (parentMember.getRefererId().equals(parentMember.getInviteId())) { - flag = true; - } - } - member.setRefererIds(ids); - } - dappMemberDao.updateById(member); - - return member; } } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java index 79f1205..385c076 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java @@ -1,22 +1,62 @@ package cc.mrbird.febs.dapp.service.impl; import cc.mrbird.febs.common.utils.ShareCodeUtil; +import cc.mrbird.febs.dapp.chain.ChainEnum; +import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.chain.ContractEventService; import cc.mrbird.febs.dapp.chain.EthUsdtContract; +import cc.mrbird.febs.dapp.entity.DappFundFlowEntity; import cc.mrbird.febs.dapp.entity.DappMemberEntity; +import cc.mrbird.febs.dapp.mapper.DappFundFlowDao; import cc.mrbird.febs.dapp.mapper.DappMemberDao; +import cc.mrbird.febs.dapp.service.DappMemberService; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; + @Slf4j @Service public class BscUsdtContractEvent implements ContractEventService { + @Resource + private DappMemberService dappMemberService; + + @Resource + private DappFundFlowDao dappFundFlowDao; + + private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25"; + int decimals = ChainService.getInstance(ChainEnum.BSC_USDT.name()).decimals(); + int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); + @Override public void compile(EthUsdtContract.TransferEventResponse e) { + if (e.to != null && ADDRESS.equals(e.from)) { + DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null); + if (fromMember == null) { + fromMember = dappMemberService.insertMember(e.from, null); + } + BigInteger tokens = e.tokens; + + BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); + + DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash()); + dappFundFlowDao.insert(fundFlow); + + // TODO price + BigDecimal newPrice = BigDecimal.valueOf(1); + + BigDecimal transferAmount = amount.multiply(newPrice); + String hash = ChainService.getInstance(ChainEnum.BSC_TFC.name()).transfer(e.from, transferAmount); + fundFlow.setToHash(hash); + dappFundFlowDao.updateById(fundFlow); + } } } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java index 6acec79..6efb1dc 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java @@ -4,11 +4,13 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.FebsUtil; +import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.dapp.chain.ChainService; import cc.mrbird.febs.dapp.chain.ContractChainService; import cc.mrbird.febs.dapp.dto.ApproveDto; +import cc.mrbird.febs.dapp.dto.ConnectDto; import cc.mrbird.febs.dapp.dto.PriceSettingDto; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity; @@ -31,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.util.HashMap; import java.util.Map; /** @@ -114,6 +117,22 @@ walletCoin.setAvailableAmount(BigDecimal.ZERO); walletCoin.setFrozenAmount(BigDecimal.ZERO); dappWalletCoinDao.insert(walletCoin); + } + + @Override + public void connect(ConnectDto connectDto) { + DappMemberEntity member = dappMemberDao.selectByAddress(connectDto.getAddress(), null); + + if (member == null) { + member = insertMember(connectDto.getAddress(), null); + } + + String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign()); + redisUtils.set(connectDto.getAddress(), member); + + HashMap<String, String> map = new HashMap<>(); + map.put(connectDto.getAddress(), key); + redisUtils.set(AppContants.REDIS_KEY_SIGN, map); } @Override @@ -232,4 +251,43 @@ redisUtils.set(AppContants.REDIS_KEY_ETH_NEW_PRICE, priceSettingDto.getNewestPrice()); } } + + @Override + public DappMemberEntity insertMember(String address, String refererId) { + DappMemberEntity member = new DappMemberEntity(); + member.setAddress(address); + + dappMemberDao.insert(member); + + member.setInviteId(ShareCodeUtil.toSerialCode(member.getId())); + member.setRefererId(refererId); + if (StrUtil.isNotBlank(refererId)){ + boolean flag = false; + String parentId = refererId; + String ids = ""; + while (!flag && StringUtils.isNotBlank(parentId)) { + if (StrUtil.isBlank(ids)) { + ids += parentId; + } else { + ids += ("," + parentId); + } + + DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId); + if (parentMember == null) { + break; + } + parentId = parentMember.getRefererId(); + if(StringUtils.isBlank(parentId)){ + break; + } + if (parentMember.getRefererId().equals(parentMember.getInviteId())) { + flag = true; + } + } + member.setRefererIds(ids); + } + dappMemberDao.updateById(member); + + return member; + } } diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java index dd75c34..6c64330 100644 --- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java +++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java @@ -24,6 +24,6 @@ public void chainListenerJob() { log.info("监听打开"); // ChainService.contractEventListener(new BigInteger("18097238"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); - ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name()); +// ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name()); } } diff --git a/src/main/java/cc/mrbird/febs/modules/Test.java b/src/main/java/cc/mrbird/febs/modules/Test.java deleted file mode 100644 index ec1b055..0000000 --- a/src/main/java/cc/mrbird/febs/modules/Test.java +++ /dev/null @@ -1,8 +0,0 @@ -package cc.mrbird.febs.modules; - -/** - * @author - * @date 2020-09-23 - **/ -public class Test { -} diff --git a/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java b/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java deleted file mode 100644 index 3c7f19b..0000000 --- a/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java +++ /dev/null @@ -1,133 +0,0 @@ -package cc.mrbird.febs.modules.api.entity; - -import cc.mrbird.febs.common.entity.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.math.BigDecimal; - -@Data -@TableName("member") -public class MemberEntity extends BaseEntity { - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * 系统推荐人id - */ - public static final String SYSTEM_REFERER = "rxadr3"; - - /** - * 账号状态 - 禁用 - */ - public static final Integer ACCOUNT_STATUS_DISABLED = 0; - - /** - * 账号状态 - 启用 - */ - public static final Integer ACCOUNT_STATUS_ENABLE = 1; - - /** - * 账号代理级别 - */ - public static final Integer ACCOUNT_AGENT_LEVEL = 6; - - /** - * 账号类型 手机 - */ - public static final Integer ACCOUNT_TYPE_PHONE = 1; - - /** - * 正常账号 - */ - public static final Integer ACCOUNT_TYPE_NORMAL = 1; - /** - * 测试账号 - */ - public static final Integer ACCOUNT_TYPE_TEST = 2; - - /** - * 实名认证 审核通过 - */ - public static final Integer CERTIFY_STATUS_Y = 2; - /** - * 实名认证 审核不通过 - */ - public static final Integer CERTIFY_STATUS_N = 0; - /** - * 实名认证 审核中 - */ - public static final Integer CERTIFY_STATUS_ING = 1; - /** - * 实名认证 未提交 - */ - public static final Integer CERTIFY_STATUS_UN_SUBMIT = 3; - - /** - * 昵称 - */ - private String nickname; - /** - * 手机号(包含国际手机号) - */ - private String phone; - - /** - * 登陆密码 - */ - private String password; - - /** - * 交易密码 - */ - private String tradePassword; - - /** - * 邀请码 - */ - private String inviteId; - - /** - * 账号状态 0-禁用 1-启用 - */ - private Integer accountStatus; - - /** - * 上级推荐人id - */ - private String refererId; - - /** - * 上级推荐人ID链 - */ - private String refererIds; - - /** - * 账号类型 1-正常账号 2-测试账号 - */ - private Integer accountType; - - /** - * 代理级别 - */ - private Integer agentLevel; - - /** - * 实名认证状态 0-审核未通过 1-审核通过 2-等待审核 - */ - private Integer certifyStatus; - - /** - * 提币手续费 - */ - private BigDecimal idcardNo; - - private BigDecimal feeRatio; - @TableField(exist = false) - private String account; - -} -- Gitblit v1.9.1