Evgenii Stratonikov
edcfdb3bde
network: add MPT-related P2P payloads
2020-06-03 13:33:44 +03:00
Evgenii Stratonikov
20f190ef69
core: update MPT during block processing
2020-06-03 13:33:44 +03:00
Roman Khimov
029fecbb71
mpt: don't flush nodes already present in the DB
...
It's just a waste of time.
2020-06-03 00:37:30 +03:00
Roman Khimov
1b6aee42d5
mpt: restructure nodes a bit, implement serialization and hash cache
...
It drastically reduces the number of allocations and hash calculations.
2020-06-03 00:37:21 +03:00
Roman Khimov
fd73310a1c
Merge pull request #1007 from nspcc-dev/update-dbft-2.x
...
consensus: update dbft to include CountFailed and RecoveryMessage changes
2020-06-02 22:44:46 +03:00
Roman Khimov
e4f413aa29
consensus: update dbft to include CountFailed and RecoveryMessage changes
...
dbft interface changed a little also because of Neo 3 changes, but it still is
compatible with Neo 2.
2020-06-02 11:12:47 +03:00
Roman Khimov
2f90a06db3
Merge pull request #990 from nspcc-dev/feature/mpt
...
Initial MPT implementation (2.x)
2020-06-01 18:58:35 +03:00
Evgenii Stratonikov
314430be1d
mpt: implement NEO storage key conversion
2020-06-01 18:15:13 +03:00
Evgenii Stratonikov
103c45850a
mpt: implement (*Trie).Collapse()
...
Because trie size is rather big, it can't be stored in memory.
Thus some form of caching should also be implemented. To avoid
marshaling/unmarshaling of items which are close to root and are used
very frequenly we can save them across the persists.
This commit implements pruning items at the specified depth,
replacing them by hash nodes.
2020-06-01 18:15:13 +03:00
Evgenii Stratonikov
9c478378e1
mpt: implement JSON marshaling/unmarshaling
...
Because there is no distinct type field in JSONized nodes, distinction
is made via payload itself, thus all unmarshaling is done via
NodeObject.
2020-06-01 18:15:13 +03:00
Evgenii Stratonikov
31d9aeddd2
mpt: implement MPT proof Get and Verify
2020-06-01 18:14:19 +03:00
Evgenii Stratonikov
861a1638e8
mpt: implement MPT trie
...
MPT is a trie with a branching factor = 16, i.e. it consists of sequences in
16-element alphabet.
2020-06-01 18:14:19 +03:00
Roman Khimov
9a0d7d3254
transaction: gofmt -s
2020-05-30 15:48:57 +03:00
Roman Khimov
06bed2b4bf
dao: split GetStorageItem for Cached into external and internal versions
...
Lower Cached state shouldn't be changed until Persist. Fixes #994 .
2020-05-27 18:34:41 +03:00
Evgenii Stratonikov
b0d07c3031
vm: make Iterator interface public
...
There is nothing wrong with iterators being implemented in other parts
of code (e.g. Storage.Find). In this case type assertions can
prevent bugs at compile-time.
2020-05-27 11:40:46 +03:00
Evgenii Stratonikov
503442a60d
dao: restrict GetStorageItems by prefix
...
All storage items can still be retrived via zero-length prefix.
2020-05-27 11:40:46 +03:00
Evgenii Stratonikov
776bd85ded
vm,dao: return storage iterator from DAO in Storage.Find interop
...
Reproduce behavior of the reference realization:
- if item was Put in cache after it was encountered during
Storage.Find, it must appear twice
- checking if item is in cache must be performed in real-time
during `Iterator.Next()`
2020-05-27 11:40:46 +03:00
Evgenii Stratonikov
86ce234d5f
core: fix a typo in GetUnspentCoins interop
...
Fix a bug introduced in 8ed77f0d
.
2020-05-25 11:14:44 +03:00
Evgenii Stratonikov
eeeb05fc2c
compiler: restore support for GetUnspentCoins
...
Revert a587274
.
2020-05-22 13:24:44 +03:00
Evgenii Stratonikov
8ed77f0d25
core: make GetUnspentCoins interop return array, fix #978 .
2020-05-22 13:24:43 +03:00
Roman Khimov
fb9b2ae982
Merge pull request #975 from nspcc-dev/clone-struct-in-setitem-2.x
...
vm: clone struct item on SETITEM, close #972
2020-05-21 18:02:06 +03:00
Roman Khimov
f8b41e486c
vm: clone struct item on SETITEM, close #972
...
It's the same as with APPEND and VALUES.
2020-05-21 17:56:26 +03:00
Evgenii Stratonikov
a8fa68914a
vm: allow to convert Map item to bool
2020-05-21 17:53:19 +03:00
Roman Khimov
e07fd4f9f0
Merge pull request #973 from nspcc-dev/fix/refcount
...
vm: update stack size in SETITEM properly
2020-05-21 16:47:27 +03:00
Evgenii Stratonikov
cd8445aa59
vm: update stack size in SETITEM properly
2020-05-21 15:20:37 +03:00
Roman Khimov
60bca03577
crypto: add input data length check in (*PublicKey).DecodeBytes
...
DecodeBinary works with streams, so it can't do that, but DecodeBytes can and
should. Also fix unmarshalled binary buffer that this check exposed.
2020-05-21 14:28:16 +03:00
Roman Khimov
0ce3a12e87
core: check for key length in CheckWitness, fix #968
...
Only one type of keys is allowed here.
2020-05-21 14:27:41 +03:00
Roman Khimov
d0853c0471
Merge pull request #967 from nspcc-dev/fix-pickitem-and-vm-cli-2.x
...
Fix pickitem and vm cli 2.x
2020-05-21 13:37:35 +03:00
Roman Khimov
1721360dd1
vm: limit types accepted for PICKITEM, fix #965
...
bafdb916a0
change was wrong (probably brought
from neo-vm 3.0 at the state at which it existed back then), neo-vm 2.x
doesn't allow PICKITEM for arbitrary types.
2020-05-21 12:16:38 +03:00
Roman Khimov
328c6d7ce5
vm/cli: fix step command
...
It was setting a (wrong) breakpoint and couldn't then break out of it.
2020-05-21 12:15:50 +03:00
Roman Khimov
318ca55982
vm/cli: add push command to push something to the estack
2020-05-21 12:15:24 +03:00
Roman Khimov
5ec70b9fc2
Merge pull request #930 from nspcc-dev/fix/keys
...
Cache storage operations across same block tx executions
2020-05-21 11:08:42 +03:00
Evgenii Stratonikov
b96fe8173c
core,dao: implement Block-level storage caching
...
The order in which storage.Find items are returns depends on what items
were processed in previous transactions of the same block.
The easiest way to implement this sort of caching is to cache operations
with storage, flushing the only in `Persist()`.
2020-05-19 17:19:51 +03:00
Roman Khimov
03cc8c118f
Merge pull request #954 from nspcc-dev/fix/struct_fields
...
compiler: support using OP= with struct fields and slice elements
2020-05-19 16:03:42 +03:00
Roman Khimov
f0d6b0a639
Merge pull request #956 from nspcc-dev/doc-update-2.x
...
Documentation update for 2.x
2020-05-19 16:02:55 +03:00
Roman Khimov
0079dfb695
interop: add some top-level doc.go
2020-05-19 13:13:15 +03:00
Roman Khimov
8c19b8f2a1
compiler/interop: add support for working with witnesses
2020-05-19 13:13:15 +03:00
Roman Khimov
085d50b430
interop/util: extend documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
ec2bf7d52e
interop/transaction: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
a587274351
compiler|transaction: remove transaction.GetUnspentCoins support
...
It's useless. Even though there is Neo.Transaction.GetUnspentCoins syscall
that can be used, its return type is an interop structure that's not accepted
by any other syscall, so you can't really do anything with it. And there is no
such interface for the .net Framework.
2020-05-19 13:13:15 +03:00
Roman Khimov
514f862b81
compiler|transaction: fix transaction.GetScript build, add to interop
...
There is no such syscall as Neo.Transaction.GetScript and GetScript should be
available for contract's use.
2020-05-19 13:13:15 +03:00
Roman Khimov
d0a3ce25ff
compiler/storage: add read-only related interops
2020-05-19 13:13:15 +03:00
Roman Khimov
07742bdf46
interop/storage: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
dff0f724cd
interop/runtime: update documentation, fix Notify
...
Notify doesn't return anything!
2020-05-19 13:13:15 +03:00
Roman Khimov
eb82661f6b
compiler/iterator: add missing iterator.Concat function
...
We have a syscall for it, so it should be exposed.
2020-05-19 13:13:15 +03:00
Roman Khimov
a17bd6176f
interop/iterator: documentation update
2020-05-19 13:13:15 +03:00
Roman Khimov
31d7b07eb5
interop/input|output: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
6c0553da47
interop/header: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
d5d497ccd7
compiler: add support for enumerator interop package
2020-05-19 13:13:15 +03:00
Roman Khimov
8fb4bbca4e
interop/enumerator: update doc, fix Next return value
2020-05-19 13:13:15 +03:00
Roman Khimov
5cebd4a7a2
compiler/engine: add dynamic APPCALL generation, fix #914
...
Previously we could generate dynamic appcall with a kludge of
AppCall([]byte{/* 20 zeroes */, realScriptHash, args...)
Now there is a separate function for this.
2020-05-19 13:13:15 +03:00
Roman Khimov
78b2387640
interop/engine: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
10abac4362
interop/crypto: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
f0047b4055
interop/contract: update documentation, fix some interfaces
...
Some functions were just not correct in their interfaces.
2020-05-19 13:13:15 +03:00
Roman Khimov
a43f2234dd
core: fix Neo.Contract.GetStorageContext security check
...
This syscall should only work for contracts created by current transaction and
that is what is supposed to be checked here. Do so by looking at the
differences between ic.dao and original lower DAO.
2020-05-19 13:13:15 +03:00
Roman Khimov
5d941364bd
compiler/interop: expose GetTransactionHeight
...
And sort syscall names as they change the indentation anyway.
2020-05-19 13:13:15 +03:00
Roman Khimov
80b8b50f02
core: fix Neo.Blockchain.GetValidators implementation
...
It should return keys, attempting to push []*state.Validator to the stack
would probably lead to failure.
2020-05-19 13:13:15 +03:00
Roman Khimov
9e94895bb0
interop/blockchain: update documentation
2020-05-19 13:13:15 +03:00
Roman Khimov
d09c3b1e27
interop/block: update documentation, fix GetTransaction
...
GetTransaction never worked with hash, it works with indexes.
2020-05-19 13:13:15 +03:00
Roman Khimov
7abd35b358
compiler: add support for attribute syscalls
2020-05-19 13:13:15 +03:00
Roman Khimov
77c5f28b09
interop/attribute: update documentation
2020-05-19 13:13:14 +03:00
Roman Khimov
f69e654260
compiler: add missing asset syscalls, sort them
2020-05-19 13:13:14 +03:00
Roman Khimov
cbcc8e160f
asset: update documentation and fix Create/Renew
...
Both Create and Renew have things returned from them.
2020-05-19 13:13:14 +03:00
Evgenii Stratonikov
231a5189a2
compiler: allow using OP= with struct fields and slice elements
...
Do it in a generic way, there is no need in restricting to only
variables.
2020-05-19 12:42:37 +03:00
Roman Khimov
9c46e79745
compiler: add support for account syscalls
...
Turns out, they never functioned correctly.
2020-05-18 19:08:28 +03:00
Roman Khimov
83df376d17
account: add missing IsStandard interop function
...
There is a Neo.Account.IsStandard syscall, but we didn't have a wrapper for
it.
2020-05-18 19:08:28 +03:00
Roman Khimov
6dff01672c
interop/account: update and extend documentation
2020-05-18 19:08:28 +03:00
alexvanin
8db714785d
rpc/client: handle client creation error in new wsclient
...
Client returns error if it can't parse endpoint string. WSClient
should check client error or there could be panic at `cl.cli = nil`
expression.
2020-05-18 16:25:36 +03:00
Roman Khimov
8cd7bc7e07
rpc/client: deduplicate block/header tests a bit
...
The same data is copied at least three times here.
2020-05-14 17:28:14 +03:00
Roman Khimov
9546e021a9
rpc/block: rework the way Block is JSONized
...
Our block.Block was JSONized in a bit different fashion than result.Block in
its Nonce and NextConsensus fields. It's not good for notifications because
third-party clients would probably expect to see the same format. Also, using
completely different Block representation in result is probably making our
client a bit weaker as this representation is harder to use with other neo-go
components.
So use the same approach we took for Transactions and wrap block.Base which is
to be serialized in proper way.
2020-05-14 17:28:14 +03:00
Roman Khimov
83febead59
transaction: add json.Unmarshaler to Attribute
...
It actually was missing and it might affect Transaction conversion to/from
JSON.
2020-05-14 17:28:14 +03:00
Roman Khimov
8f55f0ac76
rpc/server: add notification filters
...
And check state string correctness on unmarshaling.
2020-05-14 17:28:14 +03:00
Roman Khimov
78716c5335
rpc/client: add support for notification filters
...
Differing a bit from #895 draft specification, we won't add `verifier` (or
signer) for Neo 2, it's not worth doing so at the moment.
2020-05-14 00:56:26 +03:00
Roman Khimov
da32cff313
rpc/server: don't panic on test failure
2020-05-14 00:56:26 +03:00
Roman Khimov
966ff28091
rpc: add subscriber queue overflow check
...
It's not practical adding server-side tests for 2.0 (as it requires generating
more blocks), so we'll leave it for 3.0.
2020-05-14 00:56:26 +03:00
Roman Khimov
1d5734c882
Merge pull request #944 from nspcc-dev/notifications-2.x
...
Notifications 2.x
2020-05-13 17:22:55 +03:00
Roman Khimov
9454ef5c28
core: improve locking in storeBlock
...
Getting batch, updating Prometheus metrics and pushing events doesn't require
any locking: batch is a local cache batch that no one outside cares about,
Prometheus metrics are not critical to be in perfect sync and events are
asynchronous anyway.
2020-05-13 17:17:41 +03:00
Roman Khimov
5464f9c3ae
rpc/client: add notifications support for WSClient
...
It differs from #895 design in that we have Notifications channel always
exposed as WSClient field, probably it simplifies things a little.
2020-05-13 17:17:41 +03:00
Roman Khimov
e1408b6525
rpc/server: add notification subscription
...
Note that the protocol differs a bit from #895 in its notifications format,
to avoid additional server-side processing we're omitting some metadata like:
* block size and confirmations
* transaction fees, confirmations, block hash and timestamp
* application execution doesn't have ScriptHash populated
Some block fields may also differ in encoding compared to `getblock` results
(like nonce field).
I think these differences are unnoticieable for most use cases, so we can
leave them as is, but it can be changed in the future.
2020-05-13 17:17:41 +03:00
Roman Khimov
29ada4ca46
smartcontract: add JSON marshal/unmarshal for InteropType
...
We actually have to do that in order to answer getapplicationlog requests for
transactions that leave some interop items on the stack. It follows the same
logic our binary serializer/deserializes does leaving the type and stripping
the value (whatever that is).
2020-05-13 17:17:41 +03:00
Roman Khimov
d5df1212c2
rpc/server: start and shutdown Server in tests
...
It will be important for proper subscription testing and it doesn't hurt even
though technically we've got two http servers listening after this change (one
is a regular Server's http.Server and one is httptest's Server). Reusing
rpc.Server would be nice, but it requires some changes to Start sequence to
start Listener with net.Listen and then communicate back its resulting
Addr. It's not very convenient especially given that no other code needs it,
so doing these changes just for a bit cleaner testing seems like and
overkill.
Update config appropriately. Update Start comment along the way.
2020-05-12 17:42:34 +03:00
Roman Khimov
d686fe4e5d
network: get blocks directly from the chain for rebroadcasting
...
Simplify network<->consensus relations, also broadcast blocks received by
other means like RPC.
2020-05-12 17:42:34 +03:00
Roman Khimov
dd8bcfae47
consensus: remove OnNewBlock(), use Blockchain subscription
...
Get new blocks directly from the Blockchain. It may lead to some duplications
(as we'll also receive our own blocks), but at the same time it's more
correct, because technically we can also get blocks via other means besides
network server like RPC (submitblock call). And it simplifies network server
at the same time.
2020-05-12 17:41:23 +03:00
Roman Khimov
1ac4f8528d
core: add Blockchain event subscription mechanism
...
A deep internal part of #895 . Blockchainer interface is also extended for
various uses of these methods.
2020-05-12 17:41:15 +03:00
Roman Khimov
2e58a14978
core: improve documentation a little
2020-05-12 17:20:31 +03:00
Roman Khimov
3db14b4699
wallet: check for t.GetSignedPart() result correctness
...
It can return nil easily and signing that is a big mistake.
2020-05-07 21:48:45 +03:00
Roman Khimov
943d435cd2
core: ensure we produce correct blocks for tests
...
Blocks must have at least one transaction and we should check for correct
merkle root generation.
2020-05-07 21:46:28 +03:00
Roman Khimov
a1d8206ef7
Merge pull request #935 from nspcc-dev/fix/slice
...
compiler: support implicit type in function arguments
2020-05-06 18:30:01 +03:00
Evgenii Stratonikov
37813f1020
compiler: support implicit type in function arguments
...
Go supports declaring multiple arguments of the same type without
duplicating type name. Now we support this too.
2020-05-06 18:20:13 +03:00
Evgenii Stratonikov
922aff1fcc
compiler: support named returns
2020-05-06 18:15:52 +03:00
Evgenii Stratonikov
b2a3cee451
compiler: support using return
in some branches
...
When `return` is used in one codepath, but not the other,
we do not clean altstack properly. This commit fixes it.
2020-05-06 18:15:50 +03:00
Evgenii Stratonikov
2a6be8ceef
compiler: allow to use return
with no arguments
2020-05-06 17:23:32 +03:00
Roman Khimov
e097e86bfa
Merge pull request #921 from nspcc-dev/rpc-websocket-2.x
...
RPC over websocket (2.x)
2020-05-04 13:55:19 +03:00
Anna Shaleva
99d0bafa2c
compiler: add ability to generate .abi.json file
...
A part of integration with NEO Blockchain Toolkit (see #902 ). To be
able to deploy smart-contract compiled with neo-go compiler via NEO
Express, we have to generate additional .abi.json file. This file
contains the following information:
- hash of the compiled contract
- smart-contract metadata (title, description, version, author,
email, has-storage, has-dynamic-invoke, is-payable)
- smart-contract entry point
- functions
- events
However, this .abi.json file is slightly different from the one,
described in manifest.go, so we have to add auxilaury stractures for
json marshalling. The .abi.json format used by NEO-Express is described
[here](https://github.com/neo-project/neo-devpack-dotnet/blob/master/src/Neo.Compiler.MSIL/FuncExport.cs#L66 ).
2020-05-04 08:31:14 +03:00
Anna Shaleva
592fd068b1
compiler: fix bug with missing methods parameters
...
Method `methodInfoFromScope(...)` always returned an empty parameters
set, so we were missing this information in both .abi.json and
.debug.json files. Fixed now.
2020-05-04 08:31:09 +03:00
Roman Khimov
556ab39a5a
rpc/client: add minimalistic websocket client
2020-04-30 22:59:19 +03:00
Roman Khimov
6333060897
rpc/client: separate out http-related functionality
2020-04-30 22:59:19 +03:00
Roman Khimov
38f9b511ae
rpc/client: drop Version from Options
...
It makes no sense at all, it's a JSON-RPC version.
2020-04-30 22:59:19 +03:00
Roman Khimov
e32367a1c2
rpc/client: fix some comments
2020-04-30 22:59:19 +03:00
Roman Khimov
a49f2bc47c
client: remove Balancer getter/setter, make it an Option
...
Keep it internal to the client instance, it makes no sense exposing it to the
outside user.
2020-04-30 22:59:19 +03:00
Roman Khimov
00d6439eb2
client: make http.Client internal to the Client
...
Exposing it the outside users is strange, so incapsulate it completely.
Fix DialTimeout setting along the way, handle negative timeouts as invalid.
2020-04-30 22:59:01 +03:00
Roman Khimov
24b46c6041
rpc/server: add websockets support via '/ws' URL
2020-04-30 17:53:28 +03:00
Roman Khimov
3eb6d266ca
rpc/server: use httptest.Server for testing
...
Which allows to reuse it for websockets.
2020-04-30 17:52:42 +03:00
Roman Khimov
3d2a2af575
rpc: shuffle handleHttpRequest/handleRequest responsibilities
...
Make handleRequest reusable in other contexts like websockets.
2020-04-30 17:52:15 +03:00
Roman Khimov
dbe7be5b00
rpc: change handlers to always return response.Error for errors
...
As it's expected by WriteErrorResponse() actually.
2020-04-30 17:52:15 +03:00
Roman Khimov
21c31d7d24
rpc/server: refactor handler methods a little
...
request.In is a natural request representation, one can always get
request.Params from it.
2020-04-30 17:52:13 +03:00
Anna Shaleva
87b0e76a8c
rpc, smartcontract: move contract metadata to smartcontract package
2020-04-29 13:50:05 +03:00
Anna Shaleva
c813873577
consensus: added partial message decoding
...
closes #849
2020-04-16 17:16:29 +03:00
Roman Khimov
bfaa025a34
Merge pull request #839 from nspcc-dev/feature/badgerdb_support
...
storage: add support of BadgerDB
2020-04-09 15:57:50 +03:00
Anna Shaleva
54cdfe4a23
storage: add support of BadgerDB
...
closes #820
2020-04-09 13:55:59 +03:00
Roman Khimov
54a95810a4
Merge pull request #833 from nspcc-dev/test/vm_calls
...
vm: missing tests for CALL* instructions
2020-04-09 12:12:41 +03:00
Anna Shaleva
9f0bc2aaf5
vm: add tests to CALL* instructions
...
closes #452
2020-04-09 11:20:39 +03:00
Evgenii Stratonikov
c71ad6a5db
cli: output contract after compiling only with --verbose flag
...
Also remove Debug from compiler option as it is used only in CLI.
2020-04-08 13:09:51 +03:00
Evgenii Stratonikov
ee0ba9b1b4
core: make SpawnVM a method of context
...
spawnVMWithInterops is rather long too type and
it doesn't use Blockchain in any way.
2020-04-08 08:38:45 +03:00
Evgenii Stratonikov
a71cd0961e
core/dao: remove unnecessary slice type
...
It is used only once, so a simple `sort.Slice`
invocation will suffice.
2020-04-08 08:38:45 +03:00
Evgenii Stratonikov
030b7754ad
core: move DAO to a separate package
2020-04-08 08:38:44 +03:00
Anna Shaleva
495c1b0565
vm: add tests for missing bit and numeric operations
...
Added tests for:
- bit operatoins: AND, OR, XOR
- numeric operations: BOOLOR, MIN, MAX, WITHIN, NEGATE
2020-04-07 18:10:31 +03:00
Roman Khimov
4e0c3fab0f
Merge pull request #811 from nspcc-dev/feature/debug
...
compiler: support neo-debugger
2020-04-06 19:18:13 +03:00
Evgenii Stratonikov
da826522f8
compiler: set variable index on first declaration
...
This way variables will have indices corresponding to their
order of appearance in a source file.
2020-04-06 15:30:07 +03:00
Evgenii Stratonikov
457e7e006a
compiler: support exporting method variables in debug info
2020-04-06 15:30:07 +03:00
Evgenii Stratonikov
5bdee683e6
cli,compiler: support emitting debug info in a file
2020-04-06 15:30:07 +03:00
Evgenii Stratonikov
5d3da26e1e
compiler: support sequence points in debug info
...
Sequence points is a way to map a specific instruction offset
from a compiled contract to a text span in a source file.
This commit implements mapping only for `return` statements.
Further improvements are straight-forward.
2020-04-06 15:30:07 +03:00
Evgenii Stratonikov
24fef35ead
compiler: split Compile info sub-functions
...
Also add tests for basic debug info.
2020-04-06 15:30:07 +03:00
Evgenii Stratonikov
00c40b58aa
compiler: record basic debug info
...
Save info about method's byte-code sections.
2020-04-06 15:30:06 +03:00
Roman Khimov
9997661998
Merge pull request #821 from nspcc-dev/fix-cache-propagation-to-invocations
...
core: wrap cached dao properly, don't miss cached data
2020-04-06 11:52:41 +03:00
Evgenii Stratonikov
96806262bf
vm: handle negative arguments in SHL/SHR
...
Do it as in reference implementation: a >> -b == a << b.
2020-04-06 10:46:35 +03:00
Roman Khimov
83a02f42f7
Merge pull request #825 from nspcc-dev/fix/compiler
...
compiler: accept varargs in `runtime.Notify`
2020-04-06 10:08:02 +03:00
Evgenii Stratonikov
1fcc019bf3
rpc: update test chain
...
Also provide info for getblockheader RPC while
generating test chain.
2020-04-06 09:31:09 +03:00
Evgenii Stratonikov
004023920e
rpc: use Notify with varargs in the test contract
2020-04-06 09:31:09 +03:00
Evgenii Stratonikov
efad66aee1
compiler: make Notify accept varargs
2020-04-06 09:31:09 +03:00
Evgenii Stratonikov
0023c4f1f6
vm: use truncated division in MOD
...
Mimic C#'s `%` behavior.
Related 4b44190
(#773 ).
2020-04-06 09:30:48 +03:00
Roman Khimov
5f09381cf4
core: wrap cached dao properly, don't miss cached data
...
Fixes #817 where invoked contract missed updated account information because
it got it one layer below cachedDao used to process the block.
2020-04-03 10:15:11 +03:00
Roman Khimov
f64aa201c7
Merge pull request #819 from nspcc-dev/fix/util160_marshalling
...
smartcontract: fix uint160 marshalling in smartcontract.Parameter
2020-04-01 22:04:30 +03:00
Anna Shaleva
5a62eb923e
smartcontract: fix uint160 marshalling in smartcontract.Parameter
...
There's a bug after #785 : smartcontract.Parameter of type hash160 should
be marshalled in LE (as default marshaller for uint160 does) instead of
BE, so fixed.
2020-04-01 20:48:46 +03:00
Roman Khimov
2d0ad30fcf
vm: rework Map with internal slice representation
...
Which makes iterating over map stable which is important for serialization and
and even fixes occasional test failures. We use the same ordering here as
NEO 3.0 uses, but it should also be fine for NEO 2.0 because it has no
defined order.
2020-04-01 19:33:53 +03:00
Roman Khimov
25201d480d
smartcontract: simplify Array JSON marshalling
2020-04-01 19:21:00 +03:00
Roman Khimov
3dbe549a61
smartcontract: store MapType Parameter as a slice of KV pairs
...
Fixes #809 .
Basically, there are three alternative approaches to fixing it:
* allowing both []byte and string for ByteArrayType value
minimal invasion into existing code, but ugly as hell and will probably
backfire at some point
* storing string values in ByteArrayType
incurs quite a number of type conversions (and associated data copying),
though note that these values are not changed usually, so dynamic
properties of []byte are almost irrelevant here
* storing only []byte values in ByteArrayType
makes it impossible to use them as map keys which can be solved in several
ways:
- via an interface (Marshalable)
which is good, but makes testing and comparing values in general harder,
because of keys mismatch
- using serialized Parameter as a key (in a string)
which will need some additional marshaling/unmarshaling
- converting MapType from map to a slice of key-value pairs
not a bad idea as we don't use this map as a map really, the type
itself is all about input/output for real VM types and this approach is
also a bit closer to JSON representation of the Map
2020-04-01 19:21:00 +03:00
Evgenii Stratonikov
a43c9b9246
compiler: calculate stack size more precisely
...
When calculating number of local variables, only
defining assignments (i.e. via `:=`) must be taken into account.
2020-04-01 17:36:19 +03:00
Roman Khimov
9b5dab57e8
Merge pull request #810 from nspcc-dev/refactor/config
...
config: move config.go out of config
2020-04-01 10:29:57 +03:00
Anna Shaleva
5a984fdf88
config: move config.go out of config/
...
closes #423
2020-03-31 17:55:59 +03:00
Anna Shaleva
a8fa9c9244
vm: add tests to stack_item.go
...
closes #199
2020-03-31 17:18:13 +03:00
Roman Khimov
e41853d0a4
Merge pull request #789 from nspcc-dev/fix/tx_specific_data_marshalling
...
rpc: fix marshalling of type-specific tx data
2020-03-30 16:10:25 +03:00
Anna Shaleva
9c09ad9c89
rpc: fix marshalling of type-specific tx data
...
closes #585
2020-03-30 15:48:50 +03:00
Roman Khimov
6f13455cc9
Merge pull request #800 from nspcc-dev/fix/slice
...
compiler: declare compoud types with var keyword
2020-03-30 00:14:59 +03:00
Roman Khimov
92bafffcd8
Merge pull request #805 from nspcc-dev/fix-rpc-invocation-json
...
rpc: fix stack field name for invocation results
2020-03-29 13:41:46 +03:00
Roman Khimov
237de73dec
Merge pull request #807 from nspcc-dev/optimize-memcached-persist
...
storage: optimize (*MemCachedStore).Persist for memory-backed ps
2020-03-29 13:41:21 +03:00
Roman Khimov
0d482ceb7f
Merge pull request #808 from nspcc-dev/fix-map-serialization
...
vm: make map serialization more compatible with C#
2020-03-29 13:40:52 +03:00
Roman Khimov
665bf78d11
vm: make map serialization more compatible with C#
...
C# pushes value and key to the stack of non-serialized items, so key gets
serialized first followed by value. Fixes #806 .
Notice though that neither IDictionary in C#, nor map in Go have elements
ordered, so we can easily get a difference in KV pairs order and it would be
impossible to fix.
2020-03-28 17:25:42 +03:00
Roman Khimov
4758de71ec
storage: optimize (*MemCachedStore).Persist for memory-backed ps
...
Most of the time it's persisted into the MemoryStore or MemCachedStore, when
that's the case there is no real need to go through the Batch mechanism as it
incurs multiple copies of the data.
Importing 1.5M mainnet blocks with verification turned off, before:
real 12m39,484s
user 20m48,300s
sys 2m25,022s
After:
real 11m15,053s
user 18m2,755s
sys 2m4,162s
So it's around 10% improvement which looks good enough.
2020-03-28 17:21:50 +03:00
Roman Khimov
2316e2c4a7
rpc: fix stack field name for invocation results
...
Follow C# implementation:
https://docs.neo.org/docs/en-us/reference/rpc/latest-version/api/invokefunction.html
2020-03-28 13:59:42 +03:00
Anna Shaleva
0be237beb6
rpc: fix double-pointer bugs in RPC Client
...
Fixed double-pointer bug in following methods:
- GetRawTransactionVerbose
- GetBlockVerbose
- GetBlockHeader
- GetTxOut
- ValidateAddress
2020-03-27 16:04:11 +03:00
Evgenii Stratonikov
3cbd138b67
compiler: allow to declare variables of struct type
...
Previously, struct variables were initialize with VM's nil value
which is of primitive type. Thus SETITEM used for struct's field
updating wasn't working.
2020-03-27 13:50:09 +03:00
Evgenii Stratonikov
6baed7a010
compiler: allow to declare slices of compound types
...
Previously this declarations were ignored which resulted
in runtime errors, because VM's nil is an element of primitive type
and can't be converted to an array.
2020-03-27 13:50:09 +03:00
Roman Khimov
c738975b7b
Merge pull request #803 from nspcc-dev/feature/appcall
...
emit: implement AppCallWithOperationAndArgs
2020-03-27 13:30:48 +03:00
Evgenii Stratonikov
db2dccf7cb
emit: implement AppCallWithOperationAndArgs
...
It is nice to have a typical task of calling contract method
with specific arguments incapsulated inside some function.
2020-03-27 11:05:36 +03:00
Evgenii Stratonikov
0036b3e52b
random: make use or random package in tests
...
Also implement Bytes/Fill routines for generating byte slices.
2020-03-27 10:27:46 +03:00
Evgenii Stratonikov
9abda40171
testserdes: implement helpers for encode/decode routines
...
Frequently one needs to check if struct serializes/deserializes
properly. This commit implements helpers for such cases including:
1. JSON
2. io.Serializable interface
2020-03-27 10:27:46 +03:00
Anna Shaleva
37cb60a0b5
compiler/interop: add missing methods to interop.Iterator
...
Add Next() and Value() to interop.Iterator and corresponding syscalls to
compiler
2020-03-26 16:39:10 +03:00
Evgenii Stratonikov
f0b6f783aa
compiler: allow for loops with empty condition
2020-03-26 15:00:14 +03:00
Evgenii Stratonikov
4522eed1bb
vm: fix offset for CALLI opcode
...
It is different from other JMP* and +2 should be added to the parameter.
2020-03-26 13:09:55 +03:00
Roman Khimov
396c78c722
Merge pull request #793 from nspcc-dev/update/boltdb
...
go.mod: update boltdb to v1.3.4
Related to #771 .
2020-03-25 17:33:54 +03:00
Evgenii Stratonikov
4e92642dec
rpc: allow to unmarshal integer params from string
2020-03-25 17:23:13 +03:00
Evgenii Stratonikov
fcc4877f43
go.mod: update boltdb to v1.3.4
...
Also import lib as declared in it's go.mod:
via `go.etcd.io/bbolt`.
2020-03-25 17:07:54 +03:00
Evgenii Stratonikov
5f876aaeda
smartcontract: do not require pointer in MarshalYAML
...
It is a single byte anyway.
Now `contract init` works properly.
2020-03-25 16:26:39 +03:00
Evgenii Stratonikov
43495a49f4
rpc: reuse handlers map for prometheus metrics
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
57f37bc7a0
rpc: add metrics for invoke* RPCs
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
2ed417388b
rpc: unify RPC handlers
...
Move all of them to a map. This can make it easier
to add/remove RPC based on plugins and makes code less verbose.
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
8236217a01
rpc: make all handler have the same signature
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
6e801d33f0
rpc: make a separate handler for every RPC
...
Move getbestblockhash, getblockcount, getconnectioncount RPC.
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
969ed6e6e1
rpc: move getaccountstate/getunspents RPCs to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
2ec5b9f08a
rpc: move getblock RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
e442ebdb69
rpc: move getblockhash RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
90fdde4018
rpc: move getversion RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
99d02d5de0
rpc: move getpeers RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
dfb4171e3c
rpc: move getrawmempool RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
4e25c9121b
rpc: move validateaddress RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
70eb0b175a
rpc: move getassetstate RPC to a separate func
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
9e6785bed9
rpc: unify counter metrics update
2020-03-25 15:25:12 +03:00
Evgenii Stratonikov
c992d6c518
core: reuse buffer in (*cacheddao).Persist()
...
When serializing multiple accounts, cost of a buffer grow
can become significant. This commit tries to amortize it by
reusing the same buffer in a single `Persist()` call.
2020-03-25 13:13:54 +03:00
Anna Shaleva
6998c5044b
rpc: add testing infrastructure to RPC client package
...
closes #716
NOTE: RPC client tests contain `serverResponse` json data fetched from examples
published in official C# JSON-RPC API v2.10.3 reference
(see https://docs.neo.org/docs/en-us/reference/rpc/latest-version/api.html )
2020-03-24 16:02:08 +03:00
Anna Shaleva
8e05bfe99c
rpc/crypto: fix validator field marshalling in getvalidators RPC server
...
Problem: wrong `PublicKey` field json marshalling of result.Validator
Solution: add marshaller to publickey (crypto)
2020-03-24 15:52:51 +03:00
Anna Shaleva
ca12c75b12
rpc: fix name of json nep5balance field
...
Problem: wrong json field name of result.NEP5Balances.Balances
(see for details:
https://github.com/neo-project/neo-modules/blob/master-2.x/RpcNep5Tracker/RpcNep5Tracker.cs#L295 )
Solution: rename field from `balances` to `balance` to be consistent with C# client
2020-03-24 14:55:20 +03:00
Anna Shaleva
4911837949
rpc: fix wrong script marshalling in getcontractstate RPC server
...
problem: `script` field of result.ContractState is marshalled as []byte
solution: add marshaller for result.ContractState
2020-03-24 14:55:20 +03:00
Anna Shaleva
79f7862496
rpc: fix blockheader marshalling in getblockheader RPC server
...
Problem: wrong json marshalling of `nextconsensus` field of
result.Header
Solution: change field type from util.uint160 to address string
2020-03-24 14:55:20 +03:00
Roman Khimov
751e79d480
Merge pull request #785 from nspcc-dev/feature/uint160_marshalling
...
util: JSONify uint160 using LE instead of BE
2020-03-24 12:41:07 +03:00
Evgenii Stratonikov
dc8fb13021
vm: make NewBigInteger accept int64
...
It is more correct upconvert to int64 if needed,
so precision is never lost.
2020-03-24 11:10:56 +03:00
Roman Khimov
5148b98f43
Merge pull request #773 from nspcc-dev/fix/bigint
...
vm: use truncated division for Integers
2020-03-23 18:01:21 +03:00
Anna Shaleva
2187346158
rpc: fix json marshalling of result.AssetState
...
Modified result.AssetState:
- removed `FeeMode` and `FeeAddress` fields
- fixed json name of `ID` and `AssetType` fields
to be consistent with C# RPC server
2020-03-23 17:44:15 +03:00
Anna Shaleva
2001a40312
util: JSONify uint160 using LE instead of BE
...
closes #769
2020-03-23 17:38:58 +03:00
Evgenii Stratonikov
6ed2bd63b9
core: marshal AppExecResult.Stack as an array
...
Closes #782 .
2020-03-23 16:27:47 +03:00
Evgenii Stratonikov
6ac69d075e
smartcontract: implement io.Serializable for Parameter
2020-03-23 16:27:47 +03:00
Evgenii Stratonikov
0f17b9be1d
smartcontract: use int64 for Integer parameter value
2020-03-23 16:24:57 +03:00
Roman Khimov
b37c5939f8
Merge pull request #780 from nspcc-dev/fix/776
...
vm: allow to push integer-like items to stack
2020-03-18 13:27:31 +03:00
Evgenii Stratonikov
954e8cdcf1
vm: allow to push integer-like items to stack
...
Perform automatic conversion of non-standard integer types to
int64 if possible.
Closes #776 .
2020-03-18 12:58:31 +03:00
Evgenii Stratonikov
9666e99a17
smartcontract: marshal Integer values to JSON-strings
...
It is done so in C# implementation, we better be
as compatible as possible.
Closes #770 .
2020-03-18 11:58:17 +03:00
Evgenii Stratonikov
1e7b47ec05
smartcontract: always use int64 for integers
...
It is good when internal representation is unique.
2020-03-18 11:58:17 +03:00
Roman Khimov
8400f0add2
mempool: gofmt -s
2020-03-17 16:47:51 +03:00
Evgenii Stratonikov
4b44190485
vm: use truncated division for Integers
...
When divisor is negative, the result is truncated towards
zero.
2020-03-17 15:45:56 +03:00
Evgenii Stratonikov
dfbb84ef38
rpc: support https
...
Allow to start TLS RPC server on a separate port.
Closes #702 .
2020-03-17 12:44:23 +03:00
Roman Khimov
ec76a0bf15
mempool: disallow more than one issue tx at once
...
Technically they could conflict for available asset amount, but as they're
very rare (and even can be considered obsolete) we can simplify this check.
2020-03-17 11:40:01 +03:00