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:-
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.
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.
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)
MCCCS
Benutzer1420716
MCCCS
Benutzer1420716