From 74d8a1d90a58bef61b217c2b784ee9a52ee7d3a1 Mon Sep 17 00:00:00 2001 From: Taku Shimosawa Date: Fri, 10 Aug 2018 15:11:13 -0700 Subject: [PATCH] [FABN-876] Decode metadata writes in BlockDecoder This patch adds decode of metadata_writes in rwset and hashed_rwset to BlockDecoder. FABN-876 #done Change-Id: I4fca0b8067d58d669ac36314c37f2218cd501ef6 Signed-off-by: Taku Shimosawa --- fabric-client/lib/BlockDecoder.js | 59 +++++++++++++++++++++++++++++++ test/unit/block.js | 28 ++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/fabric-client/lib/BlockDecoder.js b/fabric-client/lib/BlockDecoder.js index dd5faa8fe3..c384d6cbce 100644 --- a/fabric-client/lib/BlockDecoder.js +++ b/fabric-client/lib/BlockDecoder.js @@ -192,6 +192,11 @@ actions {array} key -- {string} is_delete -- {boolean} value -- {string} + metadata_writes -- {array} + key -- {string} + entries -- {array} + name -- {string} + value -- {byte[]} collection_hashed_rwset -- {array} collection_name -- {string} hashed_rwset @@ -204,6 +209,11 @@ actions {array} key_hash -- {byte[]} is_delete -- {boolean} value_hash -- {byte[]} + metadata_writes -- {array} + key_hash -- {byte[]} + entries -- {array} + name -- {string} + value -- {byte[]} pvt_rwset_hash -- {byte[]} events chaincode_id -- {string} @@ -1276,6 +1286,7 @@ function decodeKVRWSet(kv_bytes) { kv_rw_set.reads = []; kv_rw_set.range_queries_info = []; kv_rw_set.writes = []; + kv_rw_set.metadata_writes = []; // build reads const reads = kv_rw_set.reads; @@ -1298,6 +1309,13 @@ function decodeKVRWSet(kv_bytes) { writes.push(decodeKVWrite(proto_writes[i])); } + // build metadata writes + const metadata_writes = kv_rw_set.metadata_writes; + const proto_metadata_writes = proto_kv_rw_set.getMetadataWrites(); + for (const i in proto_metadata_writes) { + metadata_writes.push(decodeKVMetadataWrite(proto_metadata_writes[i])); + } + return kv_rw_set; } @@ -1353,6 +1371,29 @@ function decodeKVWrite(proto_kv_write) { return kv_write; } +function decodeKVMetadataWrite(proto_kv_metadata_write) { + const kv_metadata_write = {}; + + kv_metadata_write.key = proto_kv_metadata_write.getKey(); + + const proto_kv_metadata_entries = proto_kv_metadata_write.getEntries(); + kv_metadata_write.entries = []; + for (const i in proto_kv_metadata_entries) { + kv_metadata_write.entries.push(decodeKVMetadataEntry(proto_kv_metadata_entries[i])); + } + + return kv_metadata_write; +} + +function decodeKVMetadataEntry(proto_kv_metadata_entry) { + const kv_metadata_entry = {}; + + kv_metadata_entry.name = proto_kv_metadata_entry.getName(); + kv_metadata_entry.value = proto_kv_metadata_entry.getValue().toBuffer(); + + return kv_metadata_entry; +} + function decodeResponse(proto_response) { if (!proto_response) return null; const response = {}; @@ -1403,6 +1444,11 @@ function decodeHashedRwset(hashed_rwset_bytes) { hashed_rwset.hashed_writes.push(decodeKVWriteHash(proto_hashed_writes[i])); } + const proto_hashed_metadata_writes = proto_hashed_rwset.getMetadataWrites(); + hashed_rwset.metadata_writes = []; + for (const i in proto_hashed_metadata_writes) { + hashed_rwset.metadata_writes.push(decodeKVMetadataWriteHash(proto_hashed_metadata_writes[i])); + } return hashed_rwset; } @@ -1430,6 +1476,19 @@ function decodeKVWriteHash(proto_kv_write_hash) { return kv_write_hash; } +function decodeKVMetadataWriteHash(proto_kv_metadata_write_hash) { + const kv_metadata_write_hash = {}; + + kv_metadata_write_hash.key_hash = proto_kv_metadata_write_hash.getKeyHash().toBuffer(); + + const proto_kv_metadata_entries = proto_kv_metadata_write_hash.getEntries(); + kv_metadata_write_hash.entries = []; + for (const i in proto_kv_metadata_entries) { + kv_metadata_write_hash.entries.push(decodeKVMetadataEntry(proto_kv_metadata_entries[i])); + } + + return kv_metadata_write_hash; +} const type_as_string = { 0: 'MESSAGE', // Used for messages which are signed but opaque diff --git a/test/unit/block.js b/test/unit/block.js index b20989cb78..4908f08011 100644 --- a/test/unit/block.js +++ b/test/unit/block.js @@ -49,10 +49,20 @@ test('\n\n*** BlockDecoder test for readwrite sets', (t) => { var writes_array = []; writes_array.push(kv_write_proto); + const kv_metadata_entry_proto = new kvrwsetProto.KVMetadataEntry(); + kv_metadata_entry_proto.setName('metadata name'); + kv_metadata_entry_proto.setValue(Buffer.from('METADATAVALUE')); + const kv_metadata_proto = new kvrwsetProto.KVMetadataWrite(); + kv_metadata_proto.setKey('metadata key'); + kv_metadata_proto.setEntries([kv_metadata_entry_proto]); + const metadata_array = []; + metadata_array.push(kv_metadata_proto); + var kvrwset_proto = new kvrwsetProto.KVRWSet(); kvrwset_proto.setReads(reads_array); kvrwset_proto.setRangeQueriesInfo(range_query_info_array); kvrwset_proto.setWrites(writes_array); + kvrwset_proto.setMetadataWrites(metadata_array); var results_proto = new rwsetProto.TxReadWriteSet(); results_proto.setDataModel(rwsetProto.TxReadWriteSet.DataModel.KV); @@ -83,7 +93,11 @@ test('\n\n*** BlockDecoder test for readwrite sets', (t) => { t.equal(false,results_json.ns_rwset[0].rwset.writes[0].is_delete, ' check results_json.ns_rwset[0].rwset.writes[0].version.is_delete'); t.equal('this is the value',results_json.ns_rwset[0].rwset.writes[0].value, ' check results_json.ns_rwset[0].rwset.writes[0].value'); - //now add in range query with query reads + t.equal('metadata key', results_json.ns_rwset[0].rwset.metadata_writes[0].key, ' check results_json.ns_rwset[0].rwset.metadata_writes[0].key'); + t.equal('metadata name', results_json.ns_rwset[0].rwset.metadata_writes[0].entries[0].name, ' check results_json.ns_rwset[0].rwset.metadata_writes[0].entries[0].name'); + t.equal('METADATAVALUE', results_json.ns_rwset[0].rwset.metadata_writes[0].entries[0].value.toString(), ' check results_json.ns_rwset[0].rwset.metadata_writes[0].entries[0].value'); + + //now add in range query with query reads var rqi_version_proto = new kvrwsetProto.Version(); rqi_version_proto.setBlockNum(13); rqi_version_proto.setTxNum(31); @@ -155,8 +169,13 @@ test('\n\n*** BlockDecoder test for readwrite sets', (t) => { hashed_kv_write.setIsDelete(true); hashed_kv_write.setValueHash(Buffer.from('HASHEDVAL1111')); + const hashed_kv_metadata = new kvrwsetProto.KVMetadataWriteHash(); + hashed_kv_metadata.setKeyHash(Buffer.from('HASHEDKEY2222')); + hashed_kv_metadata.setEntries([kv_metadata_entry_proto]); + hashed_kv_rwset.setHashedReads([hashed_kv_read]); hashed_kv_rwset.setHashedWrites([hashed_kv_write]); + hashed_kv_rwset.setMetadataWrites([hashed_kv_metadata]); const collection_rwset_array = []; const collection_rwset = new rwsetProto.CollectionHashedReadWriteSet(); @@ -195,6 +214,13 @@ test('\n\n*** BlockDecoder test for readwrite sets', (t) => { t.equal(true, results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.hashed_writes[0].is_delete, ' check results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.hashed_writes[0].is_delete'); + t.equal('HASHEDKEY2222', results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].key_hash.toString(), + ' check results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].key_hash'); + t.equal('metadata name', results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].entries[0].name, + ' check results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].entries[0].name'); + t.equal('METADATAVALUE', results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].entries[0].value.toString(), + ' check results_json.ns_rwset[0].collection_hashed_rwset[0].hashed_rwset.metadata_writes[0].entries[0].value'); + t.end(); });