// Functions for persisting and retrieving index data func addIndexDataForPersistence(block *protos.Block, blockNumber uint64, blockHash []byte, writeBatch *gorocksdb.WriteBatch) error { openchainDB := db.GetDBHandle() cf := openchainDB.IndexesCF // add blockhash -> blockNumber indexLogger.Debug("Indexing block number [%d] by hash = [%x]", blockNumber, blockHash) writeBatch.PutCF(cf, encodeBlockHashKey(blockHash), encodeBlockNumber(blockNumber)) addressToTxIndexesMap := make(map[string][]uint64) addressToChaincodeIDsMap := make(map[string][]*protos.ChaincodeID) transactions := block.GetTransactions() for txIndex, tx := range transactions { // add TxUUID -> (blockNumber,indexWithinBlock) writeBatch.PutCF(cf, encodeTxUUIDKey(tx.Uuid), encodeBlockNumTxIndex(blockNumber, uint64(txIndex))) txExecutingAddress := getTxExecutingAddress(tx) addressToTxIndexesMap[txExecutingAddress] = append(addressToTxIndexesMap[txExecutingAddress], uint64(txIndex)) switch tx.Type { case protos.Transaction_CHAINCODE_NEW, protos.Transaction_CHAINCODE_UPDATE: authroizedAddresses, chaincodeID := getAuthorisedAddresses(tx) for _, authroizedAddress := range authroizedAddresses { addressToChaincodeIDsMap[authroizedAddress] = append(addressToChaincodeIDsMap[authroizedAddress], chaincodeID) } } } for address, txsIndexes := range addressToTxIndexesMap { writeBatch.PutCF(cf, encodeAddressBlockNumCompositeKey(address, blockNumber), encodeListTxIndexes(txsIndexes)) } return nil }
func sendProducerBlockEvent(block *protos.Block) { // Remove payload from deploy transactions. This is done to make block // events more lightweight as the payload for these types of transactions // can be very large. blockTransactions := block.GetTransactions() for _, transaction := range blockTransactions { if transaction.Type == protos.Transaction_CHAINCODE_NEW { deploymentSpec := &protos.ChaincodeDeploymentSpec{} err := proto.Unmarshal(transaction.Payload, deploymentSpec) if err != nil { ledgerLogger.Error(fmt.Sprintf("Error unmarshalling deployment transaction for block event: %s", err)) continue } deploymentSpec.CodePackage = nil deploymentSpecBytes, err := proto.Marshal(deploymentSpec) if err != nil { ledgerLogger.Error(fmt.Sprintf("Error marshalling deployment transaction for block event: %s", err)) continue } transaction.Payload = deploymentSpecBytes } } producer.Send(producer.CreateBlockEvent(block)) }