fix(order): 修复订单签名 salt 并发碰撞问题
- 使用 AtomicLong + 时间戳保证 generateSalt 在并发下唯一 - 避免尾盘策略 FIXED 模式预签双单等场景产生相同 salt 导致订单冲突 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+9
-3
@@ -8,6 +8,7 @@ import org.web3j.crypto.Credentials
|
|||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.math.RoundingMode
|
import java.math.RoundingMode
|
||||||
|
import java.util.concurrent.atomic.AtomicLong
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单签名服务
|
* 订单签名服务
|
||||||
@@ -323,12 +324,17 @@ class OrderSigningService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 并发安全:确保同一毫秒内多次调用生成唯一 salt,避免 FIXED 模式预签双单等场景的 salt 碰撞 */
|
||||||
|
private val saltSequence = AtomicLong(0)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成 salt(使用时间戳,毫秒)
|
* 生成 salt(时间戳 + 自增序列,保证并发下唯一)
|
||||||
* 与 TypeScript SDK 保持一致,使用时间戳作为 salt
|
* 兼容 Polymarket:salt 为 Long,时间戳主位 + 序列次位,与 TypeScript SDK 语义兼容
|
||||||
*/
|
*/
|
||||||
private fun generateSalt(): Long {
|
private fun generateSalt(): Long {
|
||||||
return System.currentTimeMillis()
|
val now = System.currentTimeMillis()
|
||||||
|
val seq = saltSequence.incrementAndGet() and 0x3FF
|
||||||
|
return now * 1000 + seq
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user