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.6.0 Fenrir - 2020-12-18 ⚠️
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.
0.5.2 European Ecstasy - 2020-11-05 ⚠️
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.
0.5.0 Europa - 2020-10-17 ⚠️
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.
0.4.0 Despina - 2020-07-23 ⚠️
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.
0.3.0 Charon - 2020-05-29 ⚠️
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.
0.2.0 Belinda - 2020-03-23 ⚠️
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
- Public Github wiki
- Godoc
- Changelog
- TravisCI
- goreportcard
- codeclimate
- 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.
0.1.0 Ariel - 2019-12-20 ⚠️
Initial release.
- Two-party ledger state channels.
- Cooperatively settling two-party ledger channels.
- Ethereum blockchain backend.
- Logrus logging backend.
⚠️ : This release is not suited for practical use with real money.