Releases: nspcc-dev/neo-go
Yarborough
Another one 3.5.0-compatible version that is aimed to fix T5 testnet state difference that has happened at block 2336911 which leads to inability to process new blocks since 2418703. The issue is fixed by allowing JSON numbers unmarshalling from scientific notation to Integer stackitem. Maximum parsing precision for such numbers is currently restricted by 53 bits. This is a temporary C#-compatible solution that is likely to change in the future versions when an appropriate C# node bug is fixed (neo-project/neo#2879).
A set of minor bug fixes is included as well to flush some of the long-awaited changes that were blocked by the 0.102.0 release delay (caused by v3.6.0 C# node release delay). In particular, invalid headers returned by an RPC server for error responses, invalid format of incremental dumps created by CLI and deadlock on unhealthy RPC server shutdown. Long-awaited --config-file
CLI option to start the node providing a single configuration file is added.
T5 testnet chain requires a complete resynchronization for this version. Mainnet chain resynchronization is recommended, but not required.
New features:
--config-file
CLI option allowing to start the node with a single configuration file (#3014)
Improvements:
- blockchain Notary and Oracle services documentation improvement (#2972)
- BoltDB (
go.etcd.io/bbolt
) dependency upgrade that fixes a number of Windows-related issues (#3034)
Bugs fixed:
- panic on node start with invalid configuration (#2968)
- deadlock on unhealthy RPC server shutdown (#2966)
- improper WSClient notification channels managing after disconnection (#2980)
- missing Prometheus metric initialisation on node start (#2992)
- invalid initialisation of native contracts cache (#2994)
- incorrect way of incremental DB dumps creation (#3047)
- Notary contract is allowed to be a sender of main Notary request transaction (#3065)
- discrepancy in signer's witness scope parsing on the RPC server side (#3060)
- Invoker calling API isn't allowed to accept nil parameter (#3067)
- contract RPC Client unwrapper helper can't handle missing contract case (#3072)
- JSON numbers can't be unmarshalled to stackitem from scientific notation (#3073)
- invalid content-type header returned by RPC server on error responses (#3075)
Yuckiness
Yet another 3.5.0-compatible emergency version that removes scrupulous instructions check of smart contract's script on contract deployment or update. Presence of this check leads to the known T5 testnet state incompatibility (since 1670095) which causes inability to process new blocks (since 2272533). It should be noted that the corresponding check was accidentally removed from the reference C# node implementation way back in neo-project/neo#2266 and added again in neo-project/neo#2849 which is planned to be a part of the upcoming 3.6.0 C# node release. Thus, changes made in the presented 0.101.3 release will be reverted afterwards and strict contract script check will be present in the next 3.6.0-compatible version of NeoGo node.
T5 testnet chain requires a complete resynchronization for this version. Mainnet chain resynchronization is recommended.
Bugs fixed:
- extra strict contract script check on contract deployment or update is removed (#3052)
Excavation
One more (and unexpected one!) 3.5.0-compatible version that fixes a VM bug leading to mainnet state incompatibility (since 3672783) which in turn leads to inability to process new blocks (since 3682290).
Mainnet chain needs to be resynchronized for this version.
Improvements:
Bugs fixed:
Shallowness
Another 3.5.0-compatible version that delivers important bug fixes and provides a new API to be used by NeoFS. An upgrade is recommended, the DB doesn't need to be resynchronized.
New features:
- internal RPC client for deeply integrated applications like NeoFS (#2916)
Improvements:
- documentation updates (#2879, #2880, #2893, #2917, #2920, #2936)
- code style, spelling and updated linter fixes (#2884, #2922, #2933)
- NEP-2 import password can be provided via config file now (#2887)
- custom stack item deserialization limit is available via public APIs now (#2904)
- RPC client endpoint can be retrieved via public API (#2915)
- dependency updates (#2919, #2929)
- WSClient now copies filter parameters to Subscribe* and Receive* methods improving code safety (#2937)
Bugs fixed:
- name parameter ignored for wallet import command (#2887)
- incorrect RPC binding code generated for Any return type (#2918)
- memory leak on active peer disconnection (#2924)
- consensus process deadlock (#2930)
- dBFT deadlock in "committed at previous view" scenario (#2935)
- panic in RPC waiter code (#2938)
Shortness
This release delivers an important fix for block execution application logs and requires a resynchronization, therefore it's 0.101.0 (even though it's also 3.5.0-compatible). It fixes some other minor problems as well (the other most notable change probably is in the compiler), so we recommend upgrading.
Improvements:
- updated golang.org/x/* dependencies (#2854)
- CLI help and required flags handling fixes (#2852)
- transfer data storage optimization (#2865)
- network's magic number is stored (and checked against the config on startup) in the DB now, reducing potential for node operator errors (#2867)
Bugs fixed:
- in rare cases nodes could request an invalid number of blocks from peers leading to disconnect (#2846)
- outdated documentation fixes (#2860, #2876)
- application logs for blocks that contained GAS spends for transaction fees contained (and returned from getapplicationlog RPC) incorrect (off by one) values for amount in Transfer events; transaction application logs were not affected by this, but data returned to RPC event subscribers could potentially be (#2865)
- findstates RPC returned an error instead of an empty data set for valid contracts that have no data (unlike C# node, #2866)
- miscompiled shadowed range loop variable definition (#2871)
- missing (compared to C# node) explicit (even though null) 'exception' field in the getapplicationlog RPC output from server (#2872)
Chaptalization
This is a tiny update that 99.99% of users can easily skip. The reason for this release is the need to fix compatibility with the NeoFS mainnet sidechain and have some stable version to be used there. In any other case it can be ignored, but if you still decide to upgrade you don't need to resynchronize.
Behaviour changes:
- Aspidochelone fork is made to include ContractManagement native contract deploy/update methods call flags change, initially it was an unconditional part of 0.99.0 NeoGo release (or 3.2.0 C# version), but this behavior is incompatible with the NeoFS mainnet sidechain; the change to the fork logic does not affect any other public networks (mainnet/testnet) and any new networks that have Aspidochelone enabled since block 0 (#2848)
Improvements:
Centuplication
A 3.5.0-compatible version of NeoGo with all the appropriate protocol updates and a number of other changes. The most notable ones are configuration updates. New features and some long-standing inconsistencies required for some changes and this release brings them with it. Old configurations are still supported and will work the same way (except for one minor exception in VerifyBlocks that is only supposed to be used for tests/development), but we'd like to highlight that all of the old settings will be removed in ~6 months, so please review these updates and update your configurations. For public networks the best way to go is to take the new versions from the "config" directory and then adjust for particular scenario if needed.
This release requires a complete resynchronization due to native contract changes, so please schedule your updates appropriately.
New features:
- System.Runtime.LoadScript syscall (and appropriate smart contract interops) allowing to load/run dynamic code (#2719)
- PUSHT/PUSHF VM instructions allowing for simpler/cheaper booleans (#2770)
- ContractManagement native contract was extended with ID->hash mappings and
getContractById
andgetContractHashes
methods (#2702, #2837) - LogLevel application configuration option that can be changed on SIGHUP (#2831)
- additional type data generated by the compiler that then can be used by the RPC bindings (SDK/contract wrapper) generator, this allows for complex types (structures/arrays/maps) to be easily represented/handled in contract-specific RPC code (#2828)
- multiaddress listeners for all services and P2P, this changes the old Address/Port (and AnnouncedPort for P2P) configuration scheme to more generic Addresses list, the old configuration is still supported, but is deprecated and will be removed in future node versions (#2827, #2839)
Behaviour changes:
- Aspidochelone fork block for NeoFS sidechain mainnet configuration is rescheduled again (#2823, #2830)
- Blockchain's GetHeaderHash() method now accepts uint32 for parameter (#2814)
- pre-0.97.3 and pre-0.99.0 deprecated compatibility fields and logic were dropped from the result.Version (
getversion
RPC result) structure (#2786) - SecondsPerBlock protocol configuration variable was replaced with TimePerBlock allowing for sub-second precision, SecondsPerBlock is still supported, but will eventually be removed (#2829)
- AttemptConnPeers, BroadcastFactor, DialTimeout, ExtensiblePoolSize, MaxPeers, MinPeers, PingInterval, PingTimeout, ProtoTickInterval settings were moved into the new P2P section, timing parameters now use Duration type allowing for more human-friendly values in many cases, old parameters are still supported, but will eventually be removed (#2827)
- consensus (dBFT) is configured as a separate service now that can be enabled/disabled (and can work in "watch only" mode without a wallet), the old direct "UnlockWallet" specification in "ApplicationConfiguration" is still supported, but is deprecated and will be removed in future versions (#2832)
- GarbageCollectionPeriod, KeepOnlyLatestState, RemoveUntraceableBlocks, SaveStorageBatch and VerifyBlocks settings were moved from ProtocolConfiguration to ApplicationConfiguration; old configurations are still supported, except for VerifyBlocks which is replaced by SkipBlockVerification with inverted meaning (and hence an inverted default) for security reasons; this also affects NewBlockchain and neotest APIs (#2833)
Improvements:
- more user-friendly error and help messages in some cases (#2824, #2834)
- faster node startup time and smaller memory footprint for networks with lots (1-2M+) of blocks (#2814)
- minor documentation fixes (#2834, #2838)
Bugs fixed:
Hyalinization
Bugs, terrestrial arthropods with at least six legs. Sometimes we don't notice them, sometimes we ignore them, but they do exist and there are times when they need to be dealt with in one way or another. Most of the bugs fixed in this release have a little less legs than proper insects, they're far from being as critical as the ones fixed in the previous release and yet we consider them annoying enough to warrant this new version of NeoGo to be published. We don't want to see our users fighting these pesky creatures in the wild, better update and have a troublefree experience.
If you're not affected by #2815 (requests for verbose transaction data and application logs failed for some specific mainnet transaction(s)) you may leave the DB as is with this upgrade, if you want it to be solved then please resynchronize.
Behaviour changes:
- "loadtx" VM CLI command now uses transaction system fee value as the default GAS limit for the context, unless --gas is used (previously it wasn't limited, #2816)
- SendRawTransaction RPC client method will now always return transaction hash, even if error occured, this also affects Actor APIs and allows to handle some specific errors (like transaction already present in the mempool) in more appropriate way (#2817)
- Actor and NotaryActor Wait() wrapper methods now handle "already exists" and "already on chain" errors as non-errors, waiting (if needed) and returning proper results (#2817)
Improvements:
- reworked network discoverer/connection manager that has a better picture of the network (especially if it's a small one), doesn't try to make additional connections (even when having less than MinPeers of them) when there are no more real addresses to connect to, establishes stable connections faster in containerized environments and does more connection attempts when MinPeers setting is not satisfied, but there are potential candidates (#2811)
- VM invocation stack handling microoptimization (#2812)
- load* VM CLI commands now accept --gas parameter to set the amount of GAS to be used in this context (#2816)
- better logging during state reset process (#2813)
- subscription-based transaction waiter now handles already accepted transactions faster (~immediately vs waiting for block timeout previously, #2817)
- WSClient can return more specific error on websocket handshake failure if it's provided by server (#2821)
- new MaxWebSocketClients configuration option for the RPC server to control the number of allowed websocket clients, missing or 0 value make the server use the default of 64 which is compatible with the previous behavior (you can use old configurations if you don't care about this option, #2821)
Bugs fixed:
- occasional "loadgo" VM CLI test failures because of timeout (#2810)
- websocket waiter test instability (#2809)
- websocket event unsubscriptions could lead to node deadlock in rare circumstances (#2809)
- exception handler could use improper evaluation stack in some cases (#2812)
- pointer stack items were not handled correctly in "protected" serialization mode leading to inability to deserialize these items back (#2816)
- state reset functionality not working for big chains like mainnet (#2813)
Funambulation
An emergency release fixing mainnet incompatibility at block 2504320 leading to inability to process block 2504813. A couple of other less severe bugs got fixed as well. Unfortunately, this release requires complete resynchronization for mainnet, other networks can use old DBs.
Improvements:
- only transactions requested by the consensus process are forwarded to it now slightly improving performance in some networked scenarios (#2788)
- a complete set of simple array unwrappers in the unwrap library (#2792)
- RPC binding generator can handle simple arrays now with configuration file provided (#2792)
- more user-friendly error messages in some cases (#2797, #2802, #2804)
Bugs fixed:
- DB was not properly closed after state reset (#2791)
- VM stack handling problem leading to lost items after return from call to another contract (#2800)
- "istack" command panic in the VM CLI (#2800)
- failure to decode incorrect contract from ContractManagement state leading to failure to start the node, it'll be ignored now similar to how C# node treats this (#2802)
- subscription to execution events failed if no "state" filter was used along with "container" (#2804)
- Actor using WSClient could deadlock in the transaction waiter during unsubscription (#2804)
Underestimation
It wasn't long since the previous release until a juicy set of features and optimisations came on board. So we've decided to change our release plan and supply one more 3.4.0 compatible version. It comes up with a massive suite of network P2P and broadcast improvements. We've carefully investigated message sending timeouts on benchmarks, reworked the broadcast logic and significantly reduced delays in message sending and the amount of useless traffic between our nodes. For smart-contract developers and RPC client users several new features were added. These are automatic RPC bindings generator, poll-based and websocket-based transactions awaiting and an extended websocket client subscriptions interface. For better debugging experience we've improved state related functionality of VM CLI and added an ability to reset chain state to a particular height.
An important dBFT initialization bug that caused timestamp-related errors on block addition was fixed. Also, those who use NeoGo node with EnableCORSWorkaround setting may want to update the node to be able to handle websocket requests with Origin set in the header. The users of websocket RPC client subscription mechanism are welcomed to move from deprecated subscriptions API to the extended one. Finally, we are kindly asking our users to have a look at our roadmap file where deprecated code removal schedule is attached.
This version is fully compatible with C# node 3.4.0 and does not require resynchronization on upgrade. This time for sure, the next release is planned to be compatible with 3.5.0.
New features:
- logarithmic gossip fan-out, new
BroadcastFactor
application setting and adaptive peer requests are added to optimise broadcasting process (#608, #2678, #2743) - Prometheus histograms with handling time are added for P2P commands (#2750) and RPC calls (#2784)
- transaction awaiting is added to RPC clients (#2740, #2749)
- RPC bindings generator (#2705) is added for both safe (#2766) and state-changing (#2769, #2778) methods with initial iterator support (#2783)
- the ability to reset chain state to a particular height is added (#2576, #2773)
Behaviour changes:
- Aspidochelone fork block for NeoFS sidechain mainnet configuration is rescheduled (#2754, #2776)
- RPC server will now handle any Origin in websocket connection when EnableCORSWorkaround setting is on (#2772, #2724)
- WS RPC client subscriptions API is extended to accept custom subscriber channels, old subscriptions API is marked as deprecated (#2756, #2764)
Improvements:
- network code refactoring (#2742)
- network packets sending is now limited in time (#2738)
- broadcast messages will be sent concurrently to each peer (#2741)
- ping messages are broadcast using the common broadcast logic (#2742)
- transactions requested by dBFT will be accepted on demand only (#2746, #2748, nspcc-dev/dbft#63)
- VM CLI's state-based functionality improvements (extended signers and arguments parsing, enabled logging) and additional commands (
loadtx
,loaddeployed
,jump
) (#2729, #2606, #2740) - incoming P2P transactions are now processed concurrently and buffer for inventory hashes is reusable (#2755)
GetData
andGetBlocksByIndex
replies are now batched on a TCP-level (#2757)- optimisation of incoming P2P transactions and blocks filtering are introduced (#2758, #2759)
- batch size of broadcast transactions hashes is adjusted (#2760)
- peer reconnections logic is improved,
GetAddr
messages are sent more often (#2761, #2745) - documentation for wallet configuration file is clarified (#2763)
- Koblitz curve implementation of btcd/btcec was replaced with decred/secp256k1 due to GitHub security warning (#2781)
NOT
opcode for Bool emission is now used to reduce resulting script cost (#2762)
Bugs fixed: