广播比特币原始交易时出错

时间:2019-06-28 06:08:13

标签: transactions bitcoin

我参考本文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,但遇到了另一个错误“脚本未成功验证”。有人可以更正此代码或提供任何其他参考吗?

0 个答案:

没有答案