一个探索由solc生成的abstrax syntrax树的工具。

py-solc-ast的Python项目详细描述


solc ast

Pypi Status

用于探索由solc编译器生成的solidity abstrax syntrax树的工具。

安装

您可以通过pip

安装最新版本
$ pip install py-solc-ast

或者克隆repo并使用setuptools

$ python setup.py install

用法

首先,使用py-solc-x将契约编译为standard JSON output format

>>>importjson>>>importsolcx>>>input_json=json.load(open('input.json'))>>>output_json=solcx.compile_standard(input_json)

接下来,导入solcast,并使用from_standard_output_jsonfrom_standard_output初始化。这将返回一个SourceUnit对象的列表,每个对象都表示solidity ast中的基节点。

>>>importsolcast>>>nodes=solcast.from_standard_output(output_json)

从初始对象,您可以探索ast:

>>>nodes[<SourceUnititerableobject'contracts/Token.sol'>]>>>s=nodes[0]>>>s<SourceUnititerableobject'contracts/Token.sol'>>>>s.keys()['children','contract_id','contracts','depth','keys','name','node_type','offset','parent','path','value']>>>s.contracts[<ContractDefinitioniterable'Token'>]>>>s[0]<ContractDefinitioniterable'Token'>>>>s['Token']<ContractDefinitioniterable'Token'>>>>s['Token'].keys()['children','contract_id','depth','functions','keys','name','node_class','node_type','offset','parent','value']>>>s['Token'].functions[<FunctionDefinitioniterable'<constructor>'>,<FunctionDefinitioniterable'<fallback>'>,<FunctionDefinitioniterable'balanceOf'>,<FunctionDefinitioniterable'allowance'>,<FunctionDefinitioniterable'approve'>,<FunctionDefinitioniterable'transfer'>,<FunctionDefinitioniterable'transferFrom'>]>>>s['Token']['transfer']<FunctionDefinitioniterable'transfer'>>>>s['Token']['transfer'].statements[<ExpressionStatement.FunctionCall'require(balances[msg.sender] >= _value, Insufficient Balance)'>,<ExpressionStatement.Assignmentiterableuint256'balances[msg.sender] = balances[msg.sender].sub(_value)'>,<ExpressionStatement.Assignmentiterableuint256'balances[_to] = balances[_to].add(_value)'>,<EmitStatement.FunctionCall'Transfer'>,<Return.Literalbool'true'>]

使用Node.childrenNode.parents方法访问和筛选相关节点:

>>>node=s['Token']['transfer']>>>node.children(depth=1)[<ExpressionStatement.FunctionCall'require(balances[msg.sender] >= _value, Insufficient Balance)'>,<ExpressionStatement.Assignmentiterableuint256'balances[msg.sender] = balances[msg.sender].sub(_value)'>,<ExpressionStatement.Assignmentiterableuint256'balances[_to] = balances[_to].add(_value)'>,<EmitStatement.FunctionCall'Transfer'>,<Return.Literalbool'true'>]>>>node.children(include_children=False,filters={'node_type':"FunctionCall",'name':"require"})[<ExpressionStatement.FunctionCall'require(balances[msg.sender] >= _value, Insufficient Balance)'>]>>>node.parents()[<ContractDefinitioniterable'Token'>,<SourceUnititerableobject'contracts/Token.sol'>]

对这两个方法中的任何一个调用help都提供了对其功能的更详细的解释。

开发

该项目仍在开发中,应被视为早期alpha。欢迎所有反馈和贡献!

尚未实现所有节点。从任何对象中,都可以使用Node._unimplemented方法获取包含尚未包含的ast节点的键列表。原始json数据存储在Node._node

>>>s['Token']['transfer']._unimplemented()['parameters','returnParameters']>>>s['Token']['transfer']._node['returnParameters']{'id':328,'nodeType':'ParameterList','parameters':[{'constant':False,'id':327,'name':'','nodeType':'VariableDeclaration','scope':373,'src':'1573:4:2','stateVariable':False,'storageLocation':'default','typeDescriptions':{'typeIdentifier':'t_bool','typeString':'bool'},'typeName':{'id':326,'name':'bool','nodeType':'ElementaryTypeName','src':'1573:4:2','typeDescriptions':{'typeIdentifier':'t_bool','typeString':'bool'}},'value':None,'visibility':'internal'}],'src':'1572:6:2'}

有关AST grammar的信息,请参阅solidity文档。

许可证

这个项目是根据MIT license授权的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用相同的模型、颜色、字体和侦听器创建JTable的副本?   JavaSpring+Thymeleaf:用户时区中的时间   java HTTP请求返回非法状态异常安卓   java xml验证JDK 1.5 JDK 1.6差异   junit如何使用Parasoft从java文件生成测试文件   java使用getSpans方法获取可扩展文件中的所有跨距   javascript无法使用bindingResult设置表单元素   java RCP应用程序活动   获取Java类中泛型字段的类型   java更新查询,从一个依赖于另一个表的表中更改字段   java错误:GWT类型中的方法setBridge(GWTBridge)不适用于参数(GWTBridge)   为什么java/安卓需要在XML元素的开头有一个空格来解析它?   java通用代码,用于将字符串转换为任何所需的类   java如何创建Liferay钩子以扩展购物车portlet的功能   java Selected()方法存在漏洞   java新行附加在我的加密字符串上   使用NaN值的指数平滑的java   使用飞碟和iText发行的java XHTML到PDF   java如何在不使用HTMLDocument的情况下在JTextPane中显示两列文本?