
Bisq 1.10.1 版本解析BSQ swap 手续费钳制、交易限额体系与发布签名流水线Bisq 1.10.1 是一次以“交易安全与发布可靠性”为主题的版本核心围绕 BSQ swap 低费率场景下的矿工费钳制、交易限额校验修复、冷存储提醒阈值可配置化以及新增的 Gradle 发布产物签名任务展开。阅读本文后你将理解 1.10.1 中每一类改动的业务动机并能对照 release-highlights、notable-changes 与仓库源码TradeLimits、BsqSwapCalculation、FeeService、Preferences、build.gradle逐一验证其实现位置与生效条件。版本定位根据 1.10.1 release highlights该版本面向 GitHub release notes 与应用内更新消息撰写最终应用版本号设定为1.10.1。改动可归纳为四个层面交易与钱包安全BSQ swap 手续费钳制、费率下限钳制、交易统计校验修复、法币交易限额上调UX 与设置冷存储提醒阈值可配置、dev 模式弹窗抑制、交易规则与条款入口、日期选择器迁移API、打包与测试gRPC 异步错误透传、API 测试 Docker 化、Debian 包t64依赖处理发布流程与 CIGradle 签名任务、macOSfinalize.sh签名失败即中断、可复现构建证明文档、GitHub Actions 依赖更新。以下按 highlights 文档的原节次展开并结合当前仓库源码补充实现细节。交易与钱包安全BSQ swap 接单take-offer矿工费贡献钳制为零highlights 第一条指出BSQ swap take-offer 处理现在将 BTC 矿工费贡献钳制clamp在零防止在费率计算可能变为负数的边界情况下崩溃。要理解这个修复需要先看 BSQ swap 的费用模型。如 BSQ swap 手续费处理文档所述BSQ swap 是一笔同时包含 BSQ 染色输入与 BTC 输入的比特币交易BSQ 交易费并非通过独立手续费交易支付而是表现为“未作为 BSQ 输出返回的染色 satoshi”——从比特币视角看它是矿工费的一部分从 DAO 视角看它是被烧毁的 BSQ 交易费。因此每一方还需向矿工费额外补足的部分被定义为adjustedTxFee max(0, txFeePerVbyte * participantVBytes - participantTradeFee)其中participantVBytes 5 sum(inputVBytes) outputVBytessegwit 输入 68 vbytes、非 segwit 输入 149 vbytes、有找零 62 vbytes、无找零 31 vbytes。核心实现在 BsqSwapCalculation.getAdjustedTxFeeCoin adjustedTxFee Coin.valueOf(txFeePerVbyte) .multiply(vBytes) .subtract(Coin.valueOf(bsqTradeFee)); // Negative value is possible return adjustedTxFee.value;可以看到当participantTradeFee txFeePerVbyte * participantVBytes即烧毁的 BSQ 交易费已经覆盖甚至超过该方应承担的矿工份额时差值为负。旧代码直接要求该值为正于是低费率 小输入集的组合下会触发断言失败导致接单流程崩溃。1.10.1 的修复即把该值按max(0, ...)钳制触发钳制时该方不再额外贡献 BTC 矿工费交易费本身已覆盖其份额多余的少量值作为对矿工的超额支付。这也正是 highlights 中“防止 fee 计算变负的边界场景”的具体含义。费率更新钳制到比特币网络最低值第二条改动是FeeService在存储费率服务商提供的费率前把费率钳制到 Bisq 接受范围内且不低于比特币网络最低费率。当前仓库中的 FeeService 维护如下不变量maxFeePerVbyte txFeePerVbyte minFeePerVbyte networkMin其中networkMin Config.baseCurrencyNetwork().getDefaultMinFeePerVbyte()。源码注释说明了一个重要的适用前提v1.10.0尚不钳制到networkMin因此为了向后兼容当前版本暂不把networkMin用作minFeePerVByte的下界注释中保留了未来交易协议版本提升后可启用的逻辑。这一钳制与上一条形成互补——它保护getAdjustedTxFee的零钳制逻辑在“交易费已覆盖矿工份额”时不会低于中继最低费率同时避免费率服务商返回异常高值导致估算器溢出。highlights 同时提到围绕低费率条件补充了 BSQ swap 校验覆盖对应仓库中 FeeServiceTest 与 BsqSwapCalculationTest 等测试文件。交易统计校验适配降额后的限额第三条交易统计trade statistics校验为上一版本1.10.0引入的限额下调而做了调整。对应实现在 TradeStatistics3其保留了HISTORICAL_MAX_TRADE_AMOUNT 2 BTC的历史上限用于判断历史区块中的交易金额是否合法validHistoricalTradeAmount amount HISTORICAL_MAX_TRADE_AMOUNT。由于现网硬顶已降至0.250 BTC而链上历史数据仍可能存在更早限额下的交易统计校验必须区分“历史区间”与“当前区间”否则新块中的统计数据会被误判。测试覆盖见 TradeStatistics3Test。法币限额上调与 0.250 BTC 硬顶第四条是本版本中最值得展开的一项法币fiat交易限额在当前0.250 BTC硬网络上限内上调且限额规则被系统性地文档化到 trade-limits。硬顶定义在 TradeLimitspublic static final Coin MAX_TRADE_AMOUNT Coin.parseCoin(0.250);该类实现DaoStateListener通过getMaxTradeLimitFromDaoParam()读取 DAO 参数MAX_TRADE_LIMIT并调用静态clamp()压到0.250 BTC以内networkMax min(DAO_MAX_TRADE_LIMIT, 0.250 BTC)按 trade-limits 文档完整的限额决策链为每种支付方式payment method有基于networkMax的最大 BTC 额度本地userDefinedTradeLimit默认0.1 BTC即Preferences.INITIAL_TRADE_LIMIT 10000000satoshi见 Preferences可进一步降低额度账户签名account signing只会对“使用有拒付风险的成熟市场法币买入BTC”的交易者降额卖 BTC 永不因签名状态降额所有交易被0.250 BTC硬顶截断。在networkMax 0.250 BTC下风险类别上限为极低风险0.250 BTC、低风险0.1252 BTC、中风险0.0832 BTC、高风险0.0624 BTC另有UPI、PAYTM、BIZUM等按staticBaseLimit * networkMax / 2 BTC缩放的自定义静态限额如UPI为0.00625 BTC。账户签名日程为未签名或同侪签名不足 30 天的拒付风险买家限0.002 BTC30–60 天为0.5 * L满 60 天恢复LL min(PM, U)仲裁员签名或2019-03-01 00:00 UTC前的遗留见证则直接豁免。对端校验peer verification由于无法获知对端本地限额用PM替代L重算。文档还给出了 CreateOfferService 创建报价、taker 接单、对端校验三条路径下限额的应用差异以及十组具体场景示例。这些规则在源码中的落点由文档的 “Source References” 一节列出TradeLimits、PaymentMethod.getMaxTradeLimitAsCoin、AccountAgeWitnessService.getMyTradeLimit/verifyPeersTradeLimit等并有 TradeLimitsTest 与 TradeAmountValidationTest 验证——后者明确覆盖“超过MAX_TRADE_AMOUNT的存量报价被拒绝”的路径TradeAmountValidation.checkTradeAmount中checkArgument(!tradeAmount.isGreaterThan(TradeLimits.MAX_TRADE_AMOUNT), ...)。UX 与设置冷存储提醒阈值可配置highlights 指出冷存储提醒cold-storage reminder阈值现在可以在偏好设置中配置。当前仓库中的实现链路完整可见默认值与上限定义在 PreferencesINITIAL_COLD_STORAGE_REMINDER_THRESHOLD 200000000.2 BTC、MAX_COLD_STORAGE_REMINDER_THRESHOLD 2000000002 BTC并提供了getClampedColdStorageReminderThreshold钳制方法持久化字段位于 PreferencesPayloadcoldStorageReminderThreshold随偏好 payload 一起序列化加载偏好的过程中onReadDone附近见 Preferences#L392-L396会对读入值做钳制越界时回写钳制结果桌面端 PreferencesView 新增输入框用BtcValidator校验并限制最大值为MAX_COLD_STORAGE_REMINDER_THRESHOLD文案键为setting.preferences.coldStorageReminderThreshold。对用户而言这意味着当本地钱包 BTC 余额超过自设阈值默认 0.2 BTC最高可设 2 BTC时应用会提示考虑将余额转入冷存储阈值不再是写死的常量而是可持久化的个人偏好。其他 UX 改动dev 模式跳过钱包警告弹窗开发调试场景不再被钱包安全警告弹窗打断Settings/About 增加交易规则与条款入口交易规则trade rules和 terms and conditions 可在 设置/关于 页面中查看条款流程更新日期选择器迁移terms and conditions 流程刷新且日期选择控件从JFXDatePicker迁移到 JavaFX 原生DatePicker降低对第三方控件库的依赖。API、打包与测试gRPC 异步错误透传highlights 指出来自异步操作的 offer 与 wallet 失败现在通过 gRPC response observer 上报而不是丢失在后台处理中。这对 bridge 与 daemon 侧的 gRPC 服务意味着客户端调用 create/take offer、钱包操作等异步接口时协议内部的异步异常会经由 observer 的onError路径回传给调用方而不是仅打印日志后静默失败从而改善了 API 客户端CLI、外部自动化脚本可见的错误处理。测试栈 Docker 化与 BSQ 余额轮询遗留的、此前被禁用的 API 测试被移植到 Docker 测试栈上运行trade 场景测试中改进了对 BSQ 余额变化的轮询。仓库中对应资产包括Docker 测试编排与入口脚本apitest/docker、run-e2e-tests.sh、Dockerfile.bisq交易场景测试 TradeScenarioTest含 BSQ 余额轮询逻辑与 DAO 集成测试 DaoTestBase。BSQ 余额轮询的改进针对的是swap 完成后 BSQ 余额变更异步落账固定等待容易造成测试偶发失败改为轮询确认余额达到预期值。Debian 包依赖生成放宽 t64 后缀Debian 包依赖生成现在对t64依赖采取更宽松的处理放宽带t64后缀的依赖项同时保留原始约束或 qualifier 在无后缀的备选依赖上。t64是 Debian 用于区分 64 位时间戳 ABI 的包后缀这一处理使得生成的.deb在不同发行版环境下更容易通过依赖解析且不丢失原本版本约束语义。发布流程与 CIGradle 发布产物签名任务1.10.1 新增了 Gradle 发布产物签名任务signReleaseArtifacts见 build.gradle#L2865。按 release-process 文档当需要手动创建并签名最终发布目录时使用./gradlew signReleaseArtifacts为发布二进制.dmg、.deb、.rpm等生成 detached armored.asc签名发布检查清单 release-checklist 中同样引用了该命令。finalize.sh 签名失败即中断macOS 打包收尾脚本 finalize.sh 在本版本中改为签名错误即失败fail on signing errors。脚本对 x86_64/arm64 dmg、deb、rpm、exe、cli、daemon、jar_txt 逐一执行gpg --detach-sig随后gpg --verify逐件验证见 finalize.sh#L102-L120并通过BISQ_GPG_USER环境变量指定签名身份。签名密钥材料存放于 desktop/package 目录387C8307.asc、E222AA02.asc、signingkey.asc。其他发布与 CI 改动可复现构建证明文档新增 reproducible build attestation 文档位于 docs/reproducible-builds/attestations.md与同目录下的 technical.md、linux.md 等构成完整体系发布产物目录列举受保护guarded artifact directory listing避免签名流程枚举到意外文件GitHub Actions 依赖更新actions/cache→5.0.5、actions/upload-artifact→7.0.1、docker/setup-buildx-action→4.0.0/4.1.0、actions/stale→10.3.0版本号应用版本设定为1.10.1。延伸阅读与源码索引版本说明release-highlights、notable-changes、full-release-notes限额规则docs/trade-limits.md、TradeLimits、TradeLimitsTestBSQ swap 费用模型docs/bsq-swap-fee-handling.md、BsqSwapCalculation费率钳制FeeService、FeeServiceTest偏好与冷存储提醒Preferences、PreferencesPayload、PreferencesView发布与签名build.gradle、docs/release-process.md、docs/release-checklist.md、finalize.sh、docs/reproducible-builds/attestations.md端到端测试apitest/docker/README.md、TradeScenarioTest适用前提说明本文所有结论以当前仓库1.10.1 发布线的文档与源码为准FeeService对networkMin的钳制行为受 v1.10.0 向后兼容约束若未来交易协议版本提升源码注释中预留的下界逻辑可能启用。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考