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
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