Skip to content

Commit 1bb697c

Browse files
committed
Arch refactor alpha (Hyperledger-TWGC#190)
* add crpto interface as repare for Hyperledger-TWGC#127 Signed-off-by: Sam Yuan <yy19902439@126.com> * adding Worker interface for Hyperledger-TWGC#56 and decouple Assembler and Integrator Signed-off-by: Sam Yuan <yy19902439@126.com> * refactor for worker interface Signed-off-by: Sam Yuan <yy19902439@126.com> * package structure Signed-off-by: Sam Yuan <yy19902439@126.com> * fix up Signed-off-by: Sam Yuan <yy19902439@126.com> * package refactor Signed-off-by: Sam Yuan <yy19902439@126.com> * fix up Signed-off-by: Sam Yuan <yy19902439@126.com> * fix up Signed-off-by: Sam Yuan <yy19902439@126.com> * remove Envelope from elements Signed-off-by: Sam Yuan <yy19902439@126.com> * add memeory free Signed-off-by: Sam Yuan <yy19902439@126.com> * remove Proposal from Elements Signed-off-by: Sam Yuan <yy19902439@126.com> * fix up Signed-off-by: Sam Yuan <yy19902439@126.com> * move start time to ctx Signed-off-by: Sam Yuan <yy19902439@126.com>
1 parent d5470ed commit 1bb697c

32 files changed

+842
-630
lines changed

cmd/tape/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"fmt"
55
"os"
66

7-
"tape/pkg/infra"
7+
"tape/pkg/infra/cmdImpl"
88

99
"github.com/pkg/errors"
1010
log "github.com/sirupsen/logrus"
@@ -40,10 +40,10 @@ func main() {
4040
fullCmd := kingpin.MustParse(app.Parse(os.Args[1:]))
4141
switch fullCmd {
4242
case version.FullCommand():
43-
fmt.Printf(infra.GetVersionInfo())
43+
fmt.Printf(cmdImpl.GetVersionInfo())
4444
case run.FullCommand():
4545
checkArgs(rate, burst, logger)
46-
err = infra.Process(*con, *num, *burst, *rate, logger)
46+
err = cmdImpl.Process(*con, *num, *burst, *rate, logger)
4747
default:
4848
err = errors.Errorf("invalid command: %s", fullCmd)
4949
}

pkg/infra/assembler.go

Lines changed: 0 additions & 74 deletions
This file was deleted.

pkg/infra/basic/basic_suite_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package basic_test
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
)
9+
10+
func TestBasic(t *testing.T) {
11+
RegisterFailHandler(Fail)
12+
RunSpecs(t, "Basic Suite")
13+
}

pkg/infra/client.go renamed to pkg/infra/basic/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package infra
1+
package basic
22

33
import (
44
"context"

pkg/infra/client_test.go renamed to pkg/infra/basic/client_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package infra_test
1+
package basic_test
22

33
import (
44
"context"
5-
"tape/pkg/infra"
5+
"tape/pkg/infra/basic"
66

77
. "github.com/onsi/ginkgo"
88
. "github.com/onsi/gomega"
@@ -12,21 +12,21 @@ import (
1212
var _ = Describe("Client", func() {
1313

1414
Context("Client Error handling", func() {
15-
dummy := infra.Node{
15+
dummy := basic.Node{
1616
Addr: "invalid_addr",
1717
}
1818
logger := log.New()
1919

2020
It("captures error from endorser", func() {
21-
_, err := infra.CreateEndorserClient(dummy, logger)
21+
_, err := basic.CreateEndorserClient(dummy, logger)
2222
Expect(err).Should(MatchError(ContainSubstring("error connecting to invalid_addr")))
2323
})
2424
It("captures error from broadcaster", func() {
25-
_, err := infra.CreateBroadcastClient(context.Background(), dummy, logger)
25+
_, err := basic.CreateBroadcastClient(context.Background(), dummy, logger)
2626
Expect(err).Should(MatchError(ContainSubstring("error connecting to invalid_addr")))
2727
})
2828
It("captures error from DeliverFilter", func() {
29-
_, err := infra.CreateDeliverFilteredClient(context.Background(), dummy, logger)
29+
_, err := basic.CreateDeliverFilteredClient(context.Background(), dummy, logger)
3030
Expect(err).Should(MatchError(ContainSubstring("error connecting to invalid_addr")))
3131
})
3232
})

pkg/infra/config.go renamed to pkg/infra/basic/config.go

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
1-
package infra
1+
package basic
22

33
import (
4+
"crypto/ecdsa"
5+
"crypto/x509"
6+
"encoding/pem"
47
"io/ioutil"
8+
"sync"
9+
"tape/internal/fabric/bccsp/utils"
510

611
"github.com/gogo/protobuf/proto"
712
"github.com/hyperledger/fabric-protos-go/msp"
13+
"github.com/hyperledger/fabric-protos-go/peer"
814
"github.com/pkg/errors"
915
"gopkg.in/yaml.v2"
1016
)
1117

18+
type Elements struct {
19+
SignedProp *peer.SignedProposal
20+
Responses []*peer.ProposalResponse
21+
Lock sync.Mutex
22+
}
23+
1224
type Config struct {
1325
Endorsers []Node `yaml:"endorsers"`
1426
Committers []Node `yaml:"committers"`
@@ -65,7 +77,7 @@ func LoadConfig(f string) (Config, error) {
6577
return config, nil
6678
}
6779

68-
func (c Config) LoadCrypto() (*Crypto, error) {
80+
func (c Config) LoadCrypto() (*CryptoImpl, error) {
6981
var allcerts []string
7082
for _, p := range c.Endorsers {
7183
allcerts = append(allcerts, p.TLSCACert)
@@ -98,7 +110,7 @@ func (c Config) LoadCrypto() (*Crypto, error) {
98110
return nil, errors.Wrapf(err, "error get msp id")
99111
}
100112

101-
return &Crypto{
113+
return &CryptoImpl{
102114
Creator: name,
103115
PrivKey: priv,
104116
SignCert: cert,
@@ -136,3 +148,34 @@ func (n *Node) loadConfig() error {
136148
n.TLSCARootByte = TLSCARoot
137149
return nil
138150
}
151+
152+
func GetPrivateKey(f string) (*ecdsa.PrivateKey, error) {
153+
in, err := ioutil.ReadFile(f)
154+
if err != nil {
155+
return nil, err
156+
}
157+
158+
k, err := utils.PEMtoPrivateKey(in, []byte{})
159+
if err != nil {
160+
return nil, err
161+
}
162+
163+
key, ok := k.(*ecdsa.PrivateKey)
164+
if !ok {
165+
return nil, errors.Errorf("expecting ecdsa key")
166+
}
167+
168+
return key, nil
169+
}
170+
171+
func GetCertificate(f string) (*x509.Certificate, []byte, error) {
172+
in, err := ioutil.ReadFile(f)
173+
if err != nil {
174+
return nil, nil, err
175+
}
176+
177+
block, _ := pem.Decode(in)
178+
179+
c, err := x509.ParseCertificate(block.Bytes)
180+
return c, in, err
181+
}

pkg/infra/config_test.go renamed to pkg/infra/basic/config_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package infra_test
1+
package basic_test
22

33
import (
44
"io/ioutil"
55
"os"
66
"text/template"
77

8-
"tape/pkg/infra"
8+
"tape/pkg/infra/basic"
99

1010
. "github.com/onsi/ginkgo"
1111
. "github.com/onsi/gomega"
@@ -75,16 +75,16 @@ var _ = Describe("Config", func() {
7575

7676
generateConfigFile(f.Name(), struct{ TlsFile string }{tlsFile.Name()})
7777

78-
c, err := infra.LoadConfig(f.Name())
78+
c, err := basic.LoadConfig(f.Name())
7979
Expect(err).NotTo(HaveOccurred())
80-
Expect(c).To(Equal(infra.Config{
81-
Endorsers: []infra.Node{
80+
Expect(c).To(Equal(basic.Config{
81+
Endorsers: []basic.Node{
8282
{Addr: "peer0.org1.example.com:7051", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")},
8383
{Addr: "peer0.org2.example.com:7051", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")},
8484
},
85-
Committers: []infra.Node{{Addr: "peer0.org2.example.com:7051", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")}},
85+
Committers: []basic.Node{{Addr: "peer0.org2.example.com:7051", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")}},
8686
CommitThreshold: 1,
87-
Orderer: infra.Node{Addr: "orderer.example.com:7050", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")},
87+
Orderer: basic.Node{Addr: "orderer.example.com:7050", TLSCACert: tlsFile.Name(), TLSCACertByte: []byte("a")},
8888
Channel: "mychannel",
8989
Chaincode: "mycc",
9090
Version: "",
@@ -102,7 +102,7 @@ var _ = Describe("Config", func() {
102102

103103
Context("bad", func() {
104104
It("fails to load missing config file", func() {
105-
_, err := infra.LoadConfig("invalid_file")
105+
_, err := basic.LoadConfig("invalid_file")
106106
Expect(err).Should(MatchError(ContainSubstring("invalid_file")))
107107
})
108108

@@ -113,7 +113,7 @@ var _ = Describe("Config", func() {
113113

114114
generateConfigFile(f.Name(), struct{ TlsFile string }{"invalid_file"})
115115

116-
_, err := infra.LoadConfig(f.Name())
116+
_, err := basic.LoadConfig(f.Name())
117117
Expect(err).Should(MatchError(ContainSubstring("invalid_file")))
118118
})
119119
})

pkg/infra/basic/crypto.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package basic
2+
3+
import (
4+
"crypto/ecdsa"
5+
"crypto/rand"
6+
"crypto/sha256"
7+
"crypto/x509"
8+
"encoding/asn1"
9+
"math/big"
10+
11+
"tape/internal/fabric/bccsp/utils"
12+
"tape/internal/fabric/common/crypto"
13+
14+
"github.com/hyperledger/fabric-protos-go/common"
15+
)
16+
17+
type CryptoConfig struct {
18+
MSPID string
19+
PrivKey string
20+
SignCert string
21+
TLSCACerts []string
22+
}
23+
24+
type ECDSASignature struct {
25+
R, S *big.Int
26+
}
27+
28+
type CryptoImpl struct {
29+
Creator []byte
30+
PrivKey *ecdsa.PrivateKey
31+
SignCert *x509.Certificate
32+
}
33+
34+
func (s *CryptoImpl) Sign(message []byte) ([]byte, error) {
35+
ri, si, err := ecdsa.Sign(rand.Reader, s.PrivKey, digest(message))
36+
if err != nil {
37+
return nil, err
38+
}
39+
40+
si, _, err = utils.ToLowS(&s.PrivKey.PublicKey, si)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
return asn1.Marshal(ECDSASignature{ri, si})
46+
}
47+
48+
func (s *CryptoImpl) Serialize() ([]byte, error) {
49+
return s.Creator, nil
50+
}
51+
52+
func (s *CryptoImpl) NewSignatureHeader() (*common.SignatureHeader, error) {
53+
creator, err := s.Serialize()
54+
if err != nil {
55+
return nil, err
56+
}
57+
nonce, err := crypto.GetRandomNonce()
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
return &common.SignatureHeader{
63+
Creator: creator,
64+
Nonce: nonce,
65+
}, nil
66+
}
67+
68+
func digest(in []byte) []byte {
69+
h := sha256.New()
70+
h.Write(in)
71+
return h.Sum(nil)
72+
}

0 commit comments

Comments
 (0)