Bitcoin Core – Wann wird fAllowWitness als wahr bewertet?

Wann wird in Bitcoin Core fAllowWitnesszu evaluiert true?

Transaktion.h

const bool fAllowWitness = !(s.GetVersion() & SERIALIZE_TRANSACTION_NO_WITNESS);

Insbesondere kann ich den Wert nicht herausfindens.GetVersion()

Danke dir

Antworten (1)

Wenn Sie beispielsweise ein grep on SERIALIZE_TRANSACTION_NO_WITNESSausführen, wird angezeigt, dass es mit OR verknüpft ist PROTOCOL_VERSION, wenn Sie ein CDataStreamObjekt 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 intVariable nSendFlagsdas No Witness-Flag enthalten kann. Später msgMaker.Makewird 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, CNetMsgMakerin netmessagemaker.hder 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.