一个探索由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 Spigot Minecraft插件编码NoClassDefFound错误mysql   没有JRE的java客户端可以安装任何浏览器吗?   java使用FileReader和System从文本文件中读取一行。出来println似乎是用unicode打印的?   java Maven Jib插件:401未经授权   java成为API>=24上的CallScreeningService   java查找两个日期之间的天数差异以及每个月的天数   如何使用毕加索Android在谷歌地图的信息窗口中获取图像   java试图用箭头键和WASD同时移动两个对象   在elasticsearch中使用java客户端api检索期间的日期格式   java Android将选项菜单对齐到左侧,并更改其默认图标   java使用堆栈评估Posfix(LinkedList)   使用java在中打开文件   java Eclipse Autocomplete显示“内容辅助期间的问题”弹出窗口   java使用C#程序启动Apache服务器