官方示例其实是有完整例子的, 但是我想你可能对那几千行代码不是很感兴趣, 所以把解析读写集部分给摘出来了, 代码奉上
public static List<Map> getRWSetFromBlock(BlockInfo blockInfo) throws InvalidProtocolBufferException {
List<Map> transactionList = new ArrayList<>();
for (BlockInfo.EnvelopeInfo envelopeInfo : blockInfo.getEnvelopeInfos()) {
String id = envelopeInfo.getCreator().getId();
String mspid = envelopeInfo.getCreator().getMspid();
if (envelopeInfo.getType() == TRANSACTION_ENVELOPE) {
Date timestamp = envelopeInfo.getTimestamp();
BlockInfo.TransactionEnvelopeInfo transactionEnvelopeInfo = (BlockInfo.TransactionEnvelopeInfo) envelopeInfo;
String transactionID = transactionEnvelopeInfo.getTransactionID();
boolean valid = transactionEnvelopeInfo.isValid();
byte validationCode = transactionEnvelopeInfo.getValidationCode();
for (BlockInfo.TransactionEnvelopeInfo.TransactionActionInfo transactionActionInfo : transactionEnvelopeInfo.getTransactionActionInfos()) {
Map<String, Object> transactionMap = new HashMap<>();
transactionMap.put("transactionID", transactionID);
transactionMap.put("timestamp", timestamp.getTime());
transactionMap.put("isValid", valid);
transactionMap.put("MSPID", mspid);
transactionMap.put("usercert", id);
transactionMap.put("validationCode", validationCode);
int index = validationCode;
if (index < 26) {
transactionMap.put("validationCodeName", TransactionValidCode.transactionValidCode[index]);
} else {
transactionMap.put("validationCodeName", "NOT_VALIDATED_VALUE");
}
int chaincodeInputArgsCount = transactionActionInfo.getChaincodeInputArgsCount();
String[] argus = new String[chaincodeInputArgsCount];
for (int i = 0; i < chaincodeInputArgsCount; i++) {
argus[i] = new String(transactionActionInfo.getChaincodeInputArgs(i));
}
transactionMap.put("argus", argus);
transactionMap.put("status", transactionActionInfo.getResponseStatus());
transactionMap.put("endorsementsCount", transactionActionInfo.getEndorsementsCount());
String chaincodeIDName = transactionActionInfo.getChaincodeIDName();
transactionMap.put("chaincodeName", chaincodeIDName);
String chaincodeIDVersion = transactionActionInfo.getChaincodeIDVersion();
transactionMap.put("chaincodeVersion", chaincodeIDVersion);
TxReadWriteSetInfo rwsetInfo = transactionActionInfo.getTxReadWriteSet();
if (null != rwsetInfo) {
List<Map> rwList = new ArrayList<Map>();
for (TxReadWriteSetInfo.NsRwsetInfo nsRwsetInfo : rwsetInfo.getNsRwsetInfos()) {
Map<String, Object> rwMap = new HashMap<>();
Map<String, String> writeMap = new HashMap<>();
KvRwset.KVRWSet rws = nsRwsetInfo.getRwset();
String[] readSet = new String[rws.getReadsCount()];
int i = 0;
for (KvRwset.KVRead readList : rws.getReadsList()) {
String key = readList.getKey();
readSet[i++] = key;
}
rwMap.put("read", readSet);
for (KvRwset.KVWrite writeList : rws.getWritesList()) {
String valAsString = printableString(new String(writeList.getValue().toByteArray(), UTF_8));
writeList.getKey();
writeMap.put(writeList.getKey(), valAsString);
}
rwMap.put("write", writeMap);
rwList.add(rwMap);
}
transactionMap.put("RWSet", rwList);
}
transactionList.add(transactionMap);
}
}
}
return transactionList;
}
解析出来的结果:
{
"MSPID": "Org1MSP",
"validationCodeName": "VALID",
"isValid": true,
"endorsementsCount": 2,
"validationCode": 0,
"usercert": "-----BEGIN CERTIFICATE-----\nMIICKzCCAdGgAwIBAgIRAIF2IpfrV1NNOxn4LvKa2wAwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwNjE5MTI0MDAwWhcNMzAwNjE3MTI0MDAw\nWjBsMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEPMA0GA1UECxMGY2xpZW50MR8wHQYDVQQDDBZVc2VyMUBv\ncmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzYjdYD03\n5MyUfJMu6jXFLGBHJLYUsIUM5FbW+0x6x/6ncT921QDZKuKRvGZY9X/NmNerzAri\nf12OFnfKEhfLBaNNMEswDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYD\nVR0jBCQwIoAgIlJzB2U8NvdZvMWgATkcePQFA9u7ELRjZy66MSZLE7cwCgYIKoZI\nzj0EAwIDSAAwRQIhALSjWg1uKJkM/HseDRwbGDrrX3OnnQpx7/3eYWydz9vFAiBE\npMOUnQUtwNHb+S39qJV+6lnuaBbbYGVytcCu4KPa9Q==\n-----END CERTIFICATE-----\n",
"transactionID": "48369bb2bedf4a404e19cde5e57566b090a524ffdc497cec709440b422847f7b",
"RWSet": [
{
"read": [
"mycc2"
],
"write": {}
},
{
"read": [
"a",
"b"
],
"write": {
"a": "142",
"b": "413"
}
}
],
"argus": [
"invoke",
"a",
"b",
"5"
],
"chaincodeVersion": "1.0",
"timestamp": 1593584729787,
"status": 200,
"chaincodeName": "mycc2"
}