NEXT社区|小课堂
由于近期NEXT社区加入很多新的小伙伴,有在校大学生,有对区块链感兴趣的传统企业从业者。为了更方便、更系统的让NEXT社区的伙伴们了解NEO的技术知识,因此我们开设了小课堂,每周3节,向大家普及NEO相关的知识要点!
NEXT社区小课堂|第十三课
NEOPython编译器介绍
neo-boa编译器介绍
neo-boa编译器可将Python文件编译为.avm格式,在NEO虚拟机中运行。NEO虚拟机可在NEO区块链上执行合约。
编译器支持Python语言子集。
1、目前功能
·?将Python语言子集编译成.avm格式,在NEO虚拟机上运行
·??适用于Python3.4与3.5
2、未来功能
·?编译更广泛的Python语言子集
·??适用于Python3.6
3、已支持的Python功能
下文为目前支持的Python功能一览。详细介绍请参见boa.tests.src目录中的案例
4、流控制
If、Else、Elif、While、Break、Methodcalls、Lamdbas、forxin
5、用于整数运算的算数运算符与相等运算符
ADD、SUB、MUL、DIV、ABS、LSHIFT、RSHIFT、AND、OR、XOR、MODULO、INVERT、GT、GTE、LT、LTE、EQ、NOTEQ
6、使用自定义内置功能进行列表创建。注意列表一经创建,其长度便不可更改。
fromboa.code.builtinsimportlist
#thisworks
x=list(length=10)
x=84
#thisalsoworks
x=
#thisdoesNOTwork
x=
x.append(1)
#支持列表操作
x=
y=x
#在可能的情况下,Python的某些__builtins__
Nexo与三箭资本合作推出NFT借贷平台:金色财经报道,加密货币借贷平台Nexo宣布与对冲基金三箭资本(Three Arrows Capital)合作推出新的NFT借贷平台NFT Lending Desk,目前支持Bored Apes Yacht Club和CryptoPunks,未来将支持更多NFT。使用NFT Lending Desk的客户将能够借用稳定币、ETH和其他加密资产,还可以授权Nexo使用加密信用代表其执行NFT购买。[2021/12/17 7:44:55]
#已经根据NEO虚拟机的特点以自定义的方式实现
fromboa.code.builtinsimportrange
xrange=range(1,30)
#thisalsoworks
foriinrange(2,21):
i=i1
安装
1、使用pip
pipinstallneo-boa
2、手动安装
克隆存储库,进入项目目录后创建Python3虚拟环境,并通过以下指令激活。
python3?-mvenvvenvsourcevenv/bin/activate
或单独安装Python3.5
virtualenv?-p?/usr/local/bin/python3.5venvsourcevenv/bin/activate
或单独安装Python3.5
virtualenv?-p?/usr/local/bin/python3.5venvsourcevenv/bin/activate
接着,通过以下指令安装需求
pipinstall?-rrequirements.txt
3、基本用途
编译器使用指南如下
fromboa.compiler?import?CompilerCompiler.load_and_save('path/to/your/file.py')
4、许可证
·开源MIT?
·主作者为localhuman
5、boa.compiler.Compiler
分析 | Coinbase非BTC下跌真凶 Bitfinex连续大额卖单导演此次瀑布:BTC价格早间从$8500下挫至$7900左右,市场对此有较多解读,其中呼声较高的是来自Coinbase的砸盘。TokenGazer基于严谨的数据分析,得到一些有意思的数据:在BTC下跌期间(UTC 3日22点—4日2点),Bitfinex交易所中的卖单数量(20624)远超买单数量(15465),Coinbase的卖单数量(20698)少于买单数量(23896);Bitfinex的交易量(13443.42BTC)逼近Coinbase(14235.12BTC),而据TokenGazer往期观察,Coinbase成交量约为Bitfinex的1.5倍;在这个时间点Bitfinex最大抛盘为393.246BTC,Coinbase为41.6454BTC,Bitfinex的抛盘数额较大且较为密集,详细图表分析可查阅TokenGazer官网;基于以上数据支撑,TokenGazer认为:此次BTC的下跌,大概率是Bitfinex导致,而非Coinbase。[2019/6/4]
下文将介绍Compiler的具体实现细则。
6、classboa.compiler.Compiler
主编译器接口类
通过下列程序加载python文件,编译为.avm格式,并与python文件存储在一个地方。
fromboa.compilerimportCompilerCompiler.load_and_save(‘path/to/your/file.py’)#returnthecompilerobjectforinspectioncompiler=Compiler.load(‘path/to/your/file.py’)#retrievethedefaultmoduleforinpectiondefault_module=compiler.default#retreivethedefault/entrymethodforthesmartcontractentry_method=default_module.main
7、defaule
取回默认或“入口”模块。
返回值:默认反回值为boa.code.Module对象,异常时无返回值
8、staticinstance()
取回当前编译器对象的实例,否则创建一个实例
声音 | 赵东:Bitfinex IEO目前已有6~7亿美元私募意向 不影响BTC长期走势:5月6日,赵东表示,Bitfinex IEO目前大约已有6~7亿美元私募意向,但所有的钱都还没打款,无法判断会不会最终成交。此外,赵东称,短期来看,Bitfinex开展IEO可能导致资产被抽血,但长期来看,根本没必要担心,因为Tether本身是整个市场的法币通道,对整个行业而言是良性存在。(火星财经)[2019/5/7]
返回值:编译器对象的单个实例
9、staticload(path)
调用load来加载需编译但无需写为.avm格式的Python文件
参数:path–Python文件的编译路径
返回值:编译器实例
用途:通过下述程序返回编译器对象进行检查
fromboa.compiler?import?Compilercompiler?=?Compiler.load(‘path/to/your/file.py’)
10、staticload_and_save(path,output_path=None)
调用load_and_save来加载需编译为.avm格式的Python文件,并保存结果。
默认情况下,最终生成的.avm文件将与源文件存储在一个地方。
参数:
·path——Python文件的编译路径
·output_path——已编译的.avm文件的可选保存路径
返回值:返回编译器实例
用途:通过下述代码返回编译器对象进行检查
fromboa.compilerimportCompiler
Compiler.load_and_save(‘path/to/your/file.py’)
11、write()
返回值:已编译的Python程序的字节串
12、staticwrite_file(data,path)
通过指定路径将输出数据存储至文件系统
参数:
·data——待写入磁盘的数据字节串
·path——文件写入路径
13、boa.code.module.Module
动态 | Bitfinex停机维护期间庄家或将操纵市场:据 MORECOIN 研究院消息,北京时间1月7日18点到1月8日1点,Bitfinex 进行停机7小时的维护,Bitfinex 曾是全球最大的交易所,成交额处于前列。停机维护期间可能使得操纵资金成本大幅降低,因此在此期间可能会有庄家资金进行市场操控。特别提醒期货用户应注意风险。[2019/1/7]
下文将介绍Module的具体实现细则。
14、classboa.code.module.Module(path,module_name=”,is_sys_module=False,items_to_import=None)
模块是包含代码对象的顶层组件。例如,在path/to/my/file.py的编译过程中,file.py中包含的项目即为模块。一个可执行项可包含多个模块。上述案例中的“默认”或“入口”模块即为file.py。
调用Compiler.load_and_save(‘path/to/file.py’)时会专门为file.py创建一个模块。若file.py导入了其他任何功能,那些模块也会被添加至可执行项中,并置于Module.loaded_modules属性中。
在模块被当做方法处理,方法被当做基本块处理,基本块被处理为标记后,主模块或default模块的write()方法即被调用,将可执行项写为字节串,返回磁盘并存储。
如果您想检查模块内容,可使用Compiler.load(‘path/to/file.py’),该功能将返回一个编译器实例。获取该实例后,您便可以访问编译器的default模块,从而访问该默认模块中装入的其他模块。
各模块均包含byteplay3对象bp的引用,该对象包含可在Python解释器中显示的指令集。
您可对具备bp属性的任意对象调用print(module.bp.code),结果将输出一段Python解释器代码。
fromboa.compilerimportCompiler
module=Compiler.load
(‘./boa/tests/src/AddTest1.py’).default
print(module.bp.code)
LOAD_CONST
LOAD_CONST‘Main’
XRP在Bitfinex平台跌幅超20%:Bitfinex平台目前XRP跌幅达到21.9%,目前价格为2.4178美元。OKex平台目前XRP价格为2.6842美元,跌幅达19.33%。Coinmarketcap平台显示目前XRP价格降至2.98美元,跌幅为17.26%。[2018/1/6]
MAKE_FUNCTION0
STORE_NAMEMain
LOAD_CONSTNone
RETURN_VALUE
对可执行项进行处理与标记化后,便会生成虚拟机标记集,虚拟机标记虽与byteplay3标记相类似,但仍存在显著区别。这些标记均包含在该模块的all_vm_tokens属性中。
您可调用module.to_s()来查看该程序,因为该程序已根据NEO虚拟机的特点进行了标记化。
>>>module.to_s()
LOAD_FAST?
LOAD_CONST
BINARY_MULTIPL??
STORE_FAST?
LOAD_FAST?
LOAD_CONST?
BINARY_ADD????
LOAD_FAST
LOAD_CONST
BINARY_TRUE_DIVIDE
STORE_FAST?
LOAD_FAST?
LOAD_CONST?
BINARY_SUBTRACT
STORE_FAST
b''
LOAD_FAST
LOAD_FAST
BINARY_ADD????
LOAD_FAST?
BINARY_ADD
LOAD_FAST?
BINARY_ADD
NOP
15、add_method(method)
在模块中添加方法如下:
Parameters:?method(boa.code.method.Method)——模块中待添加的方法对象
返回值:显示是否已添加该方法
返回值类型:布尔值
16、build()
将bp.code对象拆分成行,并合并多行,生成不同的项目。
17、link_methods()
关联各方法地址
18、main
返回该模块的默认方法
返回值:该模块的默认方法
返回值类型:boa.code.method.Method
19、method_by_name(method_name)
在模块的methods列表中查找方法名称:parammethod_name:
待查找的方法名称:typemethod_name:str
返回值:方法
返回值类型:boa.code.method.Method
20、module_path
返回该模块的文件路径
返回值:模块路径
返回值类型:str
21、orderered_methods
方法序列表
返回值:该模块中的方法序列表
返回值类型:列表
22、process_action(lineset)
处理模块中的动作,样本如下,其目的类似于创建下列事件:
fromboa.blockchain.vm.Neo.ActionimportRegisterAction
#Registertheaction.
onRefund=RegisterAction(‘refund’,’to_address’,’amount’)
#Dispatchanaction.
onRefund(my_address,100)
参数:lineset(list)–包含应用程序调用注册功能的行集
23、process_import(import_item)
处理该模块中的导入语句
Parameters:?import_item(boa.code.items.Importsubclass)–
24、process_method(lineset)
处理包含byteplay3代码对象的行集
参数:lineset(list)–需处理与添加的行集
25、process_smart_contract_app_registration(lineset)?
在智能合约中调用另一个智能合约时处理智能合约应用程序注册事宜:
fromboa.blockchain.vm.Neo.AppimportRegisterAppCall
#registerthecontract
otherContract=RegisterAppCall(‘contract_hash’,’param1′,’param2′)
#callthecontract
result=otherContract(a,b)
参数:lineset(list)–包含应用程序调用注册功能的行集
26、split_lines()
将模块中的行集拆分成可编译的对象集
27、to_s()
该方法的目的在于以可读/标记化的格式打印可执行项的输出值,样本如下:
>>>fromboa.compilerimportCompiler
>>>module=Compiler.
load('./boa/tests/src/LambdaTest.py').default
>>>module.write()
>>>module.to_s()
LOAD_CONST
STORE_FAST
LOAD_FAST
CALL_FUNCTION?Main..
q_1
STORE_FAST
b''
m??
NOP?
RETURN_VALUE??
b''?
LOAD_FAST?x?
LOAD_CONST?
BINARY_ADD??
NOP????
RETURN_VALUE?
28、tokenize()
将boa.code.pytoken.PyToken对象集转化为boa.code.vmtoken.VMToken对象。
29、total_lines
获取该方法的总行数
返回值:总行数
返回值类型:int
30、total_module_variables
获取局部变量总数
返回值:该模块中的变量总数
返回值类型:int
31、vm_tokens
返回该方法中的虚拟机标记列表
返回值:该方法中的虚拟机标记列表
返回值类型:列表
32、write()
将标记器当前的状态写为字节串
返回值:当前标记器的字节串
返回值类型:字节
原文链接:https://github.com/localhuman/neo-python
往期精彩内容
NEXT社区小课堂|第五课:NEO-共识算法dBFT源码解析
NEXT社区小课堂|第八课:如果往错误的NEO地址转账会发生什么
NEXT社区小课堂|第十课:如何正确理解NEO平台上的GAS
NEXT社区小课堂|第十一课:NEO中数字的表达和运算
??
联系我们?
微博:https://weibo.com/u/6724929880
官网:https://neonext.club/
QQ群:612334080
电报:https://t.me/neonextop
twitter:https://twitter.com/NE0NEXT
关注NEONEXT官方公众号
获取更多一手社区资讯
EOS看涨期权 代码周EOS看涨0610期权标的EOS合约类型欧式看涨期权计价单位USDT最小价格单位0.0001USDT合约比例1:2.
1900/1/1 0:00:00美国加密货币数据分析公司DataLight推出的实际使用指标表明,与其不断增长的使用量相比,比特币价格可能被低估.
1900/1/1 0:00:00比特币在一小时内急跌800美元,盘中一度跌穿8000美元整数关口。Coindesk分析称,比特币期货交易活动的急剧上升,可能是加密货币市场中机构投资方参与度增加的一个迹象.
1900/1/1 0:00:00主流币种白盘重现了昨日市场表现,早盘至今市值靠前币种价格波动幅度非常有限,除HT以及BCH等极少数币种以外热力图中覆盖到的币种白盘波幅普遍保持在2%及以下水平,其中BTC在过去9个小时时间里仅微涨0.49%,基本相当于原地踏步.
1900/1/1 0:00:00尊敬的BTB用户: BTB交易所将于新加坡时间2019年6月5日上线CFC/证书币 上线时间: 开放充值时间:2019年6月4日11:00AM开放交易时间:2019年6月5日11:00AMCFTC委员谈FTX事件:CFTC缺乏对数字资.
1900/1/1 0:00:00出货的形态千篇一律 成妖的形态万里挑一 博弈自己力所能理解的票 周末心情好啊!有感于金逸影视的跌停板疯狂诱多,对于这样子运作的操盘非常的气愤。论变态砸盘出货,还是温州帮一字断魂刀更加胆跳心惊。论藏的深沉,比不过茅台的但斌基金和外资.
1900/1/1 0:00:00