Commit Graph

259 Commits

Author SHA1 Message Date
Ștefan Talpalaru f91e69f7c7
more VM tracing
The existing vmState tracing is plugged into chronicles, at the TRACE
level, to facilitate state test debugging.

Some useful chronicles defines are added to "tests/nim.cfg" to simplify
the compile-and-run command for individual tests.
2018-12-12 11:47:10 +01:00
Ștefan Talpalaru 115843487c
general-state testsuite changes and better fork selection
- skipped the tests in allowedFailInCurrentBuild()
- replaced doAssert() with check() in testFixtureIndexes() so we can see
  both hash values on failure
- checking filename extension for JSON tests to avoid editor swap files
- replaced the duplicated block values in the main net's ChainConfig
  with values from forkBlocks
- allowed overriding the current fork in computations, because the old
  strategy of only looking at the block number doesn't work with JSON tests
  where the block number is usually 1
- explicitly pass the fork to gasCosts() and use it for conditional cost
  calculation
- fixed a logic error in the CREATE opcode
- fixed VM selection based on current fork in updateOpcodeExec()
- single point of control for supported forks in tests (just one fork, at the
  moment)
- 44 new test failures (that were probably passing for the wrong reasons)
2018-12-07 18:18:29 +01:00
Ștefan Talpalaru 03ec65487d
logging changes
- port some "echo" logging to "chronicles"
- change the logging level of messages that should not appear by default
  to TRACE instead of DEBUG
- remove the "nimbusTrace" define
- suppress logging for messages below the ERROR level in "nimble test"
2018-12-07 00:45:52 +01:00
coffeepots 86853ea97c
Merge pull request #187 from status-im/modexp-fixes
Modexp fixes
2018-12-06 10:10:59 +00:00
andri lim fe5ddf757b fix trace returnValue 2018-12-05 22:01:29 +07:00
andri lim 572de41507 tracing opcode return value 2018-12-05 22:01:29 +07:00
andri lim 7a3ddfec87 correcting account storage retrieval 2018-12-05 22:01:29 +07:00
andri lim 2552d6452a fix traceTransaction 2018-12-05 22:01:29 +07:00
andri lim 5509c66cce implement transaction tracer 2018-12-05 22:01:28 +07:00
mratsim 24bcb3b2d8 remove log2 spurious comment 2018-12-04 15:56:18 +01:00
mratsim f50bb57eb6 Reactivate the precompiles test + consume gas 2018-12-04 15:52:59 +01:00
mratsim 29f8a8a066 modExp fixed! 2018-12-04 15:46:33 +01:00
mratsim 6d93bdffea modExp, support up to uint4096 2018-12-04 14:39:10 +01:00
mratsim 949c5a1dc6 Modexp fix example 1 (returned to early for ints of length 1) 2018-12-04 12:49:48 +01:00
coffeepots f99138dca6 Merge branch 'call-fixes-precompiles' 2018-11-12 15:57:54 +00:00
coffeepots 1cead76327 Add note about cyclic dep 2018-11-08 16:40:40 +00:00
coffeepots 6eb430fd52 Fix CREATE op code gas costs, more debug output, call transactions 2018-11-08 16:00:21 +00:00
coffeepots 492d2ae676 Debug message for new messages 2018-11-08 15:48:32 +00:00
coffeepots 6b1e989ff0 Add initial gas cost for CREATE 2018-11-08 15:47:48 +00:00
Yuriy Glukhov bac452f589 Initial TransactionTracer impl 2018-10-28 14:38:05 +01:00
coffeepots 7ba1cfaf13 Remove endian code, precompiles should now run. Removed raise as case stmt is full now. 2018-10-19 14:41:04 +01:00
coffeepots 434edcc2ae Fix incorrect message parameters (had sender and destination swapped) 2018-10-18 17:47:54 +01:00
cheatfate 0b15b86195 Fix ecMul, ecPairing, ecAdd. 2018-10-16 11:49:13 +03:00
coffeepots 6e4616e443 Precompiles now executed if called from vm_state_transactions 2018-10-12 16:16:14 +01:00
coffeepots 67df44e917 Fix ecrecover, pad ripemd result and use sha256 vs keccak256 2018-10-10 17:36:11 +01:00
mratsim bb6e1e1d76 modExp precompiles: fix padding and static evaluation 2018-10-10 16:26:21 +02:00
mratsim 0494e2a877 Support short inputs with missing bytes 2018-10-05 17:37:52 +02:00
mratsim 38b4d54815 Add modExp precompile + gas costs 2018-10-05 17:26:20 +02:00
cheatfate 9318ea93cf Added nim-bncurve dependency.
Added implementation of `ecAdd`, `ecMul`, `ecPairing` precompiles.
2018-10-05 12:15:04 +03:00
coffeepots 6a4cd4ec67 Update precompile gas costs case (cosmetic change) 2018-10-03 17:59:41 +01:00
coffeepots 3249c3e048 Add precompile costs 2018-10-03 16:39:34 +01:00
coffeepots 3deb09bbb6 Add SHA256, RIPEMD160 and Identity precompiles 2018-10-03 13:33:19 +01:00
coffeepots fcffd94469 Support different endians 2018-10-02 16:39:01 +01:00
coffeepots 36270ff4d5 Fixes for Call gas usage, Calls use precompiles, pass down their opCode 2018-10-02 16:07:16 +01:00
coffeepots 62968bf733 Initial support for precompiles with ecRecover 2018-10-02 15:46:39 +01:00
Dustin Brody 3f5fc9a034 read through block 49017 by properly setting createAddress/storageAddress of the computation message and detecting whether the computation has the gas required to pay 200*code length; also, clean up pointless commented nonnegativity assertions for nonnegative GasInt type 2018-09-28 10:26:27 +03:00
tersec 690ce2cf97
Partly fix state_db getCode for 20 new working GeneralStateTests (#156)
* partly fix state_db getCode to get 20 new working GeneralStateTests; remove 2 functions which existed as workarounds; switch all remaining setBalance calls in GeneralStateTestRunner to subBalance (addBalance calls already changed)

* two of the 20 new tests don't work in 32-bit builds
2018-09-20 21:36:57 +00:00
Dustin Brody 8f4e1a4445
integrate GeneralStateTest runner into CI with 775 running tests (#153)
* fix 32-bit issue in AppVeyor

* allow another dozen or so GeneralStateTest fixtures which work on 64-bit, but not on 32-bit platforms, to safely-fail, but demarcate them separately to facilitate debugging

* steal fa672600eb from @coffeepots fix-int32-high-zero branch
2018-09-19 16:46:14 +00:00
Yuriy Glukhov 0adfaf0f31 s/increaseBalance/addBalance 2018-09-19 18:41:17 +03:00
coffeepots 766d1c4091 Temp fix for int32.high returning zero 2018-09-19 12:11:54 +03:00
mratsim 070487d78a Homestead contract creation gas cost 2018-09-18 17:28:40 +02:00
Dustin Brody dd20f4079c revert better toSeq version to worse for-loop version of extracting keys from table because former now fails to compile 2018-09-18 07:07:04 -07:00
Dustin Brody 048921b045 20 new working GeneralStateTests 2018-09-18 14:00:30 +00:00
Dustin Brody 7dfd2a3849 update deltabalance to mix of setBalance and increaseBalance 2018-09-18 06:25:28 -07:00
coffeepots 4f03c9cf2a
Merge pull request #139 from status-im/callOpCodeWork
Flesh out call op
2018-09-18 14:09:00 +01:00
coffeepots b49637cdbf Helper procs for updating opcode executor based on fork 2018-09-18 13:10:30 +01:00
coffeepots d435e434ec Copy opCodeExec to child computation 2018-09-18 13:03:22 +01:00
Zahary Karadjov d71ce6fb24 Make use of the new transactional API offered by the Trie DB 2018-09-18 02:56:10 +03:00
coffeepots d484420f5b Remove fork distinguished procs, handle in applyCreateMessage 2018-09-17 19:35:07 +01:00
coffeepots 949d4c11f8 Full names for `$`(fork) 2018-09-17 18:38:10 +01:00
Dustin Brody beb1befc6e 13 additional GeneralStateTests working; remove commented auto-ported Py-EVM validations which are implicit in UInt256; address comments to last commit (toSeq, hoising vmState.readOnlyStateDB, deltaBalance -> increaseBalance) 2018-09-17 13:41:32 +00:00
coffeepots cdfcda41b4 Remove init 0 after child computation 2018-09-14 18:04:09 +01:00
coffeepots 63f9acd8ce Add create and apply message procs 2018-09-14 18:03:26 +01:00
coffeepots c7a014bb10 Add gas cost for create 2018-09-14 17:59:21 +01:00
coffeepots af76d209a6 Add opcode executor proc to computation 2018-09-14 16:47:40 +01:00
coffeepots 6183761251 Refactor for generateChildComputation 2018-09-14 16:16:55 +01:00
coffeepots 2b6342764c Add fork to string proc 2018-09-14 16:16:55 +01:00
coffeepots d465fcd038 Appy child computation in call op code 2018-09-14 16:16:55 +01:00
coffeepots 2a38c0194d Expose isCreate for export 2018-09-14 16:16:55 +01:00
coffeepots 69f07c587a Add generateChildComputation, addChildComputation and applyChildComputation 2018-09-14 16:16:55 +01:00
coffeepots d24108a79b Convert code from byte range to seq 2018-09-14 16:16:55 +01:00
coffeepots b4fd38e062 Call now gets and checks balance against funds, also now fetches code 2018-09-14 16:16:55 +01:00
Dustin Brody 7ba90fda54
48 new working GeneralStateTests, via fixing some overflows/underflows, creating a rudimentary balance commit/revert scheme, and implementing account deletion for the selfdestruct instruction (#146) 2018-09-14 13:43:40 +00:00
Dustin Brody fd07d6fed1 A simple/basic GeneralStateTest runner which gets 400+ of them correct 2018-09-10 19:42:45 +03:00
Yuriy Glukhov 3a1ec035b3 Various fixes towards state reconstruction 2018-09-07 14:00:37 +03:00
coffeepots 085880758b Always update account nonce even if there's an contract address collision 2018-09-06 13:57:42 +01:00
coffeepots ca6eb0cb38 Don't touch nonce until after address in-use check 2018-09-06 13:57:42 +01:00
coffeepots 555687ba97 Comment reference to issue regarding address collisions 2018-09-06 13:57:42 +01:00
coffeepots 7a5a43f50f Add generateAddress utility 2018-09-06 13:57:42 +01:00
coffeepots 0e2068c99e Create Op now generates contract addresses & checks for collisions 2018-09-06 13:57:42 +01:00
Jacek Sieka db202dc35f
replace logging module with nim-chronicles (fixes #38)
This blindly changes logging to nim-chronicles - issues that ensue:

* keeps gas cost computation logs hidden behind flag
* unclear if logScope is practical - for example, since vm is split over
many files, topics get lost when using simple top-level per-module
topics
* when passing named object around, scope should incliude the name of
the object but this is caught neither by logScope nor by dynamicLogScope
2018-08-29 16:13:03 -06:00
coffeepots c9de0fbd29 Reduce range of cleanMemRef 2018-08-17 17:16:40 +03:00
coffeepots fd7062fecb Fix VMTest message creation in 32 bits, also duplicated word in comment 2018-08-17 17:16:40 +03:00
coffeepots ff52d75fc0 Fix overflowing int in 32 bit 2018-08-17 17:16:40 +03:00
coffeepots 66adba9037 Fix for gas costs in 32 bit 2018-08-17 17:16:40 +03:00
Dustin Brody f91bb16bdd Initial EVMC message type API matching: reorder overlapping fields to match EMVC; rename to to destination; replace isStatic with more general flags (with only one non-zero value); remove superfluous-seeming shouldTransferValue; keep internalFoo fields, which aren't in PyEVM either, so weren't per se part of PyEVM matching 2018-08-14 15:03:18 +03:00
Dustin Brody ea2f3b71bf
Complete VM Test sync, with EXP(0, 0) defined as 1 now (#98) 2018-08-07 18:41:01 +00:00
Dustin Brody 2136bc74fd
Sanitize memory addresses and lengths (#97)
* add a helper function to ensure for memory addressing and length purposes, especially as applied to array indexing and bounds-checking, that non-negative UInt256 numbers remain non-negative when lossily converted to int's
2018-08-06 16:33:20 +00:00
Dustin Brody 71679d6d95 fix assorted test fixtures which have been un-skipped 2018-08-02 15:57:28 -07:00
Dustin Brody dcf97d8198 memory expansion boilerplate usage wasn't 100% consistent, so extcodecopy and codecopy were returning far too low gas costs in many cases (#88) 2018-07-28 09:59:33 +02:00
Dustin Brody 5d82493a9c fix comment to correctly reflect REVERT opcode 2018-07-25 16:30:18 -07:00
Yuriy Glukhov 04bacca35c
Merge pull request #81 from status-im/ClampMemoryGasCostToNonnegative
accessing memory can't cost less than nothing
2018-07-25 13:48:21 +03:00
Yuriy Glukhov 8713939bfe
Merge pull request #82 from status-im/ImplementSelfDestructOp
Implemented selfDestruct op
2018-07-25 13:41:14 +03:00
coffeepots 47e5081f86 TODO comment for other forks on the selfdestruct op 2018-07-25 10:40:08 +01:00
Dustin Brody 85e1c39a83 accessing memory can't cost less than nothing 2018-07-24 18:37:56 -07:00
Dustin Brody c2ed3bf11e mstore8 wants LSB of BE representation, i.e. last byte 2018-07-24 12:25:21 -07:00
coffeepots 52daaf49c0 Implemented selfDestruct op 2018-07-24 17:21:29 +01:00
Yuriy Glukhov 473140f586
Merge pull request #79 from status-im/FixExtCodeCopyCost
ExtCodeCopy is a memory expansion operation for gas computation purposes
2018-07-24 12:19:04 +03:00
Dustin Brody df23f802c6 ExtCodeCopy is a memory expansion operation for gas computation purposes 2018-07-23 17:00:06 -07:00
Dustin Brody 00cd33febd add subcase of yellow paper equation (297) for zero-length memory ranges 2018-07-23 14:00:49 -07:00
Yuriy Glukhov 01a920b3b6
Merge pull request #76 from status-im/FixFailOnEmptyChildComputation
Only write to child computation if data present
2018-07-20 11:15:12 +03:00
coffeepots 868f2b1959 Remove if statement for actualOutputSize - 1 2018-07-20 08:53:56 +01:00
coffeepots 6ce46c0163 Only write to child computation if data present 2018-07-19 19:14:17 +01:00
coffeepots e33bc85bfa Remove validateCanonicalAddress 2018-07-19 19:04:01 +01:00
Yuriy Glukhov feaff16e9d Corrected jump boundary check. Nonexistent sload pushes 0. (#74) 2018-07-19 15:11:52 +02:00
Yuriy Glukhov b2acf3a5e3 GasMeter is an object now (#73) 2018-07-18 14:18:17 +02:00
Yuriy Glukhov 6c67115ef5 Fixed sstore gas computation, empty sha3, smod, sdiv (#71)
* Fixed sstore gas computation, fixed empty sha3

* Fixed smod and sdiv

* Comments addressed
2018-07-18 11:14:28 +02:00
Yuriy Glukhov 601db4d9f3 Fixed a few more tests (#70)
* Fixed getting reading balance from the test fixtures

* Fixed sha3 opcode
2018-07-17 10:57:13 +02:00
Yuriy Glukhov 46a8b5dc49 Refactored log opcodes, added validation, fixed a couple of tests 2018-07-16 11:14:52 +02:00
Mamy Ratsimbazafy 4dd75aee84
Delete utilities: address, padding, bytes (#68)
* Delete utilities: address, padding, bytes

* Remove bigEndianToInt

* Fix C compiler error: member reference base type 'char' is not a structure or union

* fix todo comment
2018-07-06 17:08:31 +02:00
Mamy Ratsimbazafy 4b5eada322
Refactor interpreter dispatch (#65)
* move forks constants, rename errors

* Move vm/utils to vm/interpreter/utils

* initial opcodes refactoring

* Add refactored Comparison & Bitwise Logic Operations

* Add sha3 and address, simplify macro, support pop 0

* balance, origin, caller, callValue

* fix gas copy opcodes gas costs, add callDataLoad/Size/Copy, CodeSize/Copy and gas price opcode

* Update with 30s, 40s, 50s opcodes + impl of balance + stack improvement

* add push, dup, swap, log, create and call operations

* finish opcode implementation

* Add the new dispatching logic

* Pass the opcode test

* Make test_vm_json compile

* halt execution without exceptions for Return, Revert, selfdestruct (fix #62)

* Properly catch and recover from EVM exceptions (stack underflow ...)

* Fix byte op

* Fix jump regressions

* Update for latest devel, don't import old dispatch code as quasiBoolean macro is broken by latest devel

* Fix sha3 regression on empty memory slice and until end of range slice

* Fix padding / range error on expXY_success (gas computation left)

* update logging procs

* Add tracing - expXY_success is not a regression, sload stub was accidentally passing the test

* Reuse the same stub as OO implementation

* Delete previous opcode implementation

* Delete object oriented fork code

* Delete exceptions that were used as control flows

* delete base.nim 🔥, yet another OO remnants

* Delete opcode table

* Enable omputed gotos and compile-time gas fees

* Revert const gasCosts -> generates SIGSEGV

* inline push, swap and dup opcodes

* loggers are now template again, why does this pass new tests?

* Trigger CI rebuild after rocksdb fix https://github.com/status-im/nim-rocksdb/pull/5

* Address review comment on "push" + VMTests in debug mode (not release)

* Address review comment: don't tag fork by default, make opcode impl grepable

* Static compilation fixes after rebasing

* fix the initialization of the VM database

* add a missing import

* Deactivate balance and sload test following #59

* Reactivate stack check (deactivated in #59, necessary to pass tests)

* Merge remaining opcodes implementation from #59

* Merge callDataLoad and codeCopy fixes, todo simplify see #67
2018-07-06 09:52:31 +02:00
zah 18b7bbb3b0 Implemented most of the stubbed-out state handling instructions (#59)
Merge note: currently cannot compile due to `quasiBoolean` (#63). This will be solved by https://github.com/status-im/nimbus/pull/65
----

* Implemented most of the stubbed out state handling instructions

The code compiles, but still fails at the moment due to incorrect

initialization of the VM. Don't merge yet. More commits will be
pushed in the coming days.

* Fixed crash

* trie put and del are void now

* getBlockTransactionData and getReceipts

* Working code for extcodesize0.json

* fix origin.json

* fix calldatasize1

* fix calldataloadSizeTooHighPartial

* fix calldataloadSizeTooHigh

* more efficient PushX implementation

* fix and, or, xor
2018-07-05 14:41:01 +02:00
zah 6f28d11866 Few steps towards having 64-bit block numbers (#57)
Some of the other clients don't bother to store block numbers as
256-bit integers (64 bits or even 32 bit are enough).

The changes here are based on helpers introduced in eth_common
that try to abstract away all conversion steps in the code between
VM words and block numbers in variables in fields. Unfortunately,
this turn out to be more work than anticipated and I've postponed
finishing the refactoring for now (Block numbers are still 256 bit).
2018-06-26 16:09:50 +02:00
Mamy Ratsimbazafy c26c751f9b
Reorganize VM/interpreter + cleanup (#52)
* Move and cleanup interpreter files - prepare for redesign of VM

* fix call comment aobut recursive dependencies

* memory: use a template again and avoid (?) a cstring-> string conversion

* Fix stack test regression

* Fix recursive dependency on logging_ops, test_vm_json compiles but regression :/

* Fix signextend regression

* Fix 3 signed test and sha3 test
2018-06-15 11:11:25 +02:00
Mamy Ratsimbazafy 05275f9773
Activate logging, sha3, arith tests (#51)
* Activate the tests

* Use 3 params in memExpansion gas costs, fix 31 log tests and 8 sha3 tests

* Activate Control Flow tests as well
2018-06-13 19:33:47 +02:00
mratsim 8d76cab46a Was confused about ∧ in the Yellow paper. Fix #50 - pass 2 new tests. Only 1 arithmetic failure left. 2018-06-13 16:05:52 +02:00
Mamy Ratsimbazafy 90c3ca4a96
Gas refactoring - decouple opcode logic and gas (#49)
* Decoupling op logic and gas - introduce gasometer, rework opcode declaration

* Remove gas constants for gas opcode computation

* Remove gas constants for precompiled contracts

* make vm_types compile

* Make opcode, call and computation compile

* Distinguish between dynamic and complex gas costs, fix arithmetic

* Fix context and sha3

* update memory and storage ops

* Log opcode uses memory expansion code

* update/stub system_ops with gas costs

* Make test compile. Deactivate stub test_vm

* all tests compiles, opcode fails due to https://github.com/nim-lang/Nim/issues/8007 (const object variant in tables reset at runtime)

* Create an enum without holes - workaround: https://github.com/nim-lang/Nim/issues/8007

* Use arrays instead of tables for GasCosts, remove some unused imports - passing all basic tests!

* Make test_vm_json compile

* Fix test_vm_json - workaround https://github.com/nim-lang/Nim/issues/8015

* fix memory expansion cost bug

* Remove leftover special handling from before GckMemExpansion

* cleanup outdated comment, better align =

* Fix sha3 gas cost not taking memory expansion into account

* Improve gas error reporting of test_vm_json

* Fix gas computation regression due to mem expansion

* mass replace for memExpansion->RequestedMemSize was too eager

* fix log gas cost (no tests :/)

* missed a static FeeSchedule

* static as expression is fickle
2018-06-12 17:33:47 +02:00
Yuriy Glukhov 8bdf09683b Hash256/EthAddrres refactoring 2018-05-30 19:11:15 +03:00
Yuriy Glukhov 51b572d8b8 Some renames 2018-05-28 13:22:28 +03:00