Skip to content

Commit 8e60c9f

Browse files
Merge pull request #325 from perun-network/explicit-encoding
Initialize wire encoding explicitly
2 parents d698d08 + 0dda64c commit 8e60c9f

30 files changed

+148
-108
lines changed

client/proposalmsgs_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"perun.network/go-perun/channel/test"
2525
"perun.network/go-perun/client"
2626
clienttest "perun.network/go-perun/client/test"
27-
_ "perun.network/go-perun/wire/perunio/serializer" // wire serialzer init
2827
peruniotest "perun.network/go-perun/wire/perunio/test"
2928
pkgtest "polycry.pt/poly-go/test"
3029
)

wire/controlmsgs_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package wire_test
1717
import (
1818
"testing"
1919

20-
_ "perun.network/go-perun/wire/perunio/serializer" // wire serialzer init
2120
peruniotest "perun.network/go-perun/wire/perunio/test"
2221
wiretest "perun.network/go-perun/wire/test"
2322
)

wire/encode.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,6 @@ import (
2424
"perun.network/go-perun/wire/perunio"
2525
)
2626

27-
var envelopeSerializer EnvelopeSerializer
28-
29-
// SetEnvelopeSerializer sets the global envelope serializer instance. Must not
30-
// be called directly but through importing the needed backend.
31-
func SetEnvelopeSerializer(e EnvelopeSerializer) {
32-
if envelopeSerializer != nil {
33-
panic("envelope serializer already set")
34-
}
35-
envelopeSerializer = e
36-
}
37-
3827
type (
3928
// Msg is the top-level abstraction for all messages sent between Perun
4029
// nodes.
@@ -59,18 +48,6 @@ type (
5948
}
6049
)
6150

62-
// EncodeEnvelope serializes the envelope into the writer, using the global
63-
// envelope serialzer instance.
64-
func EncodeEnvelope(w io.Writer, env *Envelope) error {
65-
return envelopeSerializer.Encode(w, env)
66-
}
67-
68-
// DecodeEnvelope deserializes an envelope from the reader, using the global
69-
// envelope serialzer instance.
70-
func DecodeEnvelope(r io.Reader) (*Envelope, error) {
71-
return envelopeSerializer.Decode(r)
72-
}
73-
7451
// EncodeMsg encodes a message into an io.Writer. It also encodes the message
7552
// type whereas the Msg.Encode implementation is assumed not to write the type.
7653
func EncodeMsg(msg Msg, w io.Writer) error {

wire/net/bus.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ const (
4545

4646
// NewBus creates a new network bus. The dialer and listener are used to
4747
// establish new connections internally, while id is this node's identity.
48-
func NewBus(id wire.Account, d Dialer) *Bus {
48+
func NewBus(id wire.Account, d Dialer, s wire.EnvelopeSerializer) *Bus {
4949
b := &Bus{
5050
mainRecv: wire.NewReceiver(),
5151
recvs: make(map[wallet.AddrKey]wire.Consumer),
5252
}
5353

5454
onNewEndpoint := func(wire.Address) wire.Consumer { return b.mainRecv }
55-
b.reg = NewEndpointRegistry(id, onNewEndpoint, d)
55+
b.reg = NewEndpointRegistry(id, onNewEndpoint, d, s)
5656
go b.dispatchMsgs()
5757

5858
return b

wire/net/bus_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"perun.network/go-perun/wire"
2323
"perun.network/go-perun/wire/net"
2424
nettest "perun.network/go-perun/wire/net/test"
25+
perunio "perun.network/go-perun/wire/perunio/serializer"
2526
wiretest "perun.network/go-perun/wire/test"
2627
)
2728

@@ -32,7 +33,7 @@ func TestBus(t *testing.T) {
3233
var hub nettest.ConnHub
3334

3435
wiretest.GenericBusTest(t, func(acc wire.Account) wire.Bus {
35-
bus := net.NewBus(acc, hub.NewNetDialer())
36+
bus := net.NewBus(acc, hub.NewNetDialer(), perunio.Serializer())
3637
hub.OnClose(func() { bus.Close() })
3738
go bus.Listen(hub.NewNetListener(acc.Address()))
3839
return bus

wire/net/dialer.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ import (
2323
// Dialer is an interface that allows creating a connection to a peer via its
2424
// Perun address. The established connections are not authenticated yet.
2525
type Dialer interface {
26-
// Dial creates a connection to a peer.
27-
// The passed context is used to abort the dialing process. The returned
28-
// connection might not belong to the requested address.
26+
// Dial creates a connection to a peer. The passed context is used to abort
27+
// the dialing process. The returned connection might not belong to the
28+
// requested address.
29+
//
30+
// `ser` is used for message serialization.
2931
//
3032
// Dial needs to be reentrant, and concurrent calls to Close() must abort
3133
// any ongoing Dial() calls.
32-
Dial(ctx context.Context, addr wire.Address) (Conn, error)
34+
Dial(ctx context.Context, addr wire.Address, ser wire.EnvelopeSerializer) (Conn, error)
3335
// Close aborts any ongoing calls to Dial().
3436
//
3537
// Close() needs to be reentrant, and repeated calls to Close() need to

wire/net/endpoint_internal_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
_ "perun.network/go-perun/backend/sim" // backend init
2828
wallettest "perun.network/go-perun/wallet/test"
2929
"perun.network/go-perun/wire"
30+
perunio "perun.network/go-perun/wire/perunio/serializer"
3031
wiretest "perun.network/go-perun/wire/test"
3132
"polycry.pt/poly-go/test"
3233
)
@@ -53,7 +54,7 @@ func makeSetup(rng *rand.Rand) *setup {
5354
}
5455

5556
// Dial simulates creating a connection to a.
56-
func (s *setup) Dial(ctx context.Context, addr wire.Address) (Conn, error) {
57+
func (s *setup) Dial(ctx context.Context, addr wire.Address, _ wire.EnvelopeSerializer) (Conn, error) {
5758
s.mutex.RLock()
5859
defer s.mutex.RUnlock()
5960

@@ -99,7 +100,7 @@ func makeClient(conn Conn, rng *rand.Rand, dialer Dialer) *client {
99100
receiver := wire.NewReceiver()
100101
registry := NewEndpointRegistry(wallettest.NewRandomAccount(rng), func(wire.Address) wire.Consumer {
101102
return receiver
102-
}, dialer)
103+
}, dialer, perunio.Serializer())
103104

104105
return &client{
105106
endpoint: registry.addEndpoint(wallettest.NewRandomAddress(rng), conn, true),

wire/net/endpoint_registry.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ type EndpointRegistry struct {
6767
id wire.Account // The identity of the node.
6868
dialer Dialer // Used for dialing peers.
6969
onNewEndpoint func(wire.Address) wire.Consumer // Selects Consumer for new Endpoints' receive loop.
70+
ser wire.EnvelopeSerializer
7071

7172
endpoints map[wallet.AddrKey]*fullEndpoint // The list of all of all established Endpoints.
7273
dialing map[wallet.AddrKey]*dialingEndpoint
@@ -81,11 +82,17 @@ const exchangeAddrsTimeout = 10 * time.Second
8182
// NewEndpointRegistry creates a new registry.
8283
// The provided callback is used to set up new peer's subscriptions and it is
8384
// called before the peer starts receiving messages.
84-
func NewEndpointRegistry(id wire.Account, onNewEndpoint func(wire.Address) wire.Consumer, dialer Dialer) *EndpointRegistry {
85+
func NewEndpointRegistry(
86+
id wire.Account,
87+
onNewEndpoint func(wire.Address) wire.Consumer,
88+
dialer Dialer,
89+
ser wire.EnvelopeSerializer,
90+
) *EndpointRegistry {
8591
return &EndpointRegistry{
8692
id: id,
8793
onNewEndpoint: onNewEndpoint,
8894
dialer: dialer,
95+
ser: ser,
8996

9097
endpoints: make(map[wallet.AddrKey]*fullEndpoint),
9198
dialing: make(map[wallet.AddrKey]*dialingEndpoint),
@@ -138,7 +145,7 @@ func (r *EndpointRegistry) Listen(listener Listener) {
138145
// Start listener and accept all incoming peer connections, writing them to
139146
// the registry.
140147
for {
141-
conn, err := listener.Accept()
148+
conn, err := listener.Accept(r.ser)
142149
if err != nil {
143150
r.Log().Debugf("EndpointRegistry.Listen: Accept() loop: %v", err)
144151
return
@@ -240,7 +247,7 @@ func (r *EndpointRegistry) authenticatedDial(
240247
close(de.created)
241248
}()
242249

243-
conn, err := r.dialer.Dial(ctx, addr)
250+
conn, err := r.dialer.Dial(ctx, addr, r.ser)
244251
if err != nil {
245252
return nil, errors.WithMessage(err, "failed to dial")
246253
}

wire/net/endpoint_registry_external_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"perun.network/go-perun/wire"
2727
"perun.network/go-perun/wire/net"
2828
nettest "perun.network/go-perun/wire/net/test"
29+
perunio "perun.network/go-perun/wire/perunio/serializer"
2930
ctxtest "polycry.pt/poly-go/context/test"
3031
"polycry.pt/poly-go/sync"
3132
"polycry.pt/poly-go/test"
@@ -43,8 +44,8 @@ func TestEndpointRegistry_Get_Pair(t *testing.T) {
4344
var hub nettest.ConnHub
4445
dialerID := wallettest.NewRandomAccount(rng)
4546
listenerID := wallettest.NewRandomAccount(rng)
46-
dialerReg := net.NewEndpointRegistry(dialerID, nilConsumer, hub.NewNetDialer())
47-
listenerReg := net.NewEndpointRegistry(listenerID, nilConsumer, nil)
47+
dialerReg := net.NewEndpointRegistry(dialerID, nilConsumer, hub.NewNetDialer(), perunio.Serializer())
48+
listenerReg := net.NewEndpointRegistry(listenerID, nilConsumer, nil, perunio.Serializer())
4849
listener := hub.NewNetListener(listenerID.Address())
4950

5051
done := make(chan struct{})
@@ -88,8 +89,8 @@ func TestEndpointRegistry_Get_Multiple(t *testing.T) {
8889
t.Logf("subscribing %s\n", addr)
8990
return nil
9091
}
91-
dialerReg := net.NewEndpointRegistry(dialerID, logPeer, dialer)
92-
listenerReg := net.NewEndpointRegistry(listenerID, logPeer, nil)
92+
dialerReg := net.NewEndpointRegistry(dialerID, logPeer, dialer, perunio.Serializer())
93+
listenerReg := net.NewEndpointRegistry(listenerID, logPeer, nil, perunio.Serializer())
9394
listener := hub.NewNetListener(listenerID.Address())
9495

9596
done := make(chan struct{})

wire/net/endpoint_registry_internal_test.go

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"perun.network/go-perun/wallet"
2929
wallettest "perun.network/go-perun/wallet/test"
3030
"perun.network/go-perun/wire"
31+
perunio "perun.network/go-perun/wire/perunio/serializer"
3132
wiretest "perun.network/go-perun/wire/test"
3233
ctxtest "polycry.pt/poly-go/context/test"
3334
"polycry.pt/poly-go/sync/atomic"
@@ -52,7 +53,7 @@ func (d *mockDialer) Close() error {
5253
return nil
5354
}
5455

55-
func (d *mockDialer) Dial(ctx context.Context, addr wire.Address) (Conn, error) {
56+
func (d *mockDialer) Dial(ctx context.Context, addr wire.Address, _ wire.EnvelopeSerializer) (Conn, error) {
5657
d.mutex.Lock()
5758
defer d.mutex.Unlock()
5859

@@ -85,8 +86,8 @@ type mockListener struct {
8586
dialer mockDialer
8687
}
8788

88-
func (l *mockListener) Accept() (Conn, error) {
89-
return l.dialer.Dial(context.Background(), nil)
89+
func (l *mockListener) Accept(ser wire.EnvelopeSerializer) (Conn, error) {
90+
return l.dialer.Dial(context.Background(), nil, ser)
9091
}
9192

9293
func (l *mockListener) Close() error {
@@ -123,7 +124,7 @@ func TestRegistry_Get(t *testing.T) {
123124
t.Parallel()
124125

125126
dialer := newMockDialer()
126-
r := NewEndpointRegistry(id, nilConsumer, dialer)
127+
r := NewEndpointRegistry(id, nilConsumer, dialer, perunio.Serializer())
127128
existing := newEndpoint(peerAddr, newMockConn())
128129

129130
r.endpoints[wallet.Key(peerAddr)] = newFullEndpoint(existing)
@@ -138,7 +139,7 @@ func TestRegistry_Get(t *testing.T) {
138139
t.Parallel()
139140

140141
dialer := newMockDialer()
141-
r := NewEndpointRegistry(id, nilConsumer, dialer)
142+
r := NewEndpointRegistry(id, nilConsumer, dialer, perunio.Serializer())
142143

143144
dialer.Close()
144145
ctxtest.AssertTerminates(t, timeout, func() {
@@ -154,7 +155,7 @@ func TestRegistry_Get(t *testing.T) {
154155
t.Parallel()
155156

156157
dialer := newMockDialer()
157-
r := NewEndpointRegistry(id, nilConsumer, dialer)
158+
r := NewEndpointRegistry(id, nilConsumer, dialer, perunio.Serializer())
158159

159160
ct := test.NewConcurrent(t)
160161
a, b := newPipeConnPair()
@@ -182,7 +183,7 @@ func TestRegistry_authenticatedDial(t *testing.T) {
182183
rng := test.Prng(t)
183184
id := wallettest.NewRandomAccount(rng)
184185
d := &mockDialer{dial: make(chan Conn)}
185-
r := NewEndpointRegistry(id, nilConsumer, d)
186+
r := NewEndpointRegistry(id, nilConsumer, d, perunio.Serializer())
186187

187188
remoteID := wallettest.NewRandomAccount(rng)
188189
remoteAddr := remoteID.Address()
@@ -267,7 +268,7 @@ func TestRegistry_setupConn(t *testing.T) {
267268

268269
t.Run("ExchangeAddrs fail", func(t *testing.T) {
269270
d := &mockDialer{dial: make(chan Conn)}
270-
r := NewEndpointRegistry(id, nilConsumer, d)
271+
r := NewEndpointRegistry(id, nilConsumer, d, perunio.Serializer())
271272
a, b := newPipeConnPair()
272273
go func() {
273274
err := b.Send(&wire.Envelope{
@@ -286,7 +287,7 @@ func TestRegistry_setupConn(t *testing.T) {
286287

287288
t.Run("ExchangeAddrs success (peer already exists)", func(t *testing.T) {
288289
d := &mockDialer{dial: make(chan Conn)}
289-
r := NewEndpointRegistry(id, nilConsumer, d)
290+
r := NewEndpointRegistry(id, nilConsumer, d, perunio.Serializer())
290291
a, b := newPipeConnPair()
291292
go func() {
292293
err := ExchangeAddrsActive(context.Background(), remoteID, id.Address(), b)
@@ -303,7 +304,7 @@ func TestRegistry_setupConn(t *testing.T) {
303304

304305
t.Run("ExchangeAddrs success (peer did not exist)", func(t *testing.T) {
305306
d := &mockDialer{dial: make(chan Conn)}
306-
r := NewEndpointRegistry(id, nilConsumer, d)
307+
r := NewEndpointRegistry(id, nilConsumer, d, perunio.Serializer())
307308
a, b := newPipeConnPair()
308309
go func() {
309310
err := ExchangeAddrsActive(context.Background(), remoteID, id.Address(), b)
@@ -331,7 +332,7 @@ func TestRegistry_Listen(t *testing.T) {
331332

332333
d := newMockDialer()
333334
l := newMockListener()
334-
r := NewEndpointRegistry(id, nilConsumer, d)
335+
r := NewEndpointRegistry(id, nilConsumer, d, perunio.Serializer())
335336

336337
go func() {
337338
// Listen() will only terminate if the listener is closed.
@@ -365,7 +366,12 @@ func TestRegistry_addEndpoint_Subscribe(t *testing.T) {
365366
t.Parallel()
366367
rng := test.Prng(t)
367368
called := false
368-
r := NewEndpointRegistry(wallettest.NewRandomAccount(rng), func(wire.Address) wire.Consumer { called = true; return nil }, nil)
369+
r := NewEndpointRegistry(
370+
wallettest.NewRandomAccount(rng),
371+
func(wire.Address) wire.Consumer { called = true; return nil },
372+
nil,
373+
perunio.Serializer(),
374+
)
369375

370376
assert.False(t, called, "onNewEndpoint must not have been called yet")
371377
r.addEndpoint(wallettest.NewRandomAddress(rng), newMockConn(), false)
@@ -378,15 +384,25 @@ func TestRegistry_Close(t *testing.T) {
378384
rng := test.Prng(t)
379385

380386
t.Run("double close error", func(t *testing.T) {
381-
r := NewEndpointRegistry(wallettest.NewRandomAccount(rng), nilConsumer, nil)
387+
r := NewEndpointRegistry(
388+
wallettest.NewRandomAccount(rng),
389+
nilConsumer,
390+
nil,
391+
perunio.Serializer(),
392+
)
382393
r.Close()
383394
assert.Error(t, r.Close())
384395
})
385396

386397
t.Run("dialer close error", func(t *testing.T) {
387398
d := &mockDialer{dial: make(chan Conn)}
388399
d.Close()
389-
r := NewEndpointRegistry(wallettest.NewRandomAccount(rng), nilConsumer, d)
400+
r := NewEndpointRegistry(
401+
wallettest.NewRandomAccount(rng),
402+
nilConsumer,
403+
d,
404+
perunio.Serializer(),
405+
)
390406

391407
assert.Error(t, r.Close())
392408
})
@@ -395,5 +411,6 @@ func TestRegistry_Close(t *testing.T) {
395411
// newPipeConnPair creates endpoints that are connected via pipes.
396412
func newPipeConnPair() (a Conn, b Conn) {
397413
c0, c1 := net.Pipe()
398-
return NewIoConn(c0), NewIoConn(c1)
414+
ser := perunio.Serializer()
415+
return NewIoConn(c0, ser), NewIoConn(c1, ser)
399416
}

wire/net/exchange_addr_internal_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323

2424
wallettest "perun.network/go-perun/wallet/test"
2525
"perun.network/go-perun/wire"
26-
_ "perun.network/go-perun/wire/protobuf" // wire serialzer init
2726
wiretest "perun.network/go-perun/wire/test"
2827
ctxtest "polycry.pt/poly-go/context/test"
2928
"polycry.pt/poly-go/test"

0 commit comments

Comments
 (0)