本文整理汇总了Golang中github.com/piotrnar/gocoin/lib/btc.Tx类的典型用法代码示例。如果您正苦于以下问题:Golang Tx类的具体用法?Golang Tx怎么用?Golang Tx使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Tx类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: apply_to_balance
// apply the chnages to the balance folder
func apply_to_balance(tx *btc.Tx) {
f, _ := os.Create("balance/unspent.txt")
if f != nil {
// append new outputs at the end of unspentOuts
ioutil.WriteFile("balance/"+tx.Hash.String()+".tx", tx.Serialize(), 0600)
fmt.Println("Adding", len(tx.TxOut), "new output(s) to the balance/ folder...")
for out := range tx.TxOut {
if k := pkscr_to_key(tx.TxOut[out].Pk_script); k != nil {
uns := new(unspRec)
uns.key = k
uns.TxPrevOut.Hash = tx.Hash.Hash
uns.TxPrevOut.Vout = uint32(out)
uns.label = fmt.Sprint("# ", btc.UintToBtc(tx.TxOut[out].Value), " BTC @ ", k.BtcAddr.String())
//stealth bool TODO: maybe we can fix it...
unspentOuts = append(unspentOuts, uns)
}
}
for j := range unspentOuts {
if !unspentOuts[j].spent {
fmt.Fprintln(f, unspentOuts[j].String())
}
}
f.Close()
} else {
println("ERROR: Cannot create balance/unspent.txt")
}
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:30,代码来源:unspent.go
示例2: write_tx_file
func write_tx_file(tx *btc.Tx) {
signedrawtx := tx.Serialize()
tx.Hash = btc.NewSha2Hash(signedrawtx)
hs := tx.Hash.String()
fmt.Println("TxID", hs)
f, _ := os.Create(hs[:8] + ".txt")
if f != nil {
f.Write([]byte(hex.EncodeToString(signedrawtx)))
f.Close()
fmt.Println("Transaction data stored in", hs[:8]+".txt")
}
}
开发者ID:vancsj,项目名称:gocoin,代码行数:14,代码来源:signtx.go
示例3: consensus_verify_script
func consensus_verify_script(pkScr []byte, i int, tx *btc.Tx, ver_flags uint32) bool {
txTo := tx.Serialize()
var pkscr_ptr, pkscr_len uintptr // default to 0/null
if pkScr != nil {
pkscr_ptr = uintptr(unsafe.Pointer(&pkScr[0]))
pkscr_len = uintptr(len(pkScr))
}
r1, _, _ := syscall.Syscall9(bitcoinconsensus_verify_script.Addr(), 7,
pkscr_ptr, pkscr_len,
uintptr(unsafe.Pointer(&txTo[0])), uintptr(len(txTo)),
uintptr(i), uintptr(ver_flags), 0, 0, 0)
return r1 == 1
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:15,代码来源:verify_tx.go
示例4: multisig_reorder
// reorder signatures to meet order of the keys
// remove signatuers made by the same keys
// remove exessive signatures (keeps transaction size down)
func multisig_reorder(tx *btc.Tx) (all_signed bool) {
all_signed = true
for i := range tx.TxIn {
ms, _ := btc.NewMultiSigFromScript(tx.TxIn[i].ScriptSig)
if ms == nil {
continue
}
hash := tx.SignatureHash(ms.P2SH(), i, btc.SIGHASH_ALL)
var sigs []*btc.Signature
for ki := range ms.PublicKeys {
var sig *btc.Signature
for si := range ms.Signatures {
if btc.EcdsaVerify(ms.PublicKeys[ki], ms.Signatures[si].Bytes(), hash) {
//fmt.Println("Key number", ki, "has signature number", si)
sig = ms.Signatures[si]
break
}
}
if sig != nil {
sigs = append(sigs, sig)
} else if *verbose {
fmt.Println("WARNING: Key number", ki, "has no matching signature")
}
if !*allowextramsigns && uint(len(sigs)) >= ms.SigsNeeded {
break
}
}
if *verbose {
if len(ms.Signatures) > len(sigs) {
fmt.Println("WARNING: Some signatures are obsolete and will be removed", len(ms.Signatures), "=>", len(sigs))
} else if len(ms.Signatures) < len(sigs) {
fmt.Println("It appears that same key is re-used.", len(sigs)-len(ms.Signatures), "more signatures were added")
}
}
ms.Signatures = sigs
tx.TxIn[i].ScriptSig = ms.Bytes()
if len(sigs) < int(ms.SigsNeeded) {
all_signed = false
}
}
return
}
开发者ID:liudch,项目名称:gocoin,代码行数:50,代码来源:multisig.go
示例5: TxMiner
// return miner ID of the given coinbase transaction
func TxMiner(cbtx *btc.Tx) (string, int) {
txdat := cbtx.Serialize()
for i, m := range MinerIds {
if bytes.Equal(m.Tag, []byte("_p2pool_")) { // P2Pool
if len(cbtx.TxOut) > 10 &&
bytes.Equal(cbtx.TxOut[len(cbtx.TxOut)-1].Pk_script[:2], []byte{0x6A, 0x28}) {
return m.Name, i
}
} else if bytes.Contains(txdat, m.Tag) {
return m.Name, i
}
}
adr := btc.NewAddrFromPkScript(cbtx.TxOut[0].Pk_script, Testnet)
if adr != nil {
return adr.String(), -1
}
return "", -1
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:21,代码来源:mining.go
示例6: mk_spend_tx
func mk_spend_tx(input_tx *btc.Tx, sig_scr []byte, witness [][]byte) (output_tx *btc.Tx) {
output_tx = new(btc.Tx)
output_tx.Version = 1
output_tx.TxIn = []*btc.TxIn{&btc.TxIn{Input: btc.TxPrevOut{Hash: btc.Sha2Sum(input_tx.Serialize()), Vout: 0},
ScriptSig: sig_scr, Sequence: 0xffffffff}}
output_tx.TxOut = []*btc.TxOut{&btc.TxOut{Value: input_tx.TxOut[0].Value}}
// Lock_time = 0
if len(witness) > 0 {
output_tx.SegWit = make([][][]byte, 1)
output_tx.SegWit[0] = witness
if DBG_SCR {
println("tx has", len(witness), "ws")
for xx := range witness {
println("", xx, hex.EncodeToString(witness[xx]))
}
}
}
output_tx.SetHash(output_tx.Serialize())
return
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:21,代码来源:script_test.go
示例7: check_consensus
func check_consensus(pkScr []byte, amount uint64, i int, tx *btc.Tx, ver_flags uint32, result bool) {
var tmp []byte
if len(pkScr) != 0 {
tmp = make([]byte, len(pkScr))
copy(tmp, pkScr)
}
tx_raw := tx.Raw
if tx_raw == nil {
tx_raw = tx.Serialize()
}
go func(pkScr []byte, txTo []byte, i int, ver_flags uint32, result bool) {
var pkscr_ptr, pkscr_len uintptr // default to 0/null
if pkScr != nil {
pkscr_ptr = uintptr(unsafe.Pointer(&pkScr[0]))
pkscr_len = uintptr(len(pkScr))
}
r1, _, _ := syscall.Syscall9(bitcoinconsensus_verify_script_with_amount.Addr(), 8,
pkscr_ptr, pkscr_len, uintptr(amount),
uintptr(unsafe.Pointer(&txTo[0])), uintptr(len(txTo)),
uintptr(i), uintptr(ver_flags), 0, 0)
res := r1 == 1
atomic.AddUint64(&ConsensusChecks, 1)
if !result {
atomic.AddUint64(&ConsensusExpErr, 1)
}
if res != result {
atomic.AddUint64(&ConsensusErrors, 1)
common.CountSafe("TxConsensusERR")
mut.Lock()
println("Compare to consensus failed!")
println("Gocoin:", result, " ConsLIB:", res)
println("pkScr", hex.EncodeToString(pkScr))
println("txTo", hex.EncodeToString(txTo))
println("amount:", amount, " input_idx:", i, " ver_flags:", ver_flags)
println()
mut.Unlock()
}
}(tmp, tx_raw, i, ver_flags, result)
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:40,代码来源:consensus_windows.go
示例8: dump_hashes_to_sign
// dump hashes to be signed
func dump_hashes_to_sign(tx *btc.Tx) {
for in := range tx.TxIn {
uo := UO(unspentOuts[in])
if uo == nil {
println("Unknown content of unspent input number", in)
os.Exit(1)
}
var pubad *btc.BtcAddr
if litecoin {
pubad = ltc.NewAddrFromPkScript(uo.Pk_script, testnet)
} else {
pubad = btc.NewAddrFromPkScript(uo.Pk_script, testnet)
}
if pubad != nil {
hash := tx.SignatureHash(uo.Pk_script, in, btc.SIGHASH_ALL)
fmt.Printf("Input #%d:\n\tHash : %s\n\tAddr : %s\n", in, hex.EncodeToString(hash), pubad.String())
} else {
println("Cannot decode pkscript of unspent input number", in)
os.Exit(1)
}
}
}
开发者ID:vancsj,项目名称:gocoin,代码行数:23,代码来源:signtx.go
示例9: apply_to_balance
// apply the chnages to the balance folder
func apply_to_balance(tx *btc.Tx) {
fmt.Println("Applying the transaction to the balance/ folder...")
f, _ := os.Create("balance/unspent.txt")
if f != nil {
for j := 0; j < len(unspentOuts); j++ {
if j > len(tx.TxIn) {
fmt.Fprintln(f, unspentOuts[j], unspentOutsLabel[j])
}
}
if *verbose {
fmt.Println(len(tx.TxIn), "spent output(s) removed from 'balance/unspent.txt'")
}
var addback int
for out := range tx.TxOut {
for j := range publ_addrs {
if publ_addrs[j].Owns(tx.TxOut[out].Pk_script) {
fmt.Fprintf(f, "%s-%03d # %.8f / %s\n", tx.Hash.String(), out,
float64(tx.TxOut[out].Value)/1e8, publ_addrs[j].String())
addback++
}
}
}
f.Close()
if addback > 0 {
f, _ = os.Create("balance/" + tx.Hash.String() + ".tx")
if f != nil {
f.Write(tx.Serialize())
f.Close()
}
if *verbose {
fmt.Println(addback, "new output(s) appended to 'balance/unspent.txt'")
}
}
}
}
开发者ID:vancsj,项目名称:gocoin,代码行数:38,代码来源:signtx.go
示例10: skip_broken_tests
// Some tests from the satoshi's json files are not applicable
// ... for our architectre so lets just fake them.
func skip_broken_tests(tx *btc.Tx) bool {
// No inputs
if len(tx.TxIn) == 0 {
return true
}
// Negative output
for i := range tx.TxOut {
if tx.TxOut[i].Value > btc.MAX_MONEY {
return true
}
}
// Duplicate inputs
if len(tx.TxIn) > 1 {
for i := 0; i < len(tx.TxIn)-1; i++ {
for j := i + 1; j < len(tx.TxIn); j++ {
if tx.TxIn[i].Input == tx.TxIn[j].Input {
return true
}
}
}
}
// Coinbase of w wrong size
if tx.IsCoinBase() {
if len(tx.TxIn[0].ScriptSig) < 2 {
return true
}
if len(tx.TxIn[0].ScriptSig) > 100 {
return true
}
}
return false
}
开发者ID:bityuan,项目名称:gocoin,代码行数:38,代码来源:tx_test.go
示例11: sign_tx
// prepare a signed transaction
func sign_tx(tx *btc.Tx) (all_signed bool) {
all_signed = true
for in := range tx.TxIn {
uo := UO(unspentOuts[in])
var found bool
for j := range publ_addrs {
if publ_addrs[j].Owns(uo.Pk_script) {
er := tx.Sign(in, uo.Pk_script, btc.SIGHASH_ALL, publ_addrs[j].Pubkey, priv_keys[j][:])
if er == nil {
found = true
} else {
fmt.Println("Error signing input", in, "of", len(tx.TxIn))
fmt.Println("...", er.Error())
}
break
}
}
if !found {
fmt.Println("WARNING: You do not have key for", hex.EncodeToString(uo.Pk_script))
all_signed = false
}
}
return
}
开发者ID:vancsj,项目名称:gocoin,代码行数:25,代码来源:signtx.go
示例12: mk_out_tx
func mk_out_tx(sig_scr, pk_scr []byte) (output_tx *btc.Tx) {
// We build input_tx only to calculate it's hash for output_tx
input_tx := new(btc.Tx)
input_tx.Version = 1
input_tx.TxIn = []*btc.TxIn{&btc.TxIn{Input: btc.TxPrevOut{Vout: 0xffffffff},
ScriptSig: []byte{0, 0}, Sequence: 0xffffffff}}
input_tx.TxOut = []*btc.TxOut{&btc.TxOut{Pk_script: pk_scr}}
// Lock_time = 0
output_tx = new(btc.Tx)
output_tx.Version = 1
output_tx.TxIn = []*btc.TxIn{&btc.TxIn{Input: btc.TxPrevOut{Hash: btc.Sha2Sum(input_tx.Serialize()), Vout: 0},
ScriptSig: sig_scr, Sequence: 0xffffffff}}
output_tx.TxOut = []*btc.TxOut{&btc.TxOut{}}
// Lock_time = 0
return
}
开发者ID:bityuan,项目名称:gocoin,代码行数:18,代码来源:script_test.go
示例13: write_tx_file
func write_tx_file(tx *btc.Tx) {
var signedrawtx []byte
if tx.SegWit != nil {
signedrawtx = tx.SerializeNew()
} else {
signedrawtx = tx.Serialize()
}
tx.SetHash(signedrawtx)
hs := tx.Hash.String()
fmt.Println("TxID", hs)
f, _ := os.Create(hs[:8] + ".txt")
if f != nil {
f.Write([]byte(hex.EncodeToString(signedrawtx)))
f.Close()
fmt.Println("Transaction data stored in", hs[:8]+".txt")
}
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:19,代码来源:signtx.go
示例14: sign_tx
// prepare a signed transaction
func sign_tx(tx *btc.Tx) (all_signed bool) {
var multisig_done bool
all_signed = true
// go through each input
for in := range tx.TxIn {
if ms, _ := btc.NewMultiSigFromScript(tx.TxIn[in].ScriptSig); ms != nil {
hash := tx.SignatureHash(ms.P2SH(), in, btc.SIGHASH_ALL)
for ki := range ms.PublicKeys {
k := public_to_key(ms.PublicKeys[ki])
if k != nil {
r, s, e := btc.EcdsaSign(k.Key, hash)
if e != nil {
println("ERROR in sign_tx:", e.Error())
all_signed = false
} else {
btcsig := &btc.Signature{HashType: 0x01}
btcsig.R.Set(r)
btcsig.S.Set(s)
ms.Signatures = append(ms.Signatures, btcsig)
tx.TxIn[in].ScriptSig = ms.Bytes()
multisig_done = true
}
}
}
} else {
uo := getUO(&tx.TxIn[in].Input)
if uo == nil {
println("ERROR: Unkown input:", tx.TxIn[in].Input.String(), "- missing balance folder?")
all_signed = false
continue
}
adr := addr_from_pkscr(uo.Pk_script)
if adr == nil {
fmt.Println("WARNING: Don't know how to sign input number", in)
fmt.Println(" Pk_script:", hex.EncodeToString(uo.Pk_script))
all_signed = false
continue
}
k := hash_to_key(adr.Hash160)
if k == nil {
fmt.Println("WARNING: You do not have key for", adr.String(), "at input", in)
all_signed = false
continue
}
er := tx.Sign(in, uo.Pk_script, btc.SIGHASH_ALL, k.BtcAddr.Pubkey, k.Key)
if er != nil {
fmt.Println("ERROR: Sign failed for input number", in, er.Error())
all_signed = false
}
}
}
// reorder signatures if we signed any multisig inputs
if multisig_done && !multisig_reorder(tx) {
all_signed = false
}
if !all_signed {
fmt.Println("WARNING: Not all the inputs have been signed")
}
return
}
开发者ID:liudch,项目名称:gocoin,代码行数:66,代码来源:signtx.go
示例15: make_signed_tx
// prepare a signed transaction
func make_signed_tx() {
// Make an empty transaction
tx := new(btc.Tx)
tx.Version = 1
tx.Lock_time = 0
// Select as many inputs as we need to pay the full amount (with the fee)
var btcsofar uint64
for inpcnt := 0; inpcnt < len(unspentOuts); inpcnt++ {
uo := UO(unspentOuts[inpcnt])
// add the input to our transaction:
tin := new(btc.TxIn)
tin.Input = *unspentOuts[inpcnt]
tin.Sequence = 0xffffffff
tx.TxIn = append(tx.TxIn, tin)
btcsofar += uo.Value
if !*useallinputs && (btcsofar >= spendBtc+feeBtc) {
break
}
}
changeBtc = btcsofar - (spendBtc + feeBtc)
if *verbose {
fmt.Printf("Spending %d out of %d outputs...\n", len(tx.TxIn), len(unspentOuts))
}
// Build transaction outputs:
for o := range sendTo {
outs, er := btc.NewSpendOutputs(sendTo[o].addr, sendTo[o].amount, testnet)
if er != nil {
fmt.Println("ERROR:", er.Error())
os.Exit(1)
}
tx.TxOut = append(tx.TxOut, outs...)
}
if changeBtc > 0 {
// Add one more output (with the change)
chad := get_change_addr()
if *verbose {
fmt.Println("Sending change", changeBtc, "to", chad.String())
}
outs, er := btc.NewSpendOutputs(chad, changeBtc, testnet)
if er != nil {
fmt.Println("ERROR:", er.Error())
os.Exit(1)
}
tx.TxOut = append(tx.TxOut, outs...)
}
if *message != "" {
// Add NULL output with an arbitrary message
scr := new(bytes.Buffer)
scr.WriteByte(0x6a) // OP_RETURN
btc.WritePutLen(scr, uint32(len(*message)))
scr.Write([]byte(*message))
tx.TxOut = append(tx.TxOut, &btc.TxOut{Value: 0, Pk_script: scr.Bytes()})
}
if *hashes {
dump_hashes_to_sign(tx)
} else {
signed := sign_tx(tx)
write_tx_file(tx)
if apply2bal && signed {
apply_to_balance(tx)
}
}
}
开发者ID:vancsj,项目名称:gocoin,代码行数:71,代码来源:signtx.go
示例16: make_signed_tx
// prepare a signed transaction
func make_signed_tx() {
// Make an empty transaction
tx := new(btc.Tx)
tx.Version = 1
tx.Lock_time = 0
// Select as many inputs as we need to pay the full amount (with the fee)
var btcsofar uint64
for i := range unspentOuts {
if unspentOuts[i].key == nil {
continue
}
uo := getUO(&unspentOuts[i].TxPrevOut)
// add the input to our transaction:
tin := new(btc.TxIn)
tin.Input = unspentOuts[i].TxPrevOut
tin.Sequence = uint32(*sequence)
tx.TxIn = append(tx.TxIn, tin)
btcsofar += uo.Value
unspentOuts[i].spent = true
if !*useallinputs && (btcsofar >= spendBtc+feeBtc) {
break
}
}
if btcsofar < (spendBtc + feeBtc) {
fmt.Println("ERROR: You have", btc.UintToBtc(btcsofar), "BTC, but you need",
btc.UintToBtc(spendBtc+feeBtc), "BTC for the transaction")
cleanExit(1)
}
changeBtc = btcsofar - (spendBtc + feeBtc)
if *verbose {
fmt.Printf("Spending %d out of %d outputs...\n", len(tx.TxIn), len(unspentOuts))
}
// Build transaction outputs:
for o := range sendTo {
outs, er := btc.NewSpendOutputs(sendTo[o].addr, sendTo[o].amount, testnet)
if er != nil {
fmt.Println("ERROR:", er.Error())
cleanExit(1)
}
tx.TxOut = append(tx.TxOut, outs...)
}
if changeBtc > 0 {
// Add one more output (with the change)
chad := get_change_addr()
if *verbose {
fmt.Println("Sending change", changeBtc, "to", chad.String())
}
outs, er := btc.NewSpendOutputs(chad, changeBtc, testnet)
if er != nil {
fmt.Println("ERROR:", er.Error())
cleanExit(1)
}
tx.TxOut = append(tx.TxOut, outs...)
}
if *message != "" {
// Add NULL output with an arbitrary message
scr := new(bytes.Buffer)
scr.WriteByte(0x6a) // OP_RETURN
btc.WritePutLen(scr, uint32(len(*message)))
scr.Write([]byte(*message))
tx.TxOut = append(tx.TxOut, &btc.TxOut{Value: 0, Pk_script: scr.Bytes()})
}
signed := sign_tx(tx)
write_tx_file(tx)
if apply2bal && signed {
apply_to_balance(tx)
}
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:76,代码来源:signtx.go
示例17: dl_payment
func dl_payment(w http.ResponseWriter, r *http.Request) {
if !ipchecker(r) {
return
}
var err string
if len(r.Form["outcnt"]) == 1 {
var thisbal chain.AllUnspentTx
var pay_cmd string
var totalinput, spentsofar uint64
var change_addr *btc.BtcAddr
var multisig_input []*wallet.MultisigAddr
addrs_to_msign := make(map[string]bool)
tx := new(btc.Tx)
tx.Version = 1
tx.Lock_time = 0
outcnt, _ := strconv.ParseUint(r.Form["outcnt"][0], 10, 32)
wallet.BalanceMutex.Lock()
for i := 1; i <= int(outcnt); i++ {
is := fmt.Sprint(i)
if len(r.Form["txout"+is]) == 1 && r.Form["txout"+is][0] == "on" {
hash := btc.NewUint256FromString(r.Form["txid"+is][0])
if hash != nil {
vout, er := strconv.ParseUint(r.Form["txvout"+is][0], 10, 32)
if er == nil {
var po = btc.TxPrevOut{Hash: hash.Hash, Vout: uint32(vout)}
for j := range wallet.MyBalance {
if wallet.MyBalance[j].TxPrevOut == po {
thisbal = append(thisbal, wallet.MyBalance[j])
// Add the input to our tx
tin := new(btc.TxIn)
tin.Input = wallet.MyBalance[j].TxPrevOut
tin.Sequence = 0xffffffff
tx.TxIn = append(tx.TxIn, tin)
// Add new multisig address description
_, msi := wallet.IsMultisig(wallet.MyBalance[j].BtcAddr)
multisig_input = append(multisig_input, msi)
if msi != nil {
for ai := range msi.ListOfAddres {
addrs_to_msign[msi.ListOfAddres[ai]] = true
}
}
// Add the value to total input value
totalinput += wallet.MyBalance[j].Value
// If no change specified, use the first input addr as it
if change_addr == nil {
change_addr = wallet.MyBalance[j].BtcAddr
}
}
}
}
}
}
}
wallet.BalanceMutex.Unlock()
for i := 1; ; i++ {
adridx := fmt.Sprint("adr", i)
btcidx := fmt.Sprint("btc", i)
if len(r.Form[adridx]) != 1 || len(r.Form[btcidx]) != 1 {
break
}
if len(r.Form[adridx][0]) > 1 {
addr, er := btc.NewAddrFromString(r.Form[adridx][0])
if er == nil {
am, er := btc.StringToSatoshis(r.Form[btcidx][0])
if er == nil && am > 0 {
if pay_cmd == "" {
pay_cmd = "wallet -useallinputs -send "
} else {
pay_cmd += ","
}
pay_cmd += addr.Enc58str + "=" + btc.UintToBtc(am)
outs, er := btc.NewSpendOutputs(addr, am, common.CFG.Testnet)
if er != nil {
err = er.Error()
goto error
}
tx.TxOut = append(tx.TxOut, outs...)
spentsofar += am
} else {
err = "Incorrect amount (" + r.Form[btcidx][0] + ") for Output #" + fmt.Sprint(i)
goto error
}
} else {
err = "Incorrect address (" + r.Form[adridx][0] + ") for Output #" + fmt.Sprint(i)
goto error
//.........这里部分代码省略.........
开发者ID:liudch,项目名称:gocoin,代码行数:101,代码来源:sendtx.go
示例18: DecodeTxSops
func DecodeTxSops(tx *btc.Tx) (s string, missinginp bool, totinp, totout uint64, sigops uint, e error) {
s += fmt.Sprintln("Transaction details (for your information):")
s += fmt.Sprintln(len(tx.TxIn), "Input(s):")
sigops = btc.WITNESS_SCALE_FACTOR * tx.GetLegacySigOpCount()
for i := range tx.TxIn {
s += fmt.Sprintf(" %3d %s", i, tx.TxIn[i].Input.String())
var po *btc.TxOut
inpid := btc.NewUint256(tx.TxIn[i].Input.Hash[:])
if txinmem, ok := network.TransactionsToSend[inpid.BIdx()]; ok {
s += fmt.Sprint(" mempool")
if int(tx.TxIn[i].Input.Vout) >= len(txinmem.TxOut) {
s += fmt.Sprintf(" - Vout TOO BIG (%d/%d)!", int(tx.TxIn[i].Input.Vout), len(txinmem.TxOut))
} else {
po = txinmem.TxOut[tx.TxIn[i].Input.Vout]
}
} else {
po, _ = common.BlockChain.Unspent.UnspentGet(&tx.TxIn[i].Input)
if po != nil {
s += fmt.Sprintf("%8d", po.BlockHeight)
}
}
if po != nil {
ok := script.VerifyTxScript(po.Pk_script, po.Value, i, tx, script.VER_P2SH|script.VER_DERSIG|script.VER_CLTV)
if !ok {
s += fmt.Sprintln("\nERROR: The transacion does not have a valid signature.")
e = errors.New("Invalid signature")
return
}
totinp += po.Value
ads := "???"
if ad := btc.NewAddrFromPkScript(po.Pk_script, common.Testnet); ad != nil {
ads = ad.String()
}
s += fmt.Sprintf(" %15.8f BTC @ %s", float64(po.Value)/1e8, ads)
if btc.IsP2SH(po.Pk_script) {
so := btc.WITNESS_SCALE_FACTOR * btc.GetP2SHSigOpCount(tx.TxIn[i].ScriptSig)
s += fmt.Sprintf(" + %d sigops", so)
sigops += so
}
swo := tx.CountWitnessSigOps(i, po.Pk_script)
if swo > 0 {
s += fmt.Sprintf(" + %d segops", swo)
sigops += swo
}
s += "\n"
} else {
s += fmt.Sprintln(" - UNKNOWN INPUT")
missinginp = true
}
}
s += fmt.Sprintln(len(tx.TxOut), "Output(s):")
for i := range tx.TxOut {
totout += tx.TxOut[i].Value
adr := btc.NewAddrFromPkScript(tx.TxOut[i].Pk_script, common.Testnet)
if adr != nil {
s += fmt.Sprintf(" %15.8f BTC to adr %s\n", float64(tx.TxOut[i].Value)/1e8, adr.String())
} else {
s += fmt.Sprintf(" %15.8f BTC to scr %s\n", float64(tx.TxOut[i].Value)/1e8, hex.EncodeToString(tx.TxOut[i].Pk_script))
}
}
if missinginp {
s += fmt.Sprintln("WARNING: There are missing inputs and we cannot calc input BTC amount.")
s += fmt.Sprintln("If there is somethign wrong with this transaction, you can loose money...")
} else {
s += fmt.Sprintf("All OK: %.8f BTC in -> %.8f BTC out, with %.8f BTC fee\n", float64(totinp)/1e8,
float64(totout)/1e8, float64(totinp-totout)/1e8)
}
s += fmt.Sprintln("ECDSA sig operations : ", sigops)
return
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:77,代码来源:usif.go
示例19: output_tx_xml
func output_tx_xml(w http.ResponseWriter, tx *btc.Tx) {
w.Write([]byte("<input_list>"))
for i := range tx.TxIn {
w.Write([]byte("<input>"))
w.Write([]byte("<script_sig>"))
w.Write([]byte(hex.EncodeToString(tx.TxIn[i].ScriptSig)))
w.Write([]byte("</script_sig>"))
var po *btc.TxOut
inpid := btc.NewUint256(tx.TxIn[i].Input.Hash[:])
if txinmem, ok := network.TransactionsToSend[inpid.BIdx()]; ok {
if int(tx.TxIn[i].Input.Vout) < len(txinmem.TxOut) {
po = txinmem.TxOut[tx.TxIn[i].Input.Vout]
}
} else {
po, _ = common.BlockChain.Unspent.UnspentGet(&tx.TxIn[i].Input)
}
if po != nil {
ok := script.VerifyTxScript(po.Pk_script, po.Value, i, tx, script.STANDARD_VERIFY_FLAGS)
if !ok {
w.Write([]byte("<status>Script FAILED</status>"))
} else {
w.Write([]byte("<status>OK</status>"))
}
fmt.Fprint(w, "<value>", po.Value, "</value>")
fmt.Fprint(w, "<pkscript>", hex.EncodeToString(po.Pk_script), "</pkscript>")
if ad := btc.NewAddrFromPkScript(po.Pk_script, common.Testnet); ad != nil {
fmt.Fprint(w, "<addr>", ad.String(), "</addr>")
}
fmt.Fprint(w, "<block>", po.BlockHeight, "</block>")
if btc.IsP2SH(po.Pk_script) {
fmt.Fprint(w, "<input_sigops>", btc.WITNESS_SCALE_FACTOR*btc.GetP2SHSigOpCount(tx.TxIn[i].ScriptSig), "</input_sigops>")
}
fmt.Fprint(w, "<witness_sigops>", tx.CountWitnessSigOps(i, po.Pk_script), "</witness_sigops>")
} else {
w.Write([]byte("<status>UNKNOWN INPUT</status>"))
}
fmt.Fprint(w, "<sequence>", tx.TxIn[i].Sequence, "</sequence>")
if tx.SegWit != nil {
w.Write([]byte("<segwit>"))
for _, wit := range tx.SegWit[i] {
w.Write([]byte("<witness>"))
w.Write([]byte(hex.EncodeToString(wit)))
w.Write([]byte("</witness>"))
}
w.Write([]byte("</segwit>"))
}
w.Write([]byte("</input>"))
}
w.Write([]byte("</input_list>"))
w.Write([]byte("<output_list>"))
for i := range tx.TxOut {
w.Write([]byte("<output>"))
fmt.Fprint(w, "<value>", tx.TxOut[i].Value, "</value>")
adr := btc.NewAddrFromPkScript(tx.TxOut[i].Pk_script, common.Testnet)
if adr != nil {
fmt.Fprint(w, "<addr>", adr.String(), "</addr>")
} else {
fmt.Fprint(w, "<addr>", "scr:"+hex.EncodeToString(tx.TxOut[i].Pk_script), "</addr>")
}
w.Write([]byte("</output>"))
}
w.Write([]byte("</output_list>"))
}
开发者ID:piotrnar,项目名称:gocoin,代码行数:66,代码来源:txs.go
示例20: evalScript
func evalScript(p []byte, stack *scrStack, tx *btc.Tx, inp int, ver_flags uint32) bool {
if DBG_SCR {
fmt.Println("script len", len(p))
}
if len(p) > 10000 {
if DBG_ERR {
fmt.Println("script too long", len(p))
}
return false
}
defer func() {
if r := recover(); r != nil {
if DBG_ERR {
err, ok := r.(error)
if !ok {
err = fmt.Errorf("pkg: %v", r)
}
fmt.Println("evalScript panic:", err.Error())
fmt.Println(string(debug.Stack()))
}
}
}()
var exestack scrStack
var altstack scrStack
sta, idx, opcnt := 0, 0, 0
checkMinVals := (ver_flags & VER_MINDATA) != 0
for idx < len(p) {
inexec := exestack.nofalse()
// Read instruction
opcode, pushval, n, e := btc.GetOpcode(p[idx:])
if e != nil {
//fmt.Println(e.Error())
//fmt.Println("A", idx, hex.EncodeToString(p))
return false
}
idx += n
if DBG_SCR {
fmt.Printf("\nExecuting opcode 0x%02x n=%d inexec:%t push:%s..\n",
opcode, n, inexec, hex.EncodeToString(pushval))
stack.print()
}
if pushval != nil && len(pushval) > btc.MAX_SCRIPT_ELEMENT_SIZE {
if DBG_ERR {
fmt.Println("pushval too long", len(pushval))
}
return false
}
if opcode > 0x60 {
opcnt++
if opcnt > 201 {
if DBG_ERR {
fmt.Println("evalScript: too many opcodes A")
}
return false
}
}
if opcode == 0x7e /*OP_CAT*/ ||
opcode == 0x7f /*OP_SUBSTR*/ ||
opcode == 0x80 /*OP_LEFT*/ ||
opcode == 0x81 /*OP_RIGHT*/ ||
opcode == 0x83 /*OP_INVERT*/ ||
opcode == 0x84 /*OP_AND*/ ||
opcode == 0x85 /*OP_OR*/ ||
opcode == 0x86 /*OP_XOR*/ ||
opcode == 0x8d /*OP_2MUL*/ ||
opcode == 0x8e /*OP_2DIV*/ ||
opcode == 0x95 /*OP_MUL*/ ||
opcode == 0x96 /*OP_DIV*/ ||
opcode == 0x97 /*OP_MOD*/ ||
opcode == 0x98 /*OP_LSHIFT*/ ||
opcode == 0x99 /*OP_RSHIFT*/ {
if DBG_ERR {
fmt.Println("Unsupported opcode", opcode)
}
return false
}
if inexec && 0 <= opcode && opcode <= btc.OP_PUSHDATA4 {
if checkMinVals && !checkMinimalPush(pushval, opcode) {
if DBG_ERR {
fmt.Println("Push value not in a minimal format", hex.EncodeToString(pushval))
}
return false
}
stack.push(pushval)
if DBG_SCR {
fmt.Println("pushed", len(pushval), "bytes")
}
} else if inexec || (0x63 /*OP_IF*/ <= opcode && opcode <= 0x68 /*OP_ENDIF*/) {
switch {
case opcode == 0x4f: // OP_1NEGATE
stack.pushInt(-1)
//.........这里部分代码省略.........
开发者ID:liudch,项目名称:gocoin,代码行数:101,代码来源:script.go
注:本文中的github.com/piotrnar/gocoin/lib/btc.Tx类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论