neo-go/pkg/core
Anna Shaleva effba1fa47 core: ensure System.Runtime.GetNotifications can't break MaxStackSize
This test ensures that NeoGo node doesn't have the DeepCopy problem
described in https://github.com/neo-project/neo/issues/3300 and fixed in
https://github.com/neo-project/neo/pull/3301. This problem leads to the
fact that Notifications items are not being properly refcounted by C#
node which leads to possibility to build an enormously large object on
stack. Go node doesn't have this problem.

The reason (at least, as I understand it) is in the fact that C# node
performs objects refcounting inside the DeepCopy even if the object
itself is not yet on stack. I.e. System.Runtime.Notify handler
immediately adds references to the notification argumetns inside
DeepCopy:
b1d27f0189/src/Neo.VM/Types/Array.cs (L108)
b1d27f0189/src/Neo.VM/Types/Array.cs (L75)

Whereas Go node just performs the honest DeepCopy without references counting:
b66cea5ccc/pkg/vm/stackitem/item.go (L1223)

Going further, C# node clears refs for notification arguments (for array
and underlying array items). System.Runtime.GetNotifications pushes the
notificaiton args array back on stack and increments counter only for
the external array, not for its arguments. Which results in negative
refcounter once notificaiton is removed from the stack. The fix itself
(f471c0542d/src/Neo/SmartContract/NotifyEventArgs.cs (L84))
doesn't need to be ported to NeoGo because Go node adds object to the
refcounter only at the moment when it's being pushed to stack by
System.Runtime.GetNotifications handler. This object is treated as new
object since it was deepcopied earlier by System.Runtime.Notify handler:
b66cea5ccc/pkg/vm/stack.go (L178).

Thus, no functoinal changes from the NeoGo side. And we won't
intentionally break our node to follow C# pre-Domovoi invalid behaviour.

Close #3484, close #3482.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
2024-06-11 17:51:41 +03:00
..
block consensus: fetch dbft pre-0.2.0 version 2024-03-25 19:21:50 +03:00
chaindump *: use require.ErrorIs instead of require.True(t, error.Is()) 2023-05-04 17:03:47 +03:00
dao dao: do not remove block executable by conflict record stub 2024-05-16 12:13:41 +03:00
fee vm: add ABORTMSG and ASSERTMSG opcodes 2023-08-10 12:41:30 +03:00
interop interop: use executing contract state for permissions checks 2024-06-03 12:32:10 +03:00
mempool *: replace go.uber.org/atomic with sync/atomic 2023-10-12 17:59:34 +03:00
mempoolevent *: replace interface{} with any keyword 2023-04-04 13:22:42 +03:00
mpt *: replace slice.Copy with bytes.Clone 2024-03-05 13:54:10 +03:00
native core: move P2PNotary node role out of P2PSigExtensions 2024-05-21 12:10:47 +03:00
state state: drop NativeContract, fix #3430 2024-05-16 18:46:46 +03:00
stateroot *: replace go.uber.org/atomic with sync/atomic 2023-10-12 17:59:34 +03:00
statesync *: replace slice.Copy with bytes.Clone 2024-03-05 13:54:10 +03:00
storage storage: bytes.Clone(nil) == nil 2024-05-16 19:29:11 +03:00
test_data core: refactor helper test contracts generation 2022-03-30 11:46:29 +03:00
transaction dao: fix transaction application log decoding 2024-05-16 12:13:41 +03:00
basic_chain_test.go config: add a special Blockchain type to configure Blockchain 2022-12-07 17:35:53 +03:00
bench_test.go core: make GetHeaderHash accept uint32 2022-11-25 14:30:51 +03:00
blockchain.go core: adjust prevHeader nil check 2024-06-05 11:53:52 +03:00
blockchain_core_test.go core: distinguish empty Hardforks map from nil 2024-04-25 13:26:54 +03:00
blockchain_neotest_test.go core: ensure System.Runtime.GetNotifications can't break MaxStackSize 2024-06-11 17:51:41 +03:00
doc.go *: apply go 1.19 formatter heuristics 2022-08-09 15:37:52 +03:00
headerhashes.go *: use v2 LRU, fix #3322 2024-03-05 18:39:17 +03:00
helper_test.go *: add GenesisTransaction extension to the protocol configuration 2023-10-19 18:33:50 +03:00
interops.go core: add System.Runtime.CurrentSigners syscall 2023-11-20 14:46:27 +03:00
native_designate_test.go *: introduce Genesis protocol configuration 2023-10-19 18:30:20 +03:00
prometheus.go core: distinguish notarypool/mempool metrics 2023-04-13 18:40:19 +03:00
util.go *: add GenesisTransaction extension to the protocol configuration 2023-10-19 18:33:50 +03:00
util_test.go *: add GenesisTransaction extension to the protocol configuration 2023-10-19 18:33:50 +03:00