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  }