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.
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.