Releases: AntelopeIO/spring
Spring v2.0.0-dev1.3
This developer preview release addresses a critical stability issue in the Sync Calls feature that could cause node crashes on restart. Spring v2.0.0-dev1.3 ensures proper resource allocation for sync calls across node restarts and protocol feature activation scenarios.
Warning
This is a Developer Preview release, intended for testing and feedback only. Future releases may contain breaking changes. Spring 2.0.0-dev1.3 should only be used on dedicated test networks.
Notable Changes
Sync Call Resource Allocation Fix
Resolved a critical issue where resources required for nested sync calls were only allocated when the sync_call protocol feature was first activated. This caused crashes when nodes were restarted after the feature was already active. The fix ensures resources are properly allocated during node startup regardless of when the protocol feature was activated.
Complete Change Log
Critical Sync Call Fixes
Full Changelog: v2.0.0-dev1.2...v2.0.0-dev1.3
Contributors
Special thanks to @ericpassmore for reporting the issue and providing core dumps that helped diagnose the problem.
Spring v1.2.2
The Spring v1.2.2 release is a patch update focused on enhancing stability and resolving critical bugs. This release includes several important changes aimed at ensuring robust performance and preventing disruptions in node operations.
Notable Changes
This release fixes a race condition that can potentially cause a block producing node to become stuck (neither apply blocks nor produce blocks) until the node restarted.
Complete Changes
Critical Fixes
- Protect against timer "rearm race" - Addressed timing conflicts to prevent node stalling.
- Avoid infinite loop on shutdown of terminate-at-block - Prevented infinite loop conditions during shutdown.
P2P Enhancements
- Reset sync on rejected block - Averted potential sync issues caused by unlinkable blocks.
- Block nack reset fix - Track received blocks for more accurate nack resets.
Testing Improvements
- Improve the reliability of gossip peer test - Cleanup test and improve reliability.
- Do not fail on not finding a block - Ensure tests don't fail when blocks aren't found within the timeout.
- Shutdown before resume - Synchronize shutdown before resuming production to prevent errors.
Contributors
- Kevin Heifner (@heifner)
- Matt Witherspoon (@spoonincode)
Full Changelog: v1.2.1...v1.2.2
Spring v2.0.0-dev1.2
Spring v2.0.0-dev1.2 fixes a potential crash in sync calls. All nodes testing the v2.0.0-dev1 release should upgrade to this new version.
Warning
This is a Developer Preview release, intended for testing and feedback only. Future releases will contain breaking changes. Data files created by 2.0.0-dev1.2 (such as block logs, snapshots, state history logs, etc) will not necessarily be compatible with any future releases. 2.0.0-dev1.2 should not be used on chains other than chains specifically testing the 2.0.0-dev1.2 preview release.
Contributors
Special thanks to the contributors that submitted patches for this release:
Spring v2.0.0-dev1.1
Spring v2.0.0-dev1.1 changes the behavior of get_sender() in sync calls based on developer feedback. See #1738 for details. For compatibility with the live developer preview testnet this modification is being done as a temporary protocol feature for the dev1 release. Future releases will include this new behavior in the SYNC_CALL protocol feature.
Nodes connected to the developer preview testnet will need to upgrade to this release. Nodes on private or local testnets should activate GET_SENDER_FIX to get the updated behavior.
Warning
This is a Developer Preview release, intended for testing and feedback only. Future releases will contain breaking changes. Data files created by 2.0.0-dev1.1 (such as block logs, snapshots, state history logs, etc) will not necessarily be compatible with any future releases. 2.0.0-dev1.1 should not be used on chains other than chains specifically testing the 2.0.0-dev1.1 preview release.
Contributors
Special thanks to the contributors that submitted patches for this release:
Spring v2.0.0-dev1
Spring v2.0.0-dev1 is the first developer preview release of the Spring 2.0 series, focussing on the initial introduction of Sync Calls for developer feedback.
Warning
This is a Developer Preview release, intended for testing and feedback only. Future releases will contain breaking changes. Data files created by 2.0.0-dev1 (such as block logs, snapshots, state history logs, etc) will not necessarily be compatible with any future releases. 2.0.0-dev1 should not be used on chains other than chains specifically testing the 2.0.0-dev1 preview release.
Sync Calls Overview
Sync Calls introduce a new mechanism for smart contracts to synchronously call other contracts and receive a return value, enabling more expressive and modular contract design.
This release includes:
- Protocol Feature Activation: Sync Calls are gated behind a protocol feature (
sync_call) and require activation by Block Producers. - New Host Functions: Includes
call(),get_call_data(), andset_call_return_value()for performing and managing sync calls inside contract code. - Return Value Support: Sync calls can pass and receive binary-encoded values up to configural size limit (default 512 KB).
- Nested and Recursive Calls: Contracts can perform nested sync calls up to a configurable max depth (default 16).
- Entry Point Validation: Contract deployment checks for valid
sync_call()entry points and signature correctness. - Resource Limits and Config: Introduces
chain_config_v2andsnapshot_v9, allowing on-chain governance of call depth and data size limits. - Access Scope Enforcement: Supports enforcing read-only contexts and privileged access within sync calls.
- Host Function Constraints: Action-specific host functions (e.g.
send_inline) are restricted within sync calls to prevent side effects. - Console Tracing: Console output from sync calls is captured and displayed in a structured hierarchy for better debugging.
- Call Traces: Each sync call is tracked via structured call traces with full metadata, returned as part of the action trace.
Note
In order to use Sync Calls in smart contracts, you will need to use CDT v5.0.0-dev1.
For details on how to use the new Sync Calls features, please see the Developer's Guide to Sync Calls.
Platform Support
Spring 2.0.0 no longer supports Ubuntu 20.04.
Changes
New Sync Calls Feature
- SC: SYNC_CALL protocol feature definition and registration by @linh2931 in #1222
- SC: Implement boilerplate code for new host functions call, get_call_data, and set_call_return_value by @linh2931 in #1238
- SC: Merge main to sync_call 03-06-25 by @linh2931 in #1241
- SC: Implement the core functionalities of sync calls by @linh2931 in #1251
- SC: Introduce chain_config_v2 and snapshot_v9 for max_sync_call_depth and max_sync_call_data_size by @linh2931 in #1257
- SC: Implement
get_call_data,set_call_return_valueandget_call_datahost functions by @linh2931 in #1258 - SC: Validate sync call entry point by @linh2931 in #1266
- SC: Tests for sync calls without parameters, not returning a value, or returning a 0-length value by @linh2931 in #1300
- SC: privilege support by @linh2931 in #1311
- SC: Enforce host function preconditions for sync calls by @linh2931 in #1296
- SC: enforce
max_sync_call_depthfor nested and recursive sync calls by @linh2931 in #1285 - SC: Introduce host_context class as the interface to the host and as the base class for apply_context and sync_call_context by @linh2931 in #1273
- SC: Merge main branch into sync call branch (4/7/2025) by @linh2931 in #1326
- SC: add support for v9 snapshots to
spring-util snapshot infoby @spoonincode in #1327 - SC: Hide max_sync_call_depth and max_sync_call_data_size in the return value of get_consensus_parameters if sync_call protocol feature is not activated by @linh2931 in #1331
- SC: Merge
mainbranch intosync_callbranch (4-11-25) by @linh2931 in #1364 - SC: save & restore GS register to allow nested EOS VM OC executors by @spoonincode in #1382
- SC: A new approach to managing Wasm allocators in controller by @linh2931 in #1346
- SC: Merge
release/2.0intosync_callbranch (4-18-25) by @linh2931 in #1406 - SC: Support read only sync call by @linh2931 in #1404
- SC: point to head of eos-vm sync_call branch by @linh2931 in #1417
- SC: Implement sync call trace by @linh2931 in #1333
- SC: Fix read_only flag in call traces and make code cleaner in read only processing by @linh2931 in #1410
- SC: Make sure return value is retained if set_call_return_value() is called before eosio_exit() by @linh2931 in #1427
- SC: Add SHiP support for sync call traces by @linh2931 in #1340
- SC: Merge release/2.0 to sync_call (4/29/25) by @linh2931 in #1466
- SC: Implement EOSVM-OC support for sync calls by @linh2931 in #1378
- SC: Implement memory pools with variable-sized memory slices for OC by @linh2931 in #1451
- SC: Revert entry point validation by @linh2931 in #1453
- SC: Sync call entry point validation for
eosvm,eosvm-jit, andeosvmocby @linh2931 in #1455 - SC: Support sync_call entry point function to return execution status by @linh2931 in #1525
- SC: Revert SHiP Support for call_trace by @linh2931 in #1556
- SC: Support call trace deserialization in ABI serializer by @linh2931 in #1576
- SC: Set up infrastructure for writing sync call tests using contracts in C++ by @linh2931 in #1591
- SC: Pretty print sync call consoles from contract in call hierarchy by @linh2931 in #1641
- SC: Add comprehensive tests using test-contracts in C++ by @linh2931 in #1651
- SC: Support long sync call names by @linh2931 in #1701
- SC: Cleos support of displaying call traces and console logs by @linh2931 in #1724
- SC: Support consolidated single sync call ABI section by @linh2931 in #1725
- SC: Add sync calls to deep mind log by @linh2931 in #1439
Cleos Enhancements
- [2.0.0-dev] when outputting K1 public keys, always use
PUB_K1_format by @spoonincode in #1561 - switch cleos to using UTF8 locale; allows using IDN endpoints by @spoonincode in #1590
- cleos convert un/pack_hex by @heifner in #1578
- Add stricter abi version checks in
cleosandabi_serializerby @greg7mdp in #1640 - Add core.vaulta support to cleos by @heifner in #1625
P2P Enhancements
Miscellaneous Enhancements
- [2.0.0-dev] Add support for
bitsetserialization inabi_serializer. by @greg7mdp in #1531 - Updated docs with nodeos --help output by @heifner in #1459
- add missing check for MAX_NUM_ARRAY_ELEMENTS in the std::array pack/unpack. Also c++20 syntax update. by @greg7mdp in #1443
- Support truncate-at-block with terminate-at-block by @heifner in #1457
- [2.0.0-dev] Add a rethrow() to fc::exception to preserve exception type by @heifner in #1535
- [2.0.0-dev] Generate new snapshot on fork by @heifner in #1538
- remove unused to/from variant, to/from base58, and pack/unpack for some key types by @spoonincode in #1560
- Add support for fixed size arrays in abi_se...
Spring v1.2.1
Spring v1.2.1 is a non-breaking patch release focused on stability improvements in P2P synchronization, error handling, and testing resilience.
Notable Changes
-
TraceAPI Fix for Snapshot-Based Transactions
TraceAPI can now correctly locate transactions after starting from a snapshot, improving traceability across restarts. -
Error Reporting on Invalid Blocks
Node now logs clear error messages for invalid blocks, enhancing observability and debugging. -
Improve Catchup Sync Reliability
Prevent disconnects during catchup sync when a peer’s requested block isn't available, avoiding unnecessary disconnects and retries. -
Fix Sync Spamming for Rejected Blocks
Prevent spamming a syncing node with the same range of blocks when there is a rejected block.
Changes
- #1700: TraceAPI: Fix for finding trx after starting from snapshot
- #1672: Report error on invalid block
- #1663: P2P: Do not disconnect on catchup sync for unavailable block
- #1676: P2P: Fix repeated sync request on rejected blocks
- #1649: Add
-latomicto link dependencies - #1647: Test: Modify sync test to sync from the same node
- #1657: Test: Do not error when there is an incoming connection
- #1659: Test: Wait on node to stop advancing LIB
- #1707: Test: Allow more time for node to startup and sync
Spring v1.2.0
Spring v1.2.0 is a minor release that enhances node connectivity, resilience, and operational simplicity of Spring nodes. The most notable new feature is Gossip-based Auto-peering for Block Producers.
Notes on Gossip-Based BP Auto-Peering
Spring v1.2.0 introduces a powerful new networking feature: gossip-based auto-peering for block producers. This system eliminates the need for manual peer configuration by enabling BPs to dynamically discover and connect to each other using authenticated gossip messages. The result is a self-healing consensus mesh that adapts gracefully to changes in the network—such as node redeployments, hard forks, or producer schedule changes—without requiring human coordination.
Registering BP Peering Keys
This feature requires the deployment of vaultafoundation/system-contracts v3.9.0 or later, which introduces the ability for BPs to register on-chain peering keys using the regpeerkey action. These keys are used to sign and validate gossip messages securely.
Configuring Gossip Peering
Block Proposers that wish to participate in the gossip mesh, must declare its public presence using one or more --p2p-bp-gossip-endpoint entries.
Up to 8 active gossip entries per producer are supported. These entries are signed, gossiped to other participating peers, and refreshed every 30 minutes. Expired entries are pruned automatically after 1 hour.
Monitoring and Debugging
To inspect currently known BP gossip peers, Spring exposes a new API, /v1/net/bp_gossip_peers, which returns the list of active gossip entries, including each peer's identity, endpoint, and expiration timestamp—useful for diagnostics or generating dynamic firewall rules.
Setup Instructions
For complete instructions on how to participate in BP Gossip-based BP Auto-peering, please see: https://github.com/AntelopeIO/spring/wiki/BP-Gossip-Peering-Instructions
Other Notable Changes
While gossip-based BP auto-peering is the headline feature of Spring v1.2.0, several other important improvements and fixes have also landed in this release:
IPv6 Support Restored
Fixed a regression in IP address parsing introduced in v1.1, fully restoring IPv6 compatibility in the net_plugin.
Improved OC Compile Scheduling
Optimized the handling of WebAssembly OC compiles by switching to an unbounded result queue and proactively releasing memory, reducing potential latency and memory overhead.
Agent Name in P2P Logs
Introduced support for a custom agent-name string in peer log formatting to help operators better identify connections.
Complete Change Log
Enhancements
- Validate finality mroot of Savanna blocks as a part of header validation.
- Cache the packed block data in
signed_blockso that it can be retrieved without having topackit at time of serialization. performance - Print snapshot information using
spring-utilcommand. - Add
--dry-runforpush actionin cleos. - Add gossip of BP peers.
- Retrieval of peers public keys from chainbase db.
- Modify p2p-auto-bp-peer to connect to all finalizers, the top 21 producers.
- Optimize processing of incoming blocks by removing an unneeded thread hop on nominal case.
- Add new options
_peerand_nvertopeer-log-format. - Increase send/receive buffer to 1Mb.
- Add interrupt of speculative transactions interrupting when a block is received.
- Add interrupt of read-only trxs on ctrl-c/SIGINT/SIGTERM/SIGPIPE. Do not interrupt read-only trxs when a block is received.
- Only show action return information when
ACTION_RETURNis activated. - Improve hash function for
chain::name - [1.2.0] P2P: BP gossip connections
- [1.2.0-rc3] P2P: Trim addresses
- [1.2.0-rc3] P2P: Allow p2p-bp-gossip-endpoint with duplicate server addresses
- [1.2.0-rc3] P2P: agent-name
- [1.2.0-rc3] TraceAPI: Add core.vaulta.abi and update eosio.* abis
- [1.2.0-rc3] Handle block log exception during replay
- [1.2.0-rc2] P2P: Versioned signed type for gossip_bp_peers_message::signed_bp_peer
- [1.2.0-rc2] P2P: Gossip BP peer enhancements
- use a global merkle thread pool to avoid creation and destruction of threads every block
- avoid copying action when computing action digest
- Optimize fork database open/read
- Do not interrupt apply_block on a received block if applying to head
- Update to peer_keys_db_t to match changes in eos-system-contracts pr 185
Logging
Documentation
Other
- [1.2.0-rc2] mark a couple variables used only for
assert()as[[maybe_unused]]to avoid warning - [1.2.0-rc2] use more portable
__builtin_bswap64() - Add
vaulta_genesisfile. - remove C++20 ifdefs in merkle.hpp
- allow any executor for
post_async_task() - Add some missing
std::move(), usevariantstype consistently. - no need to use
std::packaged_task; asio supports returning astd::futuredirectly - Ensure finalizercNode is synced up before terminating the first node in the cluster. test-instability
- Preserve test when evaluating a fork, add time to evaluate fork switch. test-instability
- Logs protocol activations during tests.
- Improve test helpers by adding common method for registering different test types.
- [1.2.0] Test: Wait on block before verification of pause
- [1.2.0] Test: Increase timeout
- [1.2.0-rc3] Test: Wait for pause to take affect
- [1.2.0-rc3] Test: Reduce throttle speed
- [1.2.0-rc3] Test: Relax hard thread test
- [1.2.0-rc3] Test: Wait on the correct head value
- [1.2.0-rc2] fix race on creation of
TestLogsdirectory in TestHarness Utils - [1.2.0-rc1] Bump version to 1.2.0-rc1
- [1.2.0-rc2] bump version to 1.2.0-rc2
- [1.2.0-rc3] Bump version to 1.2.0-rc3
- [1.2.0] Version 1.2.0
- Remove empty file.
- Reduce strain on ci/cd by lowering TPS during performance tests. test-instability
- Bump bn256 submodule.
- Update code sanitizers to clang20.
- [Cleanup memcpy and memset to avoid wa...
Spring v1.2.0-rc3
Spring v1.2.0-rc3 further refines the block producer gossip protocol.
🔧 Notable Changes
-
Relaxed Gossip Endpoint Uniqueness
Updated uniqueness checks forp2p-bp-gossip-endpointto focus on the tuple[bp-account, outbound-IP], allowing duplicate server endpoints under controlled conditions. -
Endpoint Address Trimming
Enforced trimming of leading/trailing spaces in gossip endpoint configurations and peer hostnames to prevent connection errors due to stray whitespace. -
Restored IPv6 Support
Fixed the broken IPv6 parsing logic by correctly handling and trimming bracketed addresses, restoring full IPv6 compatibility innet_plugin.
📝 Complete Change Log
Enhancements
- P2P: agent-name — Changed default agent name to “Spring Agent” ([#1551])
- P2P: Allow p2p‑bp‑gossip‑endpoint with duplicate server addresses — Relaxed uniqueness enforcement by outbound IP ([#1596])
- P2P: Trim addresses — Auto-trims whitespace from configured endpoints and peer hostnames ([#1597])
- Rebrand Updates — BIOS Boot tutorial rebranded to Spring identity ([#1536])
Bug Fixes
Tests
- Test: Wait on the correct head value — Fixed tests to ensure accurate block head references ([#1529])
- Test: Relax hard thread test — Loosened multi-threading constraints for test stability ([#1530])
- Test: Reduce throttle speed — Adjusted throttle delays for more permissive testing ([#1555])
- Test: Wait for pause to take effect — Enhanced timing in test workflows for pause/resume functionality ([#1565])
- TraceAPI: Add core.vaulta.abi and update eosio.* abis — Expanded ABI coverage in Trace API tests ([#1571])
Full Changelog: v1.2.0-rc2...v1.2.0-rc3
Spring v1.2.0-rc2
Note
1.2.0-rc2 changes the bp peering gossip protocol in ways that are incompatible with v1.2.0-rc1.
Spring v1.2.0-rc2 introduces significant advancements in the BP gossip protocol, enhancing peer discovery, connectivity, and network resilience. These updates build upon the dynamic auto-peering system introduced in v1.2.0-rc1, further streamlining block producer operations and network configuration.
Notable Changes
-
Enhanced BP Gossip Endpoint Configuration
Introduced the--p2p-bp-gossip-endpointoption, allowing block producers to specify their account name, advertised inbound endpoint, and outbound IP address. This facilitates dynamic peer discovery and simplifies firewall configurations. -
BP Peer Entry Expiration Mechanism
Implemented an expiration system for BP peer entries, ensuring outdated information is purged and the network maintains up-to-date peer data. Entries expire after one hour, with updates propagated every 30 minutes. -
Increased BP Peer Entry Limit
Expanded the maximum number of BP peer entries per producer from 4 to 8, accommodating more complex network topologies and enhancing connectivity options. -
New API Endpoint for BP Gossip Peers
Added the/v1/net/bp_gossip_peersAPI endpoint, providing real-time access to the current set of known BP gossip peers, aiding in monitoring and diagnostics. -
Agent Name Inclusion in Peer Logs
Extended thepeer-log-formatoption to include the agent name, offering clearer identification in peer log statements and facilitating debugging. -
Versioned Signed BP Peer Messages
Adopted a versioned structure forsigned_bp_peermessages, paving the way for future enhancements while maintaining backward compatibility.
What's Changed
- [1.1.4] Bump version to 1.1.4 by @heifner in #1435
- [1.1.4 -> 1.2.0-rc1] Bump version to 1.1.4 by @heifner in #1437
- [1.1.5] fix state history race on disconnect: drain session strand before destroying session by @spoonincode in #1446
- [1.1.5 -> 1.2.0-rc2] fix state history race on disconnect: drain session strand before destroying session by @spoonincode in #1448
- [1.1.5] Fix OC scheduling of compiles by @heifner in #1447
- [1.1.5 -> 1.2.0-rc2] Fix OC scheduling of compiles by @heifner in #1458
- [1.1.5] Version bump to v1.1.5 by @heifner in #1463
- [1.2.0-rc2] github org rename to vaultafoundation/system-contracts by @ericpassmore in #1462
- [1.1.5 -> 1.2.0-rc1] Version bump to v1.1.5 by @heifner in #1465
- [1.2.0-rc2] Updated docs with latest nodeos --help output by @heifner in #1469
- [1.2.0-rc2] Additional logging of unapplied trxs by @heifner in #1473
- [1.2.0-rc2] use more portable
__builtin_bswap64()by @spoonincode in #1478 - [1.2.0-rc2] mark a couple variables used only for
assert()as[[maybe_unused]]to avoid warning by @spoonincode in #1479 - [1.2.0-rc2] fix build of
api_testson platforms without OC by @spoonincode in #1480 - [1.2.0-rc2] Migrate Performance Test Harness Actions to @v4 by @ericpassmore in #1481
- [1.2.0-rc2] Performance Workflow Move Upload Out of Build Dir by @ericpassmore in #1494
- [1.2.0-rc2] Fix logging of failed trx by @heifner in #1498
- [1.2.0-rc2] fix race on creation of
TestLogsdirectory in TestHarness Utils by @spoonincode in #1490 - [1.2.0-rc2] P2P: Gossip BP peer enhancements by @heifner in #1503
- [1.2.0-rc2] P2P: Versioned signed type for gossip_bp_peers_message::signed_bp_peer by @heifner in #1512
- [1.2.0-rc2] bump version to 1.2.0-rc2 by @spoonincode in #1521
Full Changelog: v1.2.0-rc1...v1.2.0-rc2
Spring v1.1.5
Spring v1.1.5 is a patch release focused on improving system stability.
Notable Changes
-
Resolved State History Race Condition on Disconnect
Addressed a race condition in the state_history plugin that could lead to undefined behavior during session teardown by ensuring all pending asynchronous operations are drained before destruction. -
Improved OC Compile Reliability
Fixed a condition where in some cases OC would stop compiling new contracts resulting in reduced performance.
Complete Change Log
Bug Fixes
Miscellaneous
Contributors
Full Changelog: v1.1.4...v1.1.5