code: async function decodeMappingsKeys (web3, storage, corrections, callback) {
    var ret = {}
    if (!corrections.length) corrections.push({offset: 0, slot: 0})
    for (var hashedLoc in storage) {
      var preimage
      try {
        var key = storage[hashedLoc].key
        for (var k in corrections) {
          var corrected = util.sub(key, corrections[k].slot).toString(16)
          preimage = await getPreimage(web3, '0x' + corrected)
          if (preimage) break
        }
      } catch (e) {
      }
      if (preimage) {
        // got preimage!
        // get mapping position (i.e. storage slot), its the last 32 bytes
        var slotByteOffset = preimage.length - 64
        var mappingSlot = preimage.substr(slotByteOffset)
        var mappingKey = preimage.substr(0, slotByteOffset)
        if (!ret[mappingSlot]) {
          ret[mappingSlot] = {}
        }
        ret[mappingSlot][mappingKey] = preimage
      }
    }
    callback(null, ret)
  }
docs: extract the mappings location from the storage
  like { "<mapping_slot>" : { "<mapping-key1>": preimageOf1 }, { "<mapping-key2>": preimageOf2 }, ... }
  
  @param {Object} storage  - storage given by storage Viewer (basically a mapping hashedkey : {key, value})
  @param {Array} corrections - used in case the calculated sha3 has been modifyed before SSTORE (notably used for struct in mapping).
  @param {Function} callback  - calback
  @return {Map} - solidity mapping location (e.g { "<mapping_slot>" : { "<mapping-key1>": preimageOf1 }, { "<mapping-key2>": preimageOf2 }, ... })