github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/core/ledger/kvledger/txmgmt/rwset/rwset.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package rwset 18 19 import ( 20 "bytes" 21 "fmt" 22 23 "github.com/golang/protobuf/proto" 24 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version" 25 ) 26 27 // KVRead - a tuple of key and its version at the time of transaction simulation 28 type KVRead struct { 29 Key string 30 Version *version.Height 31 } 32 33 // NewKVRead constructs a new `KVRead` 34 func NewKVRead(key string, version *version.Height) *KVRead { 35 return &KVRead{key, version} 36 } 37 38 // KVWrite - a tuple of key and it's value that a transaction wants to set during simulation. 39 // In addition, IsDelete is set to true iff the operation performed on the key is a delete operation 40 type KVWrite struct { 41 Key string 42 IsDelete bool 43 Value []byte 44 } 45 46 // NewKVWrite constructs a new `KVWrite` 47 func NewKVWrite(key string, value []byte) *KVWrite { 48 return &KVWrite{key, value == nil, value} 49 } 50 51 // SetValue sets the new value for the key 52 func (w *KVWrite) SetValue(value []byte) { 53 w.Value = value 54 w.IsDelete = value == nil 55 } 56 57 // RangeQueryInfo captures a range query executed by a transaction 58 // and the tuples <key,version> that are read by the transaction 59 // This it to be used to perform a phantom-read validation during commit 60 type RangeQueryInfo struct { 61 StartKey string 62 EndKey string 63 ItrExhausted bool 64 Results []*KVRead 65 ResultHash *MerkleSummary 66 } 67 68 // MerkleTreeLevel used for representing a level of the merkle tree 69 type MerkleTreeLevel int 70 71 // Hash represents bytes of a hash 72 type Hash []byte 73 74 // MerkleSummary encloses the summary of the merkle tree that consists of the hashes of the results of a range query. 75 // This allows to reduce the size of RWSet in the presence of range query results 76 // by storing certain hashes instead of actual results. 77 type MerkleSummary struct { 78 MaxDegree int 79 MaxLevel MerkleTreeLevel 80 MaxLevelHashes []Hash 81 } 82 83 // NsReadWriteSet - a collection of all the reads and writes that belong to a common namespace 84 type NsReadWriteSet struct { 85 NameSpace string 86 Reads []*KVRead 87 Writes []*KVWrite 88 RangeQueriesInfo []*RangeQueryInfo 89 } 90 91 // TxReadWriteSet - a collection of all the reads and writes collected as a result of a transaction simulation 92 type TxReadWriteSet struct { 93 NsRWs []*NsReadWriteSet 94 } 95 96 // Equal verifies whether the give MerkleSummary is equals to this 97 func (ms *MerkleSummary) Equal(anotherMS *MerkleSummary) bool { 98 if anotherMS == nil { 99 return false 100 } 101 if ms.MaxDegree != anotherMS.MaxDegree || 102 ms.MaxLevel != anotherMS.MaxLevel || 103 len(ms.MaxLevelHashes) != len(anotherMS.MaxLevelHashes) { 104 return false 105 } 106 for i := 0; i < len(ms.MaxLevelHashes); i++ { 107 if !bytes.Equal(ms.MaxLevelHashes[i], anotherMS.MaxLevelHashes[i]) { 108 return false 109 } 110 } 111 return true 112 } 113 114 // Marshal serializes a `KVRead` 115 func (r *KVRead) Marshal(buf *proto.Buffer) error { 116 if err := buf.EncodeStringBytes(r.Key); err != nil { 117 return err 118 } 119 versionBytes := []byte{} 120 if r.Version != nil { 121 versionBytes = r.Version.ToBytes() 122 } 123 if err := buf.EncodeRawBytes(versionBytes); err != nil { 124 return err 125 } 126 return nil 127 } 128 129 // Unmarshal deserializes a `KVRead` 130 func (r *KVRead) Unmarshal(buf *proto.Buffer) error { 131 var err error 132 var versionBytes []byte 133 if r.Key, err = buf.DecodeStringBytes(); err != nil { 134 return err 135 } 136 if versionBytes, err = buf.DecodeRawBytes(false); err != nil { 137 return err 138 } 139 if len(versionBytes) > 0 { 140 r.Version, _ = version.NewHeightFromBytes(versionBytes) 141 } 142 return nil 143 } 144 145 // Marshal serializes a `RangeQueryInfo` 146 func (rqi *RangeQueryInfo) Marshal(buf *proto.Buffer) error { 147 if err := buf.EncodeStringBytes(rqi.StartKey); err != nil { 148 return err 149 } 150 if err := buf.EncodeStringBytes(rqi.EndKey); err != nil { 151 return err 152 } 153 154 itrExhausedMarker := 0 // iterator did not get exhausted 155 if rqi.ItrExhausted { 156 itrExhausedMarker = 1 157 } 158 if err := buf.EncodeVarint(uint64(itrExhausedMarker)); err != nil { 159 return err 160 } 161 162 if err := buf.EncodeVarint(uint64(len(rqi.Results))); err != nil { 163 return err 164 } 165 for i := 0; i < len(rqi.Results); i++ { 166 if err := rqi.Results[i].Marshal(buf); err != nil { 167 return err 168 } 169 } 170 hashPresentMarker := 0 171 if rqi.ResultHash != nil { 172 hashPresentMarker = 1 173 } 174 if err := buf.EncodeVarint(uint64(hashPresentMarker)); err != nil { 175 return err 176 } 177 if rqi.ResultHash != nil { 178 if err := rqi.ResultHash.Marshal(buf); err != nil { 179 return err 180 } 181 } 182 return nil 183 } 184 185 // Unmarshal deserializes a `RangeQueryInfo` 186 func (rqi *RangeQueryInfo) Unmarshal(buf *proto.Buffer) error { 187 var err error 188 var numResults uint64 189 var itrExhaustedMarker uint64 190 var hashPresentMarker uint64 191 192 if rqi.StartKey, err = buf.DecodeStringBytes(); err != nil { 193 return err 194 } 195 if rqi.EndKey, err = buf.DecodeStringBytes(); err != nil { 196 return err 197 } 198 if itrExhaustedMarker, err = buf.DecodeVarint(); err != nil { 199 return err 200 } 201 if itrExhaustedMarker == 1 { 202 rqi.ItrExhausted = true 203 } else { 204 rqi.ItrExhausted = false 205 } 206 if numResults, err = buf.DecodeVarint(); err != nil { 207 return err 208 } 209 if numResults > 0 { 210 rqi.Results = make([]*KVRead, int(numResults)) 211 } 212 for i := 0; i < int(numResults); i++ { 213 kvRead := &KVRead{} 214 if err := kvRead.Unmarshal(buf); err != nil { 215 return err 216 } 217 rqi.Results[i] = kvRead 218 } 219 if hashPresentMarker, err = buf.DecodeVarint(); err != nil { 220 return err 221 } 222 if hashPresentMarker == 0 { 223 return nil 224 } 225 resultHash := &MerkleSummary{} 226 if err := resultHash.Unmarshal(buf); err != nil { 227 return err 228 } 229 rqi.ResultHash = resultHash 230 return nil 231 } 232 233 // Marshal serializes a `QueryResultHash` 234 func (ms *MerkleSummary) Marshal(buf *proto.Buffer) error { 235 if err := buf.EncodeVarint(uint64(ms.MaxDegree)); err != nil { 236 return err 237 } 238 if err := buf.EncodeVarint(uint64(ms.MaxLevel)); err != nil { 239 return err 240 } 241 if err := buf.EncodeVarint(uint64(len(ms.MaxLevelHashes))); err != nil { 242 return err 243 } 244 for i := 0; i < len(ms.MaxLevelHashes); i++ { 245 if err := buf.EncodeRawBytes(ms.MaxLevelHashes[i]); err != nil { 246 return err 247 } 248 } 249 return nil 250 } 251 252 // Unmarshal deserializes a `QueryResultHash` 253 func (ms *MerkleSummary) Unmarshal(buf *proto.Buffer) error { 254 var err error 255 var maxDegree uint64 256 var level uint64 257 var numHashes uint64 258 var hash []byte 259 260 if maxDegree, err = buf.DecodeVarint(); err != nil { 261 return err 262 } 263 if level, err = buf.DecodeVarint(); err != nil { 264 return err 265 } 266 if numHashes, err = buf.DecodeVarint(); err != nil { 267 return err 268 } 269 ms.MaxDegree = int(maxDegree) 270 ms.MaxLevel = MerkleTreeLevel(int(level)) 271 for i := 0; i < int(numHashes); i++ { 272 if hash, err = buf.DecodeRawBytes(false); err != nil { 273 return err 274 } 275 ms.MaxLevelHashes = append(ms.MaxLevelHashes, hash) 276 } 277 return nil 278 } 279 280 // Marshal serializes a `KVWrite` 281 func (w *KVWrite) Marshal(buf *proto.Buffer) error { 282 var err error 283 if err = buf.EncodeStringBytes(w.Key); err != nil { 284 return err 285 } 286 deleteMarker := 0 287 if w.IsDelete { 288 deleteMarker = 1 289 } 290 if err = buf.EncodeVarint(uint64(deleteMarker)); err != nil { 291 return err 292 } 293 if deleteMarker == 0 { 294 if err = buf.EncodeRawBytes(w.Value); err != nil { 295 return err 296 } 297 } 298 return nil 299 } 300 301 // Unmarshal deserializes a `KVWrite` 302 func (w *KVWrite) Unmarshal(buf *proto.Buffer) error { 303 var err error 304 if w.Key, err = buf.DecodeStringBytes(); err != nil { 305 return err 306 } 307 var deleteMarker uint64 308 if deleteMarker, err = buf.DecodeVarint(); err != nil { 309 return err 310 } 311 if deleteMarker == 1 { 312 w.IsDelete = true 313 return nil 314 } 315 if w.Value, err = buf.DecodeRawBytes(false); err != nil { 316 return err 317 } 318 return nil 319 } 320 321 // Marshal serializes a `NsReadWriteSet` 322 func (nsRW *NsReadWriteSet) Marshal(buf *proto.Buffer) error { 323 var err error 324 if err = buf.EncodeStringBytes(nsRW.NameSpace); err != nil { 325 return err 326 } 327 if err = buf.EncodeVarint(uint64(len(nsRW.Reads))); err != nil { 328 return err 329 } 330 for i := 0; i < len(nsRW.Reads); i++ { 331 if err = nsRW.Reads[i].Marshal(buf); err != nil { 332 return err 333 } 334 } 335 if err = buf.EncodeVarint(uint64(len(nsRW.Writes))); err != nil { 336 return err 337 } 338 for i := 0; i < len(nsRW.Writes); i++ { 339 if err = nsRW.Writes[i].Marshal(buf); err != nil { 340 return err 341 } 342 } 343 if err = buf.EncodeVarint(uint64(len(nsRW.RangeQueriesInfo))); err != nil { 344 return err 345 } 346 for i := 0; i < len(nsRW.RangeQueriesInfo); i++ { 347 if err = nsRW.RangeQueriesInfo[i].Marshal(buf); err != nil { 348 return err 349 } 350 } 351 return nil 352 } 353 354 // Unmarshal deserializes a `NsReadWriteSet` 355 func (nsRW *NsReadWriteSet) Unmarshal(buf *proto.Buffer) error { 356 var err error 357 if nsRW.NameSpace, err = buf.DecodeStringBytes(); err != nil { 358 return err 359 } 360 var numReads uint64 361 if numReads, err = buf.DecodeVarint(); err != nil { 362 return err 363 } 364 for i := 0; i < int(numReads); i++ { 365 r := &KVRead{} 366 if err = r.Unmarshal(buf); err != nil { 367 return err 368 } 369 nsRW.Reads = append(nsRW.Reads, r) 370 } 371 372 var numWrites uint64 373 if numWrites, err = buf.DecodeVarint(); err != nil { 374 return err 375 } 376 for i := 0; i < int(numWrites); i++ { 377 w := &KVWrite{} 378 if err = w.Unmarshal(buf); err != nil { 379 return err 380 } 381 nsRW.Writes = append(nsRW.Writes, w) 382 } 383 384 var numRangeQueriesInfo uint64 385 if numRangeQueriesInfo, err = buf.DecodeVarint(); err != nil { 386 return err 387 } 388 for i := 0; i < int(numRangeQueriesInfo); i++ { 389 rqInfo := &RangeQueryInfo{} 390 if err = rqInfo.Unmarshal(buf); err != nil { 391 return err 392 } 393 nsRW.RangeQueriesInfo = append(nsRW.RangeQueriesInfo, rqInfo) 394 } 395 return nil 396 } 397 398 // Marshal serializes a `TxReadWriteSet` 399 func (txRW *TxReadWriteSet) Marshal() ([]byte, error) { 400 buf := proto.NewBuffer(nil) 401 var err error 402 if err = buf.EncodeVarint(uint64(len(txRW.NsRWs))); err != nil { 403 return nil, err 404 } 405 for i := 0; i < len(txRW.NsRWs); i++ { 406 if err = txRW.NsRWs[i].Marshal(buf); err != nil { 407 return nil, err 408 } 409 } 410 return buf.Bytes(), nil 411 } 412 413 // Unmarshal deserializes a `TxReadWriteSet` 414 func (txRW *TxReadWriteSet) Unmarshal(b []byte) error { 415 buf := proto.NewBuffer(b) 416 var err error 417 var numEntries uint64 418 if numEntries, err = buf.DecodeVarint(); err != nil { 419 return err 420 } 421 for i := 0; i < int(numEntries); i++ { 422 nsRW := &NsReadWriteSet{} 423 if err = nsRW.Unmarshal(buf); err != nil { 424 return err 425 } 426 txRW.NsRWs = append(txRW.NsRWs, nsRW) 427 } 428 return nil 429 } 430 431 // String prints a `KVRead` 432 func (r *KVRead) String() string { 433 return fmt.Sprintf("%s:%d", r.Key, r.Version) 434 } 435 436 // String prints a `KVWrite` 437 func (w *KVWrite) String() string { 438 return fmt.Sprintf("%s=[%#v]", w.Key, w.Value) 439 } 440 441 // String prints a range query info 442 func (rqi *RangeQueryInfo) String() string { 443 return fmt.Sprintf("StartKey=%s, EndKey=%s, ItrExhausted=%t, Results=%#v, Hash=%#v", 444 rqi.StartKey, rqi.EndKey, rqi.ItrExhausted, rqi.Results, rqi.ResultHash) 445 } 446 447 // String prints a `NsReadWriteSet` 448 func (nsRW *NsReadWriteSet) String() string { 449 var buffer bytes.Buffer 450 buffer.WriteString("ReadSet=\n") 451 for _, r := range nsRW.Reads { 452 buffer.WriteString("\t") 453 buffer.WriteString(r.String()) 454 buffer.WriteString("\n") 455 } 456 buffer.WriteString("WriteSet=\n") 457 for _, w := range nsRW.Writes { 458 buffer.WriteString("\t") 459 buffer.WriteString(w.String()) 460 buffer.WriteString("\n") 461 } 462 buffer.WriteString("RangeQueriesInfo=\n") 463 for _, rqi := range nsRW.RangeQueriesInfo { 464 buffer.WriteString("\t") 465 buffer.WriteString(rqi.String()) 466 buffer.WriteString("\n") 467 } 468 return buffer.String() 469 } 470 471 // String prints a `TxReadWriteSet` 472 func (txRW *TxReadWriteSet) String() string { 473 var buffer bytes.Buffer 474 for _, nsRWSet := range txRW.NsRWs { 475 buffer.WriteString(nsRWSet.NameSpace) 476 buffer.WriteString("::") 477 buffer.WriteString(nsRWSet.String()) 478 } 479 return buffer.String() 480 }