Releases: nspcc-dev/neo-go
Lyophilization
This 3.7.5-compatible version includes a number of important fixes, so please upgrade your nodes. Some minor extensions were also added.
Resynchronization (or state reset) is required for testnet (because of a bug leading to state difference since 4368840), but not required for mainnet.
New features:
Behavior changes:
- CLI no longer panics if error occurs (#3495)
- MaxTraceableBlocks is 17280 now for NeoFS networks (#3518)
- minimal default RPC
SessionExpirationTime
is 5s now (#3529)
Improvements:
- RPC actor interface extension with WaitSuccess method (#3491)
- Signers() API for RPC invokers (#3492)
- SignerAccounts() API for RPC actors (#3492)
- getpeers RPC extension with the user agent and last known block height data (#3481)
- OnExecHook() API for VM (#3460)
- more details in witness verification error message (#3508)
- CLI help and error string format unification (#3495, #3520)
- CLI library (github.com/urfave/cli) upgrade to 2.27.2 (from v1 API, #3495)
- microoptimization of extensible sender list calculation (#3500)
- microoptimization of chain dump code (#3514)
- documentation and error messages (#3526, #3527)
Bugs fixed:
- RPC
SessionExpirationTime
could be zero in some configurations (#3529) - panic in WSClient unsubscription code in some multithreaded cases (#3532)
- missing PrimaryIndex in Ledger's getBlock() result (#3534)
- contract manifests with null groups were accepted (#3523)
- contract manifests with invalid features were accepted (#3523)
- contract manifests with null trusts were accepted (#3523)
- WSClient deadlock in some disconnection cases (#3535)
Keratinization
A 3.7.5-compatible version introducing new Domovoi hardfork that brings two fixes to the protocol: using executing contract state to check contract call permissions (included into this NeoGo release) and proper VM items refcounting for System.Runtime.GetNotifications handler (not included into this NeoGo release because we've never had this bug). Since the second bug is C#-specific and does not lead to the state differences in mainnet/testnet, we've decided not to break the NeoGo node to follow pre-Domovoi C# node implementation. Thus, differences in application logs for several T5 transactions before Domovoi hardfork are expected and won't be fixed.
Please, ensure your node configuration includes the Domovoi hardfork. No DB resynchronisation is required.
New features:
- Domovoi hardfork scheduled for 5570000 block of mainnet and 4144000 block of T5 testnet (#3476, #3473, #3486, #3487)
Behavior changes:
- hide node logs timestamp if the node is running not in TTY (#3468)
- distinguish log level for various node peer disconnection reasons (#3469)
Improvements:
- ensure NeoFS nodes are configured when processing NeoFS oracle requests (#3455)
- NeoFS SDK dependency upgrade (#3483)
- ensure System.Runtime.GetNotifications handler can't break the MaxStackSize constraint before and after Domovoi hardfork (#3485)
Bugs fixed:
Implication
An urgent release that fixes mainnet state difference at block 5462944 which halts blocks processing starting from the height 5468658. This release requires full node DB resynchronization for mainnet nodes. T5 testnet DB state is not affected by this bug (at least up to the current 4087361 height). Thus, DB resynchronisation may be skipped for testnet nodes. No configuration changes implied.
Bugs fixed:
Zephyranthes
We're rolling out a large set of updates including all of Neo 3.7.4 protocol changes: native contracts update functionality and extended native contract APIs united under the upcoming Cockatrice hardfork. For smart contract developers an ability to generate smart contract bindings with dynamic hash is supported as well as a number of useful extensions for unwrap
package, compatible NNS smart contract RPC binding and a lot of other handy enhancements. This release also includes a couple of severe regression bug fixes affecting the node state. As a bonus of fixing a wide range of failing tests, we've refactored the node services start and shutdown procedures to make it more stable. This version drops support for Go 1.19 and requires 1.20+ to build (with Go 1.22 supported).
Notice that this release requires full node resynchronization for both mainnet and testnet nodes. Please pay special attention to the Cockatrice hardfork schedule and check your configurations. It should be configured for 3967000 of T5 testnet and 5450000 of mainnet. To ensure compatibility your node must be configured appropriately.
New features:
- native contracts update functionality bound to hardforks (#3402, #3444)
- Cockatrice hardfork planned for 5450000 block of mainnet and 3967000 block of T5 testnet (#3402, #3448, #3402, #3446)
CommitteeChanged
events are emitted by NeoToken native contract starting from Cockatrice hardfork (#3351, #3448)getCommitteeAddress
method of NeoToken native contract is available starting from Cockatrice hardfork (#3362, #3402)keccak256
method of CryptoLib native contract is available starting from Cockatrice hardfork (#3301, #3402)- dynamic contract hash support for smart contract bindings (#3405)
- support
StringCompressed
API forcrypto.PublicKey
(#3408) - support
Copy
API fortransaction.Transaction
andpayload.P2PNotaryRequest
(#3407) - extend
verifyWithECDsa
method of native CryptoLib contract with Keccak256 hasher starting from Cockatrice and add an example of custom Koblitz-based and Keccak256-based transaction witness verification (#3425) - autogenerated
nativehashes
package (#3402, #3431) - introduce
unwrap.Exception
type for better RPC invocation result exceptions detection (#3438)
Behavior changes:
- Neo Name Service smart contract RPC binding follows the official N3 implementation (#3291)
- clear LastGasPerVote NeoToken account info on unvoting (#3349)
- return fault exception (if any) in
unwrap
RPC client helpers (#3356) - move P2PNotary designation role out of P2PSigExtensions (#3452)
Improvements:
- support
smartcontract.Convertible
interface as RPC Actor and Invoker call parameters (#3297) - allow to import multisignature account into wallet without WIF and password specified (#3293)
- upgrade go-ordered-json dependency to avoid possible node state incompatibility issues caused by smart contract manifest marshalling (#3331, #3333)
- Go 1.22 support, bump minimum required Go version up to Go 1.20 (#3336)
- a number of dependent libraries are updated to the fresh versions (#3338, #3418)
- improve error message of
System.Crypto.CheckMultisig
interop API handler (#3374) - upgrade dBFT library to v0.2.0 (#3371, #3413)
- increase
ValidUntilBlock
value for transactions generated by CLI commands (#3376) - documentation updates (#3375, #3382)
- let default Notary Actor options be customizable (#3394)
- extend
getversion
RPC response with RPC server settings (#3386) - make errors related to wallet opening more detailed (#3389)
- adjust error messages of
setExecFeeFactor
andsetStoragePrice
methods of native PolicyContract (#3406) - make neotest chain constructor options customizable (#3404)
- format improvements for CLI commands description (#3410)
- make state dumps comparator script more verbose (#3411)
- refactor storage
Get
implementation for BoltDB (#3441) - add
updatecounter
field to the resulting items ofgetnativecontracts
RPC API call (#3439)
Bugs fixed:
- node panic on committee missing from node configuration (#3294)
- autogenerated RPC bindings do not follow Go naming convention (#3299)
- a batch of failing tests is fixed (#3306, #3313, #3321, #3332, #3337, #3335, #3344, #3340, #3350, #3355, #3364, #3368, #3377, #3393, #3397, #3392, #3398, #3400)
- outdated minimum required Go version of boilerplate contract generated by
neo-go contract init
(#3318) - outdated address used as an example in RPC client documentation (#3327)
- ungraceful node services shutdown procedure (#3307)
- logging data race on node services shutdown (#3307)
- Map parameter support is missing from RPC server handlers (#3329)
- smart contract storage iterator prefix wasn't copied while iterating over values (#3336)
- RPC error with -511 code (insufficient funds) returned on
sendrawtransaction
RPC request should cover multiple cases of sender's insufficient funds (#3360, #3361) - reentrancy possibility for Notary deposit withdrawal (#3357)
- null
findstorage
RPC response in case of missing storage items (#3385) - uninitialized named return variables in compiler (#3401)
- wrong debug sequence points after
JUMP*
instructions shortening by compiler (#3412) - corrupted genesis block record and application log caused by improper Conflicts attribute processing (#3437)
- false positive DB-based blocked accounts detection in native PolicyContract leaded to invalid committee computations and reward distribution made by NeoToken (#3443)
Enumeration
This is another v3.6.2-compatible release that fixes mainnet state difference at block 4688591. It is confirmed to have the same state up to 4723K height (which is current), but to get proper mainnet state you need to resynchronize your node from the genesis. T5 testnet state is not affected (at least up to the current 3323K height), thus DB resynchronisation may be skipped for testnet nodes.
Improvements:
Bugs fixed:
- state difference at block 4688591 of N3 mainnet caused by difference at characters escaping during manifest's
Extra
field JSON serialisation (#3286)
Designation
We're rolling out an update for NeoGo nodes that contains a number of user-facing API improvements for RPC web-socket notification subsystem, CLI utility, wallet related packages and not only. Try out our new --await
CLI option for those commands that relay transactions to the network to automatically wait for the on-chain transaction execution result. Subscribe for new block headers with extended RPC notification subsystem interface. Use contract-based accounts provided by wallet
package and neotest
framework to sign transactions. These and a set of other improvements are available to our users while this release is staying compatible with 3.6.2 version of C# node.
This version also delivers a bug fix for consensus node panic caused by improper native NeoToken cache initialisation. Moreover, there's a set of RPC server side improvements, thus, we recommend to upgrade both consensus and RPC nodes to provide more stable consensus node functioning and extended user APIs functionality. No database resynchronisation is needed.
New features:
- block headers RPC web-socket subscription (#3252)
--await
option to synchronize on transaction execution for CLI commands (#3265)- partial session-based RPC iterator unwrapping (#3274)
- contract-based transaction signers in neotest framework (#3233)
- AMD64 release binaries for macOS (#3251)
- complex contract signature schemes in wallet.Account (#3256)
Behavior changes:
- basic RPC subscription filter validity checks are implemented on both RPC client and RPC server sides (#3258)
- filter of notary request event RPC subscription is extended with
type
field (#3236) - if available, use block headers RPC web-socket subscription for transaction awaiting via
waiter
package API (#3283)
Improvements:
- add smart contract storage limits to interop utilities (#3232)
- extend ZKP examples documentation with additional links to PoT ceremony response files (#3234)
- support Go types in VM emitter API (#3237)
- documentation update (#3239, #3242, #3246)
- BoltDB (go.etcd.io/bbolt) dependency upgrade (#3250)
- CLI code refactoring (#2682)
- extend wallet package to work with byte slice based wallets (#3255)
- export RPC client side transaction awaiting functionality via
waiter
package (#3265, #3283)
Bugs fixed:
- remove stale
updatehistory
section ofgetnativecontracts
RPC response (#3240) - immediately check RPC client initialisation on access to blocks RPC subscription API (#3257, #3261)
- fix CN panic caused by unexpected call to native NeoToken cache (#3253)
- make "automatically generated" warning of all automatically generated files follow the standard (#3280)
Globalization
We're updating NeoGo to push out a number of useful updates and protocol extensions as well as make it compatible with 3.6.2 version of C# node. The most invasive behaviour changes are VM-level protocol constraints imposed on the size of serialized stackitems and NativeActivations
node setting removal. This version also delivers a set of smaller useful changes in the interoperability layer and native contract functionality including System.Runtime.CurrentSigners interop, strLen
StdLib method and PolicyContract-based transaction attributes pricing as far as a user-facing canceltx
CLI command and community-requested --relative-path
CLI option.
Node operators must resynchronize their nodes to get fully compatible state (which is confirmed to be compatible with 3.6.2 for current mainnet up to block 4483627 and T5 testnet up to block 3078762). Please, ensure your node configuration doesn't contain NativeActivations
protocol configuration section as this logic is hidden under Hardforks
starting from the current release.
New features:
- System.Runtime.CurrentSigners interop allowing to get signers of the currently loaded transaction (#3058)
strLen
method of native StdLib contract (#3208)- transaction attributes pricing regulation via native PolicyContract (#3155)
canceltx
CLI command as an alternative to unsupportedcanceltransaction
RPC request (#3223, #3214)
Behaviour changes:
- reduce maximum allowed stackitem.Item size (#3185)
- restrict maximum allowed NEF file size and prohibit large contracts deployment (#3186)
- bind
NativeActivations
node setting to theHardforks
setting (#3212) - introduce serialization limit to stackitem.Item and fail large contracts deploy wrt this setting (#3218)
- add customizable
MaxRequestBodyBytes
andMaxRequestHeaderBytes
RPC server configuration setting (#3221)
Improvements:
- provide more detailed error on attempt to read non-existent service wallet specified via node configuration file (#3210)
- optimize emit of imported code for autogenerated RPC bindings (#3215)
- documentation update (#3203, #3222)
- add
--relative-path
CLI flag allowing to override configuration-specific relative paths (#3206) - update code owners (#3216, @fyrchik will live in our hearts forever)
Bugs fixed:
- unify messages of RPC errors according to the RPC errors NEP (#3199)
- limit maximum allowed number and depth of transaction signers and witnesses per RPC request that accept transaction (#3207, #3221)
- forbid unknown fields usage in the node configuration file (#3209)
- enable hardfork-dependant code starting exactly from the block height specified in the node configuration (#3211)
- require Notary native deposit to be valid for at least one subsequent block after deposit transaction acceptance (#3211)
- deduplicate unnamed event types for autogenerated RPC bindings and make the binding generation order strictly defined and stable (#3215, #3220)
- do not panic on trying to compile an import cycle (#3215)
- state difference at block 3002333 of T5 testnet caused by difference at characters escaping during manifest's
Extra
field JSON serialisation (#3225) - properly start node services that depend on native RoleManagement contract data with genesis
Roles
protocol configuration setting specified (#3229)
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)