forked from hyperledger/fabric
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hash.go
80 lines (64 loc) · 2.06 KB
/
hash.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
/*
Copyright DTCC 2016 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package java
import (
"archive/tar"
"encoding/hex"
"fmt"
"os"
"strings"
"errors"
"io/ioutil"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric/common/flogging"
"github.com/hyperledger/fabric/common/util"
ccutil "github.com/hyperledger/fabric/core/chaincode/platforms/util"
pb "github.com/hyperledger/fabric/protos/peer"
)
var logger = flogging.MustGetLogger("java/hash")
//collectChaincodeFiles collects chaincode files and generates hashcode for the
//package.
//NOTE: for dev mode, user builds and runs chaincode manually. The name provided
//by the user is equivalent to the path. This method will treat the name
//as codebytes and compute the hash from it. ie, user cannot run the chaincode
//with the same (name, input, args)
func collectChaincodeFiles(spec *pb.ChaincodeSpec, tw *tar.Writer) (string, error) {
if spec == nil {
return "", errors.New("Cannot collect chaincode files from nil spec")
}
chaincodeID := spec.ChaincodeId
if chaincodeID == nil || chaincodeID.Path == "" {
return "", errors.New("Cannot collect chaincode files from empty chaincode path")
}
codepath := chaincodeID.Path
var err error
if !strings.HasPrefix(codepath, "/") {
wd := ""
wd, err = os.Getwd()
codepath = wd + "/" + codepath
}
if err != nil {
return "", fmt.Errorf("Error getting code %s", err)
}
var hash []byte
//install will not have inputs and we don't have to collect hash for it
if spec.Input == nil || len(spec.Input.Args) == 0 {
logger.Debugf("not using input for hash computation for %v ", chaincodeID)
} else {
inputbytes, err2 := proto.Marshal(spec.Input)
if err2 != nil {
return "", fmt.Errorf("Error marshalling constructor: %s", err)
}
hash = util.GenerateHashFromSignature(codepath, inputbytes)
}
buf, err := ioutil.ReadFile(codepath)
if err != nil {
logger.Errorf("Error reading %s", err)
return "", err
}
//get the new hash from file contents
hash = ccutil.ComputeHash(buf, hash)
return hex.EncodeToString(hash[:]), nil
}