我参考本文https://www.thepolyglotdeveloper.com/2018/03/create-sign-bitcoin-transactions-golang在主网和测试网中创建了原始比特币交易。但是此脚本似乎不兼容。
package main
import (
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"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"
)
type Transaction struct {
TxId string `json:"txid"`
SourceAddress string `json:"source_address"`
DestinationAddress string `json:"destination_address"`
Amount int64 `json:"amount"`
UnsignedTx string `json:"unsignedtx"`
SignedTx string `json:"signedtx"`
}
func CreateTransaction(secret string, destination string, amount int64, txHash string) (Transaction, error) {
var transaction Transaction
wif, err := btcutil.DecodeWIF(secret)
if err != nil {
return Transaction{}, err
}
addresspubkey, _ := btcutil.NewAddressPubKey(wif.PrivKey.PubKey().SerializeUncompressed(), &chaincfg.MainNetParams)
sourceTx := wire.NewMsgTx(wire.TxVersion)
sourceUtxoHash, _ := chainhash.NewHashFromStr(txHash)
sourceUtxo := wire.NewOutPoint(sourceUtxoHash, 0)
sourceTxIn := wire.NewTxIn(sourceUtxo, nil, nil)
destinationAddress, err := btcutil.DecodeAddress(destination, &chaincfg.MainNetParams)
sourceAddress, err := btcutil.DecodeAddress(addresspubkey.EncodeAddress(), &chaincfg.MainNetParams)
if err != nil {
return Transaction{}, 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, destinationPkScript)
redeemTx.AddTxOut(redeemTxOut)
sigScript, err := txscript.SignatureScript(redeemTx, 0, sourceTx.TxOut[0].PkScript, txscript.SigHashAll, wif.PrivKey, false)
if err != nil {
return Transaction{}, err
}
redeemTx.TxIn[0].SignatureScript = sigScript
flags := txscript.StandardVerifyFlags
vm, err := txscript.NewEngine(sourceTx.TxOut[0].PkScript, redeemTx, 0, flags, nil, nil, amount)
if err != nil {
return Transaction{}, err
}
if err := vm.Execute(); err != nil {
return Transaction{}, err
}
var unsignedTx bytes.Buffer
var signedTx bytes.Buffer
sourceTx.Serialize(&unsignedTx)
redeemTx.Serialize(&signedTx)
transaction.TxId = sourceTxHash.String()
transaction.UnsignedTx = hex.EncodeToString(unsignedTx.Bytes())
transaction.Amount = amount
transaction.SignedTx = hex.EncodeToString(signedTx.Bytes())
transaction.SourceAddress = sourceAddress.EncodeAddress()
transaction.DestinationAddress = destinationAddress.EncodeAddress()
return transaction, nil
}
广播时出现此错误。 “验证交易时出错:交易65bf440e95ccf1fb5c046f3354b8bdd9277f137c4870f91fbc9eac603f7a2151是孤立的,缺少引用85563b9696cedf1525cea8dfaf66547db3421ebe57fe9bd4f239e49a6f818619。 “
我也提到了这篇帖子https://bitcoin.stackexchange.com/questions/77145/is-the-any-workable-testnet3-bitcoin-solution-for-creating-signing-broadcast-a,但遇到了另一个错误“脚本未成功验证”。有人可以更正此代码或提供任何其他参考吗?