func getProposal() (*peer.Proposal, error) { cis := &peer.ChaincodeInvocationSpec{ ChaincodeSpec: &peer.ChaincodeSpec{ ChaincodeID: &peer.ChaincodeID{Name: "foo"}, Type: peer.ChaincodeSpec_GOLANG}} uuid := util.GenerateUUID() return utils.CreateProposalFromCIS(uuid, util.GetTestChainID(), cis, signerSerialized) }
func endTxSimulationCIS(chainID string, txid string, txsim ledger.TxSimulator, payload []byte, commit bool, cis *pb.ChaincodeInvocationSpec) error { // get serialized version of the signer ss, err := signer.Serialize() if err != nil { return err } // get a proposal - we need it to get a transaction prop, err := putils.CreateProposalFromCIS(txid, chainID, cis, ss) if err != nil { return err } return endTxSimulation(chainID, txsim, payload, commit, prop) }
func isTxValidForVscc(payload *common.Payload, envBytes []byte) error { // TODO: Extract the VSCC/policy from LCCC as soon as this is ready vscc := "vscc" chainName := payload.Header.ChainHeader.ChainID if chainName == "" { err := fmt.Errorf("transaction header does not contain an chain ID") logger.Errorf("%s", err) return err } txid := "N/A" // FIXME: is that appropriate? // build arguments for VSCC invocation // args[0] - function name (not used now) // args[1] - serialized Envelope args := [][]byte{[]byte(""), envBytes} // create VSCC invocation proposal vsccCis := &pb.ChaincodeInvocationSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: pb.ChaincodeSpec_GOLANG, ChaincodeID: &pb.ChaincodeID{Name: vscc}, CtorMsg: &pb.ChaincodeInput{Args: args}}} prop, err := putils.CreateProposalFromCIS(txid, chainName, vsccCis, []byte("")) if err != nil { logger.Errorf("Cannot create a proposal to invoke VSCC, err %s\n", err) return err } // get context for the chaincode execution var txsim ledger.TxSimulator lgr := peer.GetLedger(chainName) txsim, err = lgr.NewTxSimulator() if err != nil { logger.Errorf("Cannot obtain tx simulator, err %s\n", err) return err } defer txsim.Done() ctxt := context.WithValue(context.Background(), chaincode.TXSimulatorKey, txsim) cccid := chaincode.NewCCContext(chainName, vscc, "", txid, true, prop) // invoke VSCC _, _, err = chaincode.ExecuteChaincode(ctxt, cccid, args) if err != nil { logger.Errorf("VSCC check failed for transaction, error %s", err) return err } return nil }
func createTx() (*common.Envelope, error) { cis := &peer.ChaincodeInvocationSpec{ChaincodeSpec: &peer.ChaincodeSpec{ChaincodeID: &peer.ChaincodeID{Name: "foo"}}} uuid := util.GenerateUUID() prop, err := utils.CreateProposalFromCIS(uuid, util.GetTestChainID(), cis, sid) if err != nil { return nil, err } presp, err := utils.CreateProposalResponse(prop.Header, prop.Payload, []byte("res"), nil, nil, id) if err != nil { return nil, err } return utils.CreateSignedTx(prop, id, presp) }
func executeJoin(cf *JoinCmdFactory) (err error) { spec, err := getJoinCCSpec() if err != nil { return err } // Build the ChaincodeInvocationSpec message invocation := &pb.ChaincodeInvocationSpec{ChaincodeSpec: spec} creator, err := cf.Signer.Serialize() if err != nil { return fmt.Errorf("Error serializing identity for %s: %s\n", cf.Signer.GetIdentifier(), err) } uuid := cutil.GenerateUUID() var prop *pb.Proposal prop, err = putils.CreateProposalFromCIS(uuid, "", invocation, creator) if err != nil { return fmt.Errorf("Error creating proposal for join %s\n", err) } var signedProp *pb.SignedProposal signedProp, err = putils.GetSignedProposal(prop, cf.Signer) if err != nil { return fmt.Errorf("Error creating signed proposal %s\n", err) } var proposalResp *pb.ProposalResponse proposalResp, err = cf.EndorserClient.ProcessProposal(context.Background(), signedProp) if err != nil { return fmt.Errorf("Error endorsing %s\n", err) } if proposalResp == nil { return fmt.Errorf("Error on join by endorsing: %s\n", err) } fmt.Printf("Join Result: %s\n", string(proposalResp.Response.Payload)) return nil }
// chaincodeInvokeOrQuery invokes or queries the chaincode. If successful, the // INVOKE form prints the ProposalResponse to STDOUT, and the QUERY form prints // the query result on STDOUT. A command-line flag (-r, --raw) determines // whether the query result is output as raw bytes, or as a printable string. // The printable form is optionally (-x, --hex) a hexadecimal representation // of the query response. If the query response is NIL, nothing is output. // // NOTE - Query will likely go away as all interactions with the endorser are // Proposal and ProposalResponses func chaincodeInvokeOrQuery(cmd *cobra.Command, args []string, invoke bool, cf *ChaincodeCmdFactory) (err error) { spec, err := getChaincodeSpecification(cmd) if err != nil { return err } // Build the ChaincodeInvocationSpec message invocation := &pb.ChaincodeInvocationSpec{ChaincodeSpec: spec} if customIDGenAlg != common.UndefinedParamValue { invocation.IdGenerationAlg = customIDGenAlg } creator, err := cf.Signer.Serialize() if err != nil { return fmt.Errorf("Error serializing identity for %s: %s\n", cf.Signer.GetIdentifier(), err) } uuid := cutil.GenerateUUID() var prop *pb.Proposal prop, err = putils.CreateProposalFromCIS(uuid, chainID, invocation, creator) if err != nil { return fmt.Errorf("Error creating proposal %s: %s\n", chainFuncName, err) } var signedProp *pb.SignedProposal signedProp, err = putils.GetSignedProposal(prop, cf.Signer) if err != nil { return fmt.Errorf("Error creating signed proposal %s: %s\n", chainFuncName, err) } var proposalResp *pb.ProposalResponse proposalResp, err = cf.EndorserClient.ProcessProposal(context.Background(), signedProp) if err != nil { return fmt.Errorf("Error endorsing %s: %s\n", chainFuncName, err) } if invoke { if proposalResp != nil { // assemble a signed transaction (it's an Envelope message) env, err := putils.CreateSignedTx(prop, cf.Signer, proposalResp) if err != nil { return fmt.Errorf("Could not assemble transaction, err %s", err) } // send the envelope for ordering if err = cf.BroadcastClient.Send(env); err != nil { return fmt.Errorf("Error sending transaction %s: %s\n", chainFuncName, err) } } logger.Infof("Invoke result: %v", proposalResp) } else { if proposalResp == nil { return fmt.Errorf("Error query %s by endorsing: %s\n", chainFuncName, err) } if chaincodeQueryRaw { if chaincodeQueryHex { err = errors.New("Options --raw (-r) and --hex (-x) are not compatible\n") return } fmt.Print("Query Result (Raw): ") os.Stdout.Write(proposalResp.Response.Payload) } else { if chaincodeQueryHex { fmt.Printf("Query Result: %x\n", proposalResp.Response.Payload) } else { fmt.Printf("Query Result: %s\n", string(proposalResp.Response.Payload)) } } } return nil }