Exemple #1
0
    def _extractCountMetric(self, dbsession: session, contractAddress: str,
                            rootNode: solcast.nodes.NodeBase) -> bool:

        try:

            cmResult: CountMetric = CountMetricCalculator(
                contract_addr=contractAddress,
                contract_path=os.path.join(
                    self.contract_root_path, contractAddress + "." +
                    self.contract_src_path_skeleton.split(".")[1]),
                rootNode=rootNode).getCountMetrics()
        except Exception as e:
            logger.error(
                "|_____Extracting CountMetric for Contract:{contract} ERROR: {emsg}"
                .format(contract=contractAddress, emsg=e))
            return False
        else:
            #
            dbsession.add(cmResult)
            dbsession.commit()
            dbsession.flush()
            return True
Exemple #2
0
    def extractBatchContractFeature(self,
                                    dbsession: session,
                                    min_id: int = 0,
                                    max_id: int = 60000,
                                    batchSize: int = 500):

        processinglist:List[ProcessingState] = dbsession.query(ProcessingState)\
                                            .filter(ProcessingState.id.between(min_id,max_id))\
                                            .filter(ProcessingState.fullyextracted == 0)\
                                            .limit(batchSize)
        if not processinglist:
            logger.warning(
                "All Smart Contracts Have Been Successfully Feature-Extracted")

        #
        SCid: int = 1
        for processing in processinglist:
            # time.sleep(0.2)
            print("当前抽取特征的批次完成进度: %d / %d" % (SCid, batchSize))
            contractAddr = processing.contractAddr
            logger.info("Extracting Features for Contract:{contract}".format(
                contract=contractAddr))

            #
            cpmState = processing.complexityMetricExtracted
            ctmState = processing.countMetricExtracted
            oomState = processing.objectOrientedMetricExtracted
            lrmState = processing.languageRelatedMetricExtracted

            allState = all([cpmState, ctmState, oomState, lrmState])
            rootNode: solcast.nodes.NodeBase = self._getRootNode(
                contractAddr=contractAddr,
                versionString=processing.solc_versions)
            print(processing)
            try:

                if not processing.complexityMetricExtracted:
                    cpmState: bool = self._extractComplexityMetric(
                        dbsession, contractAddr, rootNode=rootNode)

                    if cpmState:
                        logger.info(
                            "|___Extracting ComplexityMetric for Contract:{contract} Successfully."
                            .format(contract=contractAddr))
                    else:
                        logger.error(
                            "|___Extracting ComplexityMetric for Contract:{contract} Failed!."
                            .format(contract=contractAddr))
                    assert cpmState == True

                if not processing.countMetricExtracted:
                    ctmState: bool = self._extractCountMetric(
                        dbsession,
                        contractAddress=contractAddr,
                        rootNode=rootNode)
                    if ctmState:
                        logger.info(
                            "|___Extracting CountMetric Features for Contract:{contract} Successfully."
                            .format(contract=contractAddr))
                    else:
                        logger.error(
                            "|___Extracting CountMetric Features for Contract:{contract} Failed!."
                            .format(contract=contractAddr))
                    assert ctmState == True

                if not processing.objectOrientedMetricExtracted:
                    oomState: bool = self._extractObjectOrientedMetric(
                        dbsession,
                        contractAddress=contractAddr,
                        rootNode=rootNode)
                    if oomState:
                        logger.info(
                            "|___Extracting ObjectOrientedMetric Features for Contract:{contract} Successfully."
                            .format(contract=contractAddr))
                    else:
                        logger.error(
                            "|___Extracting ObjectOrientedMetric Features for Contract:{contract} Failed!."
                            .format(contract=contractAddr))
                    assert oomState == True

                if not processing.languageRelatedMetricExtracted:
                    lrmState: bool = self._extractLanguageRelatedMetric(
                        dbsession,
                        contractAddress=contractAddr,
                        rootNode=rootNode)
                    if lrmState:
                        logger.info(
                            "|___Extracting LanguageRelatedMetric Features for Contract:{contract} Successfully."
                            .format(contract=contractAddr))
                    else:
                        logger.error(
                            "|___Extracting LanguageRelatedMetric Features for Contract:{contract} Failed!."
                            .format(contract=contractAddr))
                    assert lrmState == True

            except Exception as e:
                logger.error(
                    "|___Extracting Features for Contract:{contract} ERROR: {emsg}"
                    .format(contract=contractAddr, emsg=e))

                break
            else:
                allState = all([cpmState, ctmState, oomState, lrmState])
                if allState:
                    logger.success(
                        "Extracting Features for Contract:{contract} Full SUCCESSFULLY!"
                        .format(contract=contractAddr))
                else:
                    logger.warning(
                        "Extracting Features for Contract:{contract} PARTIAL SUCCESSFULLY!"
                        .format(contract=contractAddr))
            finally:
                processing.fullyextracted = allState
                processing.complexityMetricExtracted = cpmState
                processing.countMetricExtracted = ctmState
                processing.objectOrientedMetricExtracted = oomState
                processing.languageRelatedMetricExtracted = lrmState
                dbsession.commit()
                dbsession.flush()
                logger.success(
                    "Update Information on ProcessingState Table for  Contract:{contract} successfully!"
                    .format(contract=contractAddr))
                SCid = SCid + 1