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__
Bitfinex公布储备证明:135个冷、热钱包地址总计持有超20万枚BTC和超122万枚ETH:11月12日消息,Bitfinex首席技术官Paolo Ardoino 在GitHub上公开了Bitfinex的储备证明,他列出了总计135个冷钱包和热钱包地址。为了免去查看地址信息的麻烦,Paolo Ardoino 重点说明了一些重要储备资产,比如204338.17967717枚比特币、1225600枚以太坊。据悉Paolo Ardoino 曾在2018年6月开放了一个名为“Antani”的开源库,其中提供了偿付能力证明、托管和链下委托投票证明,但并未引起重视。[2022/11/12 12:55:49]
#已经根据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、许可证
Diginex CEO:比特币将在2021年超过10万美元:加密货币和区块链服务公司Diginex首席执行官Richard Byworth表示,比特币价格最近突破3.5万美元,部分原因是比特币供应有限。他补充说,庞大的银行刺激计划,以及投资者寻求安全的价值储存手段以应对日益加剧的货币通胀,加速了对比特币的需求。因此,现在有很大一部分金融机构正在评估他们比特币头寸规模。随着这些参与者将比特币转移到安全的冷库中,将导致大量的交易所提款,比特币将出现供应方面的危机。Byworth表示,目前正处于牛市周期的开始,2021年将带来可能令某些人震惊的回报。在一年中的某个时候,比特币将超过10万美元,并且山寨币会跟随。(Cointelegraph)[2021/1/7 16:36:34]
·开源MIT?
·主作者为localhuman
5、boa.compiler.Compiler
下文将介绍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()
取回当前编译器对象的实例,否则创建一个实例
返回值:编译器对象的单个实例
9、staticload(path)
Cardano基金会称与BTCNEXT未合作 警告用户注意安全:7月9日,Cardano基金会警告称,一些来自加勒比海加密交易所BTCNEXT的人声称认识Cardano的核心成员,并正在试图进行投资。Cardano基金会称其或任何生态系统合作伙伴都与BTCNEXT没有任何关系,他们也不是合作伙伴。用户需确保投资安全,不要向第三方发送任何数据。(Cointelegraph)[2020/7/9]
调用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
下文将介绍Module的具体实现细则。
14、classboa.code.module.Module(path,module_name=”,is_sys_module=False,items_to_import=None)
Bitfinex CTO:比特币会成为许多金融应用程序的基础引擎:金色财经报道,Bitfinex和Tether CTO Paolo Ardoino表示,虽然闪电网络是一个设计良好的第二层,他觉得比特币仍然是一个很好的基础层。Ardoino称,他相信比特币会成为许多金融应用程序的基础引擎。但是,即使在解决了可扩展性问题的情况下,如果比特币想要成为金融应用程序的基础引擎,其波动性仍然是一个挑战。[2020/3/14]
模块是包含代码对象的顶层组件。例如,在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’
MAKE_FUNCTION0
STORE_NAMEMain
LOAD_CONSTNone
RETURN_VALUE
声音 | Altana首席信息官:有人在Bitfinex上关闭了一个10500枚BTC的空头订单:5月16日,Altana数字货币基金首席信息官Alistair Milne发推称:今天有人在Bitfinex上关闭了一个10,500枚BTC的空头订单。由于缺乏价格走势和成交量,这目前只是“声称”。多头/空头比率现在约为60:40。[2019/5/17]
对可执行项进行处理与标记化后,便会生成虚拟机标记集,虚拟机标记虽与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官方公众号
获取更多一手社区资讯
摘要:6月3日,推特用户CryptoBatman发布推特称,主要的加密货币交易所币安已发行了英镑支持的稳定币BGBP。币安CEO赵长鹏也证实了这一点并称该项目“正在测试”之中.
1900/1/1 0:00:00DoNews6月4日消息4日,支付宝方面透露,其区块链技术已经落地40余个场景中,其中长三角占比超过一半.
1900/1/1 0:00:00BCC白皮书:http://www.bcchain.net/BCC_06.04.pdf官网:http://www.bcchain.net区块浏览器:http://explorer.
1900/1/1 0:00:00金色财经比特币6月4日讯很多人以为美国证券交易委员会对加密技术的了解并不充分,但是在上周五举办的金融科技论坛上,该监管机构的表现令人惊叹.
1900/1/1 0:00:00早间醒来,BTC走势并未出现大跌趋势,反而向上突破了7900美元,完成了昨日晚间并未达到的价位,目前在7700美元震荡,走势尚在可控范围内,局势还算稳定,整体主流币都有上涨.
1900/1/1 0:00:00据TheBlockCrypto报道,中国加密矿机巨头比特大陆前CEO吴忌寒将于7月底推出新的初创公司Matrix.
1900/1/1 0:00:00