Evgenii Stratonikov
7a6d6f43ce
vm: get rid of recursive (*VM).execute calls
...
Recursive execute() calls can affect gas calculation.
This commit makes execute() be called only for real opcodes
and moves duplicate logic for CALL/JMP into a separate function.
2020-01-22 14:31:57 +03:00
Evgenii Stratonikov
d72d978a19
vm: abstract out GetInterop() function
2020-01-22 14:04:40 +03:00
Evgenii Stratonikov
c22d09adad
vm: set GAS limit
...
Make it possible to set maximum amount of GAS which can be spent
during execution.
2020-01-22 14:04:40 +03:00
Evgenii Stratonikov
0662a7e3c2
vm: calculate GAS spent during execution
...
If getPrice callback is provided, accumulate spent GAS.
2020-01-22 14:04:40 +03:00
Roman Khimov
cc16dac0b4
vm: optimize script loading a bit
...
Preseed the scriptHash value when we already know it. Eliminates this time
waste from the pprof graph, but doesn't really change anything in the 1.4M ->
1.5M 100K mainnet blocks import test.
2019-12-23 18:02:39 +03:00
Roman Khimov
a7457d08a1
vm/core: add ID support for SYSCALL, redo interop registration
...
This solves two problems:
* adds support for shortened SYSCALL form that uses IDs (similar to #434 , but
for NEO 2.0, supporting both forms), which is important for compatibility
with C# node and mainnet chain that uses it from some height
* reworks interop plugging to use callbacks rather than appending to the map,
these map mangling functions are clearly visible in the VM profiling
statistics and we want spawning a VM to be fast, so it makes sense
optimizing it. This change moves most of the work to the init() phase
making VM setup cheaper.
Caveats:
* InteropNameToID accepts `[]byte` because that's the thing we have in
SYSCALL processing and that's the most often usecase for it, it leads to
some conversions in other places but that's acceptable because those are
either tests or init()
* three getInterop functions are: `getDefaultVMInterop`, `getSystemInterop`
and `getNeoInterop`
Our 100K (1.4M->1.5M) block import time improves by ~4% with this change.
2019-12-19 13:35:42 +03:00
Roman Khimov
21efcb012b
vm: fix non-dupped items in PICKITEM
...
TestPICKITEMDupMap and TestPICKITEMDupArray were failing.
2019-12-17 20:26:30 +03:00
Roman Khimov
a6d60e387a
vm: fix OVER and PICK to duplicate stack items
...
TestPICKDup and TestOVERDup failed without this.
2019-12-17 20:26:30 +03:00
Roman Khimov
c596a6b273
vm: fix INVERT behaviour for converted values
...
Tests added were failing before this change.
2019-12-17 20:26:30 +03:00
Roman Khimov
587cfc7c66
vm: optimize ROLL/ROT, refactor common code
...
Add `Roll` method to Stack that doesn't pop and push values and use it for
ROLL and ROT.
1.4M->1.5M 100K block import test before:
real 3m44,292s
user 5m43,494s
sys 0m34,741s
After:
real 3m40,449s
user 5m42,701s
sys 0m35,500s
2019-12-16 19:53:21 +03:00
Roman Khimov
2627628387
vm: optimize SWAP instruction, refactor common code
...
Add `Swap` method to the Stack and use it for both SWAP and XSWAP. Avoid
element popping and pushing (and associated accounting costs).
1.4M->1.5M 100K block import test before:
real 3m51,885s
user 5m54,744s
sys 0m38,444s
After:
real 3m44,292s
user 5m43,494s
sys 0m34,741s
2019-12-16 19:02:40 +03:00
Roman Khimov
0afaff2f79
vm: microoptimize RegisterInteropFuncs()
...
Avoid useless copying.
2019-12-13 17:02:28 +03:00
Roman Khimov
d0f9a28196
vm/core: improve block import speed with PublicKey caching
...
This change (closely related to the neo-project/neo#1321 proposal) speeds up
1.4M mainnet blocks import by 30%. Basically, we're eliminating key decoding
for block's multisignature that has the same keys most of the time.
Things I don't like about this patch:
* yet another parameter for verifyHashAgainstScript()
* vm keys are not copied in/out
But it's rather simple and solves the problem for this particular case, so I
think it's worth it.
2019-12-10 19:13:29 +03:00
Evgenii Stratonikov
7179e4ba9f
util: add LE suffix to Uint256 methods
2019-12-06 12:16:55 +03:00
Evgenii Stratonikov
57efad912c
util: add LE suffix to Uint160 methods
2019-12-06 12:16:55 +03:00
Roman Khimov
8d4dd2d2e1
vm: move opcodes into their own package
...
This allows easier reuse of opcodes and in some cases allows to eliminate
dependencies on the whole vm package, like in compiler that only needs opcodes
and doesn't care about VM for any other purpose.
And yes, they're opcodes because an instruction is a whole thing with
operands, that's what context.Next() returns.
2019-12-03 18:22:14 +03:00
Evgenii Stratonikov
816d78b5ee
vm: redefine SHL/SHR limits based on integer size
2019-11-07 12:50:11 +03:00
Evgenii Stratonikov
439cd72294
vm: restrict BigInteger item size
2019-11-07 12:34:27 +03:00
Evgenii Stratonikov
7d40d2f71e
vm: make StepOut/StepOver match original VM behavior
2019-11-06 12:25:04 +03:00
Evgenii Stratonikov
9ebb793009
vm: revert SUBSTR offset behavior to NEO 2.x
2019-11-06 12:15:55 +03:00
067d9655bf
vm: restrict total stack item count
2019-11-06 11:03:43 +03:00
ed758458d5
vm: implement serialization interops in core package
2019-11-05 17:10:52 +03:00
25f77257ce
vm: implement Boolean and ByteArray item serialization
2019-11-05 15:15:39 +03:00
Roman Khimov
2f6e678a19
Merge pull request #463 from nspcc-dev/smartcontract-fixes
...
Smartcontract RPC fixes
2019-10-29 20:54:46 +03:00
Roman Khimov
47f66dfbf3
vm: add State() method to get a state description
2019-10-29 18:26:04 +03:00
c7f0b7bd68
vm: restrict max invocation stack size
2019-10-29 15:09:17 +03:00
Roman Khimov
ae7687422c
vm: clear state in Load()
...
Make VM usable after the first run.
2019-10-29 12:53:09 +03:00
Roman Khimov
f0cffe0d3f
vm: implement stack isolation opcodes, fix #192
...
No tests yet.
2019-10-25 18:25:12 +03:00
Roman Khimov
a9a2a3c711
vm: fix tests failing, follow-up to #426
...
Deal with input and transitional VM states properly.
2019-10-22 15:20:44 +03:00
Roman Khimov
3cbb699eb7
Merge pull request #426 from nspcc-dev/logger_247
...
Change fmt.Println to log, close #247 .
2019-10-22 14:41:30 +03:00
Vsevolod Brekelov
e2bfff8666
vm: removed mute mode and pushed logging to upper lvl
...
VM should be responsible for code execution and in case anyone interested in additional logging or errors they could handle them like we do it iin cli.
2019-10-22 13:44:14 +03:00
Evgenii Stratonikov
b2609786e9
vm: copy slice in NEWARRAY/NEWSTRUCT
...
When performing NEWARRAY on a Struct or NEWSTRUCT on a Array,
underlying slice needs to be copied, because when it's capacity
doesn't matches it's length, underlying storage will be used
for appends even if it is already pointed at by another slice.
2019-10-22 13:34:35 +03:00
Vsevolod Brekelov
f2805541cb
vm: fix style and comments
2019-10-21 14:22:17 +03:00
Evgenii Stratonikov
cae431b844
vm: restrict max item size in CAT
2019-10-17 17:09:42 +03:00
Evgenii Stratonikov
6d7016c3b9
vm: restrict max size in SETITEM
2019-10-17 12:17:06 +03:00
Evgenii Stratonikov
6f1f9e56bb
vm: restrict max size in PACK
2019-10-17 12:17:06 +03:00
Evgenii Stratonikov
2d56c66bde
vm: restrict max size in APPEND
2019-10-17 12:17:01 +03:00
Evgenii Stratonikov
8abcaeee6f
vm: restrict max size in NEWARRAY/NEWSTRUCT
2019-10-17 11:48:48 +03:00
Vsevolod Brekelov
591d5eafbe
vm: add stepInto,stepOver,stepOut
...
Original C# vm debugger behavior
2019-10-14 18:37:11 +03:00
Roman Khimov
dca332f333
vm: use new Context.Next() to properly dump programs
...
Fix #295 , deduplicate code and add `inspect` parameter to the vm command to
dump AVMs (`contract inspect` works with Go code).
2019-10-04 16:13:39 +03:00
Roman Khimov
53a3b18652
vm: completely separate instruction read and execution phases
...
Make Context.Next() return both opcode and instruction parameter if any. This
simplifies some code and needed to deal with #295 .
2019-10-04 16:13:39 +03:00
Roman Khimov
d62a367900
vm: add Value() method to Element
...
It gives access to the internal value's Value() which is essential for interop
functions that need to get something from InteropItems. And it also simplifies
some already existing code along the way.
2019-10-04 16:13:39 +03:00
Roman Khimov
0c963875af
vm: check for fault flag first in Run()
...
Switch cases are evaluated sequentially and the fault case is top-priority to
handle.
2019-10-04 16:13:39 +03:00
Roman Khimov
705c7f106f
vm: don't panic if there is no result in PopResult()
...
This function is intended to be ran outside of the execute's panic recovery
mechanism, so it shouldn't panic if there is no result.
2019-10-04 16:13:39 +03:00
Roman Khimov
a357d99624
vm: introduce MaxArraySize constant
...
This is both for #373 and for interop functions that have to check some
inputs.
2019-10-04 16:13:39 +03:00
Roman Khimov
da2156f955
vm: add batched RegisterInteropFuncs
2019-10-04 16:13:39 +03:00
Roman Khimov
26e3b6abbe
vm: extend interops to contain price
...
The same way C# node does.
2019-10-04 16:13:39 +03:00
Roman Khimov
ceca9cdb67
core/vm: implement contract storage and script retrieval
...
Fixes script invocations via the APPCALL instruction. Adjust contract state
field types accordingly.
2019-10-04 16:13:39 +03:00
Roman Khimov
c3591d8897
vm: fix CHECKMULTISIG to comply with NEO VM implementation
...
Testing with testnet quickly revealed that our code has an issue when the key
count doesn't equal signature count, fix it and add some comments.
2019-10-01 13:41:26 +03:00
Evgenii Stratonikov
c7c4291774
vm: simplify APPEND implementation a bit
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
13d7770c68
vm: support Map in ARRAYSIZE
...
Also make logic the same as in reference implementation
and add tests.
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
c66f493017
vm: compare Map by reference in EQUAL
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
c0be2b2a99
vm: support Map in REMOVE
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
8b6bddca3c
vm: support Map in PICKITEM and SETITEM
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
d7bb50c609
vm: implement VALUES opcode
2019-09-25 17:53:36 +03:00
Evgenii Stratonikov
2da64267b0
vm: implement KEYS opcode
2019-09-25 17:53:34 +03:00
Evgenii Stratonikov
0fb4bb05cf
vm: implement HASKEY opcode
2019-09-25 12:08:41 +03:00
Evgenii Stratonikov
df18da0ac9
vm: implement NEWMAP opcode
2019-09-24 17:06:17 +03:00
Roman Khimov
ca9c9be71f
vm: add CHECKSIG/VERIFY/CHECKMULTISIG implementations
...
Fix #269 .
2019-09-24 13:01:54 +03:00
Roman Khimov
3bbeb2476e
vm: introduce HasFailed() method and use it where appropriate
...
It's gonna be used by external modules.
2019-09-23 20:19:07 +03:00
Evgenii Stratonikov
3c53beca82
vm: restrict SHL/SHR arguments to -256..256
...
Also unify SHL/SHR implementation.
2019-09-23 15:13:10 +03:00
Evgenii Stratonikov
4a8be486f0
vm: do not pop items in OVER
2019-09-23 14:54:59 +03:00
Evgenii Stratonikov
7cd69ea8e2
vm: truncate length in SUBSTR
...
Also fail on first error, without changing the stack.
2019-09-23 14:54:59 +03:00
Evgenii Stratonikov
a88a8e13fc
vm: compare Array by reference in EQUAL
2019-09-23 13:25:59 +03:00
Evgenii Stratonikov
99f1d761ca
vm: clone Struct on APPEND
2019-09-23 13:25:59 +03:00
Evgenii Stratonikov
d2ccc3b017
vm: make REVERSE consume an item from stack
2019-09-16 15:50:51 +03:00
Evgenii Stratonikov
f0426ac2d5
vm: do nothing if SHL/SHR by 0
2019-09-16 15:50:51 +03:00
Evgenii Stratonikov
9eca5ee317
vm: convert SIZE argument to bytearray
2019-09-16 15:50:51 +03:00
Evgenii Stratonikov
9780889239
vm: make NEWARRAY/NEWSTRUCT accept bytearray
2019-09-16 15:50:51 +03:00
Evgenii Stratonikov
09e197eaf3
vm: make PUSH0 create empty bytearray
...
Also make tests expect []byte{} instead of 0.
2019-09-16 15:50:51 +03:00
Evgenii Stratonikov
66501f9ef9
vm: make REMOVE consume array from stack
2019-09-16 15:50:14 +03:00
Evgenii Stratonikov
71cfd14b92
vm: create an array of false
items in NEWARRAY/NEWSTRUCT
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
bafdb916a0
vm: make PICKITEM accept bytearrays
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
1881adabb9
vm: fail if NIP has not enough arguments
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
6e4014547d
vm: fail if DROP has no argument
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
729b7a0b24
vm: fail if ROT has not enough arguments
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
cf7fbb80ba
vm: fail if EQUAL has not enough arguments
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
d257044298
vm: fail if XTUCK argument is 0
2019-09-16 15:24:58 +03:00
Evgenii Stratonikov
68c6c93980
vm: do not allow APPEND to operate on bytearray
2019-09-11 17:17:37 +03:00
Evgenii Stratonikov
723dcc6e25
vm: make APPEND push no value on stack
2019-09-11 17:17:34 +03:00
Roman Khimov
8311bda355
vm: harden LEFT and RIGHT implementations against negative indexes
2019-09-11 14:51:04 +03:00
Roman Khimov
17f3a21e27
vm: harden SUBSTR implementation against bad index/offset values
...
The upper index bound for slices is capacity, not length. Check for negative
values also. Fixes #387 .
2019-09-11 14:37:41 +03:00
Roman Khimov
fc1075bf75
vm: protect PUSHDATA from short reads
...
Same thing done in a2a8981979
for PUSHBYTES,
failing to read the amount of bytes specified should lead to FAULT. Also
makes readUint16() and readUint32() panic as this is the behavior we want in
these cases. Add some tests along the way.
2019-09-11 12:35:37 +03:00
Evgenii
0b58ed4a22
vm: do not fault on LEFT with big index
...
Fixes #378 .
2019-09-09 17:29:31 +03:00
Roman Khimov
a039ae6cdb
Merge pull request #374 from nspcc-dev/makefile-and-gofmt
...
Makefile convenience targets and gofmt
2019-09-09 15:05:12 +03:00
Roman Khimov
a2a8981979
vm: fix not failing PUSHBYTES* on short read
...
Add some tests also. Fixes #361 .
2019-09-09 12:09:05 +03:00
Roman Khimov
fabd11699a
*: gofmt -s
...
Appy gofmt for all the source tree.
2019-09-09 12:02:24 +03:00
Roman Khimov
450063de7d
Merge pull request #362 from nspcc-dev/add-missing-opcodes-into-the-list
...
Add missing opcodes into the list
2019-09-09 11:24:39 +03:00
Roman Khimov
7b0c2781d2
vm: expand instruction list with commands from current VM spec
...
Current NEO documentation lists them:
https://docs.neo.org/docs/en-us/tooldev/advanced/neo_vm.html
CALL_* instructions were left out because of conflict with golint (but they're
removed in NEO 3.0 anyway, so wasting time on them makes no sense).
Update autogenerated instruction_string.go accordingly.
2019-09-08 20:46:35 +03:00
Evgenii
bcc8234155
vm: implement Array <-> Struct conversion
...
Reference VM implementation supports convertation from
Struct to Array via NEWARRAY and vice versa.
https://github.com/neo-project/neo-vm/pull/91
2019-09-08 13:40:21 +03:00
Roman Khimov
aefe572df3
vm: implement UNPACK, REVERSE, REMOVE opcodes
...
Also expand makeStackItem() to accept slices of int for testing
convenience. Fixes #195 .
2019-09-06 19:00:34 +03:00
Roman Khimov
b3ed3d24ee
vm: implement CAT, SUBSTR, LEFT and RIGHT
...
String instruction set.
2019-09-06 12:41:27 +03:00
Roman Khimov
3f40334979
vm: add generic stub for all unimplemented instructions
2019-09-05 17:35:30 +03:00
Roman Khimov
59de72f446
vm: implement INVERT instruction
2019-09-05 17:35:30 +03:00
Roman Khimov
b494e094c0
vm: add XDROP implementation
2019-09-05 17:35:30 +03:00
Roman Khimov
974f5db6bc
vm: add a TUCK implementation with tests
...
Also fix stack's InsertAt for the edge case of inserting into a position that
currently is empty (the first good TUCK test illustrates this).
2019-09-05 17:35:30 +03:00
Roman Khimov
eb224aeebe
vm: add some checks for OVER and PICK, add OVER tests
...
These actually behaved correctly because of deferred sigsegv recover, but I
think it would be nice to print something more meaningful for users.
2019-09-05 17:35:30 +03:00
Roman Khimov
85831e3e92
vm: fix XTUCK implementation, add tests
...
The code that we have actually implements XTUCK and not TUCK. And it's a bit
broken, so fix it and add some tests. The most interesting one (that required
to touch stack code) is the one when we have 1 element on the stack and are
trying to tell XTUCK to push 2 elements deep.
2019-09-05 17:34:25 +03:00
Roman Khimov
5f0f9e1638
vm: implement PICK instruction
2019-09-05 15:18:04 +03:00
Roman Khimov
fcf9c1213b
vm: implement the NZ opcode
2019-09-05 15:05:44 +03:00