Pass OVM tests

This commit is contained in:
Mason Fischer 2020-01-24 09:23:51 -05:00
parent 30b157a126
commit e78aecbf1f
3 changed files with 13 additions and 5 deletions

View file

@ -286,6 +286,8 @@ func (s *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash {
stateObject := s.getStateObject(addr) stateObject := s.getStateObject(addr)
if stateObject != nil { if stateObject != nil {
return stateObject.GetState(s.db, hash) return stateObject.GetState(s.db, hash)
} else {
log.Info("No state object")
} }
return common.Hash{} return common.Hash{}
} }

View file

@ -32,8 +32,8 @@ var (
bigZero = new(big.Int) bigZero = new(big.Int)
tt255 = math.BigPow(2, 255) tt255 = math.BigPow(2, 255)
OvmSLOADMethodId = hashSha3([]byte("ovmSLOAD()"))[0:4] OvmSLOADMethodId = hashSha3([]byte("ovmSLOAD()"))[0:4]
OvmSSTOREMethodId = hashSha3([]byte("ovmSStore()"))[0:4] OvmSSTOREMethodId = hashSha3([]byte("ovmSSTORE()"))[0:4]
OvmContractAddress = common.FromHex("000000000000000000000000000000000000001") OvmContractAddress = common.FromHex("EB1Be3E5Ff32bd47D9589f3f1E73B1788F36639c")
errWriteProtection = errors.New("evm: write protection") errWriteProtection = errors.New("evm: write protection")
errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") errReturnDataOutOfBounds = errors.New("evm: return data out of bounds")
errExecutionReverted = errors.New("evm: execution reverted") errExecutionReverted = errors.New("evm: execution reverted")
@ -640,12 +640,14 @@ func opSload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory
loc := stack.peek() loc := stack.peek()
val := interpreter.evm.StateDB.GetState(contract.Address(), common.BigToHash(loc)) val := interpreter.evm.StateDB.GetState(contract.Address(), common.BigToHash(loc))
loc.SetBytes(val.Bytes()) loc.SetBytes(val.Bytes())
return nil, nil return nil, nil
} }
func opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { func opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {
loc := common.BigToHash(stack.pop()) loc := common.BigToHash(stack.pop())
val := stack.pop() val := stack.pop()
interpreter.evm.StateDB.SetState(contract.Address(), loc, common.BigToHash(val)) interpreter.evm.StateDB.SetState(contract.Address(), loc, common.BigToHash(val))
interpreter.intPool.put(val) interpreter.intPool.put(val)
@ -765,21 +767,24 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory
// Pop other call parameters. // Pop other call parameters.
addr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() addr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()
toAddr := common.BigToAddress(addr) toAddr := common.BigToAddress(addr)
// log.Info(fmt.Sprintf("Calling %020x\n", toAddr.Bytes()))
value = math.U256(value) value = math.U256(value)
// Get the arguments from the memory. // Get the arguments from the memory.
args := memory.GetPtr(inOffset.Int64(), inSize.Int64()) args := memory.GetPtr(inOffset.Int64(), inSize.Int64())
if bytes.Equal(toAddr.Bytes(), OvmContractAddress) && bytes.Equal(args[0:4], OvmSLOADMethodId) { if bytes.Equal(toAddr.Bytes(), OvmContractAddress) && bytes.Equal(args[0:4], OvmSLOADMethodId) {
loc := common.BytesToHash(args[4:35]) loc := common.BytesToHash(args[4:36])
val := interpreter.evm.StateDB.GetState(contract.Address(), loc) val := interpreter.evm.StateDB.GetState(contract.Address(), loc)
stack.push(val.Big()) memory.Set(retOffset.Uint64(), retSize.Uint64(), val.Bytes())
stack.push(interpreter.intPool.get().SetUint64(1))
return val.Bytes(), nil return val.Bytes(), nil
} else if bytes.Equal(toAddr.Bytes(), OvmContractAddress) && bytes.Equal(args[0:4], OvmSSTOREMethodId) { } else if bytes.Equal(toAddr.Bytes(), OvmContractAddress) && bytes.Equal(args[0:4], OvmSSTOREMethodId) {
loc := common.BytesToHash(args[4:35]) loc := common.BytesToHash(args[4:36])
val := common.BytesToHash(args[36:68]) val := common.BytesToHash(args[36:68])
interpreter.evm.StateDB.SetState(contract.Address(), loc, val) interpreter.evm.StateDB.SetState(contract.Address(), loc, val)
interpreter.intPool.put(val.Big()) interpreter.intPool.put(val.Big())
stack.push(interpreter.intPool.get().SetUint64(1))
return nil, nil return nil, nil
} else { } else {
if value.Sign() != 0 { if value.Sign() != 0 {

View file

@ -1126,6 +1126,7 @@ func newFrontierInstructionSet() JumpTable {
memorySize: memoryCall, memorySize: memoryCall,
valid: true, valid: true,
returns: true, returns: true,
writes: true,
}, },
CALLCODE: { CALLCODE: {
execute: opCallCode, execute: opCallCode,