Каков алгоритм выбора монет?

При создании транзакции в стандартном клиенте, какой алгоритм используется для определения того, какие неизрасходованные выходы будут использоваться в качестве входных данных?

Сменилось ли это с первой версии? Какие альтернативные алгоритмы используются альтернативными клиентами?

Выполняет ли клиент какие-либо попытки оптимизировать, какие «монеты» используются на основе минимизации размера транзакции, результирующей фрагментации или «возраста» монет (значение /транзакции), используемых в качестве источника?

36 голосов | спросил Andrew Jones 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 10:33:03 +0400 2011, 10:33:03

2 ответа


21

Да, это именно то, что делает клиент. Он использует эвристику для этого, решая проблему подмножества /суммы или рюкзака.

Он использует многопроходный подход, сначала пытаясь использовать только монеты с не менее чем шестью подтверждениями. В следующие два прохода он расслабляет эти требования. В течение каждого прохода он пытается минимизировать количество заявленных транзакционных выходов, а затем возвращается количество изменений.

Обратите внимание, что все монеты в вашем кошельке считаются. В модели учета, используемой клиентом Bitcoin, определенные монеты не относятся к определенным учетным записям.

Если вы хотите сами проверить код, выполните поиск SelectCoins в wallet.cpp.

ответил David Schwartz 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 12:06:14 +0400 2011, 12:06:14
19

Я не смог найти результаты выбора монет, выписанные в любом месте, и только что закончил сбор данных из кода. Он работает как Дэвид, упомянутый , но вот более подробная информация.

алгоритм выбора монет для переноса Целевая сумма

  1. Если какой-либо из UTXO ² совпадает с Target¹, он будет использоваться.
  2. Если «сумма всего вашего UTXO меньше целевого» будет соответствовать цели, они будут использоваться. (Это будет случай, если вы развернете полный кошелек.)
  3. Если «сумма всего вашего UTXO меньше целевого» не превзойдет цель, будет использоваться наименьший UTXO, превышающий ваш Target.
  4. Elte Bitcoin Core выполняет 1000 раундов случайного объединения неразмещенных транзакционных выходов до тех пор, пока их сумма не будет больше или равна цели. Если это происходит, чтобы найти точное соответствие, оно останавливается раньше и использует это.
    В противном случае он, наконец, опустится на минимум

    • самый маленький UTXO больше, чем Target
    • наименьшая комбинация UTXO, обнаруженная на шаге 4.

Как упоминал Дэвид, проблема подмножества сначала ограничивает UTXO, которые имеют по крайней мере одно подтверждение, если отправлено самим, или шесть подтверждений, если они получены из другого кошелька, а затем смягчают эти требования в двух последующих проходах, если нет подходящего набора UTXO может быть обнаружен.


Некоторые примеры

У Алисы четыре UTXO:
â UTXO_A 0.1BTC
¢ UTXO_B 0.3BTC
¢ UTXO_C 0.5BTC
¢ UTXO_D 1BTC

Я буду игнорировать транзакционные сборы ради простоты.

Пример 1:

Алиса хочет отправить 0.3BTC .
Bitcoin Core обнаруживает, что UTXO_B соответствует Target, и он использует только UTXO_B.

Пример 2:

Алиса хочет отправить 0.4BTC .
Bitcoin Core обнаруживает, что UTXO_C является наименьшим UTXO больше, чем Target, и что сумма всего UTXO меньше целевой (т. е. UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4) соответствует цели здесь. В качестве входов используются как UTXO_A, так и UTXO_B.

Пример 3:

Алиса хочет отправить 0.45BTC .
Bitcoin Core обнаруживает, что UTXO_C является наименьшим UTXO больше, чем Target, и что сумма всего UTXO меньше целевой (т. е. UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4) не превзойдет цель. UTXO_C используется как единственный вход, являющийся следующим наименьшим входом, большим, чем Target.

Пример 4:

Алиса хочет отправить 0.35BTC .
Bitcoin Core обнаруживает, что UTXO_C является наименьшим UTXO больше, чем Target, и что сумма всего UTXO меньше целевой (т. е. UTXO_A + UTXO_B = 0.1 + 0.3 = 0.4) не соответствует цели. Он складывает случайным образом выбранный UTXO 1000 раз, пока они не превзойдут цель, вспомнив наименьшую достаточную комбинацию. Наименьшая достаточная комбинация затем сравнивается с наименьшим одним входом, большим, чем цель. Предполагая, что он найдет здесь наилучшую комбинацию, которая будет UTXO_A + UTXO_B, он обнаруживает, что Target < UTXO_A + UTXO_B < UTXO_C и использует UTXO_A и UTXO_B как входы.

Пример 5:

Алиса хочет отправить 0.6BTC .
Bitcoin Core обнаруживает, что UTXO_D является наименьшим UTXO больше, чем Target, и что сумма всего UTXO меньше целевой (т. е. UTXO_A + UTXO_B + UTXO_C = 0.1 + 0.3 + 0.5 = 0.9) не соответствует цели. Он запускает случайные комбинации, как и раньше, и в этой ситуации, вероятно, обнаружит, что UTXO_A + UTXO_C = Target. Поскольку он находит комбинацию, которая соответствует цели, она ломается и немедленно идет с этой комбинацией. UTXO_A и UTXO_C используются как входы.


¹ «Целевая» используется здесь для суммы, которую нужно потратить.
² UTXO = Неизвлеченный вывод транзакции

ответил Murch 10 AM00000050000005531 2014, 05:23:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132