Releases: nspcc-dev/neo-go
Verification
An urgent 3.6.0-compatible version that contains a hotfix for the bug that prevents node from starting from the existing database every new dBFT epoch. Also, the release includes a bugfix that fails any non-zero NEO and GAS roundtrips from accounts with zero balance.
Although the DB format and storage states were not affected by this release, the node resynchronization is still recommended for those who want to keep correct application logs. Resynchronization can be skipped if you're OK with wrong application logs for some transactions (e.g. CN doesn't care, and RPC node cares a lot).
Bugs fixed:
Backwardation
A minor 3.6.0-compatible version of NeoGo with new salty ZKP-related functionality, a large batch of deprecated APIs removal and an experimental genesis block extension. Build Groth-16 circuits, generate proofs and deploy verification contracts easily with the new end-to-end ZKP example and zkpbinding NeoGo API. Setup node roles via the node configuration starting from the genesis block without any painful multisignature transaction forming and invoke any custom script in the genesis-level transaction with the new Genesis protocol configuration extension. And don't forget to move from deprecated RPC client APIs, as a lot of them have been removed.
New node configuration format is finally adapted and the deprecated configuration sections are permanently removed according to the schedule. Pay attention to the SecondsPerBlock protocol configuration section that was replaced by TimePerBlock, a set of node and services address- and port- related configuration section that were replaced by the new Addresses format, direct UnlockWallet consensus configuration that was replaced by a separate Consensus section and a set of node-specific protocol configurations that were moved under a separate P2P section.
This release fixes a set of bugs including a vulnerability introduced by changes in the transaction conflicts storage scheme implemented in #3061 (a part of 0.102.0 release). With the patch presented, it's impossible to uncontrollably pollute the storage with malicious conflicting records.
This version is fully compatible with C# node 3.6.0. However, it requires complete resynchronization on upgrade due to the database storage scheme changes.
New features:
- API for Groth-16 verification contracts autogeneration and end-to-end example for proving and verifying statements on NeoGo (#3043, #3146)
- introduce genesis protocol extensions: default node roles designation and genesis transactions (#3168)
Behaviour changes:
- a lot of deprecated functionality is dropped: RPC client old APIs, shared Notifications channel of WebSocket client, SecondsPerBlock protocol configuration, old way of services and node address and port configuration, old P2P related application settings configuration, direct UnlockWallet consensus configuration, direct node-specific protocol configuration (#3150)
- database scheme is changed by new way of storing the transaction conflicting records (#3138)
Improvements:
- NeoFS SDK dependency upgrade (#3129)
- gnark and gnark-crypto dependencies upgrade (#3145, #3162, #3163)
- introduce timeout restriction for BoltDB opening (#3148)
- bump code coverage uploading action version (#3153)
- Go 1.21 support, bump minimum required Go version up to Go 1.19 (#3157)
- upgrade golang.org/x/net version (#3158)
- add protocol hardforks configuration to the
getversion
RPC response (#3160) - format autogenerated smart contract bindings with accordance to standard
go fmt
rules (#3164) - add "DO NOT EDIT" warning to the autogenerated smart contract bindings (#3167)
Bugs fixed:
- avoid race between
getnextblockvalidators
RPC call handler and blockchain's block handler routine, significantly refactor native validators caching scheme (#3110) - do not panic on failed NeoFS oracle requests (#3129)
- enable Notary subsystem in NeoFS mainnet configuration (#3136)
- reorganize storage scheme for transaction conflicting records to avoid possible attack (#3138)
- properly deserialize wildcard trusts field of smart contract manifest (#3140)
- use more strict GAS limit for transaction network fee calculation via RPC call (#3141)
- avoid WebSocket client request blocking (#3142)
- properly emit big uint64 constants during smart contract compilation (#3147)
- avoid race access to the node version by tests (#3149)
- make FindStorage* RPC client APIs to be always compatible with NeoC# RPC server (#3166)
Aberration
Long-awaited feature-packed 3.6.0-compatible version of NeoGo with all the appropriate protocol updates and a set of tasty improvements and bug fixes. Groth16 ZKP proof checks are there for contract developers as well as new opcodes. A huge number of improvements went into the RPC server and client, new RPCs, improved contract binding generator and standardized extended error codes make developing dApps much easier.
Users of smart contract utilities and RPC-related Prometheus metrics are advised to take a look at the deprecated APIs removal schedule
(ROADMAP.md). This version was delayed for quite some time (waiting for 3.6), so the next minor release (0.103.0) will remove a substantial amount of compatibility code. It's expected to be released in November with 3.6 protocol compatibility (3.7 cycle is likely to require more time).
This is also the first version that drops support for Go 1.17 and requires 1.18+ to build (with Go 1.20 supported). Using generics in smart contracts is not supported yet, but some elements of this support can be implemented in future versions.
Mainnet and testnet node operators, please pay attention to the Basilisk hardfork schedule and check your configurations. It will happen at block 2680000 for T5 testnet and 4120000 for mainnet. To ensure compatibility your node must be configured appropriately. This version requires DB resynchronization, so schedule your updates accordingly.
New features:
- ZKP proof checking support via CryptoLib native contract (operations with BLS12-381 curve points) (#2940, #3042)
- System.Storage.Find interop now support "Backwards" flag to iterate in the opposite direction (#2952)
util ops
CLI utility that pretty-prints VM script (#2965)notarypool_unsorted_tx
Prometheus metric for notary-enabled nodes (#2696)CloseNotificationChannelIfFull
WSClient option allowing the client to close notification channel on overflow (#2988)- autogenerated RPC bindings for contract events and conversion code from stackitem.Item to structure (#3008, #3035, #3036, #3087)
- event type inference from contract code (#3008)
- dynamic contract hashes support for RPC bindings (#3012)
- "Basilisk" protocol hardfork support (#3056, #3080, #3086, #3104)
- ABORTMSG and ASSERTMSG VM opcodes (#3066)
- standardized RPC error codes (#3063)
findstorage
andfindstoragehistoric
RPC support (#3099)getstoragehistoric
RPC support (#3099)getrawnotarypool
andgetrawnotarytransaction
RPC (#3098)
Behaviour changes:
- deprecated
FromAddress
smart contract helper is dropped from theutil
interop package (#2941) - a number of deprecated RPC-related Prometheus counters are permanently removed (#2941)
- NEP-2 account label will be asked on account import via CLI (#2889)
- hashes and states of native contracts are now accessible via native ContractManagement API (#2991)
serv_node_version
gauge Prometheus metric is marked as deprecated and replaced byneogo_version
andserver_id
(#3009)- strict contract script check is back with Basilisk hardfork, it was previously removed in 0.101.3 for 3.5 protocol compatibility (#3056)
- JSON number deserialization (via StdLib.jsonDeserialize) changes with Basilisk hardfork allowing for more precision and handling more corner cases (#3080)
- notification type errors are treated as fatal after Basilisk hardfork, before it they're just logged (#3086)
- NULL and non-UTF8 items are not allowed for String event types (#3086)
Conflicts
andNotValidBefore
transaction attributes are no longer NeoGo extensions, they can be used on regular networks (#2962)
Improvements:
- documentation and example improvements (#2945, #2972, #2979, #3020, #3084, #3099, #3114, #3116, #3119, #3121)
getproof
andverifyproof
RPC API support in RPC client (#2942)- Go 1.20 support, bump minimum required Go version up to Go 1.18 (#2908)
- faster state reset process (#2819)
- optimized voting data storage scheme for NEO contract (#2892, #2893)
- NeoFS SDK dependency upgrades (#2995, #3032)
- special exported error returned in case of WSClient disconnection (#3000)
- automatic guessing of contract and manifest filenames for
contract compile
CLI command andloadnef
VM CLI command (#3013) - support for pushing stackitem.Convertible objects via VM script emitter (#3016)
- economic adjustment for ranking of transactions with
Conflicts
attribute (#3031) google.golang.org/grpc
dependency upgrade fixing high severity security vulnerability (#3055, gRPC is only used to communicate with NeoFS nodes in the oracle service)- enforce default RPC server values when it's used as an independent package (not a part of node) (#3107)
- unwrap.Nothing function for RPC clients (#3117)
- address and reverse hash display in opcode dumps (#3115)
Bugs fixed:
- invalid peer port type returned by
getpeers
RPC response (#2914) - invalid data source for
mempool_unsorted_tx
Prometheus metric (#2969) - dBFT library upgrade fixing the ability of a single node to speed up the process of new blocks creation for the whole network (#3018, nspcc-dev/dbft#75)
- failing CALLT instructions in VM CLI for loaded NEF files (#3020)
- missing signers check for on-chain conflicting transactions (#3061)
- incorrect sequence point boundaries in debug data (#3074)
- compiler panic on encountering generic code (#3041)
- potential pooled fallback notary transaction changes (#3108)
- lost LastGasPerVote value on NEO state deserialization for non-voting accounts (#3122)
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: