Wie kann festgestellt werden, ob sich die Transaktion ausbreiten wird?

Also erstelle ich eine Transaktion mit TransactionBuilder wie folgt:

var builder = new TransactionBuilder();
Transaction tx = builder
  .AddCoins(coins)
  .AddKeys(privateKeys)
  .Send(recipientAddress, Money.Coins(amount))
  .SetChange(changeAddress)
  .SendFees(Money.Coins(fee))
  .BuildTransaction(sign: true);

Boolean verified = builder.Verify(tx);

Und dann gebe ich es wie folgt an das Netzwerk weiter:

using (var node = Node.ConnectToLocal(network)) 
{
    node.VersionHandshake(); 

    node.SendMessage(new InvPayload(InventoryType.MSG_TX, tx.GetHash()));

    node.SendMessage(new TxPayload(tx));
    Thread.Sleep(500); 
}

Ich habe zwei Fragen:

  1. Was builder.Verify(tx)sagt uns das sogar? Es gibt einen booleschen Wert zurück, aber manchmal kann ich Transaktionen weitergeben, die zurückgegeben wurden false. Was bedeutet verifizieren/tun?

  2. Da Verify()uns nicht wirklich gesagt wird, ob eine Transaktion erfolgreich weitergegeben wird, wie kann ich feststellen, wann eine mit TransactionBuilder durchgeführte Transaktion an das Netzwerk weitergegeben wird oder nicht?

Antworten (1)

Verify()überprüft, ob die Transaktion ordnungsgemäß signiert ist.

Da Verify() uns nicht wirklich sagt, ob eine Transaktion erfolgreich weitergegeben wird

Es ist entweder falsch oder Sie haben einen Fehler gefunden.

node.SendMessage(new TxPayload(tx));sollte perfekt sein. Stratis baut jedoch derzeit unter der Leitung von Nicolas Dorier, dem Schöpfer von NBitcoin, einen Bitcoin .NET Fullnode , daher sollten Sie sicher sein, dass die von ihnen verwendete Methode auf dem neuesten Stand ist. In ihren Tests machen sie es etwas anders:

node.VersionHandshake();
node.SendMessageAsync(new InvPayload(transaction));
node.SendMessageAsync(new TxPayload(transaction));
node.PingPong();

Ich kann nicht erklären, warum zwei SendMessageAsyncund PingPongda sind. Vielleicht möchten Sie es herausfinden.

Um sicherzustellen, dass Sie einige andere Knoten fragen möchten, ob sie die Transaktion in ihrem Mempool haben, mit dem Sie verbunden sind, um die Weitergabe zu überprüfen. So was:

bool broadcasted = false;
foreach(var txid in node.GetMempool())
{
    if(txid.Equals(tx.GetHash()))
    {
        broadcasted = true;
    }
}  

Alternativ können Sie auch nur Ihren Knoten fragen. Ich vermute stark, dass die Transaktion nicht in Ihren (Bitcoin Core) Mempool gelangen würde, wenn etwas nicht stimmt, aber darauf sollten Sie sich nicht verlassen. Theorie entspricht nicht immer der Praxis.

Datenschutzbedenken: Wenn Sie eine Transaktion ohne Tor übertragen, können interessierte Parteien dies bemerken und zu Schlussfolgerungen kommen.

Ich konnte eine Transaktion an das Testnetz weitergeben, die nicht ordnungsgemäß verifiziert wurde. Wenn Sie es sehen möchten, hier ist der Hash: e98118de943d124e21d52dd6a05528eff18f199e3eea6ae149d97ce3f0158ae5
Ich kann an dieser Stelle nur spekulieren, aber vielleicht überprüft der Knoten, an den Sie "propagiert haben", nicht die Gültigkeit der Transaktion, aber als er sie weiter verbreiten wollte, haben andere Knoten sie abgelehnt?
Es sollte die Transaktion akzeptieren: Ich schicke es an mich selbst, also ist meiner der einzige Schlüssel, der benötigt wird. Außerdem sehe ich, dass die obige Transaktion durchlaufen wurde: Transaktion hier
Es wurde nicht an das Netzwerk weitergegeben, Block-Explorer finden es nicht. Das Senden an sich selbst geschieht genauso wie das Senden an alle anderen. Sie müssen die Transaktion durch das gesamte Netzwerk verbreiten und sie muss von jedem Full-Node gespeichert werden. Ich bin mir nicht sicher, was bei Ihnen vor Ort los ist.
@rossbot Anscheinend ändert sich beim Kopieren und Einfügen der Transaktions-ID aus Ihrem ersten Kommentar etwas Magisches. Von dem f015fügt es 2 ein, ??wenn ich es einfüge. (Win7, nicht sicher, ob das wichtig ist). Aus diesem Grund habe ich die Transaktionen auf den obigen Links nicht gesehen.
Zusammenfassend lässt sich sagen, dass Sie eine Transaktion propagiert haben, die NBitcoin nicht verifizieren konnte. Das ist seltsam.