मैं फैब्रिक-एसडीके-जावा का उपयोग क्वेरी के लिए करता हूं और चिनकोड का आह्वान करता हूं जो बायएफएन फैब्रिक से शुरू होता है। जब मैं किसी मान की क्वेरी करता हूं, तो a 90 होता है, और मैं a,b,10 का आह्वान करता हूं। तब a का मान 80 होना चाहिए, है ना? लेकिन जब मैं चिनकोड का आह्वान करता हूं, तो मैं क्वेरी करता हूं a मान अभी भी 90 है। तो मैं रास्ता पूछना चाहता हूं? और मैं इसे कैसे हल कर सकता हूं?

नीचे मेरा कोड है:

public class FabricJavaSdkSample {

    public static void main(String[] args){

        Security.addProvider(new BouncyCastleProvider());
        final CryptoSuite crypto = CryptoSuite.Factory.getCryptoSuite();

        System.out.println("Creating client");
        final HFClient client = HFClient.createNewInstance();
        client.setCryptoSuite(crypto);


        System.out.println("Loading org1 User1 from disk");

        final String privateKeyFileName = "/Users/zhangyulong/Documents/gopath/src/github.com/hyperledger/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/c050bce32a20c8c3bda5b7a9320c6e6f043fe2ff22af645b12844a46f7e97f0c_sk";

        final String certificateFileName = "/Users/zhangyulong/Documents/gopath/src/github.com/hyperledger/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem";
        final File privateKeyFile = new File(privateKeyFileName);
        final File certificateFile = new File(certificateFileName);
        final User User1 = Utils.getUser("PeerAdmin", "Org1MSP", privateKeyFile, certificateFile);
        client.setUserContext(User1);

        // Accessing channel, should already exist
        System.out.println("Accessing channel");
        Channel myChannel = client.newChannel("mychannel");

        System.out.println("Setting channel configuration");
        final List<Peer> peers = new LinkedList<>();
        Properties peerProperties = new Properties();

        peerProperties.setProperty("pemFile",
                "/Users/zhangyulong/Documents/gopath/src/github.com/hyperledger/fabric-samples/first-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt");

        peerProperties.setProperty("hostnameOverride", "peer0.org1.example.com");
        peerProperties.setProperty("sslProvider", "openSSL");
        peerProperties.setProperty("negotiationType", "TLS");
        peerProperties.setProperty("trustServerCertificate", "true"); // testing // // PRODUCTION!
        peerProperties.put("grpc.NettyChannelBuilderOption.maxInboundMessageSize", 9000000);
        peers.add(client.newPeer("peer0.org1.example.com", "grpcs://localhost:7051", peerProperties));

        myChannel.addPeer(peers.get(0), createPeerOptions().setPeerRoles(EnumSet.of(PeerRole.ENDORSING_PEER,
                PeerRole.LEDGER_QUERY, PeerRole.CHAINCODE_QUERY, PeerRole.EVENT_SOURCE)));

        Properties ordererProperties = new Properties();
        ordererProperties.setProperty("pemFile",
                "/Users/zhangyulong/Documents/gopath/src/github.com/hyperledger/fabric-samples/first-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt");
        ordererProperties.setProperty("trustServerCertificate", "true");
        ordererProperties.setProperty("hostnameOverride", "orderer.example.com");
        ordererProperties.setProperty("sslProvider", "openSSL");
        ordererProperties.setProperty("negotiationType", "TLS");
        ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTime", new Object[] { 5L, TimeUnit.MINUTES });
        ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTimeout", new Object[] { 8L, TimeUnit.SECONDS });
        myChannel.addOrderer(client.newOrderer("orderer.example.com", "grpcs://localhost:7050", ordererProperties));

        myChannel.initialize();

        // Creating proposal for query
        System.out.println("Creating proposal for query(a)");
        final QueryByChaincodeRequest queryAProposalRequest = client.newQueryProposalRequest();
        final ChaincodeID queryChaincodeID = ChaincodeID.newBuilder().setName("mycc").setVersion("1.0").build();
        queryAProposalRequest.setChaincodeID(queryChaincodeID);
        queryAProposalRequest.setFcn("query");
        // queryAProposalRequest.setFcn("queryAllCars");
        queryAProposalRequest.setProposalWaitTime(TimeUnit.SECONDS.toMillis(10));
        queryAProposalRequest.setArgs(new String[] { "a" });
        int blocksize = (int) myChannel.queryBlockchainInfo().getHeight();
        System.out.println("NO of Blocks: " + blocksize);
        // Send proposal and wait for responses
        System.out.println("Sending proposal for query");
        final Collection<ProposalResponse> queryAResponses = myChannel.queryByChaincode(queryAProposalRequest,
                myChannel.getPeers());

        for (ProposalResponse resp : queryAResponses) {
            System.out.println(
                    "Response from peer " + resp.getPeer().getName() + " is " + resp.getProposalResponse().getResponse()
                            + resp.getProposalResponse().getResponse().getPayload().toStringUtf8());
        }

        // Creating proposal for query
        System.out.println("Creating proposal for invoke(a,b,10)");

        final TransactionProposalRequest invokeProposalRequest = client.newTransactionProposalRequest();
        invokeProposalRequest.setChaincodeID(queryChaincodeID);
        invokeProposalRequest.setFcn("invoke");
        invokeProposalRequest.setProposalWaitTime(TimeUnit.SECONDS.toMillis(10));
        invokeProposalRequest.setArgs(new String[] { "a", "b", "10" });

        final Collection<ProposalResponse> queryBResponses = myChannel.sendTransactionProposal(invokeProposalRequest,
                myChannel.getPeers());
        for (ProposalResponse resp : queryBResponses) {
            System.out.println("Response from peer " + resp.getPeer().getName() + " is"
                    + resp.getProposalResponse().getResponse());
        }
0
zhyulong 31 जुलाई 2018, 10:43
क्या आपने इस मुद्दे को हल किया है?
 – 
Next Developer
17 जिंदा 2019, 22:53
मेरे पास अभी भी यह सवाल है
 – 
zhyulong
25 जिंदा 2019, 08:03
मैंने यह पता लगा लिया है। जाहिर है, एसडीके डिफ़ॉल्ट रूप से लेनदेन को ऑर्डर पर नहीं भेजता है। आपको "sendTransactionProposal" से प्राप्त प्रतिक्रियाओं के साथ "sendTransaction" विधि को कॉल करके स्पष्ट रूप से ऐसा करना होगा।
 – 
Next Developer
25 जिंदा 2019, 12:27

2 जवाब

आदेशकर्ता को कुछ भी नहीं भेजा जा रहा है। एसडीके द्वारा आपको प्रदान किए गए एकीकरण परीक्षण को देखें, जैसा कि रीडमे सुझाव देता है। यह प्रश्नों के साथ एक ब्लेंस ट्रांसफर लेनदेन दिखाता है जो परिवर्तनों का परीक्षण करता है और बहुत कुछ।

0
rickr 31 जुलाई 2018, 15:08
वेबसाइट कहाँ है?क्या आप मेरी मदद कर सकते हैं?
 – 
zhyulong
25 जिंदा 2019, 08:04

फैब्रिक नेटवर्क में एक नया ब्लॉक लिखने के लिए आप 3 कदम उठाएंगे:

  1. साथियों को एक लेनदेन प्रस्ताव अनुरोध भेजें (वे इस चरण में लेनदेन का अनुकरण करते हैं);
  2. सभी साथियों से प्रस्ताव प्रतिक्रिया एकत्र करें;

यदि सभी प्रतिक्रियाएँ सर्वांगसम हैं तो आप निम्न चरण कर सकते हैं:

  1. सभी साथियों को लेनदेन भेजें।

जबकि, क्वेरी के लिए आपको केवल चरण 1 करने की आवश्यकता है।


तो, अपने कोड में आप केवल चरण 1 करते हैं। पूरा करने के लिए आपको निम्नलिखित कोड जोड़ना होगा:

// STEP 1
final Collection<ProposalResponse> queryBResponses = myChannel.sendTransactionProposal(invokeProposalRequest,
                myChannel.getPeers());
        for (ProposalResponse resp : queryBResponses) {
            System.out.println("Response from peer " + resp.getPeer().getName() + " is"
                    + resp.getProposalResponse().getResponse());
        }


// STEP 2
Collection<ProposalResponse> successful = new ArrayList<>();
Collection<ProposalResponse> failed = new ArrayList<>();
for (ProposalResponse response : queryBResponses) {
    if (response.getStatus() == ProposalResponse.Status.SUCCESS) {
        successful.add(response);
    } else {
        failed.add(response);
    }
}

if (failed.size() > 0) throw new BlockChainException("...");
// CHECK CONSISTENCY
Collection<Set<ProposalResponse>> proposalConsistencySets = SDKUtils.getProposalConsistencySets(queryBResponses);
if (proposalConsistencySets.size() != 1) {
    throw new BlockChainException("...");
}
// STEP 3
CompletableFuture<BlockEvent.TransactionEvent> transactionEventCompletableFuture = channel.sendTransaction(successful);
0
Gianluca Pinto 29 जिंदा 2019, 19:14