Skip to content

Commit 423f5df

Browse files
committed
fix
Signed-off-by: Angelo De Caro <adc@zurich.ibm.com>
1 parent 4e112b8 commit 423f5df

File tree

7 files changed

+51
-42
lines changed

7 files changed

+51
-42
lines changed

token/services/identity/multisig/identity.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,20 @@ func WrapIdentities(ids ...token.Identity) (token.Identity, error) {
5757

5858
// Unwrap returns the identities wrapped in the given multisig identity
5959
// It returns the identities and a boolean indicating whether the given identity is a multisig identity
60-
func Unwrap(raw []byte) (bool, []token.Identity, error) {
60+
func Unwrap(raw []byte) ([]token.Identity, bool, error) {
6161
ti, err := identity.UnmarshalTypedIdentity(raw)
6262
if err != nil {
63-
return false, nil, errors.Wrap(err, "failed unmarshalling typed identity")
63+
return nil, false, errors.Wrap(err, "failed unmarshalling typed identity")
6464
}
6565
if ti.Type != Multisig {
66-
return false, nil, nil
66+
return nil, false, nil
6767
}
6868
mi := &MultiIdentity{}
6969
err = mi.Deserialize(ti.Identity)
7070
if err != nil {
71-
return false, nil, errors.Wrap(err, "failed unmarshalling multi identity")
71+
return nil, false, errors.Wrap(err, "failed unmarshalling multi identity")
7272
}
73-
return true, mi.Identities, nil
73+
return mi.Identities, true, nil
7474
}
7575

7676
// InfoMatcher matches a multisig identity to its own audit info.

token/services/identity/multisig/identity_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ func TestWrapIdentities(t *testing.T) {
3636
wrapped, err := WrapIdentities(identities...)
3737
assert.NoError(t, err)
3838

39-
isMultisig, unwrapped, err := Unwrap(wrapped)
39+
unwrapped, isMultisig, err := Unwrap(wrapped)
4040
assert.NoError(t, err)
4141
assert.True(t, isMultisig)
4242
assert.Equal(t, identities, unwrapped)
4343
}
4444

4545
func TestUnwrap_InvalidIdentity(t *testing.T) {
4646
invalidIdentity := []byte("invalid")
47-
isMultisig, unwrapped, err := Unwrap(invalidIdentity)
47+
unwrapped, isMultisig, err := Unwrap(invalidIdentity)
4848
assert.Error(t, err)
4949
assert.False(t, isMultisig)
5050
assert.Nil(t, unwrapped)

token/services/ttx/collectendorsements.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func (c *CollectEndorsementsView) requestSignatures(signers []view.Identity, ver
198198
logger.DebugfContext(context.Context(), "collecting signature [%d] on request from [%s]", i, signerIdentity)
199199

200200
// Case: the identity is a multi-sig identity
201-
ok, multiSigners, err := multisig.Unwrap(signerIdentity)
201+
multiSigners, ok, err := multisig.Unwrap(signerIdentity)
202202
if err != nil {
203203
return nil, errors.Wrapf(err, "failed unwrapping multi-sig identity [%s]", signerIdentity)
204204
}
@@ -500,7 +500,7 @@ func (c *CollectEndorsementsView) prepareDistributionList(context view.Context,
500500
// This is a redeem, nothing to do here.
501501
continue
502502
}
503-
ok, multiSigners, err := multisig.Unwrap(id)
503+
multiSigners, ok, err := multisig.Unwrap(id)
504504
if err != nil {
505505
return nil, errors.Wrapf(err, "failed unwrapping multi-sig identity [%s]", id)
506506
}

token/services/ttx/endorse.go

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77
package ttx
88

99
import (
10+
"bytes"
1011
"context"
1112
"time"
1213

@@ -15,6 +16,7 @@ import (
1516
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/sig"
1617
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
1718
"github.com/hyperledger-labs/fabric-token-sdk/token"
19+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/multisig"
1820
"github.com/hyperledger-labs/fabric-token-sdk/token/services/tokens"
1921
"github.com/hyperledger-labs/fabric-token-sdk/token/services/utils"
2022
jsession "github.com/hyperledger-labs/fabric-token-sdk/token/services/utils/json/session"
@@ -68,7 +70,7 @@ func (s *EndorseView) Call(context view.Context) (interface{}, error) {
6870
return nil, errors.Wrapf(err, "failed acknowledging transaction")
6971
}
7072

71-
// cache the token request into the tokens db
73+
// cache the token request into the tokens db, should we use the received token request?
7274
t, err := tokens.GetService(context, s.tx.TMSID())
7375
if err != nil {
7476
return nil, errors.Wrapf(err, "failed to get tokens db for [%s]", s.tx.TMSID())
@@ -145,21 +147,28 @@ func (s *EndorseView) handleSignatureRequests(context view.Context) error {
145147
return nil
146148
}
147149

150+
// receiveTransaction is used to intercept the last round of transaction distribution from CollectEndorsementsView.
151+
// Indeed, after having collected the auditor signatures, if needed, and the approval,
152+
// CollectEndorsementsView distributes the token request with the additional signatures.
148153
func (s *EndorseView) receiveTransaction(context view.Context) (*Transaction, error) {
149-
logger.DebugfContext(context.Context(), "Receive transaction with envelope...")
150-
// TODO: this might also happen multiple times because of the pseudonym. Avoid this by identity resolution at the sender
154+
logger.DebugfContext(context.Context(), "receive transaction...")
151155
tx, err := ReceiveTransaction(context)
152156
if err != nil {
153157
return nil, errors.Wrapf(err, "failed receiving transaction")
154158
}
155159

156-
// TODO: compare with the existing transaction
157-
logger.DebugfContext(context.Context(), "Processes Fabric Envelope with ID [%s]", tx.ID())
158-
159-
// Set the envelope
160-
request := s.tx.TokenRequest
161-
s.tx = tx
162-
s.tx.TokenRequest = request
160+
// check that the content of the token request match
161+
m1, err := s.tx.TokenRequest.MarshalToSign()
162+
if err != nil {
163+
return nil, errors.Wrap(err, "failed to marshal token request to sign from the local transaction")
164+
}
165+
m2, err := tx.TokenRequest.MarshalToSign()
166+
if err != nil {
167+
return nil, errors.Wrap(err, "failed to marshal token request to sign from the remote transaction")
168+
}
169+
if !bytes.Equal(m1, m2) {
170+
return nil, errors.Errorf("token request's signer does not match the expected signer")
171+
}
163172
return tx, nil
164173
}
165174

@@ -191,20 +200,33 @@ func (s *EndorseView) ack(context view.Context, receivedTx *Transaction) error {
191200
return nil
192201
}
193202

203+
// requiredSigners extracts from the given token request a list of identities that can generate a signature over it.
194204
func requiredSigners(ctx context.Context, request *token.Request) ([]token.Identity, error) {
195205
issuerSigners := request.IssueSigners()
196206
transferSigners := request.TransferSigners()
197207
res := make([]token.Identity, 0, len(issuerSigners)+len(transferSigners))
198208
sigService := request.TokenService.SigService()
199209
for _, signer := range issuerSigners {
200-
if sigService.IsMe(ctx, signer) {
201-
res = append(res, signer)
210+
multiSigners, _, _ := multisig.Unwrap(signer)
211+
if len(multiSigners) != 0 {
212+
res = append(res, multiSigners...)
213+
continue
202214
}
215+
res = append(res, signer)
203216
}
204217
for _, signer := range transferSigners {
205-
if sigService.IsMe(ctx, signer) {
206-
res = append(res, signer)
218+
multiSigners, _, _ := multisig.Unwrap(signer)
219+
if len(multiSigners) != 0 {
220+
res = append(res, multiSigners...)
221+
continue
222+
}
223+
res = append(res, signer)
224+
}
225+
subset := make([]token.Identity, 0, len(res))
226+
for _, res := range res {
227+
if sigService.IsMe(ctx, res) {
228+
subset = append(subset, res)
207229
}
208230
}
209-
return res, nil
231+
return subset, nil
210232
}

token/services/ttx/multisig/spend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func NewRequestSpendView(unspentToken *token.UnspentToken, opts ...token2.Servic
9898
return &RequestSpendView{err: errors.Wrap(err, "failed to compile service options")}
9999
}
100100

101-
ok, identities, err := multisig.Unwrap(unspentToken.Owner)
101+
identities, ok, err := multisig.Unwrap(unspentToken.Owner)
102102
if err != nil {
103103
return &RequestSpendView{err: errors.Wrap(err, "failed to unwrap identities")}
104104
}

token/services/ttx/recipients.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ func (s *RespondRequestRecipientIdentityView) handleMultisig(
414414
}
415415

416416
// register the audit info for each party too
417-
ok, multisigIdentities, err := multisig.Unwrap(multisigRecipientData.RecipientData.Identity)
417+
multisigIdentities, ok, err := multisig.Unwrap(multisigRecipientData.RecipientData.Identity)
418418
if err != nil {
419419
return errors.Wrapf(err, "failed to unwrap multisig identity")
420420
}

token/services/ttx/transaction.go

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,16 @@ package ttx
88

99
import (
1010
"context"
11-
"encoding/base64"
12-
errors2 "errors"
1311
"runtime/debug"
1412
"time"
1513

1614
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
1715
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/endpoint"
18-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/kvs"
1916
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
2017
"github.com/hyperledger-labs/fabric-token-sdk/token"
2118
"github.com/hyperledger-labs/fabric-token-sdk/token/services/network"
2219
"github.com/hyperledger-labs/fabric-token-sdk/token/services/utils"
23-
session2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/utils/json/session"
20+
jsession "github.com/hyperledger-labs/fabric-token-sdk/token/services/utils/json/session"
2421
token2 "github.com/hyperledger-labs/fabric-token-sdk/token/token"
2522
)
2623

@@ -420,7 +417,7 @@ func NewReceiveTransactionView() *ReceiveTransactionView {
420417
}
421418

422419
func (f *ReceiveTransactionView) Call(context view.Context) (interface{}, error) {
423-
jsonSession := session2.JSON(context)
420+
jsonSession := jsession.JSON(context)
424421
msg, err := jsonSession.ReceiveRawWithTimeout(time.Minute * 4)
425422
if err != nil {
426423
logger.ErrorfContext(context.Context(), err.Error())
@@ -439,7 +436,7 @@ func (f *ReceiveTransactionView) Call(context view.Context) (interface{}, error)
439436
var err2 error
440437
tx, err2 = f.unmarshalAsSignatureRequest(context, msg)
441438
if err2 != nil {
442-
return nil, errors.Wrap(errors2.Join(err, err2), "failed to receive transaction")
439+
return nil, errors.Wrap(errors.Join(err, err2), "failed to receive transaction")
443440
}
444441
}
445442
return tx, nil
@@ -458,15 +455,5 @@ func (f *ReceiveTransactionView) unmarshalAsSignatureRequest(context view.Contex
458455
if err != nil {
459456
return nil, errors.Wrap(err, "failed to receive transaction")
460457
}
461-
k, err := kvs.CreateCompositeKey("signatureRequest", []string{tx.ID()})
462-
if err != nil {
463-
return nil, errors.Wrap(err, "failed to generate key to store signature request")
464-
}
465-
k = base64.StdEncoding.EncodeToString([]byte(k))
466-
if kvss, err := context.GetService(&kvs.KVS{}); err != nil {
467-
return nil, errors.Wrap(err, "failed to get KVS from context")
468-
} else if err := kvss.(*kvs.KVS).Put(context.Context(), k, base64.StdEncoding.EncodeToString(raw)); err != nil {
469-
return nil, errors.Wrap(err, "failed to store signature request")
470-
}
471458
return tx, nil
472459
}

0 commit comments

Comments
 (0)