func (*Endorser) getTxSimulator(ledgername string) (ledger.TxSimulator, error) { lgr := peer.GetLedger(ledgername) if lgr == nil { return nil, fmt.Errorf("chain does not exist(%s)", ledgername) } return lgr.NewTxSimulator() }
func startTxSimulation(ctxt context.Context, chainID string) (context.Context, ledger.TxSimulator, error) { lgr := peer.GetLedger(chainID) txsim, err := lgr.NewTxSimulator() if err != nil { return nil, nil, err } ctxt = context.WithValue(ctxt, TXSimulatorKey, txsim) return ctxt, txsim, nil }
func finitPeer(lis net.Listener, chainIDs ...string) { if lis != nil { for _, c := range chainIDs { deRegisterSysCCs(c) if lgr := peer.GetLedger(c); lgr != nil { lgr.Close() } } closeListenerAndSleep(lis) } ledgerPath := viper.GetString("peer.fileSystemPath") os.RemoveAll(ledgerPath) os.RemoveAll(filepath.Join(os.TempDir(), "hyperledger")) }
// deploySysCC deploys the given system chaincode on a chain func deploySysCC(chainID string, syscc *SystemChaincode) error { if !syscc.Enabled || !isWhitelisted(syscc) { sysccLogger.Info(fmt.Sprintf("system chaincode (%s,%s) disabled", syscc.Name, syscc.Path)) return nil } if chainID == "" && !syscc.ChainlessCC { return fmt.Errorf("cannot deploy system chaincode %s without chain id", syscc.Name) } else if chainID != "" && syscc.ChainlessCC { return fmt.Errorf("cannot deploy chainless system chaincode %s with chain id %s", syscc.Name, chainID) } var err error ctxt := context.Background() if !syscc.ChainlessCC { lgr := peer.GetLedger(chainID) var txsim ledger.TxSimulator if txsim, err = lgr.NewTxSimulator(); err != nil { return err } ctxt = context.WithValue(ctxt, TXSimulatorKey, txsim) defer txsim.Done() } chaincodeID := &pb.ChaincodeID{Path: syscc.Path, Name: syscc.Name} spec := &pb.ChaincodeSpec{Type: pb.ChaincodeSpec_Type(pb.ChaincodeSpec_Type_value["GOLANG"]), ChaincodeID: chaincodeID, CtorMsg: &pb.ChaincodeInput{Args: syscc.InitArgs}} // First build and get the deployment spec chaincodeDeploymentSpec, err := buildSysCC(ctxt, spec) if err != nil { sysccLogger.Error(fmt.Sprintf("Error deploying chaincode spec: %v\n\n error: %s", spec, err)) return err } txid := util.GenerateUUID() cccid := NewCCContext(chainID, chaincodeDeploymentSpec.ChaincodeSpec.ChaincodeID.Name, "", txid, true, nil) _, _, err = Execute(ctxt, cccid, chaincodeDeploymentSpec) sysccLogger.Infof("system chaincode %s/%s(%s) deployed", syscc.Name, chainID, syscc.Path) return err }
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 endTxSimulation(chainID string, txsim ledger.TxSimulator, payload []byte, commit bool, prop *pb.Proposal) error { txsim.Done() if lgr := peer.GetLedger(chainID); lgr != nil { if commit { var txSimulationResults []byte var err error //get simulation results if txSimulationResults, err = txsim.GetTxSimulationResults(); err != nil { return err } // assemble a (signed) proposal response message resp, err := putils.CreateProposalResponse(prop.Header, prop.Payload, txSimulationResults, nil, nil, signer) if err != nil { return err } // get the envelope env, err := putils.CreateSignedTx(prop, signer, resp) if err != nil { return err } envBytes, err := putils.GetBytesEnvelope(env) if err != nil { return err } //create the block with 1 transaction block := common.NewBlock(1, []byte{}) block.Data.Data = [][]byte{envBytes} //commit the block if err := lgr.Commit(block); err != nil { return err } } } return nil }
// Only exposed for testing purposes - commit the tx simulation so that // a deploy transaction is persisted and that chaincode can be invoked. // This makes the endorser test self-sufficient func (e *Endorser) commitTxSimulation(proposal *pb.Proposal, chainID string, signer msp.SigningIdentity, pResp *pb.ProposalResponse) error { tx, err := putils.CreateSignedTx(proposal, signer, pResp) if err != nil { return err } lgr := peer.GetLedger(chainID) if lgr == nil { return fmt.Errorf("failure while looking up the ledger") } txBytes, err := proto.Marshal(tx) if err != nil { return err } block := common.NewBlock(1, []byte{}) block.Data.Data = [][]byte{txBytes} block.Header.DataHash = block.Data.Hash() if err = lgr.Commit(block); err != nil { return err } return nil }