// get BtcAddr from pk_script func addr_from_pkscr(scr []byte) *btc.BtcAddr { if litecoin { return ltc.NewAddrFromPkScript(scr, testnet) } else { return btc.NewAddrFromPkScript(scr, testnet) } }
// 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) } } }
// dump raw transaction func dump_raw_tx() { tx := raw_tx_from_file(*dumptxfn) if tx == nil { fmt.Println("ERROR: Cannot decode the raw transaction") return } var unsigned int fmt.Println("ID:", tx.Hash.String()) fmt.Println("Tx Version:", tx.Version) if tx.IsCoinBase() { if len(tx.TxIn[0].ScriptSig) >= 4 && tx.TxIn[0].ScriptSig[0] == 3 { fmt.Println("Coinbase TX from block height", uint(tx.TxIn[0].ScriptSig[1])| uint(tx.TxIn[0].ScriptSig[2])<<8|uint(tx.TxIn[0].ScriptSig[3])<<16) } else { fmt.Println("Coinbase TX from an unknown block") } s := hex.EncodeToString(tx.TxIn[0].ScriptSig) for len(s) > 0 { i := len(s) if i > 64 { i = 64 } fmt.Println(" ", s[:i]) s = s[i:] } //fmt.Println() } else { fmt.Println("TX IN cnt:", len(tx.TxIn)) for i := range tx.TxIn { fmt.Printf("%4d) %s sl=%d seq=%08x\n", i, tx.TxIn[i].Input.String(), len(tx.TxIn[i].ScriptSig), tx.TxIn[i].Sequence) if len(tx.TxIn[i].ScriptSig) > 0 { if !dump_sigscript(tx.TxIn[i].ScriptSig) { unsigned++ } } else { unsigned++ } } } fmt.Println("TX OUT cnt:", len(tx.TxOut)) for i := range tx.TxOut { fmt.Printf("%4d) %20s BTC ", i, btc.UintToBtc(tx.TxOut[i].Value)) var addr *btc.BtcAddr if litecoin { addr = ltc.NewAddrFromPkScript(tx.TxOut[i].Pk_script, testnet) } else { addr = btc.NewAddrFromPkScript(tx.TxOut[i].Pk_script, testnet) } if addr != nil { if addr.Version == AddrVerScript() { fmt.Println("to scriptH", addr.String()) } else { fmt.Println("to address", addr.String()) } } else if len(tx.TxOut[i].Pk_script) == 40 && tx.TxOut[i].Pk_script[0] == 0x6a && tx.TxOut[i].Pk_script[1] == 0x26 && tx.TxOut[i].Pk_script[2] == 0x06 { fmt.Println("Stealth", hex.EncodeToString(tx.TxOut[i].Pk_script[3:7]), hex.EncodeToString(tx.TxOut[i].Pk_script[7:])) } else { if tx.TxOut[i].Value > 0 { fmt.Println("WARNING!!! These coins go to non-standard Pk_script:") } else { fmt.Println("NULL output to Pk_script:") } ss, er := btc.ScriptToText(tx.TxOut[i].Pk_script) if er == nil { for i := range ss { fmt.Println(" ", ss[i]) } } else { fmt.Println(hex.EncodeToString(tx.TxOut[i].Pk_script)) fmt.Println(er.Error()) } } } fmt.Println("Lock Time:", tx.Lock_time) if !tx.IsCoinBase() { if unsigned > 0 { fmt.Println("WARNING:", unsigned, "out of", len(tx.TxIn), "inputs are not signed or signed only patially") } else { fmt.Println("All", len(tx.TxIn), "transaction inputs seem to be signed") } } }