code: func (s *GlobalStore) keys(addr *common.Address, startKey []byte, limit int) (keys mock.Keys, err error) {
  	iter := s.db.NewIterator(nil, nil)
  	defer iter.Release()
  
  	if limit <= 0 {
  		limit = mock.DefaultLimit
  	}
  
  	prefix := []byte{indexForHashesPrefix}
  	if addr != nil {
  		prefix = indexForHashesPerNodePrefix(*addr)
  	}
  	if startKey != nil {
  		if addr != nil {
  			startKey = indexForHashesPerNode(*addr, startKey)
  		} else {
  			startKey = indexForHashes(startKey)
  		}
  	} else {
  		startKey = prefix
  	}
  
  	ok := iter.Seek(startKey)
  	if !ok {
  		return keys, iter.Error()
  	}
  	for ; ok; ok = iter.Next() {
  		k := iter.Key()
  		if !bytes.HasPrefix(k, prefix) {
  			break
  		}
  		key := append([]byte(nil), bytes.TrimPrefix(k, prefix)...)
  
  		if len(keys.Keys) >= limit {
  			keys.Next = key
  			break
  		}
  
  		keys.Keys = append(keys.Keys, key)
  	}
  	return keys, iter.Error()
  }
docs: // keys returns a paginated list of keys. If addr is not nil, only keys on that
  // node will be returned.