Skip to content

Commit a3b7d71

Browse files
Luis SanchezJingxiao Gu
authored andcommitted
[FAB-3649] add getTransient() API
Change-Id: Iae5d98b9c4d9eb43d22e43164740cee09d50b355 Signed-off-by: Luis Sanchez <sanchezl@us.ibm.com>
1 parent 3cb86b0 commit a3b7d71

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeStub.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.time.Instant;
1818
import java.util.Arrays;
1919
import java.util.List;
20+
import java.util.Map;
2021

2122
import static java.nio.charset.StandardCharsets.UTF_8;
2223
import static java.util.stream.Collectors.toList;
@@ -309,4 +310,10 @@ default void putStringState(String key, String value) {
309310
*/
310311
byte[] getCreator();
311312

313+
/**
314+
* Returns the transient map associated with the current transaction.
315+
*
316+
* @return
317+
*/
318+
Map<String, byte[]> getTransient();
312319
}

shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeStubImpl.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.hyperledger.fabric.protos.ledger.queryresult.KvQueryResult.KV;
1919
import org.hyperledger.fabric.protos.peer.ChaincodeEventPackage.ChaincodeEvent;
2020
import org.hyperledger.fabric.protos.peer.ChaincodeShim.QueryResultBytes;
21+
import org.hyperledger.fabric.protos.peer.ProposalPackage.ChaincodeProposalPayload;
2122
import org.hyperledger.fabric.protos.peer.ProposalPackage.Proposal;
2223
import org.hyperledger.fabric.protos.peer.ProposalPackage.SignedProposal;
2324
import org.hyperledger.fabric.shim.Chaincode.Response;
@@ -30,6 +31,7 @@
3031
import java.time.Instant;
3132
import java.util.Collections;
3233
import java.util.List;
34+
import java.util.Map;
3335
import java.util.function.Function;
3436
import java.util.stream.Collectors;
3537

@@ -44,6 +46,7 @@ class ChaincodeStubImpl implements ChaincodeStub {
4446
private final SignedProposal signedProposal;
4547
private final Instant txTimestamp;
4648
private final ByteString creator;
49+
private final Map<String, ByteString> transientMap;
4750
private ChaincodeEvent event;
4851

4952
ChaincodeStubImpl(String txId, Handler handler, List<ByteString> args, SignedProposal signedProposal) {
@@ -54,17 +57,20 @@ class ChaincodeStubImpl implements ChaincodeStub {
5457
if(this.signedProposal == null) {
5558
this.creator = null;
5659
this.txTimestamp = null;
60+
this.transientMap = Collections.emptyMap();
5761
} else {
5862
try {
5963
final Proposal proposal = Proposal.parseFrom(signedProposal.getProposalBytes());
6064
final Header header = Header.parseFrom(proposal.getHeader());
6165
final ChannelHeader channelHeader = ChannelHeader.parseFrom(header.getChannelHeader());
6266
validateProposalType(channelHeader);
6367
final SignatureHeader signatureHeader = SignatureHeader.parseFrom(header.getSignatureHeader());
64-
68+
final ChaincodeProposalPayload chaincodeProposalPayload = ChaincodeProposalPayload.parseFrom(proposal.getPayload());
6569
final Timestamp timestamp = channelHeader.getTimestamp();
70+
6671
this.txTimestamp = Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos());
6772
this.creator = signatureHeader.getCreator();
73+
this.transientMap = chaincodeProposalPayload.getTransientMapMap();
6874
} catch (InvalidProtocolBufferException e) {
6975
throw new RuntimeException(e);
7076
}
@@ -236,4 +242,9 @@ public byte[] getCreator() {
236242
if(creator == null) return null;
237243
return creator.toByteArray();
238244
}
245+
246+
@Override
247+
public Map<String, byte[]> getTransient() {
248+
return transientMap.entrySet().stream().collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().toByteArray()));
249+
}
239250
}

shim/src/test/java/org/hyperledger/fabric/shim/impl/ChaincodeStubImplTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hyperledger.fabric.protos.peer.ChaincodeEventPackage.ChaincodeEvent;
1818
import org.hyperledger.fabric.protos.peer.ChaincodeShim.QueryResponse;
1919
import org.hyperledger.fabric.protos.peer.ChaincodeShim.QueryResultBytes;
20+
import org.hyperledger.fabric.protos.peer.ProposalPackage.ChaincodeProposalPayload;
2021
import org.hyperledger.fabric.protos.peer.ProposalPackage.Proposal;
2122
import org.hyperledger.fabric.protos.peer.ProposalPackage.SignedProposal;
2223
import org.hyperledger.fabric.shim.Chaincode;
@@ -38,8 +39,8 @@
3839

3940
import static java.nio.charset.StandardCharsets.UTF_8;
4041
import static org.hamcrest.MatcherAssert.assertThat;
41-
import static org.hamcrest.Matchers.contains;
4242
import static org.hamcrest.Matchers.*;
43+
import static org.hamcrest.Matchers.contains;
4344
import static org.hyperledger.fabric.protos.common.Common.HeaderType.ENDORSER_TRANSACTION_VALUE;
4445
import static org.junit.Assert.assertNotNull;
4546
import static org.mockito.ArgumentMatchers.*;
@@ -400,4 +401,30 @@ public void testGetCreator() {
400401
assertThat(stub.getCreator(), is(creator));
401402
}
402403

404+
@Test
405+
public void testGetTransient() {
406+
final SignedProposal signedProposal = SignedProposal.newBuilder()
407+
.setProposalBytes(Proposal.newBuilder()
408+
.setHeader(Header.newBuilder()
409+
.setChannelHeader(ChannelHeader.newBuilder()
410+
.setType(ENDORSER_TRANSACTION_VALUE)
411+
.setTimestamp(Timestamp.getDefaultInstance())
412+
.build().toByteString()
413+
)
414+
.build().toByteString()
415+
)
416+
.setPayload(ChaincodeProposalPayload.newBuilder()
417+
.putTransientMap("key0", ByteString.copyFromUtf8("value0"))
418+
.putTransientMap("key1", ByteString.copyFromUtf8("value1"))
419+
.build().toByteString()
420+
)
421+
.build().toByteString()
422+
).build();
423+
final ChaincodeStubImpl stub = new ChaincodeStubImpl("txid", handler, new ArrayList<>(), signedProposal);
424+
assertThat(stub.getTransient(), allOf(
425+
hasEntry("key0", "value0".getBytes(UTF_8)),
426+
hasEntry("key1", "value1".getBytes(UTF_8))
427+
));
428+
}
429+
403430
}

0 commit comments

Comments
 (0)