func main() { var dir string if len(os.Args) > 1 { dir = os.Args[1] } else { dir = sys.BitcoinHome() + "gocoin" + string(os.PathSeparator) + "btcnet" + string(os.PathSeparator) + "peers3" } db, er := qdb.NewDB(dir, true) if er != nil { println(er.Error()) os.Exit(1) } println(db.Count(), "peers in databse", dir) if db.Count() == 0 { return } tmp := make(manyPeers, db.Count()) cnt := 0 db.Browse(func(k qdb.KeyType, v []byte) uint32 { np := utils.NewPeer(v) if !sys.ValidIp4(np.Ip4[:]) { return 0 } if cnt < len(tmp) { tmp[cnt] = np cnt++ } return 0 }) sort.Sort(tmp[:cnt]) for cnt = 0; cnt < len(tmp) && cnt < 2500; cnt++ { ad := tmp[cnt] fmt.Printf("%3d) %16s %5d - seen %5d min ago\n", cnt+1, fmt.Sprintf("%d.%d.%d.%d", ad.Ip4[0], ad.Ip4[1], ad.Ip4[2], ad.Ip4[3]), ad.Port, (time.Now().Unix()-int64(ad.Time))/60) } }
func parse_command_line() { var CFG struct { // Options that can come from either command line or common file Testnet bool Datadir string } GocoinHomeDir = sys.BitcoinHome() + "gocoin" + string(os.PathSeparator) cfgfilecontent, e := ioutil.ReadFile("gocoin.conf") if e != nil { cfgfilecontent, e = ioutil.ReadFile(".." + string(os.PathSeparator) + "client" + string(os.PathSeparator) + "gocoin.conf") } if e == nil { e = json.Unmarshal(cfgfilecontent, &CFG) if e == nil { GocoinHomeDir = CFG.Datadir + string(os.PathSeparator) } } flag.BoolVar(&OnlyStoreBlocks, "b", false, "Only store blocks, without parsing them into UTXO database") flag.BoolVar(&Testnet, "t", CFG.Testnet, "Use Testnet3") flag.StringVar(&GocoinHomeDir, "d", GocoinHomeDir, "Specify the home directory") flag.StringVar(&LastTrustedBlock, "trust", "auto", "Specify the highest trusted block hash (use \"all\" for all)") flag.StringVar(&SeedNode, "s", "", "Specify IP of the node to fetch headers from") flag.UintVar(&MaxNetworkConns, "n", 10, "Set maximum number of network connections for chain download") flag.IntVar(&GCPerc, "g", 0, "Set waste percentage treshold for Go's garbage collector") flag.UintVar(&MemForBlocks, "m", 64, "Set memory buffer for cached block data (value in megabytes)") var help bool flag.BoolVar(&help, "h", false, "Show this help") flag.Parse() if help { flag.PrintDefaults() os.Exit(0) } MemForBlocks <<= 20 // Convert megabytes to bytes }
func main() { if len(os.Args) < 2 { fmt.Println("Specify at least one parameter - a path to the blk0000?.dat files.") fmt.Println("By default it should be:", sys.BitcoinHome()+"blocks") fmt.Println() fmt.Println("If you specify a second parameter, that's where output data will be stored.") fmt.Println("Otherwise the output data will go to Gocoin's default data folder.") return } BtcRootDir = RemoveLastSlash(os.Args[1]) fn := BtcRootDir + string(os.PathSeparator) + "blk00000.dat" fmt.Println("Looking for file", fn, "...") f, e := os.Open(fn) if e != nil { println(e.Error()) os.Exit(1) } _, e = f.Read(Magic[:]) f.Close() if e != nil { println(e.Error()) os.Exit(1) } if len(os.Args) > 2 { GocoinHomeDir = RemoveLastSlash(os.Args[2]) + string(os.PathSeparator) } else { GocoinHomeDir = sys.BitcoinHome() + "gocoin" + string(os.PathSeparator) } if Magic == [4]byte{0x0B, 0x11, 0x09, 0x07} { // testnet3 fmt.Println("There are Testnet3 blocks") GenesisBlock = btc.NewUint256FromString("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943") GocoinHomeDir += "tstnet" + string(os.PathSeparator) } else if Magic == [4]byte{0xF9, 0xBE, 0xB4, 0xD9} { fmt.Println("There are valid Bitcoin blocks") GenesisBlock = btc.NewUint256FromString("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f") GocoinHomeDir += "btcnet" + string(os.PathSeparator) } else { println("blk00000.dat has an unexpected magic") os.Exit(1) } fmt.Println("Importing blockchain data into", GocoinHomeDir, "...") if exists(GocoinHomeDir+"blockchain.dat") || exists(GocoinHomeDir+"blockchain.idx") || exists(GocoinHomeDir+"unspent") { println("Destination folder contains some database files.") println("Either move them somewhere else or delete manually.") println("None of the following files/folders must exist before you proceed:") println(" *", GocoinHomeDir+"blockchain.dat") println(" *", GocoinHomeDir+"blockchain.idx") println(" *", GocoinHomeDir+"unspent") os.Exit(1) } import_blockchain(BtcRootDir) }
func InitConfig() { // Fill in default values CFG.Net.ListenTCP = true CFG.Net.MaxOutCons = 9 CFG.Net.MaxInCons = 10 CFG.Net.MaxBlockAtOnce = 3 CFG.TextUI.Enabled = true CFG.WebUI.Interface = "127.0.0.1:8833" CFG.WebUI.AllowedIP = "127.0.0.1" CFG.WebUI.ShowBlocks = 25 CFG.WebUI.AddrListLen = 15 CFG.TXPool.Enabled = true CFG.TXPool.AllowMemInputs = true CFG.TXPool.FeePerByte = 1 CFG.TXPool.MaxTxSize = 10e3 CFG.TXPool.MinVoutValue = 0 CFG.TXPool.TxExpireMinPerKB = 180 CFG.TXPool.TxExpireMaxHours = 12 CFG.TXRoute.Enabled = true CFG.TXRoute.FeePerByte = 1 CFG.TXRoute.MaxTxSize = 10e3 CFG.TXRoute.MinVoutValue = 500 * CFG.TXRoute.FeePerByte // Equivalent of 500 bytes tx fee CFG.Memory.GCPercTrshold = 100 // 100% CFG.Memory.MaxCachedBlocks = 500 CFG.MiningStatHours = 24 CFG.HashrateHours = 6 CFG.UserAgent = DefaultUserAgent CFG.PayCommandName = "pay_cmd.txt" cfgfilecontent, e := ioutil.ReadFile(ConfigFile) if e == nil && len(cfgfilecontent) > 0 { e = json.Unmarshal(cfgfilecontent, &CFG) if e != nil { println("Error in", ConfigFile, e.Error()) os.Exit(1) } } else { // Create default config file SaveConfig() println("Stored default configuration in", ConfigFile) } flag.BoolVar(&FLAG.Rescan, "r", false, "Rebuild the unspent DB (fixes 'Unknown input TxID' errors)") flag.BoolVar(&CFG.Testnet, "t", CFG.Testnet, "Use Testnet3") flag.StringVar(&CFG.ConnectOnly, "c", CFG.ConnectOnly, "Connect only to this host and nowhere else") flag.BoolVar(&CFG.Net.ListenTCP, "l", CFG.Net.ListenTCP, "Listen for incoming TCP connections (on default port)") flag.StringVar(&CFG.Datadir, "d", CFG.Datadir, "Specify Gocoin's database root folder") flag.UintVar(&CFG.Net.MaxUpKBps, "ul", CFG.Net.MaxUpKBps, "Upload limit in KB/s (0 for no limit)") flag.UintVar(&CFG.Net.MaxDownKBps, "dl", CFG.Net.MaxDownKBps, "Download limit in KB/s (0 for no limit)") flag.StringVar(&CFG.WebUI.Interface, "webui", CFG.WebUI.Interface, "Serve WebUI from the given interface") flag.StringVar(&CFG.Beeps.MinerID, "miner", CFG.Beeps.MinerID, "Monitor new blocks with the string in their coinbase TX") flag.BoolVar(&CFG.TXRoute.Enabled, "txp", CFG.TXPool.Enabled, "Enable Memory Pool") flag.BoolVar(&CFG.TXRoute.Enabled, "txr", CFG.TXRoute.Enabled, "Enable Transaction Routing") flag.BoolVar(&CFG.TextUI.Enabled, "textui", CFG.TextUI.Enabled, "Enable processing TextUI commands (from stdin)") if CFG.Datadir == "" { CFG.Datadir = sys.BitcoinHome() + "gocoin" } if CFG.Walletdir == "" { CFG.Walletdir = CFG.Datadir + string(os.PathSeparator) + DataSubdir() + string(os.PathSeparator) + "wallet" } if flag.Lookup("h") != nil { flag.PrintDefaults() os.Exit(0) } flag.Parse() Reset() }
func host_init() { var e error BtcRootDir := sys.BitcoinHome() common.GocoinHomeDir = common.CFG.Datadir + string(os.PathSeparator) common.Testnet = common.CFG.Testnet // So chaging this value would will only affect the behaviour after restart if common.CFG.Testnet { // testnet3 common.GenesisBlock = btc.NewUint256FromString("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943") common.Magic = [4]byte{0x0B, 0x11, 0x09, 0x07} common.GocoinHomeDir += common.DataSubdir() + string(os.PathSeparator) BtcRootDir += "testnet3" + string(os.PathSeparator) network.AlertPubKey, _ = hex.DecodeString("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a") common.MaxPeersNeeded = 100 } else { common.GenesisBlock = btc.NewUint256FromString("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f") common.Magic = [4]byte{0xF9, 0xBE, 0xB4, 0xD9} common.GocoinHomeDir += common.DataSubdir() + string(os.PathSeparator) network.AlertPubKey, _ = hex.DecodeString("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284") common.MaxPeersNeeded = 1000 } // Lock the folder os.MkdirAll(common.GocoinHomeDir, 0770) sys.LockDatabaseDir(common.GocoinHomeDir) fi, e := os.Stat(common.GocoinHomeDir + "blockchain.dat") if e != nil { os.RemoveAll(common.GocoinHomeDir) fmt.Println("You seem to be running Gocoin for the fist time on this PC") fi, e = os.Stat(BtcRootDir + "blocks/blk00000.dat") if e == nil && fi.Size() > 1024*1024 { fmt.Println("There is a database from Satoshi client on your disk...") if textui.AskYesNo("Do you want to import this database into Gocoin?") { import_blockchain(BtcRootDir + "blocks") } } } // Create default wallet file if does not exist println("wallet dir", common.CFG.Walletdir) os.MkdirAll(common.CFG.Walletdir+string(os.PathSeparator)+"stealth", 0770) default_wallet_fn := common.CFG.Walletdir + string(os.PathSeparator) + wallet.DefaultFileName println("default_wallet_fn", default_wallet_fn) fi, _ = os.Stat(default_wallet_fn) if fi == nil || fi.IsDir() { fmt.Println(default_wallet_fn, "not found") old_wallet_location := common.GocoinHomeDir + "wallet.txt" // If there is wallet.txt rename it to default. fi, _ := os.Stat(old_wallet_location) if fi != nil && !fi.IsDir() { fmt.Println("Taking wallet.txt as", default_wallet_fn) os.Rename(old_wallet_location, default_wallet_fn) } else { fmt.Println("Creating empty default wallet at", default_wallet_fn) ioutil.WriteFile(default_wallet_fn, []byte(fmt.Sprintln("# Put your wallet's public addresses here")), 0660) } } // cache the current balance of all the addresses from the current wallet files wallet.LoadAllWallets() fmt.Println("Loading UTXO database while checking balance of", len(wallet.MyWallet.Addrs), "addresses... (press Ctrl-C to interrupt)") __exit := make(chan bool) __done := make(chan bool) go func() { for { select { case s := <-killchan: fmt.Println(s) chain.AbortNow = true case <-__exit: __done <- true return } } }() ext := &chain.NewChanOpts{NotifyTxAdd: wallet.TxNotifyAdd, NotifyTxDel: wallet.TxNotifyDel, LoadWalk: wallet.NewUTXO} sta := time.Now().UnixNano() common.BlockChain = chain.NewChainExt(common.GocoinHomeDir, common.GenesisBlock, common.FLAG.Rescan, ext) sto := time.Now().UnixNano() if chain.AbortNow { fmt.Printf("Blockchain opening aborted after %.3f seconds\n", float64(sto-sta)/1e9) common.BlockChain.Close() sys.UnlockDatabaseDir() os.Exit(1) } wallet.ChainInitDone() al, sy := sys.MemUsed() fmt.Printf("Blockchain open in %.3f seconds. %d + %d MB of RAM used (%d)\n", float64(sto-sta)/1e9, al>>20, qdb.ExtraMemoryConsumed>>20, sy>>20) common.StartTime = time.Now() __exit <- true _ = <-__done // ... and now load the dafault wallet wallet.LoadWallet(default_wallet_fn) if wallet.MyWallet != nil { wallet.UpdateBalance() fmt.Print(wallet.DumpBalance(wallet.MyBalance, nil, false, true)) } }