Skip to content

Releases: nspcc-dev/neo-go


12 Jan 10:40
Choose a tag to compare

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.


Bugs fixed:

  • state difference at block 4688591 of N3 mainnet caused by difference at characters escaping during manifest's Extra field JSON serialisation (#3286)


29 Dec 13:39
Choose a tag to compare

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)


  • 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 ( 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 of getnativecontracts 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)


27 Nov 15:21
Choose a tag to compare

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 unsupported canceltransaction 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 the Hardforks setting (#3212)
  • introduce serialization limit to stackitem.Item and fail large contracts deploy wrt this setting (#3218)
  • add customizable MaxRequestBodyBytes and MaxRequestHeaderBytes RPC server configuration setting (#3221)


  • 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)


09 Nov 07:41
Choose a tag to compare

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:

  • properly initialize cache of native NeoToken contract every new dBFT epoch (#3187)
  • forbid non-zero NEO and GAS roundtrips from accounts with zero balance (#3191)


20 Oct 19:49
Choose a tag to compare

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)


  • 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 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)


06 Sep 20:26
Choose a tag to compare

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
( 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 and findstoragehistoric RPC support (#3099)
  • getstoragehistoric RPC support (#3099)
  • getrawnotarypool and getrawnotarytransaction RPC (#3098)

Behaviour changes:

  • deprecated FromAddress smart contract helper is dropped from the util 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 by neogo_version and server_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 and NotValidBefore transaction attributes are no longer NeoGo extensions, they can be used on regular networks (#2962)


  • documentation and example improvements (#2945, #2972, #2979, #3020, #3084, #3099, #3114, #3116, #3119, #3121)
  • getproof and verifyproof 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 and loadnef 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)
  • 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)


01 Aug 16:46
Choose a tag to compare

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)


  • blockchain Notary and Oracle services documentation improvement (#2972)
  • BoltDB ( 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)


08 Jul 09:16
Choose a tag to compare

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)


29 Jun 09:36
Choose a tag to compare

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.


Bugs fixed:

  • incorrect handling of empty Any-type parameter for RPC invocations (#2959)
  • incorrect state rollbacks in case of exception during cross-contract call when the call is made from non-TRYing context (#3046)


17 Mar 09:50
Choose a tag to compare

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)


  • 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)