Skip to content

Commit f3c6404

Browse files
author
Manoranjith
committed
client: Fix virtual channel proposal id generation
- Previously, the proposal ID for a virtual channel was generated using the ProposalID method defined on BaseChannelProposal. - Hence, not all parameters of the virtual channel proposal were used. - Fix it by defining a ProposalID method on the virtual channel. - Also, remove the ProposalID method on the BaseChannelProposal, as it is not needed. Signed-off-by: Manoranjith <ponraj.manoranjitha@in.bosch.com>
1 parent 4e91b2a commit f3c6404

2 files changed

Lines changed: 53 additions & 19 deletions

File tree

client/proposalmsgs.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,17 +192,6 @@ func (p BaseChannelProposal) Encode(w io.Writer) error {
192192
optAppAndDataEnc, p.InitBals, p.FundingAgreement)
193193
}
194194

195-
// ProposalID returns the identifier of this channel proposal.
196-
func (p BaseChannelProposal) ProposalID() (propID ProposalID) {
197-
hasher := newHasher()
198-
if err := perunio.Encode(hasher, p.Base()); err != nil {
199-
log.Panicf("proposal ID base encoding: %v", err)
200-
}
201-
202-
copy(propID[:], hasher.Sum(nil))
203-
return
204-
}
205-
206195
// Decode decodes a BaseChannelProposal from an io.Reader.
207196
func (p *BaseChannelProposal) Decode(r io.Reader) (err error) {
208197
if p.InitBals == nil {
@@ -620,6 +609,16 @@ func (VirtualChannelProposal) Type() wire.Type {
620609
return wire.VirtualChannelProposal
621610
}
622611

612+
// ProposalID returns the identifier of this channel proposal.
613+
func (p VirtualChannelProposal) ProposalID() (propID ProposalID) {
614+
hasher := newHasher()
615+
if err := perunio.Encode(hasher, p); err != nil {
616+
log.Panicf("proposal ID base encoding: %v", err)
617+
}
618+
copy(propID[:], hasher.Sum(nil))
619+
return
620+
}
621+
623622
// Accept constructs an accept message that belongs to a proposal message.
624623
func (p VirtualChannelProposal) Accept(
625624
responder wallet.Address,

client/proposalmsgs_test.go

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/stretchr/testify/assert"
2222
"github.com/stretchr/testify/require"
2323

24+
"perun.network/go-perun/channel"
2425
"perun.network/go-perun/channel/test"
2526
"perun.network/go-perun/client"
2627
clienttest "perun.network/go-perun/client/test"
@@ -145,18 +146,52 @@ func TestSubChannelProposalReqProposalID(t *testing.T) {
145146
func TestVirtualChannelProposalReqProposalID(t *testing.T) {
146147
rng := pkgtest.Prng(t)
147148

148-
prop, err := clienttest.NewRandomVirtualChannelProposal(rng)
149+
original, err := clienttest.NewRandomVirtualChannelProposal(rng)
149150
require.NoError(t, err)
151+
assert.Equal(t, channel.NoApp(), original.App, "virtual channel should always has no app")
152+
assert.Equal(t, channel.NoData(), original.InitData, "virtual channel should always has no data")
150153

151-
testProp := *prop
152-
assert.Equal(t, prop.ProposalID(), testProp.ProposalID())
153-
154-
prop2, err := clienttest.NewRandomVirtualChannelProposal(rng)
154+
fake, err := clienttest.NewRandomVirtualChannelProposal(rng)
155155
require.NoError(t, err)
156-
assert.NotEqual(t, prop.ProposalID(), prop2.ProposalID())
156+
assert.Equal(t, channel.NoApp(), fake.App, "virtual channel should always has no app")
157+
assert.Equal(t, channel.NoData(), fake.InitData, "virtual channel should always has no data")
157158

158-
testProp.NonceShare = prop2.NonceShare
159-
assert.NotEqual(t, prop.ProposalID(), prop2.ProposalID())
159+
assert.NotEqual(t, original.ChallengeDuration, fake.ChallengeDuration)
160+
assert.NotEqual(t, original.NonceShare, fake.NonceShare)
161+
assert.NotEqual(t, original.InitBals, fake.InitBals)
162+
assert.NotEqual(t, original.FundingAgreement, fake.FundingAgreement)
163+
assert.NotEqual(t, original.Proposer, fake.Proposer)
164+
assert.NotEqual(t, original.Peers, fake.Peers)
165+
assert.NotEqual(t, original.Parents, fake.Parents)
166+
assert.NotEqual(t, original.IndexMaps, fake.IndexMaps)
167+
168+
testProp := *original
169+
testProp.ChallengeDuration = fake.ChallengeDuration
170+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
171+
172+
testProp = *original
173+
testProp.NonceShare = fake.NonceShare
174+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
175+
176+
testProp = *original
177+
testProp.InitBals = fake.InitBals
178+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
179+
180+
testProp = *original
181+
testProp.FundingAgreement = fake.FundingAgreement
182+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
183+
184+
testProp = *original
185+
testProp.Proposer = fake.Proposer
186+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
187+
188+
testProp = *original
189+
testProp.Peers = fake.Peers
190+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
191+
192+
testProp = *original
193+
testProp.IndexMaps = fake.IndexMaps
194+
assert.NotEqual(t, original.ProposalID(), testProp.ProposalID())
160195
}
161196

162197
func TestChannelProposalAccSerialization(t *testing.T) {

0 commit comments

Comments
 (0)