Neo Global Development (NGD) Shanghai has distributed an internal core development update for December, intended to help coordinate information for community groups and encourage GitHub participation on new features and improvements.
The report highlights several major items that have been successfully implemented, such as improvements for NeoVM, and outlines active discussion topics and recent repository reorganization.
One noteworthy improvement to NeoVM is the implementation of reference counting, a technique used to facilitate memory management. With reference counting, objects are only allocated space in the VM’s memory while they are actively being referenced during execution.
For example, a particular variable in a smart contract might only be loaded into memory when a specific function is being executed. Once the function has completed, the variable can be dropped from memory.
This more efficient approach to memory allocation—coupled with the replacement of execution restrictions with a faster method for most instructions—has allowed NeoVM to improve its speed by around 20 times during benchmark tests using affected opcodes.
Another major new feature is the addition of function pointers, which are used to show the VM where to find a specific function. This allows developers to implement enumerators and other powerful contract features by paving the way for the implementation of cross-contract callbacks and lambda functions in NeoVM.
Several improvements have also been merged which are expected to considerably improve the TPS of Neo3. These include parallel processing for signature verifications, mempool caching of transaction sender fees, and the removal of time-consuming LINQ statements, and more.
Recent efforts have also attempted to improve the accessibility of the Neo codebase, beginning with the unification of the neo-cli and neo-gui repositories. These have been combined under the neo-cli repository under a new name, neo-node.
Accompanying the merger, an improved version of neo-gui is currently being designed. The tech stack for the node has now been finalized; Electron for the frontend, with communications handled through WebSocket and RPC. Current discussions are focused on UI design, with the goal of providing a better user experience for developers and blockchain purists that wish to operate a full node.
RPC functionality for neo-node has been migrated to a plugin as the core is stripped down to only consist of essential features. New plugins have also been created to allow developers to use RocksDB or LevelDB over RAM storage, depending on their needs and preferences. On-memory storage is the new default in Neo3 following its decoupling to an abstract storage layer.
Coinciding with the changes and release of new plugins, the neo-plugins repository has been renamed to neo-modules.
Although the core developers are chiefly concerned with the Neo3 network itself at this time, several pull requests have also been merged for .NET developer tools. It is now possible to use the Neon compiler to compile C# and VB contracts from source files, rather than requiring to developers to compile in .NET first.
An issue with the switch instruction has also been resolved, which would only work with less than 6 entries. This was due to a .NET compiler optimization that was not compatible with NeoVM. In the new version, developers can compile any size switch into a NEF file ready for deployment.
Both changes are planned to be ported to Neo 2.x.
Discussions and Design
Discussions are underway on important new components, such as the choice between BLS or Schnorr as the signature aggregation scheme on Neo, alongside potential refinements to the governance and economic models.
The Oracle system for Neo contracts is also under consideration; the execution processes, consensus mechanism, dividends, and policies have mostly been fleshed out, with current discussions centered on the Oracle node election process.
Following a discussion on version numbers on Neo3, it has been decided that 53 will be used as the address version number. This will cause all Neo3 addresses to lead with ‘N,’ rather than the ‘A’ used in Neo2 addresses. All other version numbers on Neo3 will be set to 3.