github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/client/wallet/onoff.go (about) 1 package wallet 2 3 import ( 4 "bytes" 5 "encoding/gob" 6 "io/ioutil" 7 8 "github.com/piotrnar/gocoin/client/common" 9 "github.com/piotrnar/gocoin/lib/utxo" 10 ) 11 12 var ( 13 FetchingBalanceTick func() bool 14 OnOff chan bool = make(chan bool, 1) 15 ) 16 17 func InitMaps(empty bool) { 18 var szs [5]int 19 var ok bool 20 21 if empty { 22 goto init 23 } 24 25 LoadMapSizes() 26 szs, ok = WalletAddrsCount[common.AllBalMinVal()] 27 if ok { 28 //fmt.Println("Have map sizes for MinBal", common.AllBalMinVal(), ":", szs[0], szs[1], szs[2], szs[3]) 29 } else { 30 //fmt.Println("No map sizes for MinBal", common.AllBalMinVal()) 31 szs = [5]int{25e6, 8e6, 4e6, 300e3, 1e3} // defaults 32 } 33 34 init: 35 AllBalancesP2KH = make(map[[20]byte]*OneAllAddrBal, szs[0]) 36 AllBalancesP2SH = make(map[[20]byte]*OneAllAddrBal, szs[1]) 37 AllBalancesP2WKH = make(map[[20]byte]*OneAllAddrBal, szs[2]) 38 AllBalancesP2WSH = make(map[[32]byte]*OneAllAddrBal, szs[3]) 39 AllBalancesP2TAP = make(map[[32]byte]*OneAllAddrBal, szs[4]) 40 } 41 42 func LoadBalance() { 43 if common.GetBool(&common.WalletON) { 44 //fmt.Println("wallet.LoadBalance() ignore: ", common.GetBool(&common.WalletON)) 45 return 46 } 47 48 var aborted bool 49 50 common.SetUint32(&common.WalletProgress, 1) 51 common.ApplyBalMinVal() 52 53 InitMaps(false) 54 55 for _i := range common.BlockChain.Unspent.HashMap { 56 common.BlockChain.Unspent.MapMutex[_i].RLock() 57 for k, v := range common.BlockChain.Unspent.HashMap[_i] { 58 NewUTXO(utxo.NewUtxoRecStatic(k, v)) 59 if FetchingBalanceTick != nil && FetchingBalanceTick() { 60 aborted = true 61 break 62 } 63 } 64 common.BlockChain.Unspent.MapMutex[_i].RUnlock() 65 if aborted { 66 break 67 } 68 common.SetUint32(&common.WalletProgress, 1000*(uint32(_i)+1)/256) 69 } 70 if aborted { 71 InitMaps(true) 72 } else { 73 common.BlockChain.Unspent.CB.NotifyTxAdd = TxNotifyAdd 74 common.BlockChain.Unspent.CB.NotifyTxDel = TxNotifyDel 75 common.SetBool(&common.WalletON, true) 76 } 77 common.SetUint32(&common.WalletProgress, 0) 78 } 79 80 func Disable() { 81 if !common.GetBool(&common.WalletON) { 82 //fmt.Println("wallet.Disable() ignore: ", common.GetBool(&common.WalletON)) 83 return 84 } 85 UpdateMapSizes() 86 common.BlockChain.Unspent.CB.NotifyTxAdd = nil 87 common.BlockChain.Unspent.CB.NotifyTxDel = nil 88 common.SetBool(&common.WalletON, false) 89 InitMaps(true) 90 } 91 92 const ( 93 MAPSIZ_FILE_NAME = "mapsize.gob" 94 ) 95 96 var ( 97 WalletAddrsCount map[uint64][5]int = make(map[uint64][5]int) //index:MinValue, [0]-P2KH, [1]-P2SH, [2]-P2WSH, [3]-P2WKH, [4]-P2TAP 98 ) 99 100 func UpdateMapSizes() { 101 WalletAddrsCount[common.AllBalMinVal()] = [5]int{len(AllBalancesP2KH), 102 len(AllBalancesP2SH), len(AllBalancesP2WKH), len(AllBalancesP2WSH), 103 len(AllBalancesP2TAP)} 104 105 buf := new(bytes.Buffer) 106 gob.NewEncoder(buf).Encode(WalletAddrsCount) 107 ioutil.WriteFile(common.GocoinHomeDir+MAPSIZ_FILE_NAME, buf.Bytes(), 0600) 108 } 109 110 func LoadMapSizes() { 111 d, er := ioutil.ReadFile(common.GocoinHomeDir + MAPSIZ_FILE_NAME) 112 if er != nil { 113 println("LoadMapSizes:", er.Error()) 114 return 115 } 116 117 buf := bytes.NewBuffer(d) 118 119 er = gob.NewDecoder(buf).Decode(&WalletAddrsCount) 120 if er != nil { 121 println("LoadMapSizes:", er.Error()) 122 } 123 }