Broadcast-Rohtransaktion ohne Eingabevalidierung

Welches Tool/welche Software kann ich verwenden, um eine Rohtransaktion zu übertragen, die eine Transaktion nicht wegen ungültiger oder doppelter Ausgaben zurückweisen würde?

Bitcoind mit RPC verfügt über einen Validierungsschritt, der jede Rohtransaktion ablehnt, bei der die Eingaben nicht bekannt sind oder wenn die Eingaben doppelt ausgegeben werden.

Außerdem möchte ich mich nicht auf einen Drittanbieterdienst wie blockchain.info verlassen.

AFAIK Es existiert nicht. Habe selbst auch danach gesucht. Sie müssen Ihr eigenes Tool entwickeln.
Am einfachsten scheint es zu sein, den Validierungscode in Bitcoin auszukommentieren und neu zu kompilieren.
Welches Tool würde dies tun? Kein Tool, denn wenn es möglich wäre, was es nicht ist, könnten Sie Bitcoin knacken.
Gott sei Dank brechen Doppelausgabeversuche Bitcoin nicht, das würde es ziemlich nutzlos machen.
Und ja, es ist durchaus möglich, es passiert einige hundert Mal am Tag: blockchain.info/double-spends .

Antworten (2)

Es stellt sich heraus, dass es viele Möglichkeiten gibt, dies zu tun:

Es gibt absolut keinen Grund zu versuchen, eine ungültige Transaktion zu übertragen. Es verschwendet Ihre Zeit und Ihren Verkehr. Ihre Kollegen werden es überprüfen und wegwerfen. Sie werden es nicht an das Netzwerk weiterleiten. Sie können Ihre IP-Adresse auch für einige Zeit (1 Tag?)

Vielleicht möchten Sie eine gültige, aber nicht standardmäßige Transaktion senden? Oder möchten Sie vielleicht ein benutzerdefiniertes Tool haben, das Transaktionen an ein Netzwerk sendet?

    // [...]
    void NetSocket::pushTx ( const QByteArray& data )
    {
      const MyKey32 key ( data.constData ( ), data.size ( ) );  // calculate txid
      outTx.insert ( key, data );                               // store data
      write ( "inv", invPacket ( MSG_TX, key ) );               // send inv packet
    }
    //--------------------------------------------------------------
    void NetSocket::write ( const char* type, const QByteArray& data )
    {
      socket -> write ( packet ( type, data ) );
    }
    //--------------------------------------------------------------
    void NetSocket::procGetdataPacket ( const QByteArray& data )
    {
      Stream d ( data ); d.skip24 ( );               // i do not check header now
      const int count ( d.readVar ( ) );
      xassert ( count == 1 );
      const quint8* ss = d.readAdvance ( 36 );
      const quint32 tag ( *(quint32*)ss );
      const MyKey32 key ( ss + 4 );
      xassert ( tag == MSG_TX );
      xassert ( outTx.contains ( key ) );
      write ( "tx", txPacket ( outTx.value ( key ) ) );
    }
    // [...]
Ich denke, es könnte sehr gut sein, dass die verschiedenen Bitcoin-Implementierungen leicht unterschiedliche Vorstellungen davon haben, wann eine Transaktion akzeptiert werden soll oder nicht. Die einzige Möglichkeit, dies herauszufinden, besteht darin, eine Transaktion ungefiltert an viele verschiedene Knoten senden zu können.
Natürlich gibt es einen sehr guten Grund. Möglicherweise geben Sie unbestätigte Ausgaben aus, von denen Ihr Client nichts weiß, die aber immer noch im Netzwerk vorhanden sind.