分类
Uncategorized

是否有任何可行的testnet3比特币解决方案用于创建、签名、广播使用Golang的正常事务?

目前,我正在尝试创建,签署和广播比特币交易使用btcsuite。首先,我已经有了testnet3地址及其相关的测试私钥。但是,通过帖子和类似的文章below:-
在这里
在这里
在这里
上面提出的解决方案并不完整,对于第一个,它只覆盖到签名(我知道作者声称它不可广播,除非你提供utxo,如果我是对的话,我会这样做),但当试图广播失败的消息
验证事务时出错:事务be9b294695bfb201a5cff32af074a4bf72b073e3c9dad1969111165bf118a622孤立,缺少引用f0c0d3b3eecf911ede996a74ceadc9366068791450c9e6bacee9ae202f3690d1
我不知道发生了什么,我怀疑它的脚本是不兼容的。
所以,底线是我只想在比特币testnet3中有一个可行的例子,通过显示创建原始交易的过程,用私钥签名,显示“从1个地址将一些比特币转移到另一个地址,将其转换为十六进制格式的原始事务,并使用https://live.blockcypher.com/btc/pushtx/ (BTC测试网)
目前我的代码是follow:-
包装总管
导入(
“fmt”
“编码/十六进制”
“字节”
“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)字符串{
buf:=bytes.NewBuffer(make([]byte,0,tx.SerializeSize())
发送序列化(buf)
返回hex.EncodeToString(buf.Bytes())
}
函数stkbtc(){
pvkey:=“cnjxnxcfawzyfguxag94rkqaya2n7qwiokhckhbqsbrt7sbdygu”
txHash:=“e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987”
目的地:=“n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ”
var金额int64=100000000
txFee:=int64(500000)
//尝试发送btc
decodedwif,err:=btcutil.DecodeWIF(pvkey)
如果错误!=无{
fmt.Printf(“decodedwif错误:%v\n”,err)
}
fmt.Printf(“decodedwif:%v\n”,decodedwif)
addresspubkey,216;:=btcutil.NewAddressPubKey(decodedwif.PrivKey.PubKey().SerializeUncompressed(),&btcchain.TestNet3Params)
sourceTx:=wire.NewMsgTx(wire.TxVersion)
sourceUtxoHash,\ u1:=chainhash.NewHashFromStr(txHash)
sourceUtxo:=wire.NewOutPoint(sourceUtxoHash,0)
sourceTxIn:=wire.NewTxIn(sourceUtxo,nil,nil)
destinationAddress,216;:=btcutil.DecodeAddress(目标,&btcchain.TestNet3Params)
sourceAddress,err:=btcutil.DecodeAddress(addresspubkey.EncodeAddress(),&btcchain.TestNet3Params)
如果错误!=无{
fmt.Printf(“源地址错误:%v\n”,错误)
}
destinationPkScript,xscript:=txscript.paytoAddressScript(destinationAddress)
sourcePkScript,216;:=txscript.PayToAddrScript(源地址)
sourceTxOut:=wire.NewTxOut(amount,sourcePkScript)
sourceTx.AddTxIn(sourceTxIn)
sourceTx.AddTxOut(源txout)
sourceTxHash:=sourceTx.TxHash()
更新tx:=wire.NewMsgTx(wire.TxVersion)
prevOut:=wire.NewOutPoint(&sourceTxHash,0)
赎回txin:=wire.NewTxIn(prevOut,nil,nil)
兑换tx.AddTxIn(兑换txin)
兑换txout:=wire.NewTxOut((amount-txFee),destinationPkScript)
兑换tx.AddTxOut(兑换txout)
sigScript,err:=txscript.SignatureScript(0,sourceTx.TxOut[0].PkScript,txscript.SigHashAll,decodedwif.PrivKey,false)
如果错误!=无{
fmt.Printf(“sigScript错误:%v\n”,错误)
}
retex.TxIn[0].SignatureScript=sigScript
fmt.Printf(“sigScript:%v\n”,十六进制编码字符串(sigScript))
//验证签名
标志:=txscript.StandardVerifyFlags
vm,err:=txscript.NewEngine(sourceTx.TxOut[0].PkScript,retemedtx,0,flags,nil,nil,amount)
如果错误!=无{
fmt.Printf(“呃!=无:%v\n“,错误)
}
如果错误:=vm.Execute();呃!=无{
fmt.Printf(“vm.Execute>err!=无:%v\n“,错误)
}
fmt.Printf(“兑换tx:%v\n”,txToHex(兑换tx))
}
函数main(){
stkbtc()
}
txhash来自上一笔交易,我从faucet那里得到了testnet比特币&没有别的。。
发件人地址:mpYGA8wRCArpGTs6aJMmZRWyUuPoZmeLJv
发送方公钥:02217DEB8B378236FA8214DA94BD5A9338F2EEB3299C39C057FB68ADA63D93DF7
发送方私钥:cnjxnxcfawzyfguxag94rkqaya2n7qwiokhckhbqsbrt7sbdygu
目标地址:n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ
请告知上面的代码有什么问题,如果有人能指出,真的很感激。
客户
原始事务
发送事务

似乎找不到UTXO:blocktrail.com/tBTC/address/mpYGA8wRCArpGTs6aJMmZRWyUuPoZmeLJv/…–MCCCS 7月15日6:05
嗨,你能详细解释一下找不到什么吗?地址mpYGA8wRCArpGTs6aJMmZRWyUuPoZmeLJv由水龙头提供资金,因此未使用部分应如图所示。live.blockcypher.com/btc testnet/address/…。想详细说明一下吗用户1420716 2018年7月16日7:13
UTXO昨天不在,请再试一次MCCCS 2018年7月16日7:15
我试过了,还是一样。验证事务时仍返回错误:事务58521a5f97cbb02e4967132f872edbe7c60677da9ef4d018f4feeca0847ce2a2孤立,缺少引用f12111c6bc76aa6d8346ab20e7e767118b6fafc9cde14366b19d77937b09daaf用户1420716 2018年7月16日8:27
添加评论
2个答案
0
我想我发现了问题:代码生成了一个创建UTXO的假事务,并引用了它的TXID而不是真实事务的TXID。
新代码:
包装总管
导入(
“字节”
“编码/十六进制”
“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)字符串{
buf:=bytes.NewBuffer(make([]byte,0,tx.SerializeSize())
发送序列化(buf)
返回hex.EncodeToString(buf.Bytes())
}
函数stkbtc(){
pvkey:=“cnjxnxcfawzyfguxag94rkqaya2n7qwiokhckhbqsbrt7sbdygu”
txHash:=“e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987”
目的地:=“n2kRiAkW1xr5DVy7QKVGaYiZbwpS7j23jJ”
var金额int64=100000000
txFee:=int64(500000)
//尝试发送btc
decodedwif,err:=btcutil.DecodeWIF(pvkey)
如果错误!=无{
fmt.Printf(“decodedwif错误:%v\n”,err)
}
fmt.Printf(“decodedwif:%v\n”,decodedwif)
addresspubkey,216;:=btcutil.NewAddressPubKey(decodedwif.PrivKey.PubKey().SerializeUncompressed(),&btcchain.TestNet3Params)
sourceUtxoHash,\ u1:=chainhash.NewHashFromStr(txHash)
sourceUtxo:=wire.NewOutPoint(sourceUtxoHash,0)
sourceTxIn:=wire.NewTxIn(sourceUtxo,nil,nil)
destinationAddress,216;:=btcutil.DecodeAddress(目标,&btcchain.TestNet3Params)
sourceAddress,err:=btcutil.DecodeAddress(addresspubkey.EncodeAddress(),&btcchain.TestNet3Params)
如果错误!=无{
fmt.Printf(“源地址错误:%v\n”,错误)
}
destinationPkScript,xscript:=txscript.paytoAddressScript(destinationAddress)
sourcePkScript,216;:=txscript.PayToAddrScript(源地址)
sourceTxOut:=wire.NewTxOut(amount,sourcePkScript)
更新tx:=wire.NewMsgTx(wire.TxVersion)
更新tx.AddTxIn(sourceTxIn)
兑换txout:=wire.NewTxOut((amount-txFee),destinationPkScript)
兑换tx.AddTxOut(兑换txout)
sigScript,err:=txscript.SignatureScript(0,sourceTxOut.PkScript,txscript.SigHashAll,decodedwif.PrivKey,false)
如果错误!=无{
fmt.Printf(“sigScript错误:%v\n”,错误)
}
retex.TxIn[0].SignatureScript=sigScript
fmt.Printf(“sigScript:%v\n”,十六进制编码字符串(sigScript))
//验证签名
标志:=txscript.StandardVerifyFlags
vm,err:=txscript.NewEngine(sourceTxOut.PkScript,retemedtx,0,flags,nil,nil,amount)
如果错误!=无{
fmt.Printf(“呃!=无:%v\n“,错误)
}
如果错误:=vm.Execute();呃!=无{
fmt.Printf(“vm.Execute>err!=无:%v\n“,错误)
}
fmt.Printf(“兑换tx:%v\n”,txToHex(兑换tx))
}
函数main(){
stkbtc()
}
差异摘要:
(我还没有发布新交易)
分享
改进这个答案
跟随
7月16日9:05答复
监控化学品
904855金徽章2222银徽章5454铜徽章
1
我试过根据你提供的更新代码生成原始的tx,好的是控制台上没有验证错误,但是在广播到blockcypher btc testnet时,它仍然抛出错误“error validating transaction:error running script for input 0 referencing e028b5bf030a24986a03b03b89dec037e8462ae32bc93679cb49d7c779685987 at 0:script was NOT verified successfully..”改进是,它是另一个错误。。但现在要解决的信息要少得多;有什么建议吗?也许代码本身已经不正确了?正确的方法是什么?请告知-用户1420716 2018年7月16日9:49
添加评论
-1
嗨,我有编写golang代码与比特币交互的经验,如果你想建立交易并签署交易,这真的很棘手,我建议你使用比特币rpc来做。下面是一个可行的golang rpc包装器(也适用于testnet3和mainnet)https://github.com/huahuayu/go-bitcoind,我在我的项目中使用它,如果您有任何问题,请留言。
分享
改进这个答案
跟随

时光素材-香车美女  (1037)blockchainBTC比特币区块链www.qkl91.com

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注