# bitcoin-signet-0001 — первый обратимый артефакт Bitcoin-native профиля

Дата: 2026-09-08 · код: `bb-bitcoin/` · спека: MEMORY-SPEC §14 · вердикт: COUNCIL Раунд 16

Что проверялось: цепочка UTXO-эпох памяти, эскроу как функция договорённости
(`fund` / `release` / `resolve` / `refund`) и независимый верификатор, который
никогда не обращается к нашему бэкенду.

---

## Сначала — что НЕ получилось

**Монет на signet добыть не удалось.** `signetfaucet.com` принял заявку
(ответ: *«A pay-out to your address has been queued»*), но выплата не пришла ни
через час, ни к концу работы; повторные заявки он отвечает страницей-заглушкой
(«у вас уже есть заявка в очереди»). Альтернативный кран `alt.signetfaucet.com`
→ `signet257.bublina.eu.org` закрыт Cloudflare Turnstile; `signet.bc-2.jp`
редиректит на припаркованный домен; `faucet.achow101.com` мёртв;
`bitcoinfaucet.uo1.net` — testnet3, не та сеть; `faucet.mutinynet.com` — другой
signet, смешивать сети нельзя.

Поэтому **денежных транзакций на signet в этом артефакте нет.** Весь денежный
цикл прогнан на **regtest** (Bitcoin Core 28.0, локальный узел), и в таблице
ниже у каждой строки честно указана сеть. Выдавать regtest за signet мы не
будем.

Адрес, который ждёт монеты (кран может доплатить позже):
`tb1pxcl6nf9p98v5ntxsjvfpe97caq0g4344msuu8qh9ms2uefqyv3xspdty5t`

---

## Что реально произошло

### Цепочка UTXO-эпох памяти — regtest

Внутренний ключ памяти: `d66493db488fda5d60cb49c43f93863916f98c0a4d98103be941b413cf34b45d`

| Что | Сеть | txid | vsize | Комиссия | Статус | Обозреватель |
|---|---|---|---|---|---|---|
| Эпоха 0 (генезис, 3 записи) | regtest | `2649fd783eeef6229f094cf3bdb9c3c1bae3b3938b2ae6c6eb5815c3db13e6c9:1` | — | — | FINAL | локальный узел |
| Эпоха 1 (4 записи) | regtest | `ba5dceaffe43aa7e08d8a10816ce2ca9aa9ccd6ce5acfe459a7421ae68b644ae` | **111 vB** | 111 сат | FINAL(10) | локальный узел |
| Эпоха 2 (5 записей) | regtest | `9f12d986d61a85d80998d1bdf3a407fb1873d320959e7565c209000943256945` | **111 vB** | 111 сат | FINAL | локальный узел |

Эпоха 1 тратит выход эпохи 0, эпоха 2 — выход эпохи 1. Двух «следующих эпох»
быть не может: один выход тратится один раз, порядок задаёт консенсус Bitcoin,
а не мы. Корни:

```
эпоха 0: 0f1ca2799f59ddba8810d3160669be94a9a1ecdfe85bc34fe2cc81ee807b4b3c
эпоха 1: e256f7af115bc4e0f054aa4201f4bd096c64013936ca9e32a0e8b6a28af4c834
эпоха 2: 8111bb30cd7f662acf075711d066ec100f8016d59188820bfbe9f466f59931e4
```

Корень эпохи 1 вшит в выходной ключ через `tweak = tagged_hash("bb/epoch",
internal || root) = 7d44220ed0534e1abfa493f82bd8275237cd0458b3a4a60bcacbe9fafe8f32d1`,
scriptPubKey выхода — `512081875e2b2d87307fa0fc589d1f34207c1c2298428ea645d447bfe5002b25dc7b`.
**34 байта, обычный P2TR, ноль лишних данных на цепи.**

### Сделка — regtest

Договорённость `bb-bitcoin/examples/agreement-regtest.json`,
отпечаток `664015fc44a4ce17b61f16be8246460958b2bb3d2b70c36b96b631901f6f673f`.
Ключи: A `020fd312e3…`, B `02d506cab9…`, C `03bb349d27…`.

| Что | Сеть | txid | vsize | Комиссия | Статус | Обозреватель |
|---|---|---|---|---|---|---|
| fund (1 вход → 3 milestone + сдача) | regtest | `5a0adef78f452d39eb696d75dbe98146f21c417ab4022e74147e828f4eef22d5` | 298 vB | 298 сат | FINAL(4) | локальный узел |
| release #1 — key path, MuSig2(A,B) | regtest | `5e0350263d4210baf3d21cad55f9d02e4f2ad5fbcc68a4969faec767d236a3df` | 111 vB | 111 сат | FINAL(3) | локальный узел |
| resolve #2 — script path, лист `B∧C` | regtest | `85d5bf2d6b65d776f2733535ba896e265d7c55202203760e207c41777d8d201a` | 170 vB | 170 сат | FINAL(3) | локальный узел |
| refund #3 — script path, лист CLTV | regtest | `40f2911b2c0f72ab88a25ce1b2a33332fe5ee80207e0b301dd0ada867082d173` | 138 vB | 138 сат | FINAL(3) | локальный узел |

Адреса milestone (regtest):

```
#1  30000 сат, T=500  bcrt1pyghfmz4aqqwe3yu50lvy5la3whhh72hprxl7ru74tfm603fv4m4qlrcfz5
#2  30000 сат, T=500  bcrt1p22tdk62vs8hkx63wp7auncl82mlnuh98nzvpkayawnzw9h0rzusqvpdmja
#3  25000 сат, T=105  bcrt1pj6fakdnd208gx7cuswganedt7r9yrmcg32yqa8qld7y83rzsv4qqs7080f
```

Каждый свидетель до отправки проверен `libbitcoinconsensus` (Bitcoin Core
25.1 ABI через `bitcoinconsensus 0.105`) — то есть скрипт исполнен настоящим
консенсусным движком, а не «мы думаем, что подпись верная». `refund` прошёл
по-настоящему: nLockTime = 105, высота цепи была доведена до 106.

### Адреса на signet (выведены, но не профинансированы)

Это настоящие signet-адреса, посчитанные из настоящей договорённости
`bb-bitcoin/examples/agreement.json` (отпечаток
`ee0b7e41…`/`b7010e84…`/`4b95f825…` у milestone 1/2/3 соответственно):

| Что | Адрес signet |
|---|---|
| Голова памяти (эпоха 0) | `tb1pzyqa7yff64uze742749ay2t6jfr5jdlpscexdc8upx6ls3kxk5nqhxu9at` |
| Эскроу milestone 1 | `tb1pwjrqqwsyug0q99v03ytqn4y89mu2jkjxjw2mvnnpffve8hxvv8qqvqyyjk` |
| Эскроу milestone 2 | `tb1pkrj60x22rena9tcxgnwrpd6f6agjkshheggnqvjg32sq63deyg4qsr4zw9` |
| Эскроу milestone 3 | `tb1pfc6wghpfetrynvq73njvxx0mvfldfuc39tjfrvrdxmezx7gnl7wq0c4f26` |
| Кошелёк (ждёт кран) | `tb1pxcl6nf9p98v5ntxsjvfpe97caq0g4344msuu8qh9ms2uefqyv3xspdty5t` |

Любой может пересчитать их сам:

```bash
cd bb-bitcoin && cargo build
./target/debug/bb-verify address examples/agreement.json \
  --a 025f722b63c968991ae979e1c934fd1fb8918385612de9ef1d6d9788c64a7ea0d3 \
  --b 0239224a43166a773cff9cc446365e5326b1975cd54d177c5938768d6a900e02c2 \
  --c 0372d689bfa93ddd7457d4627e9aadfa78f21b538cf45a03db0a70516e2bee322d \
  --milestone 1 --network signet
```

### Верификатор против живых публичных источников signet

Единственная часть, которую удалось прогнать **на настоящем signet**, — сам
верификатор. Он спросил два независимых обозревателя и потребовал их согласия:

```
$ bb-verify tx 037660f97d763a70f895edb343ad5299474eb0af852b0ea78ba9a3b3cf147688
источники  : https://mempool.space/signet/api, https://blockstream.info/signet/api
  [ok ] транзакцию видят 2 источник(ов) и согласны о высоте блока
  [ok ] merkle-путь сошёлся с заголовком блока у 2 источников
       статус: FINAL(1); vsize 234 vB, комиссия 0 сат
ИТОГ: ПРОВЕРЕНО — 2 проверок пройдено
```

Проверка настоящая: merkle-путь пересчитан из txid и позиции, результат сравнён
с байтами 36..68 реального 80-байтового заголовка блока signet, а хеш заголовка
— с хешем блока, который отдал обозреватель. Ссылки для человека:
[mempool.space](https://mempool.space/signet/tx/037660f97d763a70f895edb343ad5299474eb0af852b0ea78ba9a3b3cf147688) ·
[blockstream.info](https://blockstream.info/signet/tx/037660f97d763a70f895edb343ad5299474eb0af852b0ea78ba9a3b3cf147688).

---

## «Один байт изменён → другой адрес»

Настоящий вывод команды (regtest, milestone 1):

```
$ bb-deal --network regtest address examples/agreement-regtest.json --milestone 1

договорённость (канон): {"agreement":"664015fc44a4ce17b61f16be8246460958b2bb3d2b70c36b96b631901f6f673f",
                         "n":1,"sat":30000,"schema":"bb/milestone/0.1","timeout_height":500}
отпечаток   : 85526a32d62a754f545c6394d2575656261479f30de5c7303eaeda892582aa7d
musig(A,B)  : 13358b00d726d23ded0910abeebeef00467677fa8940ac75c02aa21d3068ee7d
deal tweak  : 7bfb1826528d29a598c75f4d355fb519092ed4d23c13cd43f5d44b711a25d9f9
internal    : 48a1facc8c038a6c1aba9d5402991e3e523bf51f24bd1e93156debd55f45f448
АДРЕС       : bcrt1pyghfmz4aqqwe3yu50lvy5la3whhh72hprxl7ru74tfm603fv4m4qlrcfz5

— один байт изменён —
что         : schema: «bb/milestone/0.1» → «bb/milestone/0.0»
отпечаток   : 530b1eab4b393796a266990b34ad3c8815989f0c6ba3f951cc66eaaf19f8db9b
АДРЕС       : bcrt1pwqptm5ryq6xvkm5k8eymw6xw9wu5k3y2pyrgksym4l3c8a5q042q2ssp0n
совпадает?  : нет — деньги заперты под конкретные байты

— другой арбитр C —
АДРЕС       : bcrt1p5gl2auqjcg7x7hhvzkpyvulav7qkrwdg2e8zdj9xmtfncsp3hhns3qpe8z
совпадает?  : нет
```

То же самое на уровне всей договорённости — в консайнменте подменено `двумя` →
`тремя` в тексте задачи, и независимый верификатор отверг файл (код возврата 2):

```
$ bb-verify deal deal-tampered.json
  [СБОЙ] отпечаток договорённости = e319577384dcbb4ceb7997ac5734f6e23833194a065a6e362bc352608728f611
  [СБОЙ] запись milestone 1 выводится из договорённости
  [СБОЙ] адрес эскроу = bcrt1pu9hpsh8t3cpuwz3dxyv853cm3wp0w3p20guy7s3j40lnfvzpma4st7ulsm
       в консайнменте заявлен bcrt1pyghfmz4aqqwe3yu50lvy5la3whhh72hprxl7ru74tfm603fv4m4qlrcfz5
       выход 0 = 5120222e9d8… (ожидали 5120e16e185c…)
ИТОГ: ОТКЛОНЕНО
```

Запись с изменённым байтом тоже отвергается — её отпечатка в эпохе просто нет:

```
$ bb-verify record mutated-record.json --bundle epoch-1.json
отпечаток  : 253924d3b376c456342bf9c7e3bb522bfbb113a674479cfc434db2ff0da84b15
  [СБОЙ] запись есть в бандле эпохи
       байты записи изменены — её отпечатка в эпохе нет
ИТОГ: ОТКЛОНЕНО
```

---

## Замеры vsize против расчёта Раунда 16

| Путь | Расчёт совета | Измерено | Разница | Почему |
|---|---|---|---|---|
| Эпоха (1 вход → 1 выход) | ≈ 111 vB | **111 vB** | 0 | — |
| release, key path (вход) | 57.5 vB | **57.5 vB** | 0 | — |
| refund, лист CLTV (вход) | 82.75 vB | **83.75 vB** | +1 vB | наш лист несёт настоящую высоту таймаута (3-байтовый push), расчёт брал голый `<pk> OP_CHECKSIG` |
| resolve, лист `B∧C` (вход) | 107.5 vB | **116 vB** | +8.5 vB | `A∧C` и `B∧C` стоят на глубине 2, а не 1: control block 97 байт вместо 65 |

Про +8 vB отдельно: это **сознательная плата за симметрию сторон**. При трёх
листьях один обязан оказаться на глубине 1. Мы отдали эту глубину таймауту, а
оба «арбитражных» листа поставили на глубину 2 — иначе у одной из сторон путь
через арбитра был бы дешевле, чем у другой. Восемь виртуальных байт за то,
чтобы band и builder были равны, — правильная цена.

Полный цикл сделки (fund + три траты) = 717 vB. При 1–4 sat/vB и BTC ≈ $78.6k
это **$0.56–2.25**, против расчётной оценки §14.2 в $0.29–1.15: разница — в том,
что расчёт считал один milestone, а мы профинансировали три (три выхода в fund
и три отдельные траты). На один milestone выходит ≈ 240 vB ≈ $0.19–0.75.

---

## Как это перепроверить

```bash
cd bb-bitcoin
cargo test                       # 31 тест, из них 5 замороженных тест-векторов
./target/debug/bb-verify tx <любой signet txid>
./target/debug/bb-verify deal <консайнмент>
./target/debug/bb-verify epoch <бандл>
```

`bb-verify` по умолчанию ходит только в `mempool.space/signet/api` и
`blockstream.info/signet/api`, требует согласия обоих и **отказывается**
обращаться к любому URL с доменом `build.band`. Замороженные формы отпечатка,
merkle-дерева, tweak и эскроу-адреса описаны в `bb-bitcoin/README.md` и
закреплены тестами в `crates/bb-core/tests/vectors.rs`.

## Статусы честно

| Заявление | Статус |
|---|---|
| Цепочка UTXO-эпох работает | **ПРОВЕРЕНО** (regtest, 3 эпохи) |
| Адрес эскроу = функция договорённости | **ПРОВЕРЕНО** (тест-векторы + regtest + signet-адреса) |
| release / resolve / refund | **ПРОВЕРЕНО** (regtest, консенсусный движок + бродкаст) |
| Верификатор без нашего узла | **ПРОВЕРЕНО** (regtest + живой signet через 2 обозревателя) |
| Денежный поток на signet | **НЕ ВЫПОЛНЕНО** — кран не выдал монеты |
| Лёгкий клиент BIP-157 (`--p2p`, Kyoto) | **NOT_TESTED** — флаг честно отказывается работать |
| Эпоха на mainnet | **НЕ ДЕЛАЛИ** — следующий шаг §14.8 |
| Арбитр по умолчанию нашим ключом | **ЗА ГЕЙТОМ** §14.7 (прецедент Peach, 01.09.2026) |
