Ist die praktikable Testnet3-Bitcoin-Lösung zum Erstellen, Signieren und Übertragen einer normalen Transaktion mit Golang?

Derzeit versuche ich, Bitcoin-Transaktionen mit btcsuite zu erstellen, zu signieren und zu übertragen. Für den Anfang hatte ich bereits die testnet3-Adresse und den zugehörigen privaten Schlüssel zum Testen. Jagen Sie jedoch durch die Post und Artikel wie unten:-

  1. Hier
  2. Hier
  3. Hier

Die oben vorgeschlagene Lösung ist nicht vollständig, für die erste deckt sie nur bis zur Unterzeichnung ab (ich wusste, dass der Autor behauptete, dass sie nicht ausgestrahlt werden kann, es sei denn, Sie geben das Utxo an, was ich getan habe, wenn ich Recht habe), aber als versucht wurde, eine Nachricht zu senden, schlug sie fehl

"Fehler beim Validieren der Transaktion: Transaktion be9b294695bfb201a5cff32af074a4bf72b073e3c9dad1969111165bf118a622 verwaist, Referenz f0c0d3b3eecf911ede996a74ceadc9366068791450c9e6bacee9ae9202f3 fehlt."

Ich habe keine Ahnung, was los ist, und ich vermute, dass sein Skript inkompatibel ist.

Unter dem Strich möchte ich also nur ein praktikables Beispiel in Bitcoin Testnet3, das zeigt, dass "von 1 Adresse etwas Bitcoin an eine andere Adresse übertragen wird", indem der Prozess zum Erstellen einer Rohtransaktion gezeigt, mit einem privaten Schlüssel signiert und in eine Rohtransaktion in Hex umgewandelt wird Formatieren und übertragen Sie es mit etwas wie https://live.blockcypher.com/btc/pushtx/ (BTC testnet)

Derzeit ist mein Code wie folgt: -

package main
import (
    "fmt"
    "encoding/hex"
    "bytes"
    "github.com/btcsuite/btcutil"
    btcchain "github.com/btcsuite/btcd/chaincfg"
    "github.com/btcsuite/btcd/chaincfg/chainhash"
    "github.com/btcsuite/btcd/txscript"
    "github.com/btcsuite/btcd/wire"
)
func txToHex(tx *wire.MsgTx) string {
    buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))
    tx.Serialize(buf)
    return hex.EncodeToString(buf.Bytes())
}

func stkbtc(){
  pvkey := "cNjXNxcfawzyfGUxaG94rKqayAL2n7QWioKhCkHbQsBRT7SbDyGu"
  txHash := "e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987"
  destination := "n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ"
  var amount int64 = 100000000
  txFee := int64(500000)

  //try send btc
  decodedwif,err := btcutil.DecodeWIF(pvkey)
  if err != nil {
    fmt.Printf("decodedwif error: %v\n",err)
  }
  fmt.Printf("decodedwif       : %v\n",decodedwif)

  addresspubkey, _ := btcutil.NewAddressPubKey(decodedwif.PrivKey.PubKey().SerializeUncompressed(), &btcchain.TestNet3Params)
  sourceTx := wire.NewMsgTx(wire.TxVersion)
  sourceUtxoHash, _ := chainhash.NewHashFromStr(txHash)

  sourceUtxo := wire.NewOutPoint(sourceUtxoHash, 0)

  sourceTxIn := wire.NewTxIn(sourceUtxo, nil, nil)
  destinationAddress, _ := btcutil.DecodeAddress(destination, &btcchain.TestNet3Params)

  sourceAddress, err := btcutil.DecodeAddress(addresspubkey.EncodeAddress(), &btcchain.TestNet3Params)
  if err != nil {
    fmt.Printf("sourceAddress err: %v\n",err)
  }

  destinationPkScript, _ := txscript.PayToAddrScript(destinationAddress)

  sourcePkScript, _ := txscript.PayToAddrScript(sourceAddress)
  sourceTxOut := wire.NewTxOut(amount, sourcePkScript)

  sourceTx.AddTxIn(sourceTxIn)
  sourceTx.AddTxOut(sourceTxOut)
  sourceTxHash := sourceTx.TxHash()

  redeemTx := wire.NewMsgTx(wire.TxVersion)
  prevOut := wire.NewOutPoint(&sourceTxHash, 0)
  redeemTxIn := wire.NewTxIn(prevOut, nil, nil)
  redeemTx.AddTxIn(redeemTxIn)
  redeemTxOut := wire.NewTxOut((amount - txFee), destinationPkScript)
  redeemTx.AddTxOut(redeemTxOut)

  sigScript, err := txscript.SignatureScript(redeemTx, 0, sourceTx.TxOut[0].PkScript, txscript.SigHashAll, decodedwif.PrivKey, false)
  if err != nil {
    fmt.Printf("sigScript err: %v\n",err)
  }
  redeemTx.TxIn[0].SignatureScript = sigScript
  fmt.Printf("sigScript: %v\n",hex.EncodeToString(sigScript))


  //Validate signature
  flags := txscript.StandardVerifyFlags
  vm, err := txscript.NewEngine(sourceTx.TxOut[0].PkScript, redeemTx, 0, flags, nil, nil, amount)
  if err != nil {
    fmt.Printf("err != nil: %v\n",err)
  }
  if err := vm.Execute(); err != nil {
    fmt.Printf("vm.Execute > err != nil: %v\n",err)
  }

  fmt.Printf("redeemTx: %v\n",txToHex(redeemTx))
}

func main(){
    stkbtc()
}

Der Txhash stammt von einer früheren Transaktion, bei der ich das Testnet-Bitcoin von Faucet und sonst nichts bekommen habe.

  • Absenderadresse: mpYGA8wRCArpGTs6aJMmZRWyUuPoZmeLJv
  • Öffentlicher Schlüssel des Absenders: 02217deb8b3782236fa8214da94bd5a9338f2eeb3299c39c057fb68ada63d93df7
  • Privater Schlüssel des Senders: cNjXNxcfawzyfGUxaG94rKqayAL2n7QWioKhCkHbQsBRT7SbDyGu

  • Zieladresse: n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ

Bitte geben Sie an, was mit dem obigen Code nicht stimmt, schätzen Sie es wirklich, wenn jemand darauf hinweisen kann.

Es scheint, dass der UTXO nicht gefunden werden konnte: blocktrail.com/tBTC/address/mpYGA8wRCArpGTs6aJMmZRWyUuPoZmeLJv/…
Hallo, können Sie im Detail erklären, was nicht gefunden werden konnte? Die Adresse mpYGA8wRCArpGTs6aJMmZRWyUupoZmeLJv wurde von faucet finanziert, daher sollten die nicht ausgegebenen Daten wie gezeigt vorhanden sein. live.blockcypher.com/btc-testnet/address/… . möchten Sie näher darauf eingehen?
Der UTXO war gestern nicht da, also versuchen Sie es bitte noch einmal.
Ich habe es versucht, es ist immer noch das gleiche. es gibt immer noch Fehler beim Validieren der Transaktion zurück: Transaktion 58521a5f97cbb02e4967132f872edbe7c60677da9ef4d018f4feeca0847ce2a2 verwaist, fehlende Referenz f12111c6bc76aa6d8346ab20e7e767118b6fafc9cde14366b19d97937.

Antworten (1)

Ich glaube, ich habe das Problem gefunden: Der Code generierte eine gefälschte Transaktion, die den UTXO erstellte, und verwies auf seine TXID anstelle der TXID der echten Transaktion.

Der neue Code:

package main

import (
    "bytes"
    "encoding/hex"
    "fmt"
    btcchain "github.com/btcsuite/btcd/chaincfg"
    "github.com/btcsuite/btcd/chaincfg/chainhash"
    "github.com/btcsuite/btcd/txscript"
    "github.com/btcsuite/btcd/wire"
    "github.com/btcsuite/btcutil"
)

func txToHex(tx *wire.MsgTx) string {
    buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize()))
    tx.Serialize(buf)
    return hex.EncodeToString(buf.Bytes())
}

func stkbtc() {
    pvkey := "cNjXNxcfawzyfGUxaG94rKqayAL2n7QWioKhCkHbQsBRT7SbDyGu"
    txHash := "e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987"
    destination := "n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ"
    var amount int64 = 100000000
    txFee := int64(500000)

    //try send btc
    decodedwif, err := btcutil.DecodeWIF(pvkey)
    if err != nil {
        fmt.Printf("decodedwif error: %v\n", err)
    }
    fmt.Printf("decodedwif       : %v\n", decodedwif)

    addresspubkey, _ := btcutil.NewAddressPubKey(decodedwif.PrivKey.PubKey().SerializeUncompressed(), &btcchain.TestNet3Params)
    sourceUtxoHash, _ := chainhash.NewHashFromStr(txHash)

    sourceUtxo := wire.NewOutPoint(sourceUtxoHash, 0)

    sourceTxIn := wire.NewTxIn(sourceUtxo, nil, nil)
    destinationAddress, _ := btcutil.DecodeAddress(destination, &btcchain.TestNet3Params)

    sourceAddress, err := btcutil.DecodeAddress(addresspubkey.EncodeAddress(), &btcchain.TestNet3Params)
    if err != nil {
        fmt.Printf("sourceAddress err: %v\n", err)
    }

    destinationPkScript, _ := txscript.PayToAddrScript(destinationAddress)

    sourcePkScript, _ := txscript.PayToAddrScript(sourceAddress)
    sourceTxOut := wire.NewTxOut(amount, sourcePkScript)

    redeemTx := wire.NewMsgTx(wire.TxVersion)
    redeemTx.AddTxIn(sourceTxIn)
    redeemTxOut := wire.NewTxOut((amount - txFee), destinationPkScript)
    redeemTx.AddTxOut(redeemTxOut)

    sigScript, err := txscript.SignatureScript(redeemTx, 0, sourceTxOut.PkScript, txscript.SigHashAll, decodedwif.PrivKey, false)
    if err != nil {
        fmt.Printf("sigScript err: %v\n", err)
    }
    redeemTx.TxIn[0].SignatureScript = sigScript
    fmt.Printf("sigScript: %v\n", hex.EncodeToString(sigScript))

    //Validate signature
    flags := txscript.StandardVerifyFlags
    vm, err := txscript.NewEngine(sourceTxOut.PkScript, redeemTx, 0, flags, nil, nil, amount)
    if err != nil {
        fmt.Printf("err != nil: %v\n", err)
    }
    if err := vm.Execute(); err != nil {
        fmt.Printf("vm.Execute > err != nil: %v\n", err)
    }

    fmt.Printf("redeemTx: %v\n", txToHex(redeemTx))
}

func main() {
    stkbtc()
}

Zusammenfassung der Unterschiede:

(Ich habe die neue Transaktion nicht veröffentlicht)

Ich habe versucht, den rohen TX basierend auf dem aktualisierten Code zu generieren, den Sie präsentiert haben. Gut, dass es keinen Validierungsfehler auf der Konsole gibt, aber bei der Übertragung an blockcypher btc testnet wird immer noch der Fehler „Fehler beim Validieren der Transaktion: Fehler beim Ausführen des Skripts für die Referenzierung von Eingabe 0“ ausgegeben e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987 bei 0: Skript wurde NICHT erfolgreich verifiziert. irgendwelche Vorschläge? vielleicht ist der Code selbst schon falsch? was wäre der richtige Weg, es zu tun? bitte beraten