Releases: nspcc-dev/neo-go
Cardioacceleration
This version is a Neo 2.12.0-compatible release that follows DeFi-related network changes while also introducing some new RPC functionality and fixing bugs.
There is an important configuration update there, please check FreeGasLimit, MaxFreeTransactionsPerBlock and MaxTransactionsPerBlock settings as they're now height-dependent (see the default mainnet and testnet configurations for example of how to configure them).
If you're using getutxotransfer calls, please resynchronize your node to fix NEO values returned.
New features:
- minimum network fee policy value can now be configured, but it defaults to zero for now (#1397)
- stateroot import/export (#1307)
- new
getalltransfertx
RPC call returning all UTXO and NEP5 transactions for specified account (parameters are the same as forgetnep5transfers
, see RPC documentation for details, #1399, #1404) - GetUTXOTransfers support was added to RPC client (#1399)
Behavior changes:
- FreeGasLimit is now height-dependent (configured as a map, instead of simple value), default value for mainnet since 6200000 and testnet since 4840000 is 50.0 (#1394, #1397, #1400, #1402)
- getnep5transfers and getutxotransfers RPC calls now support limiting and paging in addition to time span selection, by default both only return a 1000 of elements (and it's the maximum possible) for a single call (#1395, #1399)
- MaxTransactionsPerBlock and MaxFreeTransactionsPerBlock are height-dependent now, the default values for mainnet and testnet change since 6200000 and 4840000 respectively to 200 transactions per block with 199 free ones
- RPC client's GetNEP5Transfers call was updated to support new parameters (#1399)
Improvements:
- the project is now using proper YAML library import path (#1306)
- the node will exit with an error if no valid password is provided for CN wallet (#1316)
Bugs fixed:
- state root addition errors in CN logs (harmless, but annoying, #1313)
- state root was generated by CNs before StateRootEnableIndex (#1320)
- panic on consensus watcher node (#1314)
- RPC calls working with 256-bit hash parameters were not accepting hashes with "0x" prefix (#1369)
- getutxotransfer RPC call returned NEO values multiplied by 10⁸ (#1386)
- incorrect vout indexes in getblock or getrawtransaction RPC outputs (#1392)
- network fee check was not accounting for LowPriorityThreshold correctly (#1397)
Ululation
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)
Cornification
This release is aligned with Neo 2.11.0 release, bringing important changes to the NeoX consensus protocol, some bug fixes and new RPC functionality. It is tested to work in consensus with 2.11.0. The DB format was changed for NEP5 tracking data and we also track UTXO transfers now, so you need to resynchronize the DB from the genesis for this version to operate correctly.
New features:
getutxotransfers
RPC call to track NEO and GAS movements. It accepts address as mandatory parameter, asset name ("gas" or "neo") and start/end time as optional parameters (similar togetnep5transfers
). See #1268 and #1288.invoke*
RPC calls now support passing hashes to be used as verified ones during execution (for contract'sCheckWitness
calls), this functionality is also available in the CLI now (#1282)
Behavior changes:
getnep5transfers
andgetnep5balance
now return raw balance values, the same way C# node does (previously the result was adjusted by contract's decimals value, #1250)getstateheight
RPC call response now uses lowercase field names (#1274)getnep5transfers
RPC call now accepts start/end optional time parameters (the same way C# plugin does), lacking start option the result might be different from the one returned by previous node versions (#1284)- we no longer support Go 1.12 to build the node (#1285)
- NeoX consensus was reworked to exchange signatures during Prepare phase and emit stateroot message along with Commit (#1291). Note that this new consensus process is not compatible with 0.76.X versions of neo-go or 2.10.3-neox-preview1 version of C# node, but it is compatible with 2.11.0, so you need to upgrade all of your consensus nodes for the network to run correctly. Also note that the default configuration for mainnet was changed to enable StateRoot functionality.
Bugs fixed:
Calibration
Minor update for Neo 2. If you're running testnet node, we recommend to resynchronize it to fix state mismatch at block 4516236, mainnet is not known to have any similar problem so you can keep the old DB.
Bugs fixed:
Conduplication
Minor bug fixing for Neo 2 implementation. If you're affected by NEP5 balance tracking bug, please resynchronize your node to get correct results, other than that it's not required, the DB is fully compatible.
Bugs fixed:
- block synchronization stalls on consensus node when it's not yet up to date and there are a lot of blocks to fetch (#1116)
- getnep5balances and getnep5transfers RPC calls didn't support passing addresses as parameters (#1146)
- NEP5 balance tracking was not aware of contract migrations leading to wrong data being returned for getnep5balances RPC call (#1144)
Tantalization
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.
Cross-pollination
We wanted to make a 0.75.1-neox-preview1 release of neo-go compatible with
version 2.10.3-neox-preview1 of C# node, but then suddenly decided to make
something better than that and now release 0.76.0 instead which brings with
it configurable cross-chain functionality support. So there is no need to use
different node builds for different networks with NeoGo, one binary fits
all. As usual some bugs were also fixed, this time mostly concentrating around
consensus functionality.
New features:
- cross-chain (aka neox) support, refer to docs/neox.md for details on what's
included and how to use it - compiler built-in Remove function was added for slices/maps element
deletion (#1021)
Behavior changes:
- the default testnet config now enables state root with StateRootEnableIndex
of 4380100, if you have a testnet node you need to either stay with the old
configuration or remove the DB and resynchronize blocks from genesis - contracts using comparison with nil will fail to compile, this comparison
actually never functioned correctly (#952)
Improvements:
- storage cache flushing was optimized, improving block import speed by ~10%
(#1014) - consensus process now logs a bit more relevant messages (#1041)
- limits to invocation scripts were added to consensus messages (#1087)
- transaction request retries were added in case consensus process is missing
some transactions (#1095)
Bugs fixed:
- dbft's failed nodes detection was tuned for the case of node lagging behind
the network (#1009) - dbft was fixed to always process recovery messages for the current block
(#1009) - compiler now initializes complex struct fields correctly (#952)
- NOTEQUAL opcode is now only being emitted for integers by the compiler (#952)
- typo in docker entrypoint script preventing proper bootstrap file passing
(#1089) - MaxFreeTransactionsPerBlock limit wasn't really enforced (#1019)
- changeview payloads were not processed correctly by the consensus subsystem
(#1041) - dbft library wasn't including messages from higher views for last seen
message checks (#1041) - recovery request sent instead of recovery message in one case (#1095)
- some correctness checks were not done for proposed block in not all
transactions were present when the node received PrepareRequest (#1095) - timeout wasn't properly calculated in some cases for Primary node leading
to early PrepareRequest send (#1095)
Caramelization
A long-awaited Neo 2.0 update for neo-go that fixes a lot of subtle little
differences in VM and syscalls behavior compared to C# node that resulted in
storage state mismatches between two nodes. This release makes neo-go fully
compatible with public testnet and mainnet chains, for every transaction in
every block you get the same result.
But it's not just about bugs, as it's been quite a long development cycle,
we've also included some interesting new features like notification subsystem,
neo-debugger compatibility and BadgerDB support. Smart contract compiler and
interop packages were also updated making neo-go even better for developing
real-world complex smart contracts.
New features:
- support for
for
loops with no condition was added to the compiler (#799) - compiler can now emit debug information compatible with neo-debugger (#804,
#829) - experimental BadgerDB support was added (#839)
- support for abi.json files generation was added for contract deployment
with NEO-Express (#916) - RPC over websocket connections is now supported both by the server (with
ws://$SERVER:$PORT/ws URL) and client (WSClient structure, #921) - notification subsystem was added for RPC server and client (using websocket
connections, #895) - interop package now has a complete set of syscalls available (#795, #956)
- push command was added to VM CLI (#967)
- diff dumps are now supported in
db restore
CLI command (#991)
Behavior changes:
- due to DB format changes you'll need to resynchronize your node from
scratch (and it'll also update its state to a more proper one) - runtime.Notify interop now accepts varargs (#825)
- compiler's
--debug
parameter is now used for debug information generation,
use--verbose
to get more internal compiler's messages (#829) - compiler now outputs hex-encoded contract's bytecode only with
--verbose
option (#829, previously it was always printed) - RPC client's representation of GetBlock results changed significantly (#951)
- some interop functions changed their in/out types to a more proper ones
(#956, though previous ones didn't really work, so no current code should
notice that) skip
parameter todb restore
CLI command was replaced bystart
(#991), when using full (non-diff) NGD dumps with short (-s
) form they're
compatible, butstart
(as a block index) makes more sense for diff dumps
Improvements:
- (*Stack).PushVal in vm now supports all types of integers (#776)
- state.AppExecResult now stores stack in binary representation (#782)
- vm.NewBigIntegerItem now accepts int64 parameter (#788)
- RPC client tests were added (#716)
- buffer reuse added for persisting temporary changes which improved block
handling speed (#772) - significant RPC server package refactoring was done (#753)
- BoltDB was updated to v1.3.4 (#793)
- Go 1.14 is now supported (#775)
- serialization/deserialization tests were unified (#802)
- emit package now has Array and AppCallWithOperationAndArgs methods for
easier script creation (#803) - persisting from MemCachedStore to MemCachedStore was optimized which
allowed to gain 10% improvement in block import time for 1.5M mainnet
blocks (#807) - storage.Find usage example was added (#795)
- VM stack item tests were improved (#812)
config
directory now only contains configuration files, no Go code (#423,
#816)- local variables are counted more accurately now in the compiler leading to
less waste in script runtime (#815) - NEP5 example was extended with minting function making it a bit more usable
(#823) - DAO was refactored away into its own package from core (#832)
- additional tests were added for bitwise and numeric VM operations (#833)
- tests for VM CALL* instructions were added (#833)
- consensus message parsing was split into two parts so that ordinary nodes
won't touch CN's data (#862) - contract's metadata was moved into smartcontract package from rpc (#916)
- interop packages documentation was extended (#956)
- Docker build was fixed to use Makefile (#981)
Bugs fixed:
- integer stack values were not following C# node format when being converted
to JSON (#770) - vm now uses truncated division to match C# node behavior for negative
integers (#773) - getapplicationlog and other RPC calls now convert Uint160 to JSON the same
way C# node does (#769) - asset state JSON representation now follows the same format as C# node uses
(with proper field names for 'id' and 'type' and without 'fee' add
'address' fields, #785, #819) nextconsensus
field ingetblockheader
RPC call answer was using hex
representation instead of address (#763)getcontractstate
RPC call implementation was using wrong format for
script
field in answer (#763)getnep5balances
RPC call implementation was using wrong name for
balance
field in answer (#763)getvalidators
RPC call was using non-compliant validators keys format in
its answer (#763)- potential problems with GAS parameter handling in CLI (#790)
contract init
CLI command was not working correctly (#792)- RPC calls now accept integer parameters in JSON strings which fix some
incompatibilities (#794) - CALLI VM instruction was using wrong offset (#791, #798)
- vm Map stack item for using different serialization format from C# node
(#806, #808) - invoke* RPC calls were returning stack in
Stack
element rather than more
compliantstack
(#805) - slices of compound types were treated wrong by the compiler (#800)
- wrong code was generated for struct variables declarations by the compiler
(#800) - RPC client was incorrectly processing GetRawTransactionVerbose,
GetBlockVerbose, GetBlockHeader, GetTxOut and ValidateAddress call results
(#789) - type-specific transaction data was completely missing in getrawtransaction
RPC call verbose output (#585) - documentation for wallet CLI commands was fixed to follow renames made by
previous version (#814) - panic in map-containing notifications processing (#809)
- VM Map implementation now has deterministic iteration order (#818)
- MOD instruction behavior was fixed to follow neo-vm (#826)
- negative arguments are now accepted for SHL/SHR VM instructions (#827)
- improper in-block cache propagation leading to storage state differences
with C# node (#821, #817) - CLI didn't check for mandatory
method
parameter presence for
invokefunction command (#828) - wrong code generated by the compiler for return statements with no
parameters (#929) - wrong code generated by the compiler for multiple function arguments with
one type specification (#935) - NEP5 example contained wrong address check (#945)
- improper code generated by the compiler for
op=
assignments to struct
fields and slice elements (#954) - Storage.Find elements order was adjusted to match C# node implementation
and eliminate state differences resulting from that (#822, #977, #988,
#994) - step command wasn't really working in VM CLI (#967)
- PICKITEM instruction implementation was fixed to reject improper input
argument types (#965, #967) - Runtime.CheckWitness was fixed to only accept compressed keys (#968, #971)
- input data length check was added to (*PublicKey).DecodeBytes (#971)
- VM reference counting for SETITEM instruction was fixed (#973)
- Map VM stack item can now be converted to Boolean (#974)
- Structs were not cloned by SETITEM instruction implementation (#972, #975)
- GetUnspentCoins syscall implementation was fixed to return array (#978,
#979, #984)
Comprehension
Functionally complete NEO 2.0 node implementation, this release can be used as
a drop-in replacement for C# node in any setting. It features full RPC
functionality support and full set of wallet operations. As usual, there
also was a number of bugs fixed, the node stability improved and some great
optimizations were also done (especially concentrated around DB interactions),
so even though this release has more functionality than ever (and it stores a
lot more chain data than ever) it at the same time imports blocks faster than
the previous one.
Of course we will make additional maintenance releases for NEO 2.0 when
needed, but following this release we'll concentrate more on NEO 3.0 features
and catching up with recent community developments around that.
New features:
- WIF and NEP2 keys import/export into/from the wallet (#685)
- multisig accounts import into the wallet (#685)
- additional key generation for existing wallets (#685)
- support for
break
andcontinue
statements in the compiler (#678) getblocksysfee
RPC method support (#341)getapplicationlog
RPC method support (#500, #754)getclaimable
RPC method support (#694)- gas claiming support in wallet CLI (#694)
- asset transfer commands in wallet CLI (#694, #706)
getrawmempool
RPC method support (#175)- RPC client support for all methods implemented in neo-go's server (#586,
#715, #694, #723, #750) getblockheader
RPC method support (#722)getnep5balances
andgetnep5transfers
RPC methods support (#498, #751)gettransactionheight
RPC method support (#713)submitblock
RPC method support (#344)getvalidators
RPC method support (#714)- support for
switch
fallthrough
statements in the compiler (#628) - a set of
NEP5*
methods added to RPC client for convenient NEP5 contract
calls (#728, #764) - NEP tokens balance querying and transfers support for CLI (#728, #757)
getunclaimed
RPC method support (#712)- contract import was added to the wallet CLI command set (#757)
- key removal added to the wallet CLI command set (#757)
- https support for RPC server (#702)
Behaviour changes:
- gas parameter for deployment no longer specifies full gas to be added into
the transaction, it now only specifies the network fee part while system
fee part is computed automatically based on contract's metadata (#747) - contract deployment and invocation from CLI is now integrated with the
wallet subsystem, WIF parameter support was dropped (#747) - wallet subcommands were renamed,
create
becameinit
and
create-account
became simplecreate
(#757) - DB format was changed several times during this release cycle, so please
resynchronize your chains
Improvements:
- improved and extended
wallet
package (#685, #694, #706, #728, #757) - refactored RPC package (dividing it into smaller subpackages, #510, #689)
GroupInputsByPrevHash
is no longer tied toTransaction
, allowing its
wider use (#696)- more efficient
transaction.InOut
type is used forReferences
(#696,
#733) - RPC client's
SendToAddress
was renamed toTransferAsset
to better
reflect its purpose (#686) - P2P server's graceful shutdown with connection closing (#691)
- broadcasted transaction batching was added improving network efficiency
(#681) - dropped duplicating
rpc.StackParamType
in favor of improved
smartcontract.ParamType
(#690, #706) - trigger types moved to their own
trigger
package (#690) - all Go packages were moved from github.com/CityOfZion to
github.com/nspcc-dev where they technically already reside since August
2019 (#710) - NEP5 balances and transfers tracking was added to Blockchain (#723, #748)
- optimized transaction inputs/outputs/results verification (#743)
SpentCoin
andUnspentCoin
structures were merged and moved intostate
package (#743)AddVerificationHash
method was added toTransaction
to simplify
attributes management (#752)
Bugs fixed:
getpeers
RPC request was not returning unconnected and bad peers (#676)- RPC client was not reporting real error from the answer in case of HTTP
error (#676) - potential race in
Seek
implementation forMemoryStore
(#693) - improper handling of more than 64K branching points in the compiler (#687)
- Enrollment transactions verification didn't check for validator key (#696)
- Claim transaction witness check might miss some hashes from Inputs (#696)
- double Claim verification was missing (#696)
- network fee calculation was completely broken (#696)
- mempool's
Remove
might drop wrong transaction (#697) - missing double claim verification for mempool transactions (#697)
- server deadlock upon reaching connection limit (#691)
- wrong logic short-circuiting by compiler in complex conditions (#699, #701)
AddHeaders
method was not verifying headers in any way (#703)- missing Claim amount verification (#694)
- bogus error returned from
GetValidators
when processing transfers to
(yet) unexisting accounts (#694) - Claim and Miner transactions network fee was wrong (#694)
- negative outputs were allowed in transactions, but shouldn't (#694)
- smart contract invocation CLI command failed to process some parameters
correctly (#719) - fatal error on concurrent access to
Blockchain
internal variable (#720) - Invocation transactions missed some decoding checks (#718)
- it was allowed to have fractional GAS in Invocation transactions (which is
interpreted as system fee), but it shouldn't (#718) - system fee calculation for Invocation transactions was incorrect (#718)
Transaction
JSON unmarshalling was processing Outputs and Witnesses
incorrectly (#706)- panic on server shutdown in case it's not fully started yet (#721)
sendrawtransaction
RPC method implementation was not following error
codes convention (#724)- interop implementations were using wrong byte order for returned hashes
leading to storage state differences at mainnet's block 2025204 (#727) getblock
verbose response format was not following official documentation
(#734)- contract deployment could fail with no error returned (#736)
- max contract description limit was wrong, leading to deployment failures
(#735) - compiler didn't properly clean up stack on
return
orbreak
in some
situations (#731) - deadlock in discovery service (#741)
- missing dynamic
APPCALL
support (#740) EQUAL
opcode implementation was not comparing different stack item types
correctly (#745, #749)- RPC error on contract invocation when Hash160 is being passed into it
(#758) - absent any ping timeouts configuration the node was constantly pinging its
neighbours (#680) - contract's state migration was not done properly (#760)
- db import with state dump was not saving dumps correctly on interruption
and was now resuming writes to dump files correctly after restart (#761) - incomplete State transaction verification (#767)
- missing Owner signature check for Register transaction (#766)
- incomplete Issue transaction verification and mempool conflicts check
(#765)
Cotransduction
This is the first release than can successfully operate as a Testnet CN
bringing with it fixed voting system implementation, policying support and
other related fixes. It also contains RPC improvements and updates to the
compiler.
New features:
- Go smart contracts can now use variables for struct fields initialization
(#656) - for range loops support in the compiler (#658)
- subslicing support for
[]byte
type (#654) - block's storage changes dump support similar to NeoResearch's storage audit
(#649) gettxout
RPC method support (#345)getcontractstate
RPC method support (#342)getstorage
RPC method support (#343)- GetChangeAddress function in the wallet (#682)
- basic policying was implemented allowing to configure
MaxTransactionsPerBlock, MaxFreeTransactionsPerBlock,
MaxFreeTransactionSize and FeePerExtraByte (#682)
Behaviour changes:
- consensus process now only start when server sees itself synchronized with
the rest of the network (see (*Server).IsInSync method, #682) - default testnet and mainnet configurations now contain policer settings
identical to default SimplePolicy C# plugin (#682), privnet is not changed
Improvements:
- keys.PublicKey now has Cmp method available (#661)
- core now exports UtilityTokenID and GoverningTokenID functions (#682)
- miner transactions generated by consensus process now properly set outputs
based on block's transactions fees (#682) - (*Blockchain).
IsLowPriority
now takes fee (Fixed8) as an input (#682) - mempool's GetVerifiedTransactions and TryGetValue now also return
transaction's fee - DBFT logging was improved
- keys package no longer has Signature methods, they were replaced with more
useful GetScriptHash (#682)
Bugs fixed:
- compiler produced wrong code if there was some data containing byte 0x62 in
the program (#630) - answer to the
getblock
RPC method was not following the specification in
multiple places (#659) - State transaction's descriptors were not encoded/decoded correctly (#661)
- keys.PublicKeys slice was not decoded properly (#661)
- 'Registered' descriptor of State transaction was not decoded correctly
(#661) - voting processing and validators election was fixed to follow C#
implementation (#661, #512, #664, #682) - deadlock in network subsystem on disconnect (#663)
- RPC answers with transactions were not following the specification in fields
names (#666) - segmentation fault when checking references of bad transactions (#671)
getassetstate
andgetrawtransaction
RPC methods were not returning
error properly when missing asset or transaction (#675)- consensus RecoveryMessage encoding/decoding wasn't correct (#679)
- DBFT was not reinitialized after successful chain update with the new block
received from other peers (#673) - DBFT timer was extended too much, not following the C# implementation (#682)