Kann mich bitte jemand zu den Quellcode-Abschnitten verweisen, die für einen unaufgeforderten Block-Push relevant sind, wie im Bitcoin-Entwicklerhandbuch beschrieben ?
Ich habe den Begriff MSG_BLOCKmain.cpp
durchgesehen und gesucht , der als Beagle dient, um die richtige Stelle im Code zu finden. Aber beim Weiterlesen kommt es mir so vor, als ob ein frisch geschürfter Block nicht an eine Inventory-Nachricht angehängt wird, mit MSG_BLOCK , um ihn als „Paket“ als Antwort auf eine Anfrage (GetData Response) zu versenden, ABER als einzelne Nachricht dieser Struktur gesendet:
Für mich scheint der beste Kandidat für Unsolicited Block Push bis jetzt main.cpp#L2393 zu sein, main.cpp
aber ich bin verwirrt, da ich nicht weiß, ob es mehr von möglicherweise relevantem Code gibt (wie main.cpp#L3830 ) für unaufgefordertes Block-Push- in /src/
.
Also: In einem ersten Schritt suche ich nach Code, der für das Broadcasten eines neu gefundenen Blocks relevant ist. Kann jemand bitte helfen?
Wir können alle Fälle im Code finden, in denen der Client eine block
Nachricht sendet, indem wir nach suchen PushMessage("block"
. Dies ist die einzige Übereinstimmung:
void static ProcessGetData(CNode* pfrom)
{
[...]
pfrom->PushMessage("block", block);
Das bedeutet, dass der Standard-Client immer nur dann eine Sperrnachricht sendet, wenn er ausdrücklich danach gefragt wird. Diese eingehende getdata
Nachricht wird wahrscheinlich ihrerseits dadurch ausgelöst, dass dem entfernten Knoten eine inv
Nachricht gesendet wird. (Obwohl das nicht notwendig ist – Sie können nach einem Block fragen, den der andere Knoten nicht angekündigt hat.) Dies ist der Code, der Bestandsmeldungen sendet:
//
// Message: inventory
//
vector<CInv> vInv;
vector<CInv> vInvWait;
{
LOCK(pto->cs_inventory);
vInv.reserve(pto->vInventoryToSend.size());
vInvWait.reserve(pto->vInventoryToSend.size());
BOOST_FOREACH(const CInv& inv, pto->vInventoryToSend)
{
// If the other node already knows the message, don't send
if (pto->setInventoryKnown.count(inv))
continue;
// trickle out tx inv to protect privacy
[...]
// returns true if remote node hasn't seen it
if (pto->setInventoryKnown.insert(inv).second)
{
// Add to the list of inventory messages to send
vInv.push_back(inv);
// If there's 1000 inventory messages queued up, send them
// (Protocol limit is 50000 at a time.)
if (vInv.size() >= 1000)
{
pto->PushMessage("inv", vInv);
vInv.clear();
}
}
}
pto->vInventoryToSend = vInvWait;
}
// Send any that are left over.
if (!vInv.empty())
pto->PushMessage("inv", vInv);
(pto steht für den Remote-Knoten im obigen Code.)
Die Seite, die Sie sich ansehen, beschreibt also ein Verhalten, das Sie implementieren könnten und das andere Clients akzeptieren werden, aber es beschreibt nicht das aktuelle Kernverhalten des Clients.
David A. Harding
Nick Odell
Aliakbar Ahmadi
Nick Odell
Aliakbar Ahmadi
Nick Odell