/
pr.go
85 lines (70 loc) · 2.11 KB
/
pr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package transaction
import (
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/proto"
"github.com/hyperledger/fabric-protos-go/peer"
"github.com/hyperledger/fabric/protoutil"
"github.com/pkg/errors"
)
type ProposalResponse struct {
pr *peer.ProposalResponse
results []byte
}
func NewProposalResponseFromResponse(proposalResponse *peer.ProposalResponse) (*ProposalResponse, error) {
pRespPayload, err := protoutil.UnmarshalProposalResponsePayload(proposalResponse.Payload)
if err != nil {
return nil, errors.Wrapf(err, "GetProposalResponsePayload error %s", err)
}
if len(pRespPayload.Extension) == 0 {
return nil, errors.Errorf("empty pRespPayload.Extension")
}
respPayload, err := protoutil.UnmarshalChaincodeAction(pRespPayload.Extension)
if err != nil {
return nil, errors.Wrapf(err, "failed GetChaincodeAction")
}
if len(respPayload.Results) == 0 {
return nil, errors.Errorf("empty results")
}
return &ProposalResponse{
pr: proposalResponse,
results: respPayload.Results,
}, nil
}
func NewProposalResponseFromBytes(raw []byte) (*ProposalResponse, error) {
proposalResponse := &peer.ProposalResponse{}
if err := proto.Unmarshal(raw, proposalResponse); err != nil {
return nil, errors.Wrap(err, "failed unmarshalling received proposal response")
}
return NewProposalResponseFromResponse(proposalResponse)
}
func (p *ProposalResponse) Endorser() []byte {
return p.pr.Endorsement.Endorser
}
func (p *ProposalResponse) Payload() []byte {
return p.pr.Payload
}
func (p *ProposalResponse) EndorserSignature() []byte {
return p.pr.Endorsement.Signature
}
func (p *ProposalResponse) Results() []byte {
return p.results
}
func (p *ProposalResponse) PR() *peer.ProposalResponse {
return p.pr
}
func (p *ProposalResponse) ResponseStatus() int32 {
return p.pr.Response.Status
}
func (p *ProposalResponse) ResponseMessage() string {
return p.pr.Response.Message
}
func (p *ProposalResponse) Bytes() ([]byte, error) {
raw, err := proto.Marshal(p.pr)
if err != nil {
return nil, err
}
return raw, nil
}