Skip to content

Commit 19eb4fe

Browse files
author
Qi Xiao
committed
Update response structure, replace signature/key with simple hash
1 parent aa562ba commit 19eb4fe

File tree

12 files changed

+93
-105
lines changed

12 files changed

+93
-105
lines changed

cmd/cql-minerd/various_metric_test.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"testing"
2828
"time"
2929

30+
"github.com/CovenantSQL/CovenantSQL/crypto"
3031
"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
3132
kt "github.com/CovenantSQL/CovenantSQL/kayak/types"
3233
kw "github.com/CovenantSQL/CovenantSQL/kayak/wal"
@@ -194,14 +195,14 @@ func BenchmarkSignSignature(b *testing.B) {
194195
b.ResetTimer()
195196
b.Run("sign nested", func(b *testing.B) {
196197
for i := 0; i != b.N; i++ {
197-
err = rs.Sign(priv)
198+
err = rs.BuildHash()
198199
}
199200
})
200201

201202
b.ResetTimer()
202203
b.Run("verify nested", func(b *testing.B) {
203204
for i := 0; i != b.N; i++ {
204-
err = rs.Verify()
205+
err = rs.VerifyHash()
205206
}
206207
})
207208

@@ -336,17 +337,21 @@ func TestComputeMetrics(t *testing.T) {
336337

337338
t.Logf("PrepareLogSize: %v", len(buf2.Bytes()))
338339

340+
respNodeAddr, err := crypto.PubKeyHash(priv.PubKey())
341+
So(err, ShouldBeNil)
342+
339343
rs := &types.Response{
340344
Header: types.SignedResponseHeader{
341345
ResponseHeader: types.ResponseHeader{
342-
Request: r.Header.RequestHeader,
343-
RequestHash: r.Header.Hash(),
344-
NodeID: n.ToRawNodeID().ToNodeID(),
345-
Timestamp: time.Now().UTC(),
346-
RowCount: 1,
347-
LogOffset: 1,
348-
LastInsertID: 1,
349-
AffectedRows: 1,
346+
Request: r.Header.RequestHeader,
347+
RequestHash: r.Header.Hash(),
348+
NodeID: n.ToRawNodeID().ToNodeID(),
349+
ResponseAccount: respNodeAddr,
350+
Timestamp: time.Now().UTC(),
351+
RowCount: 1,
352+
LogOffset: 1,
353+
LastInsertID: 1,
354+
AffectedRows: 1,
350355
},
351356
},
352357
}

cmd/cql-observer/service.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"github.com/CovenantSQL/CovenantSQL/utils"
3636
"github.com/CovenantSQL/CovenantSQL/utils/log"
3737
"github.com/CovenantSQL/CovenantSQL/worker"
38-
3938
bolt "github.com/coreos/bbolt"
4039
)
4140

@@ -342,7 +341,7 @@ func (s *Service) addQueryTracker(dbID proto.DatabaseID, height int32, offset in
342341
if err = qt.Request.Verify(); err != nil {
343342
return
344343
}
345-
if err = qt.Response.Verify(); err != nil {
344+
if err = qt.Response.VerifyHash(); err != nil {
346345
return
347346
}
348347

sqlchain/chain.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,10 +1276,7 @@ func (c *Chain) billing(node *blockNode) (ub *types.UpdateBilling, err error) {
12761276
}
12771277
}
12781278
for _, tx := range block.QueryTxs {
1279-
if minerAddr, err = crypto.PubKeyHash(tx.Response.Signee); err != nil {
1280-
log.WithError(err).WithField("db", c.databaseID).Warning("billing fail: miner addr")
1281-
return
1282-
}
1279+
minerAddr = tx.Response.ResponseAccount
12831280
if userAddr, err = crypto.PubKeyHash(tx.Request.Header.Signee); err != nil {
12841281
log.WithError(err).WithField("db", c.databaseID).Warning("billing fail: miner addr")
12851282
return

sqlchain/xxx_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func createRandomQueryResponse(cli, worker *nodeProfile) (
167167
}
168168
}
169169

170-
if err = resp.Sign(worker.PrivateKey); err != nil {
170+
if err = resp.BuildHash(); err != nil {
171171
return
172172
}
173173

types/response_type.go

Lines changed: 40 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ package types
1919
import (
2020
"time"
2121

22-
"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
2322
"github.com/CovenantSQL/CovenantSQL/crypto/hash"
24-
"github.com/CovenantSQL/CovenantSQL/crypto/verifier"
2523
"github.com/CovenantSQL/CovenantSQL/proto"
24+
"github.com/pkg/errors"
2625
)
2726

2827
//go:generate hsp
@@ -41,15 +40,16 @@ type ResponsePayload struct {
4140

4241
// ResponseHeader defines a query response header.
4342
type ResponseHeader struct {
44-
Request RequestHeader `json:"r"`
45-
RequestHash hash.Hash `json:"rh"`
46-
NodeID proto.NodeID `json:"id"` // response node id
47-
Timestamp time.Time `json:"t"` // time in UTC zone
48-
RowCount uint64 `json:"c"` // response row count of payload
49-
LogOffset uint64 `json:"o"` // request log offset
50-
LastInsertID int64 `json:"l"` // insert insert id
51-
AffectedRows int64 `json:"a"` // affected rows
52-
PayloadHash hash.Hash `json:"dh"` // hash of query response payload
43+
Request RequestHeader `json:"r"`
44+
RequestHash hash.Hash `json:"rh"`
45+
NodeID proto.NodeID `json:"id"` // response node id
46+
Timestamp time.Time `json:"t"` // time in UTC zone
47+
RowCount uint64 `json:"c"` // response row count of payload
48+
LogOffset uint64 `json:"o"` // request log offset
49+
LastInsertID int64 `json:"l"` // insert insert id
50+
AffectedRows int64 `json:"a"` // affected rows
51+
PayloadHash hash.Hash `json:"dh"` // hash of query response payload
52+
ResponseAccount proto.AccountAddress `json:"aa"` // response account
5353
}
5454

5555
// GetRequestHash returns the request hash.
@@ -65,48 +65,30 @@ func (h *ResponseHeader) GetRequestTimestamp() time.Time {
6565
// SignedResponseHeader defines a signed query response header.
6666
type SignedResponseHeader struct {
6767
ResponseHeader
68-
verifier.DefaultHashSignVerifierImpl
68+
ResponseHash hash.Hash
6969
}
7070

71-
// Response defines a complete query response.
72-
type Response struct {
73-
Header SignedResponseHeader `json:"h"`
74-
Payload ResponsePayload `json:"p"`
75-
callback func(res *Response)
76-
}
77-
78-
// Verify checks hash and signature in response header.
79-
func (sh *SignedResponseHeader) Verify() (err error) {
80-
return sh.DefaultHashSignVerifierImpl.Verify(&sh.ResponseHeader)
81-
}
82-
83-
// Sign the request.
84-
func (sh *SignedResponseHeader) Sign(signer *asymmetric.PrivateKey) (err error) {
85-
return sh.DefaultHashSignVerifierImpl.Sign(&sh.ResponseHeader, signer)
71+
// Hash returns the response header hash.
72+
func (sh *SignedResponseHeader) Hash() hash.Hash {
73+
return sh.ResponseHash
8674
}
8775

88-
// Verify checks hash and signature in whole response.
89-
func (r *Response) Verify() (err error) {
90-
// verify data hash in header
91-
if err = verifyHash(&r.Payload, &r.Header.PayloadHash); err != nil {
92-
return
93-
}
94-
95-
return r.Header.Verify()
76+
// VerifyHash verify the hash of the response.
77+
func (sh *SignedResponseHeader) VerifyHash() (err error) {
78+
return errors.Wrap(verifyHash(&sh.ResponseHeader, &sh.ResponseHash),
79+
"verify response header hash failed")
9680
}
9781

98-
// Sign the response.
99-
func (r *Response) Sign(signer *asymmetric.PrivateKey) (err error) {
100-
if err = r.BuildHash(); err != nil {
101-
return
102-
}
103-
104-
return r.SignHash(signer)
82+
// BuildHash computes the hash of the response header.
83+
func (sh *SignedResponseHeader) BuildHash() (err error) {
84+
return errors.Wrap(buildHash(&sh.ResponseHeader, &sh.ResponseHash),
85+
"compute response header hash failed")
10586
}
10687

107-
// SignHash computes the signature of the response through existing hash.
108-
func (r *Response) SignHash(signer *asymmetric.PrivateKey) (err error) {
109-
return r.Header.SignHash(signer)
88+
// Response defines a complete query response.
89+
type Response struct {
90+
Header SignedResponseHeader `json:"h"`
91+
Payload ResponsePayload `json:"p"`
11092
}
11193

11294
// BuildHash computes the hash of the response.
@@ -116,21 +98,25 @@ func (r *Response) BuildHash() (err error) {
11698

11799
// build hash in header
118100
if err = buildHash(&r.Payload, &r.Header.PayloadHash); err != nil {
101+
err = errors.Wrap(err, "compute response payload hash failed")
119102
return
120103
}
121104

122105
// compute header hash
123-
return r.Header.SetHash(&r.Header.ResponseHeader)
106+
return r.Header.BuildHash()
124107
}
125108

126-
// SetResponseCallback stores callback function to process after response processed.
127-
func (r *Response) SetResponseCallback(cb func(res *Response)) {
128-
r.callback = cb
109+
// VerifyHash verify the hash of the response.
110+
func (r *Response) VerifyHash() (err error) {
111+
if err = verifyHash(&r.Payload, &r.Header.PayloadHash); err != nil {
112+
err = errors.Wrap(err, "verify response payload hash failed")
113+
return
114+
}
115+
116+
return r.Header.VerifyHash()
129117
}
130118

131-
// TriggerResponseCallback async executes callback.
132-
func (r *Response) TriggerResponseCallback() {
133-
if r.callback != nil {
134-
go r.callback(r)
135-
}
119+
// Hash returns the response header hash.
120+
func (r *Response) Hash() hash.Hash {
121+
return r.Header.Hash()
136122
}

types/response_type_gen.go

Lines changed: 12 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

types/types_test.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,6 @@ func TestRequest_Sign(t *testing.T) {
153153
}
154154

155155
func TestResponse_Sign(t *testing.T) {
156-
privKey, _ := getCommKeys()
157-
158156
Convey("sign", t, func() {
159157
res := &Response{
160158
Header: SignedResponseHeader{
@@ -213,7 +211,7 @@ func TestResponse_Sign(t *testing.T) {
213211
var err error
214212

215213
// sign
216-
err = res.Sign(privKey)
214+
err = res.BuildHash()
217215
So(err, ShouldBeNil)
218216

219217
// test hash
@@ -222,7 +220,7 @@ func TestResponse_Sign(t *testing.T) {
222220

223221
// verify
224222
Convey("verify", func() {
225-
err = res.Verify()
223+
err = res.BuildHash()
226224
So(err, ShouldBeNil)
227225

228226
Convey("encode/decode verify", func() {
@@ -231,25 +229,25 @@ func TestResponse_Sign(t *testing.T) {
231229
var r *Response
232230
err = utils.DecodeMsgPack(buf.Bytes(), &r)
233231
So(err, ShouldBeNil)
234-
err = r.Verify()
232+
err = r.VerifyHash()
235233
So(err, ShouldBeNil)
236234
})
237235
Convey("request change", func() {
238236
res.Header.Request.BatchCount = 200
239237

240-
err = res.Verify()
238+
err = res.VerifyHash()
241239
So(err, ShouldNotBeNil)
242240
})
243241
Convey("payload change", func() {
244242
res.Payload.DeclTypes[0] = "INT"
245243

246-
err = res.Verify()
244+
err = res.VerifyHash()
247245
So(err, ShouldNotBeNil)
248246
})
249247
Convey("header change", func() {
250248
res.Header.Timestamp = res.Header.Timestamp.Add(time.Second)
251249

252-
err = res.Verify()
250+
err = res.VerifyHash()
253251
So(err, ShouldNotBeNil)
254252
})
255253
})

types/xxx_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ func buildResponse(header *SignedRequestHeader, cols []string, types []string, r
267267
Rows: rows,
268268
},
269269
}
270-
if err = r.Sign(testingPrivateKey); err != nil {
270+
if err = r.BuildHash(); err != nil {
271271
panic(err)
272272
}
273273
return

0 commit comments

Comments
 (0)