Tacit 批量 mint 工具 v1.8.1
浏览器内构造 BTC commit+reveal tx pair · 直接 broadcast 到 mempool.space · 不经过任何后端 ·
基于
tacit.js 1.1MB 自托管副本(patched 暴露内部)·
protocol spec
⚠ 私钥风险声明(必须读完再用)
- 这个工具会把你的私钥放进浏览器 RAM。任何 XSS、恶意扩展、其它打开的标签都可能读到。
- 绝对不要用持有大额 BTC 的主钱包。生成一个专用空钱包,只放刚好够 batch mint 的 sats,多余不放。
- 本页面虽然不上传私钥到任何服务器(纯客户端 JS,broadcast 直接打 mempool.space),但不能消除 XSS / 浏览器扩展 / DNS 劫持的本地风险。
- 用完点
WIPE KEY 按钮把 RAM 里的 priv 清零,并立即关闭这个标签。
- 如果你不愿承担这些风险 → 用
本地 Node.js 脚本 替代(私钥永远不进浏览器)。
- BTC tx 不可逆。错误的 asset_id / 错误的网络 / 错误的 fee 会导致 sats 永久丢失。
- 本工具不背书 tacit 协议本身(3 天前才 public,未经实战)。理解协议风险后再用。
配置
默认 signet。先在 signet 完整跑通一遍再上 mainnet。
从 tacit-pin.rosscampbell9.workers.dev/petch-assets 实时拉取所有 PUBLIC-MINT 资产。已 mint 完的会被禁用。
切换网络后自动刷新。
从上面 dropdown 选完后这里显示完整 worker 字段。
cache 有 5min 滞后, 用这个看绝对最新
钱包状态
未连接。先填私钥 + 资产 ID + 网络,点【① 验证钱包】。
本浏览器 mint 历史 (按资产分组)
从浏览器 localStorage tacit-activity-v1:<network> 读。每次 mint 成功后自动刷新。
⚠️ 这些记录是本浏览器本地的,跟 tacit.finance 上的记录不共享 (不同 origin localStorage)。
⛓️ 链上验证 (权威, 不依赖任何 localStorage)
扫你 bc1q 地址的全部 BTC tx, 解析每笔 vin[0].witness 看是否含 PMINT envelope (opcode 0x28)。
这是链上真实数据: tacit.finance / 我工具 / 其它工具发的 mint 全包含, 任何 origin localStorage 都不能影响这个结果。
先点【① 验证钱包】加载私钥, 然后点上面按钮拉 mempool.space 的 tx 历史。
开源 + 客户端纯 JS: 所有源码在浏览器查看 (Ctrl+U)。不上传私钥到 985monitor.xyz 或任何服务器;broadcast 直接 POST 到 mempool.space/api/tx。
tacit.js: 自托管副本 (view source),patch 在文件末尾 export 块前 (~21988 行) 暴露内部。
本工具不维护 tacit 协议本身: 任何协议 bug / 升级导致老资产失效与本工具无关。
反馈 / 报告 bug: 直接在浏览器 DevTools console 看错误日志。
本地保存的内容:
tacit-mint-tool-config-v1 (网络 / 资产 ID / mint 次数 / 间隔, 不含私钥),
tacit-activity-v1:<net> (mint 历史快捷查询)。
这两个 key 都在你浏览器 localStorage, 跟 tacit.finance 不共享 (origin 隔离)。
CHANGELOG
v1.8.1 (2026-05-09) · 修 "Too many unspent transaction outputs (>500)" 错误: mempool.space 和 blockstream.info esplora API 都对单地址 UTXO > 500 直接拒查 (HTTP 400). 这在你 mint 数百次后必然撞上。修复: tacit.js 把 const getUtxos 改成 wrapper, detect 到这个错时 fallback 到 _getUtxosViaTxs: 用 /address/X/txs + /txs/chain/<lastSeen> 分页拉所有 tx (含 mempool, 最多 50 页 × 25 = 1250 笔), 自己反推 UTXO = 候选 outputs - 已消费 inputs. 比 /utxo 慢约 8-15 秒, 但能突破 500 限制。console 会输出反推过程日志。
v1.8.0 (2026-05-09) · 加资产详情卡片: 选完 dropdown 资产后, 在 etch_txid 下方显示完整 worker 字段 (cumulative_minted / credited_pmint_count / pmint_count / pending_pmint_count / mints_remaining / etched_at_height / etch_txid 直链 mempool.space) + cache 来源 + age (从 _cache_meta.fetched_at_unix 算)。新加【⚡ 强制查 worker 实时】按钮: 绕 985 cache 直接走 CORS 代理拉最新数据并刷新详情。说清"哪个数字算准": cumulative_minted = ≥3 conf 已 credit 的, pending = 还没 confirm 的, 两者总和 = 真实链上实际 mint 量。
v1.7.1 (2026-05-09) · 修 "Failed to fetch" / "etch tx has no envelope" 误导错误: tacit.js 的 api() 函数原本只打 NET.api (mempool.space), 失败时直接抛 TypeError。如果浏览器到 mempool.space 网络间歇 (中国大陆 GFW / VPN 抖动 / 浏览器扩展拦截), getTx() 拿不到 tx, 后续校验 !etchTx?.vin?.[0]?.witness 触发 "etch tx has no envelope" 误导。修复: 把 api() 改成 dual-endpoint, 主 mempool.space 失败 (TypeError 或 5xx) 时自动 fallback 到备用 NET.api2 (blockstream.info)。4xx 协议错误 (e.g. tx not found) 不 retry 直接抛。Console 会 warn 用了哪个备用端点。
v1.7.0 (2026-05-09) · 加自定义 fee rate (BTC 的"gas"): 配置卡片新加【fee rate (sat/vB)】输入框 + 【📊 查 mempool 推荐】按钮。tacit.js patch 把 const getFeeRate 包成 wrapper, 用户填的值优先 (覆盖 mempool.space 默认 auto), 留空则继续用 auto (mempool 推荐 + mainnet 10% safety margin)。新加 setCustomFeeRate / getCustomFeeRate / getMempoolRecommendedFees 暴露在 globalThis.tacit。配置持久化加 customFeeRate 字段。点查询按钮在 console 里显示 fastest/halfHour/hour/economy/minimum 5 档对照。
v1.6.0 (2026-05-09) · 加 985 自家服务器端缓存 (彻底告别公共 CORS 代理): 服务器跑 cron */5 * * * * Python 脚本拉 tacit worker 数据写到 web/tacit-mint/cache/petch-assets-{mainnet,signet}.json, 浏览器直接 fetch 同 origin 静态文件 (无 CORS 阻挡, 无 408 timeout)。fetch 优先级: ① 985 自家缓存 → ② 公共代理链 fallback → ③ hardcoded fallback。每次显示数据时附上 cache age (从 _cache_meta.fetched_at_unix 算)。
v1.5.1 (2026-05-09) · 修代理 408/500: ① 加 hardcoded fallback (mainnet 4 个资产 BINANCE/ZAMM/CONF/FAIR 的 asset_id + etch_txid + cap, 截至 2026-05-09 13:50), 启动立即可用, dropdown 不会卡空。② 加多代理 fallback 链 (allorigins → corsproxy.io → codetabs → cors.sh, 任一通即可), 各代理 10s 超时。③ 实时数据拉到时无缝替换 hardcoded。④ 全部代理挂时保留 hardcoded 数据 (而不是空 dropdown)。
v1.5.0 (2026-05-09) · 加链上权威验证: 新卡片【⛓️ 用当前钱包扫链验证】, 拉 mempool.space 的 /address/X/txs 全部 (含 mempool + 4 页确认 tx, 最多 ~200 笔), 解析每笔 vin[0].witness[1] 用 tacit decoders 找 PMINT envelope (opcode 0x28), 按 etch_txid 分组显示 ticker + 次数 + 总 amount + 确认状态。完全脱离 localStorage, tacit.finance 工具 / 我工具 / 任何其它客户端发的 mint 全包含。tacit.js patch 加 decodeEnvelopeScript / decodeCPmintPayload / decodeCPetchPayload / T_PETCH 暴露。
v1.4.0 (2026-05-09) · 加配置本地持久化: 网络 / 资产 ID / mint 次数 / 间隔 自动存到 localStorage tacit-mint-tool-config-v1, 下次进页面自动恢复。私钥永远不存 (绝对安全模式, 工具反复强调的不变量)。input change 触发 debounced (500ms) 自动保存。加【🗑 清空本地配置】按钮。
v1.3.0 (2026-05-09) · ① 加 mint 历史卡片: 从浏览器 localStorage tacit-activity-v1:<net> 读所有 pmint 记录 (tacit.js 内部 recordActivity 已自动写), 按 ticker 分组显示次数 + 总 amount + 最近 3 笔 reveal txid 的 mempool.space 链接 + 完整列表折叠展开。每次 mint 成功后自动刷新, 切换网络也刷新, 提供清空按钮。注意: 这是本浏览器本地记录, 跟 tacit.finance origin 的 localStorage 不共享。
② 加多 UTXO 检测警告: 验证钱包后看 utxoCount, 如果 = 1 → 红框警告"连续 mint 容易 RBF 冲突, 建议拆 BTC 成多笔"; 如果 ≥ 2 → 绿框"✓ N 笔 UTXO, 不会 RBF 冲突"。
③ tacit.js patch 加 loadActivity 暴露到 globalThis.tacit。
v1.2.2 (2026-05-09) · 修 RBF 冲突: ① 默认间隔从 3 秒提到 15 秒, max 提到 120 秒 (给 mempool.space indexer 时间反映已花的 UTXO) ② 批量循环加自动重试: catch insufficient fee, rejecting replacement 错误时等 45 秒重试 (最多 3 次), too-long-mempool-chain/missing inputs 等 30 秒重试。其它错误 (insufficient sats / API) 不重试直接报错。
v1.2.1 (2026-05-09) · 🐛 修关键 bug: asset_id ≠ etch_txid。tacit.js 的 buildAndBroadcastPmint 入参是 etch_txid (BTC reveal tx hash) 不是 asset_id (= SHA256(etch_txid_BE‖0_LE) 派生值)。v1.2.0 把 asset_id 当 etch_txid 用导致全部 mint 失败 "etch tx has no envelope"。修复: dropdown option value 改成 etch_txid; input 改成接受 etch_txid 不是 asset_id; help 文本警告手动填的人不要粘贴 asset_id。
v1.2.0 (2026-05-09) · 加资产下拉菜单: 从 tacit-pin.rosscampbell9.workers.dev/petch-assets?network=N 实时拉取所有 PUBLIC-MINT 资产 (T_PETCH-rooted)。显示 ticker · per mint 数量 · mints remaining · 总进度。已 mint 完的禁用置灰。选完自动填 asset_id input。切换网络自动刷新。手动粘贴 asset_id 仍保留作 fallback。
CORS 处理: tacit worker 硬编码 Allow-Origin: https://tacit.finance, 浏览器从 985monitor.xyz 直接 fetch 会被拦。改走 api.allorigins.win 公开 CORS 代理 (只读公开数据, 无私钥风险, 失败时 fallback 到直 fetch)。
v1.1.0 (2026-05-09) · ① 加 WIF (base58check) 私钥支持: 自动检测 K/L/c 开头, 自动 decode 成 raw 32 bytes, 校验 version byte 跟所选网络一致 (mainnet 0x80 / testnet 0xef)。② 加 bc1p ≠ bc1q 警告: 你的钱包是 bc1p (Taproot) 但 tacit.js 用 bc1q (P2WPKH), 同一私钥不同地址。验证后显示工具用的 bc1q 地址 + 余额 0 时高亮提示需从 bc1p 转 BTC 过来。③ tacit.js 补丁加 sha256/base58/bech32 暴露到 globalThis.tacit 供 WIF decoder 用。
v1.0.0 (2026-05-09) · 初版: 浏览器内构造 BTC commit+reveal tx pair, 自托管 tacit.js 1.1MB patched, broadcast 直接打 mempool.space/api/tx 不经任何后端, 红色风险声明 + WIPE KEY 按钮。