Я слышал, что стандартный клиент отдает приоритет транзакциям для ретрансляции, основываясь на биткойн-днях уничтоженных и комиссии, уплаченной за транзакцию, но какая точная формула используется для определения того, какая транзакция имеет более высокий приоритет? То есть, как стандартный клиент определяет приоритет, какую транзакцию отправлять другим узлам в первую очередь?
Приоритет транзакции (сумма (возраст монеты в блоках * стоимость монеты в сатоши) по всем входам в транзакции), деленная на размер транзакции в байтах.
Вот случайный пример транзакции, скопированный с http://bitcoincharts.com/bitcoin/txlist/ :
Он имеет 2 входа (оба с тех пор были потрачены на другие (подтвержденные) транзакции, что делает эту транзакцию неподтвержденной):
Он имеет длину 439 байт и приоритет 432 232 688.
На момент написания последнего блока в блокчейне было 175262.
Я суммирую (возраст * значения) для каждой транзакции и делю на размер. Это + 1
связано с тем, что транзакции, подтвержденные в новейшем блоке, считаются имеющими возраст 1, а не 0:
>>> current_block = 175262
>>> ((current_block - 165774 + 1) * 0.1005e8 +
(current_block - 165777 + 1) * 0.0995e8) / 439
432232687.92710704
Как видите, приоритет транзакции будет повышаться по мере нахождения новых блоков.
Правила для клиента Bitcoin.org заключаются в том, чтобы сохранять первую транзакцию, в которой был потрачен биткойн-адрес, и отбрасывать ее, не ретранслируя любые другие, которые могут поступить.
Таким образом, приоритет основывается на хронологическом времени прибытия.
Ходили разговоры о вариантах , которые позволили бы замещающей транзакции с более высокой комиссией заменить более раннюю транзакцию, которая еще не была подтверждена.
И есть вектор атаки, описывающий, как можно изменить этот приоритет, чтобы облегчить двойные траты .
Стивен Горник
Двоичный маг
Стефан Хименес