neo-go/CHANGELOG.md
2021-05-17 23:41:17 +03:00

44 KiB

Changelog

This document outlines major changes between releases.

0.95.0 "Sharpness" (17 May 2021)

This version mostly implements N3 RC2 protocol changes (and is fully RC2-compatible), but also brings NEP11 CLI support and small improvements for node operators.

Please note that this release is incompatible with 0.94.1 and there won't be long-term support provided for it.

New features:

  • CLI command for NEP17 transfers now accepts data parameter for the transfer (#1906)
  • contract deployment CLI comand now also accepts data parameter for _deploy method (#1907)
  • NEP11 and NEP17 transfers from CLI can now have multiple signers (#1914)
  • System.Runtime.BurnGas interop was added to burn some GAS as well as refuel GAS contract method to add GAS to current execution environment (#1937)
  • port number announced via P2P can now differ from actual port node is bound to if new option is used (#1942)
  • CLI now supports full set of NEP11 commands, including balance and transfers (#1918)
  • string split, memory search and compare functions added to stdlib (#1943)
  • MaxValidUntilBlockIncrement can now be configured (#1963)

Behavior changes:

  • data parameter is now passed in a different way to NEP17 RPC client methods (#1906)
  • default (used if nothing else specified) signer scope is now CalledByEntry in CLI and RPC (#1909)
  • SignAndPushInvocationTx RPC client method now adds as many signatures as it can with the wallet given which in some cases allows CLI to create complete transaction without going through multisignature procedure (#1912)
  • getversion RPC call now returns network magic number in network field (#1927)
  • RoleManagement native contract now emits Designation event in designateAsRole method (#1938)
  • System.Storage.Find syscall now strips full prefix given when FindRemovePrefix option is used (#1941)
  • LT, LE, GT, GE VM opcodes now accept Null parameters (#1939)
  • features field was re-added to contract manifests, though it's not currently used (#1944)
  • node will reread TLS certificates (if any configured) on SIGHUP (#1945)
  • contract trusts are now expressed with permission descriptors in manifest (#1946)
  • NEP11 transfers now also support data parameter (#1950)
  • N3 RC2 testnet magic differs from N2 RC1 testnet (#1951, #1954)
  • stdlib encoding/decoding methods now only accept inputs no longer than 1024 bytes (#1943)
  • System.Iterator.Create interop was removed with all associated logic (#1947)
  • Neo.Crypto.CheckSig and Neo.Crypto.CheckMultisig interops were renamed to System.Crypto.CheckSig and System.Crypto.CheckMultisig (#1956)
  • oracle requests now use Neo-specific JSONPath implementation (#1916)
  • native NNS contract was removed and replaced by non-native version (#1965)

Improvements:

  • RPC errors reported by server are now more verbose for submitblock, sendrawtransaction calls (#1899)
  • all CLI commands that accept addresses now also accept hashes and vice versa (#1905)
  • code cleanup based on a number of static analysis tools (#1908, #1958)
  • CLI implementation refactoring (#1905, #1911, #1914, #1915, #1918)
  • only one state validator now sends complete stateroot message normally (#1953)
  • oracle HTTPS requests are now sent with User-Agent header (#1955)
  • stdlib itoa and atoi methods can now be called with one parameter (#1943)
  • oracle nodes are no longer on extensible payload whitelist (#1948)
  • extensible message pool is now per-sender with configurable size (#1948)
  • static-variables field support for debugger as well as debug data for init and _deploy functions (#1957)
  • user documentation for configuration options (#1968)

Bugs fixed:

  • getproof RPC request returned successful results in some cases where it should fail
  • Transfer events with invalid numbers were not rejected by NEP17 tracking code (#1902)
  • boolean function parameters were not accepted by invokefunction RPC call implementation (#1920)
  • potential races in state validation service (#1953)
  • single state validator couldn't ever complete stateroot signature (#1953)
  • SV vote resending was missing (#1953)
  • SV vote messages used invalid (too big) ValidBlockEnd increment (#1953)
  • memory leak in state validation service (#1953)
  • NEP-6 wallets have isDefault field, not isdefault (#1961)

0.94.1 "Channelization" (08 Apr 2021)

This is the second and much improved N3 RC1-compatible release. We've mostly focused on documentation and examples with this release, so there is a number of updates in this area including oracle contract example and NEP-11 NFT contract example. At the same time proper testnet network revealed some implementation inconsistencies between NeoGo and C# especially in oracle and state validation services, so there are fixes for them also.

Protocol-wise this release is compatible with 0.94.0, but MPT structures have changed and there are known state change differences for N3 RC1 testnet, so you need to do full node resynchronization on update from 0.94.0. Some SDK APIs have changed also improving developer experience, but they may affect your code. We don't plan to make more of RC1-compatible releases (the protocol has slightly changed already since the release).

New features:

  • RPC (*Client).GetDesignatedByRole method to easily get node lists from RoleManagement contract (#1855)
  • calculatenetworkfee RPC method support (#1858)
  • RPC client now has additional methods for NEP-11 contracts and specifically for NNS native contract (#1857)
  • contract deployment from multisig addresses (#1886)

Behavior changes:

  • node roles for RoleManagement contract were moved into separate package (#1855)
  • NotaryVerificationPrice constant was moved into package of its own (#1855)
  • testnet configuration now has proper N3 RC1 testnet magic (#1856)
  • crypto.Verifiable interface was removed, now any hash.Hashable thing can be verified (and signed, #1859)
  • Network field was dropped from transaction.Transaction, block.Header, payload.Extensible, state.MPTRoot, payload.P2PNotaryRequest and network.Message, it was needed for proper hash calculations before recent protocol changes (even though this field is not a part of serialized representation of any of these elements), but now it's only used to sign/verify data and doesn't affect hashing which allowed to simplify interface here (#1859)
  • RPC server now returns StateRootInHeader option in its getversion request answers if it's used by the network (#1862)
  • NNS record types were moved to separate package (#1857)
  • MaxStorageKeyLen and MaxStorageValueLen constants were moved to storage package from core (#1871)
  • oracle service now accepts complete URL for other nodes RPC services (#1877)

Improvements:

  • RPC (*Client).AddNetworkFee method is now more informative in some error case (#1852)
  • proper NEP-17 support in unit test contract (#1852)
  • documentation updates for examples and services (#1854, #1890)
  • syscall number is now printed for failed syscalls (#1874)
  • better logging (#1883, #1889)
  • Oracle native contract interop documentation extended (#1884)
  • Oracle native contract interop extended with return codes and constants (#1884)
  • oracle smart contract example (#1884)
  • NEP-11 NFT smart contract example (#1891)

Bugs fixed:

  • node could simultaneously try to connect to the same peer multiple times in some cases (#1861)
  • uniqueness is enforced now for other node addresses provided by peers (#1861)
  • stateroot message hash wasn't calculated the same way as in C# (#1859)
  • state validation service P2P messages were not signed properly (#1859)
  • state.MPTRoot structure JSON representation was different from C# one (#1859)
  • stateroot messages generated by state validation service were not setting proper message category (#1866)
  • block persistence caches were flushed too early by MPT-managing code (#1866)
  • validated stateroot data overwrote local one which lead to node not functioning after restart if states were different (#1866)
  • peers delivering P2P message with validated stateroot differing from local one were disconnected (#1866)
  • state dump comparing script was using old Ledger native contract ID (#1869)
  • candidate registration check was made in different way from C# in native NEO contract leading to different execution results for erroneous voting transactions (#1869)
  • state change dumps were different from C# node for erroneous voting transactions even though contract's state was the same (#1869)
  • arguments were not completely removed from stack in erroneous Runtime.Notify calls leading to different stack state with C# implementation (#1874)
  • in case contract failed execution with THROW the node didn't print the message from the contract properly (#1874)
  • getproof RPC call output was not strictly compliant with C# implementation (#1871)
  • MPT node serialization and some constants were out of date wrt C# implementation (#1871)
  • native NEP-17 contracts could use stale balance data in some cases (#1876)
  • state validation service could lock the system during shutdown, preventing proper node exit (#1877)
  • state validation and oracle services were started before node reaching full synchronization which could lead to excessive useless traffic (#1877)
  • some native contract calls in function arguments could be miscompiled (#1880)
  • oracle service was accepting http URLs instead of https (#1883)
  • neofs URIs were subject to host validation in oracle service even though there is no host there (#1883)
  • neofs URI scheme was differing from C# implementation (#1883)
  • no default value was used for NeoFS request timeout if it's not specified in the configuration (#1883)
  • oracle response code was marshalled as integer into JSON (#1884)
  • MPT could grow in memory unbounded (#1885)
  • Storage.Find results could differ from C# in some cases (#1888)

0.94.0 "Tsessebe" (19 Mar 2021)

N3 RC1-compatible release is here. We've implemented all Neo protocol changes (including state validation service and NeoFS support for oracles) and are ready for testnet launch now, so that you could play with new native contracts, VM instructions and other goodies RC1 brings with it. Some usability improvements and documentation updates also went into this release as well as a number of fixes stabilizing Notary subsystem (which is NeoGo-specific protocol extension).

Please note that this release is incompatible with 0.93.0. We do plan to make an update soon (with more examples and documentation), but there won't be long-term support provided, Neo N3 is still on its way to mainnet (although RC1 and testnet are major milestones on this route).

New features:

  • Compiler:
    • ellipsis support for append() to non-byte slices (#1750)
    • NEP-11 standard conformance check (#1722)
    • onNEP*Payable compliance checks (#1722)
  • you can pass files as contract arguments now with filebytes CLI parameter (#1762)
  • CLI now supports specifying addresses everywhere script hashes are accepted (#1758)
  • System.Contract.CreateMultisigAccount interop function (#1763)
  • SQRT and POW VM instructions (#1789, #1796)
  • new NeoFSAlphabet node role added to RoleManagement contract (#1812)
  • node can serve as state validator node (#1701)
  • oracles now support NeoFS (#1484, #1830)
  • CLI can be used to dump wallet's public keys (#1811)
  • storage fee, candidate register price and oracle request price can now be adjusted by committee (#1818, #1850)
  • native contracts can now be versioned (#1827)
  • RPC client was extended with price getters for native contracts (#1838)

Behavior changes:

  • NFTs no longer have "description" field (#1751)
  • P2P Notary service configuration moved to ApplicationConfiguration section (#1747)
  • native contract methods requiring write permission in call flags now also require read permission (#1777, #1837)
  • System.Contract.Call interop function now requires state read permission (#1777)
  • NeoGo no longer supports Go 1.13 (#1791)
  • native contract calls are now contract version aware (#1744)
  • interop wrappers for smart contracts now use int type for all integers (#1796)
  • MaxTransactionsPerBlock, MaxBlockSize, MaxBlockSystemFee settings are now a part of node configuration and no longer are available in Policy contract (#1759, #1832)
  • storage items can no longer be constant (#1819)
  • state root handling is now conformant with C# implementation (with state validators and vote/stateroot messages, #1701)
  • blocks no longer have ConsensusData section, primary index is now a part of the header (#1792, #1840, #1841)
  • wallet multisign sign command was renamed to wallet sign, it now works not just for multisignature contract signing, but also for multiple regular signers as well as contract verification signing
  • conversion interops were moved to StdLib native contract (#1824)
  • crypto interops (except basic CheckSig and CheckMultiSig) were moved to CryptoLib native contract (#1824)
  • PACK, UNPACK and CONVERT instructions now cost more (#1826)
  • some native contract types were adjusted (#1820)
  • native Neo's getCommittee and getNextBlockValidators methods now cost less (#1828)
  • block/transaction/payload hashing and signing scheme has changed (#1829, #1839)
  • signing context is now serialized to JSON using base64 for data (#1829)
  • System.Contract.IsStandard interop was removed (#1834)
  • notifications are no longer allowed for safe contract methods (#1837)

Improvements:

  • verification script are now allowed to make contract calls (#1751)
  • extensible payloads now have the same size limit as other P2P messages (#1751)
  • error logging is more helpful now in some cases (#1747, #1757)
  • function inlining support in compiler for internal intrinsics, interop refactoring (#1711, #1720, #1774, #1785, #1804, #1805, #1806, #1796, #1809)
  • documentation updates (#1778, #1843)
  • sendrawtransaction and submitblock RPC calls now return more detailed information about errors for failed submissions (#1773)
  • NeoGo now supports Go 1.16 (#1771, #1795)
  • NEP-17 transfer tracking was optimized to avoid some DB accesses (#1782)
  • interop wrappers added for SIGN/ABS/MAX/MIN/WITHIN instructions (#1796)

Bugs fixed:

  • designateAsRole method returned value while it shouldn't (#1746)
  • deleting non-existent key could lead to node panic during MPT calculation (#1754)
  • some invalid IPv4 were accepted by name service contract (#1741)
  • some legitimate IPv6 addresses were rejected by name service (#1741)
  • compiler: append() to byte array produced wrong results for bytes with

    0x80 values (#1750)

  • wrong notary-signed transaction size in notifications leading to client disconnects (#1766)
  • CALLT wasn't checking permission to read states and make calls in call flags (#1777)
  • proper escaping wasn't done in some cases on VM stack item conversion to JSON (#1794)
  • improper network fee calculation for complex multi-signed transactions in some cases (#1797)
  • importing package with the same name as compiled one could lead to incorrect compiler behavior (#1808)
  • boolean values were emitted as integers by compiler leading to some comparison failures (#1822)
  • invokecontractverify wasn't calculating proper GAS price of verification using contract (#1825)
  • ContractManagement contract wasn't returning NULL value from getContract method if contract is missing (#1851)

0.93.0 "Hyperproduction" (12 Feb 2021)

This is a 3.0.0-preview5 compatible release with important protocol changes, improved smart contract interop interface for native contracts (it's much easier now to use them) and complete Notary subsystem which is a NeoGo experimental protocol extension for P2P signature collection.

Please note that this release is incompatible with 0.92.0 and there are no plans for long-term support of it, Neo 3 is still changing and improving.

The release is tested with preview5 testnet data (and one of testnet CNs is already a neo-go node) up to 48K blocks and it has exactly the same storage data except for the Ledger contract that technically can differ between nodes (it's not a part of state proper), and in case of neo-go it's intentionally different (but this doesn't affect contract's functionality and state roots compatibility).

New features:

  • "ProtocolNotSupported" oracle response code (#1630)
  • POPITEM VM opcode (#1670)
  • CALLT VM opcode and contract tokens support (#1673)
  • extensible P2P payloads (#1667, #1674, #1706, #1709)
  • contract method overloading (#1689)
  • oracle module (#1427, #1703)
  • NNS native contract (#1678, #1712, #1721)
  • complete P2P Notary subsytem (experimental protocol extension, use only on private networks, #1658, #1726)
  • Ledger native contract (#1696)
  • getblockheadercount RPC call (#1718)
  • native contract wrappers for Go smart contracts (#1702)
  • getnativecontracts RPC call (#1724)

Behavior changes:

  • VM CLI now supports and requires manifests to properly work with NEF files (#1642)
  • NEP17-related CLI commands now output GAS balance as floating point numbers (#1654)
  • --from parameter can be omitted now for NEP17 CLI transfers, the default wallet address will be used in this case (#1655)
  • native contracts now use more specific types for methods arguments (#1657)
  • some native contract names and IDs have changed (#1622, #1660)
  • NEF file is stored now in contract's state instead of script only which also affects RPC calls and ContractManagement's interface
  • call flag definitions were moved to a package of their own (#1647)
  • callback syscalls were removed (#1647)
  • calling a contract now requires specifying allowed flags (and CallEx syscall was removed, #1647)
  • iterator/enumerator Concat calls were removed (#1656)
  • System.Enumerator.* syscalls were removed (#1656)
  • System.Storage.Find interface was reworked (#1656)
  • NEF file format was changed merging compiler and version fields, adding reserved fields and tokens (#1672)
  • registering as committee/validator candidate now costs 1000 GAS (#1684)
  • dbft now uses extensible P2P payloads (#1667)
  • contract hashing scheme was changed now including names in the mix (#1686)
  • GAS fees JSON marshalling was changed to plain integers (#1687, #1723)
  • native methods requiring committee signature now fail the script instead of returning false (#1695)
  • native ContractManagement contract now has two deploy methods, with additional data and without it (#1693)
  • updated contract manifest now can't change contract's name (#1693)
  • default values of native contracts were moved to storage from code (#1703)
  • blocked accounts now store empty string instead of 01 byte (#1703)
  • testnet magic number was changed for preview5 (#1709, #1715)
  • onPayment method was renamed to onNEP17Payment (#1712)
  • manifests are stored and accessed as stack items instead of JSON (#1704)
  • zero-length "Headers" packet is a protocol error now (#1716)
  • getstorage RPC call now uses base64 instead of hex for input/output (#1717)
  • state dumper and comparer now use base64 instead of hex (#1717)
  • deployed contracts and manifests are now checked for correctness (#1729)
  • transaction scripts are now checked for correctness before execution (#1729)

Improvements:

  • default VM interop prices were adjusted (#1643)
  • batched MPT updates (#1641)
  • you can use -m now for manifest parameter of contract deploying command (#1690)
  • transaction cosigners can be specified with addresses now (#1690)
  • compiler documentation was updated (#1690)

Bugs fixed:

  • oracle response transaction can't be correctly evicted from the mempool (#1668)
  • the node left with zero peers didn't initiate reconnections to seeds in rare cases (#1671)
  • native contracts supposed to check for committee witness in fact checked for validators witness (#1679)
  • it was allowed for contracts to have non-bool verify methods (#1689)
  • previous proposal reuse could lead to empty blocks accepted even if there are transactions in the mempool (#1707)
  • NEO contract's getCommittee method name was misspelled (#1708)
  • CLI wasn't correctly handling escape sequences (#1727)
  • init and deploy methods could be misoptimized leading to execution failures (#1730)
  • NEP-17 contract example was missing onNEP17Payment invocation (#1732)
  • missing state read privilege could lead to transaction failures for transfers from CLI or when using native contract wrappers (#1734, #1735)
  • some native contract methods had different parameter names and return output types (#1736)

0.92.0 "Fermentation" (28 Dec 2020)

NeoGo project is closing year 2020 with 3.0.0-preview4 compatible release that also has much improved performance, a lot of updates to compiler and SDK and some experimental protocol extensions. This release also is the most tested release of NeoGo ever, we've reached 83% code coverage (Neo 2.x only has 66%).

Please note that this release is incompatible with 0.91.0 and there are no plans for long-term support of it, Neo 3 is still changing and improving.

Protocol-wise this release is tested with preview4 testnet (including working in consensus with C# nodes) and it is compatible with it even though there are some known storage change mismatches between NeoGo and C# (functionally the contents is the same, this mismatch is caused by JSON handling differences and needs to be addressed at the protocol level).

New features:

  • "high priority" transaction attribute (#1341)
  • "oracle response" transaction attribute (#1407, #1520, #1573)
  • new GAS distribution and committee update scheme (#1364, #1529, #1518, #1542, #1549, #1636, #1639)
  • oracle native contract (#1409, #1432, #1474, #1476, #1521, #1528, #1548, #1556, #1625)
  • designation native contract (#1451, #1504, #1519)
  • support for _deploy method (#1452, #1466)
  • MaxTraceableBlocks parameter can now be configured (#1520)
  • KeepOnlyLatestState configuration option to drop old MPT data (#1553)
  • StateRootInHeader configuration option to include state root data in the header (it's a protocol extension, so use with care, #1500)
  • NEP-5 was replaced by NEP-17 (#1558, #1574, #1617, #1636)
  • RemoveUntraceableBlocks configuration option to perform old (unreachable) block and transaction purging (#1561)
  • stable deployed contract hashes (#1555, #1616, #1628)
  • Safe method flag for contract manifests (#1597, #1607)
  • native Management contract to deploy/update/destroy contracts (#1610, #1624, #1636)
  • Compiler/SDK:
    • base58 encoding/decoding interops for smart contracts (#1350, #1375)
    • you can use aliases now when importing interop packages (#397)
    • += operator is now supported for strings (#1351)
    • switch without statement support (#1355)
    • make() support for maps and slices using basic types (#1352)
    • copy() support for byte slices (#1352, #1383)
    • iota support (#1361)
    • support for basic function literals (#1343)
    • new variable initialization is now supported in if statements (#1343)
    • defer is now supported (#1343)
    • recover() support for exception handling (#1343, #1383)
    • delete() support (#1391)
    • util.Remove() function is added for smart contracts to remove elements from slice (#1401)
    • interop package now provides specific type aliases like Hash160/Hash256 for smart contracts to use (it affects generated manifests, #1375, #1603)
    • variables and function calls support in struct and slice literals (#1425)
    • atoi/itoa encoding/decoding interops for smart contracts (#1530, #1533)
    • contracts specifying NEP-17 as supported standard are now checked for interface compliance (#1373)
    • contract.CallEx function is now available to contracts that allows specifying flags for contract called (#1598)
  • CLI:
    • support for array parameters in invocations (#1363, #1367)
    • contract addresses can now be imported into wallet (#1362)
    • deploying/invoking from multisignature accounts (#1461)
  • RPC:
    • getcommittee RPC call (#1416)
    • limits and paging are now supported for get*transfers calls (#1419)
    • getunclaimedgas RPC call now also supports passing address as a parameter (#1418)
    • getcontractstate now also accepts addresses, IDs and names (for native contracts, #1426)
    • batched JSON-RPC requests support (#1514)
    • invokecontractverify RPC call to run verification scripts (#1524)
  • P2P notaries subsystem (configurable P2PSigExtensions protocol extension, use with care):
    • optional NotValidBefore transaction attribute (#1490)
    • optional Conflicts transaction attribute (#1507)
    • native Notary contract (#1557, #1593)
    • notary request P2P payload (#1582)

Behavior changes:

  • converting items to boolean now fail for strings of bytes longer than 32 (#1346)
  • consensus messages now use uint8 field for validator indexes (#1350)
  • maximum possible try-catch nesting is now limited to 16 levels (#1347)
  • maximum manifest size increased to 64K (#1365, #1555)
  • required flags changed for many interop functions (#1362)
  • compiler no longer generates code to log panic() message (#1343)
  • GetBlock, GetTransaction and similar interop functions now return pointers to structures (#1375)
  • calling script hash now also is accounted for by CheckWitness interop (#1435, #1439)
  • CLI is using --address parameter everywhere it's needed (some commands used --addr previously (#1434)
  • VM now restricts comparable byte array size to 64K (#1433)
  • FeeOnly witness scope was renamed to None (#1450)
  • getvalidators RPC call was renamed to getnextblockvalidators (#1449)
  • emit.Opcode is now emit.Opcodes, allowing for variadic specification of opcodes (#1452)
  • CalculateNetworkFee was moved to fee.Calculate (#1467)
  • fault exception string is now returned for failed invocations (#1462)
  • runtime.GetInvocationCounter no longer errors (#1455)
  • invoke* RPC calls now also return transaction field (#1418)
  • getversion RPC call now also returns network magic number (#1489)
  • RPC calls now return data in base64 instead of hex (#1489, #1525, #1537)
  • blocked accounts interface and storage was changed in Policy contract (#1504)
  • voting fee is lower now (#1510)
  • blocks are now processed with two execution triggers, OnPersist and PostPersist, getapplicationlog RPC call was updated to support passing trigger type (#1515, #1531, #1619)
  • storage fee formula has changed (#1517)
  • MaxValidUntilBlockIncrement is now 5760 instead of 2102400 (#1520)
  • Policy contract no longer saves default values during initialization (#1535)
  • opcode pricing was changed and now it's adjustable (#1538, #1615)
  • contracts no longer have IsPayable (see NEP-17) and HasStorage (they all have it by default now) features (#1544)
  • notification size is restricted now (#1551)
  • unsolicited addr messages are now treated as errors (#1562)
  • native contracts no longer have name() methods, it is now a part of manifest (#1557)
  • transaction fees, invocation GAS counters and unclaimed GAS values are now returned as strings with floating point values from RPC calls (#1566, #1572, #1604)
  • NEF format was changed (#1555)
  • engine.AppCall() interop was renamed to contract.Call() (#1598)
  • call flags were renamed (#1608)
  • deploying contract now costs at minimum 10 GAS and MaxGasInvoke configuration was adjusted to account for that (the fee is configurable by the committee, #1624, #1635)

Improvements:

  • a lot of new tests added (#1335, #1339, #1341, #1336, #1378, #1452, #1508, #1564, #1567, #1583, #1584, #1587, #1590, #1591, #1595, #1602, #1633, #1638)
  • a number of optimizations across all node's components applied (#1342, #1347, #1337, #1396, #1398, #1403, #1405, #1408, #1428, #1421, #1463, #1471, #1492, #1493, #1526, #1561, #1618)
  • smartcontract package now provides function to create simple majority multisignature contract (in addition to BFT majority, #1341)
  • AddNetworkFee() now supports contract addresses (#1362)
  • error handling and help texts for CLI wallet commands (#1434)
  • compiler emitting short jump instructions if possible (#805, #1488)
  • compiler emitting jump instructions with embedded conditions where possible (#1351)
  • transaction retransmission mechanism added to mempool (#1536)
  • parallel block fetching (#1568)
  • Binary and Runtime interops refactored to separate packages (#1587)
  • message broadcasts now finish successfully if the message is sent to 2/3 of peers (#1637)

Bugs fixed:

  • TRY opcode implementation was not allowing for 0 offsets (#1347)
  • compiler wasn't dropping unused elements returned from calls (#683)
  • MEMCPY with non-zero destination index was not working correctly (#1352)
  • asset transfer from CLI didn't work (#1354)
  • specifying unknown DB type in configuration file induced node crash (#1356)
  • address specifications in configuration file didn't work correctly (#1356)
  • RPC server wasn't processing hashes with "0x" prefix in parameters (#1368)
  • incorrect context unloding on exception handling (#1343)
  • attempt to get committee only returned validators if there was no voting on chain (#1370)
  • block queue could be attacked with wrong blocks to cause OOM (#1374)
  • token sale example wasn't checking witness correctly (#1379)
  • structure methods were added to generated manifests (#1381)
  • type conversions in switch and range statements were compiled as function calls (#1383)
  • RPC server result format wasn't conforming to C# implementation for getapplicationlog and invoke* (#1371, #1387)
  • subslicing non-byte slices was miscompiled (it's forbidden now, #1401)
  • potential deadlock in consensus subsystem (#1410)
  • race in peer connection closing method (#1378)
  • race in MPT calculation functions (#1378)
  • possible panic on shutdown (#1411)
  • block-level getapplicationlog result had block hash in it (#1413)
  • fail CN execution if wrong password is provided in the configuration (#1419)
  • tx witness check didn't account for GAS properly when several witnesses are used (#1439)
  • map keys longer than 64 bytes were allowed (#1433)
  • unregistered candidate with zero votes wasn't removed (#1445)
  • standard contract's network fee wasn't calculated correctly (#1446)
  • witness checking wasn't taking into account transaction size fee (#1446)
  • sending invalid transaction from the CLI wasn't prevented in some cases (#1448, #1479, #1604)
  • System.Storage.Put wasn't accounting for new key length in its GAS price (#1458)
  • blocks can't have more than 64K transactions (#1454)
  • Policy native contract wasn't limiting some values (#1442)
  • MerkleBlock payload wasn't serialized/deserialized properly (#1454, #1591)
  • partial contract updates were not always possible (#1460)
  • potential panic on verification with incorrect signature size (#1467)
  • CLI attempted to save transaction when it wasn't requested (#1467)
  • VM allowed to create bigger integers than it should support (#1464)
  • some protocol limits were not enforced (#1469)
  • iterating over storage items could produce incorrect KV pairs when using LevelDB or BadgerDB (#1478)
  • stale transaction were not deleted from the mempool (#1480)
  • node panic during block processing with BoltDB (#1482)
  • node that failed to connect to seeds on startup never attempted to reconnect to them again (#1486, #1592)
  • compiler produced incorrect code for if statements using function calls (#1479)
  • invocation stack size check wasn't performed in some cases (#1492)
  • incorrect code produced by the compiler when assigning slices returned from functions to new variables (#1495)
  • websocket client closing connection on new events (#1494)
  • minor getrawtransaction/gettransactionheight and NEP5-related RPC implementation incompatibilities (#1543, #1550)
  • VM CLI breakpoint wasn't stopping before the instruction (#1584)
  • VM CLI was incorrectly processing missing parameter error (#1584)
  • wallet conversion wasn't performed correctly (#1590)
  • node didn't return all requested blocks in response to getblocks P2P requests (#1595)
  • CN didn't request transactions properly from its peers in some cases (#1595)
  • incorrect manifests generated for some parameter types (#1599)
  • incorrect code generated when no global variables are present, but there are some global constants (#1598)
  • native contract invocations now set proper calling script hash (#1600)
  • byte string and buffer VM stack items conversion to JSON differed from C# (#1609)
  • when mempool is full new transaction's hash could still be added into it even if it is to be rejected afterwards (#1621)
  • CN wasn't always performing timestamp validation correctly (#1620)
  • incorrect stack contents after execution could stop block processing (#1631)
  • getapplicationlog RPC call handler wasn't validating its parameters properly, potentially leading to node crash (#1636)
  • a peer could be connected twice in rare circumstances (#1637)
  • missing write timeout could lead to broadcasting stalls (#1637)

0.91.0 "Ululation" (18 August 2020)

We've updated NeoGo for 3.0.0-preview3 compatibility implementing all the appropriate protocol changes as well as improving NeoGo-specific components. This release brings with it significant changes for smart contracts, both in terms of Neo protocol changes (no more there is a single entry point! execution environment has also changed in lots of ways) and Go smart contract compiler updates and fixes.

Please note that this release is incompatible with 0.90.0 and there will be no long-term support provided for it, Neo 3 is still changing and improving. If you have any wallets used with 0.90.0 release you'll need to regenerate them from private keys because of changes to verification scripts that also changed hashes and addresses.

But nonetheless it is tested to be compatible with preview3 testnet for up to 68K of blocks in terms of storage changes, with neo-debugger for debug data produced by the compiler and with consensus process for heterogeneous setups (like 2 neo-go CNs with 2 C# CNs).

New features:

  • secp256k1 signature checks added to interop functions (Neo.Crypto.VerifyWithECDsaSecp256k1 and Neo.Crypto.CheckMultisigWithECDsaSecp256k1 syscalls, crypto.ECDsaSecp256k1Verify and crypto.ECDSASecp256k1CheckMultisig interop functions, #918)
  • RIPEMD160 hash added to interop functions (Neo.Crypto.RIPEMD160 syscall, crypto.RIPEMD160 interop function, #918, #1193)
  • "NotFound" P2P message (#1135, #1333)
  • base64 encoding/decoding interop functions (binary.Base64Encode and binary.Base64Decode, #1187)
  • new contract.GetCallFlags interop (System.Contract.GetCallFlags syscall) implemented (#1187)
  • it is possible now to create iterators and enumerators over primitive VM types in smart contracts (#1218)
  • runtime.Platform interop (System.Runtime.Platform syscall) is now available to smart contracts in Go (#1218)
  • storage.PutEx interop (System.Storage.PutEx syscall) is now available to smart contracts in Go (#1221)
  • exceptions support in VM (#885)
  • CLI conversion utility functions for addresses/hashes/etc (#1207, #1258)
  • multitransfer transactions now can be generated with RPC client or CLI (#940, #1260)
  • System.Callback.* syscalls for callback creation and execution (callback.* interop functions, #1197)
  • MPT implementation was added (#1235)
  • Policy native contract now also contains MaxBlockSystemFee setting (#1195)
  • getting blocks by indexes via P2P is now supported (#1192)
  • limited pointer support was added to the compiler (#1247)
  • voting support in CLI (#1206, #1286)

Behavior changes:

  • crypto.ECDsaVerify interop function was renamed to crypto.ECDsaSecp256r1Verify now that we have support for secp256k1 curve (#918)
  • many RPC requests/responses changed names used for data fields (#1169)
  • runtime.Notify interop function now requires a mandatory UTF8 name parameter (#1052) and this name can be used to filter notifications (#1266)
  • sendrawtransaction and submitblock RPC calls now return a hash instead of boolean value in case of success (#1216)
  • System.Runtime.Log syscall now only accepts valid UTF8 strings no longer than 1024 bytes (#1218)
  • System.Storage.Put syscall now limits keys to 64 bytes and values to 1024 bytes (#1221)
  • PUSHA instruction now works with relative code offset (#1226)
  • EQUAL instruction no longer does type conversions, so that values of different types are always unequal (#1225)
  • verification scripts now can't use more than 0.5 GAS (#1202)
  • contracts no longer have single entry point, rather they export a set of methods with specific offsets. Go smart contract compiler has been changed accordingly to add all exported (as in Go) methods to the manifest (but with the first letter being lowercased to match NEP-5 expections, #1228). Please also refer to examples changes to better see how it affects contracts, manifests and configuration files (#1296)
  • native contracts are now called via Neo.Native.Call syscall (#1191)
  • compressed P2P payloads now also contain their uncompressed size (#1212, #1255)
  • NEF files now use double SHA256 for checksums (#1203)
  • VM's map keys and contract methods now can only contain valid UTF-8 strings (#1198)
  • stack items now can be converted to/from JSON natively (without smartcontract.ContractParameters intermediate) which is now used for invoke* RPC calls and application execution logs (#1242, #1317)
  • invoking Policy native contracts now requires AllowsStates (to get settings) or AllowModifyStates (to change setting) flags (#1254)
  • Transaction now has Signers field unifying Sender (the first Signer) and Cosigners, a Signer can have FeeOnly or any other regular witness scope (#1184)
  • verification scripts no longer have access to blockchain's state (#1277)
  • governance scheme was changed to delegated committee-based one. The number of validators is now specified with ValidatorsCount configuration option, standby validators are no longer being registered by default (#867, #1300)
  • Go 1.13+ is now required to build neo-go (#1281)
  • public contract methods now always return some value and this is being checked by the VM (#1196, #1331, #1332)
  • runtime interop package now exports triggers as proper constants rather than functions (#1299)
  • RPC client no longer has SetWIF/WIF methods that didn't do anything useful anyway (#1328)

Improvements:

  • Neo.Crypto.CheckMultisigWithECDsaSecp256r1 syscall is now available via crypto.ECDSASecp256r1CheckMultisig interop function (#1175)
  • System.Contract.IsStandard syscall now also checks script's container (#1187)
  • syscalls no longer have allowed triggers limitations (#1205)
  • better testing coverage (#1232, #1318, #1328)
  • getrawmempool RPC call now also supports verbose parameter (#1182)
  • VMState is no longer being stored as a string for application execution results (#1236)
  • manifest now contains a list of supported standards (#1204)
  • notifications can't be changed now by a contract after emitting them (#1199)
  • it is possible to call other contracts from native contracts now (#1271)
  • getnep5transfers now supports timing parameters (#1289)
  • smartcontract package now has CreateDefaultMultiSigRedeemScript that should be used for BFT-compliant "m out of n" multisignature script generation (#1300)
  • validators are always sorted now (standby validators were not previously, #1300)
  • debug information now contains all file names (#1295)
  • compiler now accepts directory to compile a package, only one file could be passed previously (#1295)
  • some old no longer used functions and structures were removed (#1303)
  • contract inspection output was improved for new Neo 3 VM instructions (#1231)
  • ping P2P message handling was changed to trigger block requests (#1326)

Bugs fixed:

  • inability to transfer NEO/GAS from deployed contract's address (#1180)
  • System.Blockchain.GetTransactionFromBlock syscall didn't pick all of its arguments from the stack in some error cases (#1187)
  • System.Contract.CallEx syscall didn't properly check call flags (#1187)
  • System.Blockchain.GetContract and System.Contract.Create syscalls returned an interop interface instead of plain well-defined structure (#1187)
  • System.Contract.Update syscall's manifest checks were improved, return value was fixed (#1187)
  • getnep5balances and getnep5transfers RPC calls now support addresses in their parameters (#1188)
  • rare panic during node's shutdown (#1188)
  • System.Runtime.CheckWitness, System.Runtime.GetTime syscalls are only allowed to be called with AllowStates flag (#1218)
  • System.Runtime.GasLeft syscall result for test VM mode was wrong (#1218)
  • getrawtransaction RPC call now also returns its VM state after execution (#1183)
  • getnep5balances and getnep5transfers RPC calls now correctly work for migrated contracts (#1188, #1239)
  • compiler now generates correct code for global variables from multiple files (#1240)
  • compiler now correctly supports exported contracts and variables in packages (#1154)
  • compiler no longer confuses functions with the same name from different packages (#1150)
  • MaxBlockSize policy setting was not enforced (#1254)
  • missing scope check for signers (#1244)
  • compiler now properly supports init() functions (#1253, #1295)
  • getvalidators RPC call now returns zero-length array of validators when there are no registered candidates instead of null value (#1300)
  • events were not added to the debug data (#1311, #1315)
  • RPC client's BalanceOf method was lacking account parameter (#1323)
  • VM CLI debugging commands didn't really allow to step through the contract (#1328)
  • recovery message decoding created incorrect PrepareRequest payload that lead to consensus failures (#1334)

0.90.0 "Tantalization" (14 July 2020)

The first Neo 3 compatible release of neo-go! We've targeted to make it compatible with preview2 release of Neo 3, so it only contains features available there, but at the same time this makes the node more useful until we have some more up to date reference version. It's a completely different network, so almost everything has changed and it's hard to describe it with the same level of details we usually do (but we'll provide them for subsequent releases where the changeset is going to be lower in size). Please note that this is a preview-level release and there won't be long-term support provided for it, Neo 3 is evolving and the next release won't be compatible with this one.

Main Neo 3 features in this release:

  • no UTXO
  • native contracts
  • new VM
  • scoped witnesses for transaction
  • updated interop/syscalls set
  • contract manifests
  • more efficient P2P protocol

Things that have also changed:

  • transaction format
  • block format
  • address format
  • wallets
  • RPC protocol
  • notification subsystem
  • executable format output for compiler

Compatibility level of this neo-go release:

  • identical storage changes compared to C# node for 378K blocks of preview2 testnet
  • debugging info produced is compatible with preview2-compatible neo-debugger
  • running consensus nodes in heterogeneous setup is possible (2 neo-go CNs with 2 C# CNs, for example)

Changes specific to neo-go:

  • some CLI parameters like wallet path or RPC endpoint URL have been unified across all commands and thus have changed in some of them (refer to CLI help for details)
  • as an extension we support post-preview2 cosigners parameter for invokefunction RPC calls (see neo-project/neo-modules#260)
  • Go compiler now supports comparisons with nil properly
  • we no longer provide bootstrapping 6k block dump for private networks, you have 30000000 GAS right in the genesis block and it's not hard to make use of it (see neo-go-sc-wrkshp for an example of how to use it)
  • we have a conversion tool for your old Neo 2 wallets (wallet convert command), so you can reuse keys on Neo 3 networks
  • util.Equals interop function may not function the way you expect it to due to Neo VM changes, it still is an EQUAL opcode though. This interop may be removed in the future.

Older versions

Please refer to the master-2.x branch CHANGELOG for versions prior to 0.90.0 (that are Neo 2 compatible, unlike 0.90.0+ that are Neo 3 compatible).