Для SIGHASH_SINGLE выходы, отличные от входного индекса, имеют 8 байтов или 9 байтов, включая VarInt?

Биткойн-вики говорит:

Все остальные выходные данные txCopy, кроме вывода, совпадающего с текущим входным индексом, устанавливаются на пустой сценарий и значение (длинное) -1.

https://en.bitcoin.it/wiki/OP_CHECKSIG#Hashtype_SIGHASH_SINGLE

Трудно найти, что это означает в клиенте C++. Означает ли это, что выходные данные, кроме вывода с тем же индексом, что и ввод, для которого подписывается, имеют только 8 байтов для значения, или это означает, что у них также есть еще один байт для VarInt, установленный на ноль; всего 9 байт?

Спасибо.

Ответы (1)

Выходы транзакций имеют поле «значение», которое представляет собой 8-байтовое целое число со знаком (всегда 8 байтов), указывающее, сколько сатоши (0,00000001 BTC каждый) доступно для этого вывода. Это то, что устанавливается в -1 на других выходах в режиме SIGHASH_SINGLE.

Это похоже на код, ответственный за это, из script.cpp:

/** Serialize an output of txTo */
template<typename S>
void SerializeOutput(S &s, unsigned int nOutput, int nType, int nVersion) const {
    if (fHashSingle && nOutput != nIn)
        // Do not lock-in the txout payee at other indices as txin
        ::Serialize(s, CTxOut(), nType, nVersion);
    else
        ::Serialize(s, txTo.vout[nOutput], nType, nVersion);
}

Если мы находимся в режиме SIGHASH_SINGLE и индекс вывода отличается от индекса ввода, то то, что мы подписываем в этом месте, является просто фиктивным объектом CTxOut, чей конструктор без параметров (в core.h) вызывает SetNull (), который устанавливает для поля с именем «nValue» значение -1 (-0,00000001 BTC) и очищает scriptPubKey, что гарантирует, что это 0-байтовый вектор.

Когда CTxOut сериализуется, он записывает nValue и scriptPubKey для этого (снова core.h):

IMPLEMENT_SERIALIZE
(
    READWRITE(nValue);
    READWRITE(scriptPubKey);
)

nValue сериализуется как 8-байтовое представление с дополнением до двух для -1 или 0xFFFFFFFFFFFFFFFF. scriptPubKey сериализуется как 1-байтовый CompactSize, что указывает на то, что скрипт имеет длину 0 байт или 0x0.

Итак, короткий ответ: 9 байт. ;>