| 79 | } |
| 80 | |
| 81 | func (t *VMTest) Run(vmconfig vm.Config) error { |
| 82 | statedb := MakePreState(database.NewMemDatabase(), t.json.Pre) |
| 83 | ret, gasRemaining, err := t.exec(statedb, vmconfig) |
| 84 | |
| 85 | if t.json.GasRemaining == nil { |
| 86 | if err == nil { |
| 87 | return fmt.Errorf("gas unspecified (indicating an error), but VM returned no error") |
| 88 | } |
| 89 | if gasRemaining > 0 { |
| 90 | return fmt.Errorf("gas unspecified (indicating an error), but VM returned gas remaining > 0") |
| 91 | } |
| 92 | return nil |
| 93 | } |
| 94 | // Test declares gas, expecting outputs to match. |
| 95 | if !bytes.Equal(ret, t.json.Out) { |
| 96 | return fmt.Errorf("return data mismatch: got %x, want %x", ret, t.json.Out) |
| 97 | } |
| 98 | if gasRemaining != uint64(*t.json.GasRemaining) { |
| 99 | return fmt.Errorf("remaining gas %v, want %v", gasRemaining, *t.json.GasRemaining) |
| 100 | } |
| 101 | for addr, account := range t.json.Post { |
| 102 | for k, wantV := range account.Storage { |
| 103 | if haveV := statedb.GetState(addr, k); haveV != wantV { |
| 104 | return fmt.Errorf("wrong storage value at %x:\n got %x\n want %x", k, haveV, wantV) |
| 105 | } |
| 106 | } |
| 107 | } |
| 108 | // if root := statedb.IntermediateRoot(false); root != t.json.PostStateRoot { |
| 109 | // return fmt.Errorf("post state root mismatch, got %x, want %x", root, t.json.PostStateRoot) |
| 110 | // } |
| 111 | if logs := rlpHash(statedb.Logs()); logs != common.Hash(t.json.Logs) { |
| 112 | return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, t.json.Logs) |
| 113 | } |
| 114 | return nil |
| 115 | } |
| 116 | |
| 117 | func (t *VMTest) exec(statedb *state.StateDB, vmconfig vm.Config) ([]byte, uint64, error) { |
| 118 | evm := t.newEVM(statedb, vmconfig) |