Selaa lähdekoodia

降低能量检测阈值
去除强制能量租赁
增加能量回收时间限制,防止能量超收

huangjunling 1 viikko sitten
vanhempi
commit
3866111af9

+ 1 - 0
blockchain-transfer/pom.xml

@@ -122,6 +122,7 @@
     </dependencies>
     <!--打包配置-->
     <build>
+        <finalName>blockchain-transfer</finalName>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>

+ 18 - 6
blockchain-transfer/src/main/java/com/table/transfer/module/service/TronService.java

@@ -48,22 +48,26 @@ public class TronService {
     /**
      * 能量租赁等待时间上限
      */
-    private static final long ENERGY_WAIT_TIMEOUT_MS = 120_000L;
+    private static final long ENERGY_WAIT_TIMEOUT_MS = 50_000L;
     /**
      * 地址+合约,余额(健康检查的时候顺便加载)
      */
     private final Cache<String, BigDecimal> addressBalance = CacheBuilder.newBuilder()
             .expireAfterAccess(1, TimeUnit.HOURS)
             .build();
-
+    //防止能量回收延迟
+    private static final Cache<String, Integer> energyRecycling  = CacheBuilder.newBuilder()
+            .expireAfterAccess(12, TimeUnit.SECONDS)
+            .build();
+    private static final Integer energyRecyclingTime=10000;
     /**
      * trx 精度
      */
     private static final BigDecimal SUN_TO_TRX = BigDecimal.valueOf(1_000_000);
     /**
-     * 单词转账的能量阈值
+     * 单次转账的能量阈值,但是租赁时有时候会略低于这个值,此时多付点trx,能正常接受
      */
-    private static final long ENERGY_PER_TRANSFER = 65_000L;
+    private static final long ENERGY_PER_TRANSFER = 55_000L;
 
     /**
      * 频率限制器
@@ -237,6 +241,11 @@ public class TronService {
             long requiredEnergy = ENERGY_PER_TRANSFER * energyCount;
             log.info("代币转账需要 {} 笔能量,总计 {} 能量", energyCount, requiredEnergy);
 
+            Integer ifPresent = energyRecycling.getIfPresent(fromAddress);
+            if(ifPresent!=null){
+                //存在说明近期租过能量了,等待一段时间,等能量回收完成再租赁,防止能量被超收
+                Thread.sleep(energyRecyclingTime);
+            }
             // 3. 检查当前能量是否足够
             long currentEnergy = getAvailableEnergy(apiWrapper, fromAddress);
             if (currentEnergy < requiredEnergy) {
@@ -264,7 +273,8 @@ public class TronService {
             Contract contract = limitApiWrapper(apiWrapper).getContract(contractAddress);
             Trc20Contract token = new Trc20Contract(contract, fromAddress, limitApiWrapper(apiWrapper));
             txHash = token.transfer(toAddress, amountInSmallestUnit.longValue(), 0, "", 1000000000L);
-
+            //转账完成后记录这个地址10秒内转过账了
+            energyRecycling.put(fromAddress,1);
             log.info("代币转账广播成功: txId={}", txHash);
 
             return txHash;
@@ -302,7 +312,9 @@ public class TronService {
                 Thread.sleep(3000);
             }
         }
-        throw new RuntimeException("能量租赁未到账,超时");
+        log.info("能量租赁失败,消耗trx转账");
+//        能量没租到直接转,多点手续费,记录下日志就行
+//        throw new RuntimeException("能量租赁未到账,超时");
     }
 
     /**