一个探索由solc生成的abstrax syntrax树的工具。
py-solc-ast的Python项目详细描述
solc ast
用于探索由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_json
或from_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.children
和Node.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授权的。