From 9de0a7a2d63b2fc68751fc556c05ebd5cd35c4d8 Mon Sep 17 00:00:00 2001 From: Mason Fischer Date: Wed, 13 May 2020 12:48:08 -0400 Subject: [PATCH] Add state_manager --- core/vm/state_manager.go | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 core/vm/state_manager.go diff --git a/core/vm/state_manager.go b/core/vm/state_manager.go new file mode 100644 index 0000000000..8634200ba7 --- /dev/null +++ b/core/vm/state_manager.go @@ -0,0 +1,58 @@ +package vm + +import ( + "os" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/common" +) + +var ( + StateManagerAddress = common.HexToAddress(os.Getenv("STATE_MANAGER_ADDRESS")) +) + +type ovmOperation func(*EVM, *Contract, []byte) ([]byte, error) +type methodId [4]byte + +var funcs = map[string]ovmOperation{ + "getStorage(address,bytes32)": getStorage, + "setStorage(address,bytes32,bytes32)": setStorage, +} +var methodIds map[[4]byte]ovmOperation +var executionMangerBytecode []byte + + +func init() { + methodIds = make(map[[4]byte]ovmOperation, len(funcs)) + for methodSignature, f := range funcs { + methodIds[MethodSignatureToMethodId(methodSignature)] = f + } +} + + +func MethodSignatureToMethodId(methodSignature string) [4]byte { + var methodId [4]byte + copy(methodId[:], crypto.Keccak256([]byte(methodSignature))) + return methodId +} + + +func callStateManager(input []byte, evm *EVM, contract *Contract) (ret []byte, err error) { + var methodId [4]byte + copy(methodId[:], input[:4]) + ret, err = methodIds[methodId](evm, contract, input) + return ret, err +} + +func setStorage(evm *EVM, contract *Contract, input []byte) (ret []byte, err error) { + key := common.BytesToHash(input[4:36]) + val := common.BytesToHash(input[36:68]) + evm.StateDB.SetState(contract.Address(), key, val) + return nil, nil +} +func getStorage(evm *EVM, contract *Contract, input []byte) (ret []byte, err error) { + key := common.BytesToHash(input[4:36]) + val := evm.StateDB.GetState(contract.Address(), key) + return val.Bytes(), nil + return []byte{}, nil +}