Esempio n. 1
0
  SSTORE: function (key, val, runState, cb) {
    var stateManager = runState.stateManager
    var address = runState.address
    key = utils.setLengthLeft(key, 32)
    var value = utils.unpad(val)

    stateManager.getContractStorage(runState.address, key, function (err, found) {
      if (err) return cb(err)
      try {
        if (value.length === 0 && !found.length) {
          subGas(runState, new BN(fees.sstoreResetGas.v))
        } else if (value.length === 0 && found.length) {
          subGas(runState, new BN(fees.sstoreResetGas.v))
          runState.gasRefund.iadd(new BN(fees.sstoreRefundGas.v))
        } else if (value.length !== 0 && !found.length) {
          subGas(runState, new BN(fees.sstoreSetGas.v))
        } else if (value.length !== 0 && found.length) {
          subGas(runState, new BN(fees.sstoreResetGas.v))
        }
      } catch (e) {
        cb(e.error)
        return
      }

      stateManager.putContractStorage(address, key, value, function (err) {
        if (err) return cb(err)
        runState.contract = stateManager.cache.get(address)
        cb()
      })
    })
  },
Esempio n. 2
0
 self._fetchStorage(keyHex, function (err, rawValue) {
   if (err) return cb(err);
   var value = ethUtil.toBuffer(rawValue);
   value = ethUtil.unpad(value);
   var encodedValue = ethUtil.rlp.encode(value);
   cb(null, encodedValue);
 });
Esempio n. 3
0
  PUSH: function (runState) {
    var numToPush = runState.opCode - 0x5f
    var loaded = utils.unpad(runState.code.slice(runState.programCounter, runState.programCounter + numToPush))

    runState.stack.push(loaded)
    runState.programCounter += numToPush
  },
Esempio n. 4
0
  MLOAD: function (runState) {
    var pos = utils.bufferToInt(runState.stack.pop())
    var loaded = utils.unpad(memLoad(runState, pos, 32))

    if (loaded === ERROR.OUT_OF_GAS) {
      return loaded
    }

    runState.stack.push(loaded)
  },
Esempio n. 5
0
  BLOCKHASH: function (runState, cb) {
    var stateManager = runState.stateManager
    var number = utils.unpad(runState.stack.pop())
    var diff = utils.bufferToInt(runState.block.header.number) - utils.bufferToInt(number)

    // block lookups must be within the past 256 blocks
    if (diff > 256 || diff <= 0) {
      runState.stack.push(new Buffer([0]))
      cb()
      return
    }

    stateManager.getBlockHashByNumber(number, function (err, blockHash) {
      if (err) return cb(err)
      runState.stack.push(blockHash)
      cb()
    })
  },
Esempio n. 6
0
  SSTORE: function (runState, cb) {
    var stateManager = runState.stateManager
    var address = runState.address
    var key = utils.pad(runState.stack.pop(), 32)
    var value = utils.unpad(runState.stack.pop())

    // format input
    if (value.length === 0) {
      // deleting a value
      // set empty buffer to empty string
      value = ''
    } else {
      value = rlp.encode(value)
    }

    stateManager.getContractStorage(runState.address, key, function (err, found) {
      if (err) return cb(err)

      // calculate gas cost
      if (value === '' && !found) {
        runState.gasLeft = runState.gasLeft.sub(new BN(fees.sstoreResetGas.v))
      } else if (value === '' && found) {
        runState.gasLeft = runState.gasLeft.sub(new BN(fees.sstoreResetGas.v))
        runState.gasRefund = runState.gasRefund.add(new BN(fees.sstoreRefundGas.v))
      } else if (value !== '' && !found) {
        runState.gasLeft = runState.gasLeft.sub(new BN(fees.sstoreSetGas.v))
      } else if (value !== '' && found) {
        runState.gasLeft = runState.gasLeft.sub(new BN(fees.sstoreResetGas.v))
      }

      stateManager.putContractStorage(address, key, value, function () {
        runState.contract = stateManager.cache.get(address)
        cb()
      })
    })
  },
Esempio n. 7
0
 MLOAD: function (pos, runState) {
   pos = utils.bufferToInt(pos)
   var loaded = utils.unpad(memLoad(runState, pos, 32))
   return loaded
 },
Esempio n. 8
0
 EQ: function (a, b, runState) {
   a = utils.unpad(a)
   b = utils.unpad(b)
   return new Buffer([a.toString('hex') === b.toString('hex')])
 },
Esempio n. 9
0
 EQ: function (runState) {
   const a = utils.unpad(runState.stack.pop())
   const b = utils.unpad(runState.stack.pop())
   runState.stack.push(new Buffer([a.toString('hex') === b.toString('hex')]))
 },