Биткойн-вики говорит:
Все остальные выходные данные txCopy, кроме вывода, совпадающего с текущим входным индексом, устанавливаются на пустой сценарий и значение (длинное) -1.
https://en.bitcoin.it/wiki/OP_CHECKSIG#Hashtype_SIGHASH_SINGLE
Трудно найти, что это означает в клиенте C++. Означает ли это, что выходные данные, кроме вывода с тем же индексом, что и ввод, для которого подписывается, имеют только 8 байтов для значения, или это означает, что у них также есть еще один байт для VarInt, установленный на ноль; всего 9 байт?
Спасибо.
Выходы транзакций имеют поле «значение», которое представляет собой 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.
дторп