Wann wird in Bitcoin Core fAllowWitness
zu evaluiert true
?
const bool fAllowWitness = !(s.GetVersion() & SERIALIZE_TRANSACTION_NO_WITNESS);
Insbesondere kann ich den Wert nicht herausfindens.GetVersion()
Danke dir
Wenn Sie beispielsweise ein grep on SERIALIZE_TRANSACTION_NO_WITNESS
ausführen, wird angezeigt, dass es mit OR verknüpft ist PROTOCOL_VERSION
, wenn Sie ein CDataStream
Objekt erstellen. Dies ist der erste Hinweis darauf, dass das No Witness-Flag zusammen mit dem Versionsprotokoll zu finden ist.
Ein wenig mehr Graben zeigt, dass diese Definition beim Erstellen einer Tx-Nachricht in den Zeilen 1105-1126 von net_processing.cpp (v0.15.0.1) verwendet wird :
else if (inv.type == MSG_TX || inv.type == MSG_WITNESS_TX)
{
// Send stream from relay memory
bool push = false;
auto mi = mapRelay.find(inv.hash);
int nSendFlags = (inv.type == MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0);
if (mi != mapRelay.end()) {
connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *mi->second));
push = true;
} else if (pfrom->timeLastMempoolReq) {
auto txinfo = mempool.info(inv.hash);
// To protect privacy, do not answer getdata using the mempool when
// that TX couldn't have been INVed in reply to a MEMPOOL request.
if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) {
connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *txinfo.tx));
push = true;
}
}
if (!push) {
vNotFound.push_back(inv);
}
}
Der obige Code zeigt, dass die int
Variable nSendFlags
das No Witness-Flag enthalten kann. Später msgMaker.Make
wird diese Variable verwendet, um die Tx-Nachricht zu erstellen, wie in Zeile 1119 gezeigt :
connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *txinfo.tx));
Sie können dann die Serialisierung verfolgen, indem Sie sich die Klasse ansehen, CNetMsgMaker
in netmessagemaker.h
der sie selbst verwendet wird CVectorWriter
, um die Daten zu serialisieren.
Zusammenfassend lässt sich sagen, dass der GetVersion()
Wert mithilfe der Protokollversion erstellt wird, die optional mit dem SERIALIZE_TRANSACTION_NO_WITNESS
. Dieser Wert wird niemals über die Leitung gesendet. Es wird nur verwendet, um die Serialisierung der Tx-Nachricht zu steuern.