code: function Storage (opts) {
    var self = this
    EventEmitter.call(self)
  
    opts = _.extend({networkName: 'livenet', compactMode: false}, opts)
    self.networkName = opts.networkName
    self.compactMode = opts.compactMode
  
    self._isReady = false
    self.once('ready', function () { self._isReady = true })
  }
docs: @event Storage#error
  @param {Error} error
   
  Abstract storage for verified blockchain
  
  You can save all hashes, but that needed store a large size
  on 20 February 2015 mainnet have more that 344k blocks
  thats mean you need store minimum 80 * 344000 / 1024 / 1024 = 26.24 MB
  or 52.48 MB if you store data in hex
  but for example in localStorage you can save only 2.5 MB ...
  
  We offer store maximum 2015 blocks hashes and sha256x2 hash for every chunk
  it's required nearly 105.31 KB for 344k blocks (impressive, really?)
  if you need block hash you can:
  - get from storage if it belongs to last not complete unhashed chunk
  - get chunk from network, calculate hash and compare with saved in storage,
  use block hashes from chunk and save it in memory if you needed this
  besides you can use pre-saved chunk hashes from Storage.prototype,
  it's saved user traffic and accelerate blockchain initialization
  pre-saved data has next structure:
  {lastHash: string, chunkHashes: string[]}
  
  But at least you can use both options, it's your right
  just remember, what sometimes you can't store all data that you needed ...
  
  All methods return Promise,
  this is done for asynchronous storages such as: File, WebSQL
  
  Also all methods represent hashes in hex strings, not Buffer
  
  @class Storage
  @extends events.EventEmitter
  
  @param {Object} [opts]
  @param {string} [opts.networkName=livenet]
  @param {boolean} [opts.compactMode=false]