// CommitTxBatch gets invoked when the current transaction-batch needs // to be committed. This function returns successfully iff the // transactions details and state changes (that may have happened // during execution of this transaction-batch) have been committed to // permanent storage. func (h *Helper) CommitTxBatch(id interface{}, metadata []byte) (*pb.Block, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, fmt.Errorf("Failed to get the ledger: %v", err) } // TODO fix this one the ledger has been fixed to implement if err := ledger.CommitTxBatch(id, h.curBatch, h.curBatchErrs, metadata); err != nil { return nil, fmt.Errorf("Failed to commit transaction to the ledger: %v", err) } size := ledger.GetBlockchainSize() defer func() { h.curBatch = nil // TODO, remove after issue 579 h.curBatchErrs = nil // TODO, remove after issue 579 }() block, err := ledger.GetBlockByNumber(size - 1) if err != nil { return nil, fmt.Errorf("Failed to get the block at the head of the chain: %v", err) } logger.Debugf("Committed block with %d transactions, intended to include %d", len(block.Transactions), len(h.curBatch)) return block, nil }
func (i *Noops) getBlockData() (*pb.Block, *statemgmt.StateDelta, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, nil, fmt.Errorf("Fail to get the ledger: %v", err) } blockHeight := ledger.GetBlockchainSize() if logger.IsEnabledFor(logging.DEBUG) { logger.Debugf("Preparing to broadcast with block number %v", blockHeight) } block, err := ledger.GetBlockByNumber(blockHeight - 1) if nil != err { return nil, nil, err } //delta, err := ledger.GetStateDeltaBytes(blockHeight) delta, err := ledger.GetStateDelta(blockHeight - 1) if nil != err { return nil, nil, err } if logger.IsEnabledFor(logging.DEBUG) { logger.Debugf("Got the delta state of block number %v", blockHeight) } return block, delta, nil }
// GetBlockchainSize returns the current size of the blockchain func (h *Helper) GetBlockchainSize() (uint64, error) { ledger, err := ledger.GetLedger() if err != nil { return 0, fmt.Errorf("Failed to get the ledger :%v", err) } return ledger.GetBlockchainSize(), nil }
func TestGenesis(t *testing.T) { //use a different address than what we usually use for "peer" //we override the peerAddress set in chaincode_support.go peerAddress := "0.0.0.0:50303" lis, err := net.Listen("tcp", peerAddress) if err != nil { t.Fail() t.Logf("Error starting peer listener %s", err) return } var opts []grpc.ServerOption if viper.GetBool("peer.tls.enabled") { creds, err := credentials.NewServerTLSFromFile(viper.GetString("peer.tls.cert.file"), viper.GetString("peer.tls.key.file")) if err != nil { grpclog.Fatalf("Failed to generate credentials %v", err) } opts = []grpc.ServerOption{grpc.Creds(creds)} } grpcServer := grpc.NewServer(opts...) getPeerEndpoint := func() (*protos.PeerEndpoint, error) { return &protos.PeerEndpoint{ID: &protos.PeerID{Name: "testpeer"}, Address: peerAddress}, nil } ccStartupTimeout := time.Duration(30000) * time.Millisecond protos.RegisterChaincodeSupportServer(grpcServer, chaincode.NewChaincodeSupport(chaincode.DefaultChain, getPeerEndpoint, false, ccStartupTimeout, nil)) go grpcServer.Serve(lis) ledger := ledger.InitTestLedger(t) if ledger.GetBlockchainSize() != 0 { t.Fatalf("Expected blockchain size of 0, but got %d", ledger.GetBlockchainSize()) } makeGenesisErr := MakeGenesis() if makeGenesisErr != nil { t.Fatalf("Error creating genesis block, %s", makeGenesisErr) } if ledger.GetBlockchainSize() != 1 { t.Fatalf("Expected blockchain size of 1, but got %d", ledger.GetBlockchainSize()) } }
// GetBlockHeadMetadata returns metadata from block at the head of the blockchain func (h *Helper) GetBlockHeadMetadata() ([]byte, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, err } head := ledger.GetBlockchainSize() block, err := ledger.GetBlockByNumber(head - 1) if err != nil { return nil, err } return block.ConsensusMetadata, nil }
// MakeGenesis creates the genesis block and adds it to the blockchain. func MakeGenesis() error { once.Do(func() { ledger, err := ledger.GetLedger() if err != nil { makeGenesisError = err return } if ledger.GetBlockchainSize() == 0 { genesisLogger.Info("Creating genesis block.") if makeGenesisError = ledger.BeginTxBatch(0); makeGenesisError == nil { makeGenesisError = ledger.CommitTxBatch(0, nil, nil, nil) } } }) return makeGenesisError }
// CommitTxBatch gets invoked when the current transaction-batch needs // to be committed. This function returns successfully iff the // transactions details and state changes (that may have happened // during execution of this transaction-batch) have been committed to // permanent storage. func (h *Helper) CommitTxBatch(id interface{}, metadata []byte) (*pb.Block, error) { ledger, err := ledger.GetLedger() if err != nil { return nil, fmt.Errorf("Failed to get the ledger: %v", err) } // TODO fix this one the ledger has been fixed to implement if err := ledger.CommitTxBatch(id, h.curBatch, nil, metadata); err != nil { return nil, fmt.Errorf("Failed to commit transaction to the ledger: %v", err) } size := ledger.GetBlockchainSize() h.curBatch = nil // TODO, remove after issue 579 block, err := ledger.GetBlockByNumber(size - 1) if err != nil { return nil, fmt.Errorf("Failed to get the block at the head of the chain: %v", err) } return block, nil }
// MakeGenesis creates the genesis block based on configuration in core.yaml // and adds it to the blockchain. func MakeGenesis() error { once.Do(func() { ledger, err := ledger.GetLedger() if err != nil { makeGenesisError = err return } var genesisBlockExists bool if ledger.GetBlockchainSize() == 0 { genesisLogger.Info("Creating genesis block.") ledger.BeginTxBatch(0) } else { genesisBlockExists = true } var genesisTransactions []*protos.Transaction defer func() { if !genesisBlockExists && makeGenesisError == nil { genesisLogger.Info("Adding %d system chaincodes to the genesis block.", len(genesisTransactions)) ledger.CommitTxBatch(0, genesisTransactions, nil, nil) } }() //We are disabling the validity period deployment for now, we shouldn't even allow it if it's enabled in the configuration allowDeployValidityPeriod := false if isDeploySystemChaincodeEnabled() && allowDeployValidityPeriod { vpTransaction, deployErr := deployUpdateValidityPeriodChaincode(genesisBlockExists) if deployErr != nil { genesisLogger.Error("Error deploying validity period system chaincode for genesis block.", deployErr) makeGenesisError = deployErr return } genesisTransactions = append(genesisTransactions, vpTransaction) } if getGenesis() == nil { genesisLogger.Info("No genesis block chaincodes defined.") } else { chaincodes, chaincodesOK := genesis["chaincodes"].(map[interface{}]interface{}) if !chaincodesOK { genesisLogger.Info("No genesis block chaincodes defined.") ledger.CommitTxBatch(0, genesisTransactions, nil, nil) return } genesisLogger.Debug("Genesis chaincodes are %s", chaincodes) for i := range chaincodes { name := i.(string) genesisLogger.Debug("Chaincode %s", name) chaincode := chaincodes[name] chaincodeMap, chaincodeMapOK := chaincode.(map[interface{}]interface{}) if !chaincodeMapOK { genesisLogger.Error("Invalid chaincode defined in genesis configuration:", chaincode) makeGenesisError = fmt.Errorf("Invalid chaincode defined in genesis configuration: %s", chaincode) return } path, pathOK := chaincodeMap["path"].(string) if !pathOK { genesisLogger.Error("Invalid chaincode URL defined in genesis configuration:", chaincodeMap["path"]) makeGenesisError = fmt.Errorf("Invalid chaincode URL defined in genesis configuration: %s", chaincodeMap["path"]) return } chaincodeType, chaincodeTypeOK := chaincodeMap["type"].(string) if !chaincodeTypeOK { genesisLogger.Error("Invalid chaincode type defined in genesis configuration:", chaincodeMap["type"]) makeGenesisError = fmt.Errorf("Invalid chaincode type defined in genesis configuration: %s", chaincodeMap["type"]) return } if chaincodeType == "" { chaincodeType = "GOLANG" } chaincodeID := &protos.ChaincodeID{Path: path, Name: name} genesisLogger.Debug("Genesis chaincodeID %s", chaincodeID) constructorMap, constructorMapOK := chaincodeMap["constructor"].(map[interface{}]interface{}) if !constructorMapOK { genesisLogger.Error("Invalid chaincode constructor defined in genesis configuration:", chaincodeMap["constructor"]) makeGenesisError = fmt.Errorf("Invalid chaincode constructor defined in genesis configuration: %s", chaincodeMap["constructor"]) return } var spec protos.ChaincodeSpec if constructorMap == nil { genesisLogger.Debug("Genesis chaincode has no constructor.") spec = protos.ChaincodeSpec{Type: protos.ChaincodeSpec_Type(protos.ChaincodeSpec_Type_value[chaincodeType]), ChaincodeID: chaincodeID} } else { _, ctorArgsOK := constructorMap["args"] if !ctorArgsOK { genesisLogger.Error("Invalid chaincode constructor args defined in genesis configuration:", constructorMap["args"]) makeGenesisError = fmt.Errorf("Invalid chaincode constructor args defined in genesis configuration: %s", constructorMap["args"]) return } ctorArgs, ctorArgsOK := constructorMap["args"].([]interface{}) var ctorArgsStringArray []string if ctorArgsOK { genesisLogger.Debug("Genesis chaincode constructor args %s", ctorArgs) for j := 0; j < len(ctorArgs); j++ { ctorArgsStringArray = append(ctorArgsStringArray, ctorArgs[j].(string)) } } spec = protos.ChaincodeSpec{Type: protos.ChaincodeSpec_Type(protos.ChaincodeSpec_Type_value[chaincodeType]), ChaincodeID: chaincodeID, CtorMsg: &protos.ChaincodeInput{Args: ctorArgsStringArray}} } transaction, _, deployErr := DeployLocal(context.Background(), &spec, genesisBlockExists) if deployErr != nil { genesisLogger.Error("Error deploying chaincode for genesis block.", deployErr) makeGenesisError = deployErr return } genesisTransactions = append(genesisTransactions, transaction) } //for } //else }) return makeGenesisError }