All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.12.0] Leda - 2024-11-19 💥
Flexibility in funding for payment channels and basic Layer-2 security.
-
Egoistic funding allows users to wait for their peers to fund before they fund themselves. This change has to be adopted by the Perun backends to be usable (in case of Ethereum): #397
-
Wire authentication for Layer2 communication between Perun clients, using TLS: #402 💥
-
Support for Stellar backend in README: #408
- Update go to 1.22: #406
- 💥 This is a breaking change, e.g., it changes the external API.
Exposure of protobuf converters & SignedState
, abstraction of tests and bug fixes.
- Add Fabric to backend list in README: #377
- Create new type
TransparentChannel
to exposeSignedState
: #389 - Update backend compatibility list in README: #392
- Add MAINTAINERS.md file, Update NOTICE: #394
- Fix sub-channel test: #359
- Fix Multi-Adjudicator Subscription: #366
- Use correct identity for client tests: #376
- Fix link to white paper in README: #379
- Fix linter copyright year checking in CI: #389
- Fix failing unit tests: #399
Changed 💥
- Abstract multiledger test, making it usable by backends: #355
- Abstract fund recovery test, making it usable by backends: #370
- Abstract virtual channel test, making it usable by backends: #375
- Expose protobuf converters: #384 #393
- Use absolute module path in wire.proto: #383
- Create AppID Type to generalize app identifiers: #378 💥
Multi-ledger payment channels.
- Satisfy linter warnings: #342
- Remove go-ethereum dependency: #338
Moved Ethereum backend to separate repository.
- Moved Ethereum backend to separate repository: #355.
Injectable wire encoding and a protobuf
wire encoder.
- ✨ Injectable wire encoding #233: The encoding used for messages that are sent across the network is now injectable.
- ✨ Protobuf wire encoder #311: A wire encoder based on
protobuf
has been added #318. - Minor additions: Introduce
Asset.Equal
#279, export proposer index #313.
- 💥 Rename
Address.Equals
toAddress.Equal
#264. - 💥 Revise
Channel.Update
andChannel.ForceUpdate
: #289, #291, #306. - 🚚
pkg/io
migration: #256, #271, #285, #287. - 📝 Update README to include references to existing backends #314.
- 🚸 Minor usability improvements: #268, #278, #315.
- 👷 CI updates: #260, #274, #276, #277.
- ⬆️ Use
LatestSigner
in Ethereum contract backend and don't setGasLimit
by default, so that EIP1559 TXs are sent #322.
- 🐛 Fix a bug causing
Channel.Watch
to not work correctly for sub-channels and virtual channels #251. - 🐛 Fix bugs causing
ContractBackend.confirmNTimes
to block indefintely or fail in some rare cases: #254, #309. - ✅ Improve test stability: #310, #319.
- 🔒 It is now checked that assets are not changed during a state update, which could otherwise cause a channel to become unfunded #304.
Reorg-resistance for the Ethereum backend and support for external Watchtowers.
- ✨ Ethereum backend: Reorg resistance #19: The Ethereum backend now lets the user specify after how many blocks a transaction or an event should be considered confirmed.
- ✨ Watcher interface #172: The watcher logic is now injectable. The adjudicator takes a watcher instance as a setup parameter. This enables using remote watcher services. A local watcher implementation is provided.
- ⬆️ Update go to v1.17 and go-ethereum to v1.10.12.
- ✅ Extend support for additional blockchain backends by revising the generic tests (e.g., #225, #227, #228).
- 🚸 Improve usability (e.g., #124, #144, #196, #204, #240).
Virtual channels. And some other additions.
- Virtual Channels (#83, #114, #119, #123): Go-perun now supports virtual channels. A virtual channel is a channel that is funded and settled completely off-chain and therefore does not incur any on-chain transaction fees.
- Generic event subscription (#36, #86, #89, #94): In preparation for implementing a reorg-resistant event subscription, we implemented a generic event subscription that can be used across the whole library.
- Tutorial announcement (c8cff7cb): We now have a developer tutorial at http://tutorial.perun.network.
- Named errors (429a8934, #10, #11, #26, #34, #80): Specific error types help the library user to identify the cause of an error.
- Register asset at runtime #124: It is now possible to add assets to the Eth funder at runtime.
Gatherer.OnFail
(e3729a6a), Test wallet (12c78d33), GitHub CI (#3),ConcurrentT.WaitCtx
(#112), Eth sim backend auto mining (#104)
- 💥 Asset holder validation (#111): Asset holder validation does no longer include adjudicator validation.
- Current state in HandleUpdate #33: The update handler now receives the current channel state as a parameter.
- Funder usability #74: Streamlined Eth funder setup.
- 2021 updates (2212847d),
Update generate script (3f81e47c),
Update links to HLL (#6),
Update security disclaimer (#14, #51),
Delete gitlab templates (#24),
Dependency update (#30),
Document parameters of
NewLedgerChannelProposal
(#43), CI speed-up (#44), Refactor Eth channel errors (#88), Log message type (#96)
-
Cache first channel update (#4, #129): Fixes a bug where a client receives channel messages before completing the channel setup.
-
Subchannel off-chain settlement #59: Sub-channels had to be disputed on-chain before they could be settled. Sub-channels can now be collaboratively settled off-chain.
-
ERC20 depositor nonce mismatch #134: Fixes an issue where the ERC20 depositor sometimes was not incrementing the transaction nonce correctly.
-
Unitialized funder variable (af207adb), EndpointRegistry retry and timeout (28e535bb), Watcher return (cf9279c9), Thread-safe test wallet #17, Withdraw variable capture #50,
NewRandomLedgerChannelProposal
consistency #55, Enable logging per default in package client #66, StabilizeBlockTimeout
test #90, Fix state hash test #120, Ensure custom error progagation #126
- Ensure correct params ID after deserialization #60: Parameter deserialization did not assert that the encoded channel ID is correct. This is now fixed.
- Signature verification for sub-channel funding and settlement #61: Sub-channel funding and settlement requires an automated update in the parent channel. The signatures on that automated update were not correctly verified. This is now fixed.
Support for on-chain progression of app channels.
- On-chain progression: The channel watcher is now interactive and informs the client when a channel has been registered on-chain. If the channel has a defined app logic with a valid state transition logic, clients can individually progress the app state on-chain according to the defined state transition logic by calling
ProgressBy
on the channel object. - Settle with sub-channel disputes: Ledger channels can now be settled with funds locked in disputed sub-channels if the corresponding sub-channels have been registered and the disputes have been resolved on-chain.
- The channel watcher logic changed. The channel watcher now takes as input an event handler which gets notified about on-chain channel events. Before, the watcher automatically settled a channel in case of a dispute. Now, the watcher will automatically detect if an old state has been registered, refute with the most recent one, and notify the user. If the channel has a defined application logic, the user can further progress the channel on-chain. It is within the responsibility of the framework user to finally settle the channel and withdraw the funds.
- The channel settling logic changed. Before, a call to
Settle
on a channel object automatically registered the channel, concluded it, and withdrew the funds. Now, to accomodate on-chain progression functionality, the user must callRegister
independetly before being able to settle the channel. Afterwards, for app channels, the user has the opportunity to progress the channel state on-chain by callingProgressBy
. Finally, the user can settle the channel by callingSettle
. ContractBackend.NewTransactor
now sets the context onTransactOpts
. Furthermore, parametervalue
has been removed.
- Persistence: Sub-channels are now persisted and restored properly.
ERC20 and Funding Agreement support and many test fixes.
- Funding agreement support: when proposing channels, the proposer can now optionally suggest to reallocate the funding responsibilities among the participants so that it differs from the initial channel allocation.
- ERC20 support.
- A context-aware
WaitGroup
implementation topkg/sync
.
- The
eth/wallet/hd.Transactor
to use the correcttypes.Signer
if theWallet
has a correctSignHash
method. - The Go version to 1.15.
- Many timeouts in tests that made slow CI pipelines fail.
- A bug in the Concurrent Tester.
- The
Client
role tests to not deadlock so easily.
The Sub-Channels release, enabling fully generalized state channels.
- Sub-Channels: run app-channels inside parent (ledger) channels.
- Special
NoApp
for channels without app. Skips force-execution phase in disputes. - Optimized
Channel.SettleSecondary
settlement method for the responding settler during optimistic channel settlements. Avoids wasting gas by not sending unnecessary transactions. ErrorGatherer
type topkg/errors
package for errors accumulation.- Transactor abstraction to allow different wallet implementations for transaction sending in Ethereum backend.
- App registry so that multiple apps can be used in a single program instance.
channel.Update
to accept achannel.State
instead ofchannel.ChannelUpdate
. This simplifies the usage.- Contracts updated to handle sub-channels.
- Contracts now have distinct dispute and force-execution phases.
- Channel proposal protocol now uses shared nonce from all channel peers.
- Channel peers persistence in key-value persistence backend.
Introduced a wire messaging abstraction. License changed to Apache 2.0.
- Wire messages are now sent and received over an abstract
wire.Bus
. It serves as a wire messaging abstraction for theclient
package using pub/sub semantics.wire.Msg
s are wrapped inEnvelope
s that have a sender and recipient.- Two implementations available:
wire.LocalBus
for multiple clients running in the same program instance.wire/net.Bus
for wire connections over networks.
- Consistent use of
wallet.Address
es as map keys (wallet.AddrKey
). - Ordering to
wallet.Addresses
es to resolve ties in protocols. - Contract validation to Ethereum backend.
- Consistent creation of PRNGs in tests (
pkg/test.Prng
).
- License to Apache 2.0.
- The packages
peer
,wire
andpkg/io
were restructured:- Serialization code was moved from
wire
intopkg/io
. - The
peer
package was merged into thewire
package. - Networking-specific
wire
components were moved intowire/net
. - The simple TCP/IP and Unix
Dialer
andListener
implementations were moved intowire/net/simple
.
- Serialization code was moved from
- The
ProposalHandler
andUpdateHandler
interfaces' methods were renamed to explicitly name what they handle (HandleProposal
andHandleUpdate
). - The keyvalue persister uses an improved data model and doesn't cache peer-channels any more.
Channel.Peers
now returns the full list of channel network peers, including the ownwire.Address
.
- A race in
client
synchronization.
- The
net
package, as it didn't contain anything useful.
Added persistence module to persist channel state data and handle client shutdowns/restarts, as well as disconnects/reconnects.
- Persistence:
- Persister, Restorer, ChannelIterator interfaces to allow for multiple
persistence implementations.
- sortedkv implementation provided (in-memory and LevelDB).
- States and signatures are constantly persisted while channels progress.
- Clients restore all saved channels on startup. State is synchronized with peers.
Client.OnNewChannel
callback registration to deal with restored channels.
- Persister, Restorer, ChannelIterator interfaces to allow for multiple
persistence implementations.
- Wallet interface for account unlocking abstraction.
- Used during persistence to restore secret keys for signing.
- Implemented for the Ethereum and simulated backend.
- Peer disconnect/reconnect handling.
Channel.UpdateBy
functional channel update method for better usability.
- License changed to Apache 2.0.
- Replaced
Channel.ListenUpdates
andClient.HandleChannelProposals
withClient.Handle(ProposalHandler, UpdateHandler)
- a single common handler routine per client. - Adapted client to new persistence layer and wallet.
- Made Ethereum interactions idempotent (increased safety).
- Moved subpackage
db
topkg/sortedkv
. - Swapped Balance dimensions of type
channel.Allocation
. - Random type generators in package
channel/test
now accept options to customize random data generation. - Channels now get automatically closed when peers disconnect (and restored on reconnect).
- Ethereum backend: No funding transactions for zero own initial channel balances.
Added direct disputes and watcher for two-party ledger channels, much polishing (refactors, bug fixes, documentation).
- Ledger state channel disputes and watcher.
channel.Adjudicator
interface and Ethereum implementation for registering channel states and withdrawing concluded channels.- Ethereum contracts for disputes
- Godoc
- Changelog
- goreportcard
- TCP and unix socket
peer.Dialer
andListener
implementations. Eventually
tester inpkg/test
to repeatedly run tests until they succeed.- Concurrent testing tool in
pkg/test
to be able to callrequire
in tests with multiple go routines.
client.New
now needs aFunder
andAdjudicator
, instead of aSettler
.Serializable
renamed toSerializer
.- Unified backend imports.
pkg/io/test/bytewiseReader
toiotest.OneByteReader
.- Improved peer message handling mechanism.
- Consistent handling of
nil
arguments in exported functions. - Many refactors to improve the overall code quality and documentation.
- Updated Ethereum contract bindings to newest version.
wallet.Wallet
interface andsim
backend implementation - it was never used.ethereum
andsim/wallet.NewAddressFromBytes
- onlywallet.DecodeAddress
should be used to create anAddress
from bytes.channel/machine
Phase subscription logic.channel.Settler
interface and backend implementations - replaced byAdjudicator
.
- Reduced cyclomatic complexity of complex functions.
- Deadlock in two-party payment channel test.
- Ethereum backend test timeouts and instabilities.
- Many minor bug fixes, mainly concurrency issues in tests.
Initial release.
- Two-party ledger state channels.
- Cooperatively settling two-party ledger channels.
- Ethereum blockchain backend.
- Logrus logging backend.
⚠️ This is a pre-release and not intended for usage with real funds.- 💥 This is a breaking change, e.g., it changes the external API.