// NewAdr creates a new, never before seen address, and increments the // DB counter as well as putting it in the ram Adrs store, and returns it func (ts *TxStore) NewAdr() (btcutil.Address, error) { if ts.Param == nil { return nil, fmt.Errorf("NewAdr error: nil param") } priv := new(hdkeychain.ExtendedKey) var err error var n uint32 var nAdr btcutil.Address n = uint32(len(ts.Adrs)) priv, err = ts.rootPrivKey.Child(n + hdkeychain.HardenedKeyStart) if err != nil { return nil, err } nAdr, err = priv.Address(ts.Param) if err != nil { return nil, err } // total number of keys (now +1) into 4 bytes var buf bytes.Buffer err = binary.Write(&buf, binary.BigEndian, n+1) if err != nil { return nil, err } // write to db file err = ts.StateDB.Update(func(btx *bolt.Tx) error { sta := btx.Bucket(BKTState) return sta.Put(KEYNumKeys, buf.Bytes()) }) if err != nil { return nil, err } // add in to ram. var ma MyAdr ma.PkhAdr = nAdr ma.KeyIdx = n ts.Adrs = append(ts.Adrs, ma) ts.localFilter.Add(ma.PkhAdr.ScriptAddress()) return nAdr, nil }