NEXT社區 | 小課堂python
因爲近期NEXT社區加入不少新的小夥伴,有在校大學生,有對區塊鏈感興趣的傳統企業從業者。爲了更方便、更系統的讓NEXT社區的夥伴們瞭解NEO的技術知識,所以咱們開設了小課堂,每週3節,向你們普及NEO相關的知識要點!git
NEXT社區小課堂 | 第十三課github
NEO Python編譯器介紹(一)算法
neo-boa編譯器介紹app
neo-boa編譯器可將Python文件編譯爲.avm格式,在NEO虛擬機中運行。NEO虛擬機可在NEO區塊鏈上執行合約。區塊鏈
編譯器支持Python語言子集(Python語言子集與Python的關係相似於蟒蛇與蟒屬的關係)。ui
一、目前功能this
· 將Python語言子集編譯成.avm格式,在NEO虛擬機上運行spa
· 適用於Python3.4與3.53d
二、將來功能
· 編譯更普遍的Python語言子集
· 適用於Python3.6
三、已支持的Python功能
下文爲目前支持的Python功能一覽。詳細介紹請參見boa.tests.src目錄中的案例
四、流控制
If、Else、Elif、While、Break、Methodcalls、Lamdbas、for x in
五、用於整數運算的算數運算符與相等運算符
ADD、SUB、MUL、DIV、ABS、LSHIFT、RSHIFT、AND、OR、XOR、MODULO、INVERT、GT、GTE、LT、LTE、EQ、NOTEQ
六、使用自定義內置功能進行列表建立。注意列表一經建立,其長度便不可更改。
from boa.code.builtins import list# this worksx = list(length=10)x[3] = 84# this also worksx = [1,3,65,23]# this does NOT workx = [ ]x.append(1)# 支持列表(building slices)操做x = [12,46,56]y = x[1:3]# 在可能的狀況下,Python的某些__builtins__# 已經根據NEO虛擬機的特色以自定義的方式實現fromboa.code.builtins import rangexrange = range(1, 30)# this also worksfori in range(2, 21):i = i + 1
安裝
一、使用pip
pipinstallneo-boa
二、手動安裝
克隆存儲庫,進入項目目錄後建立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
三、基本用途
編譯器使用指南以下
fromboa.compiler import CompilerCompiler.load_and_save('path/to/your/file.py')
四、許可證
· 開源MIT
(Github地址:/CityOfZion/neo-python/blob/master/LICENSE.md)
· 主做者爲localhuman
(Github地址:https://github.com/localhuman)
五、boa.compiler.Compiler
下文將介紹Compiler的具體實現細則。
六、classboa.compiler.Compiler[source]
主編譯器接口類
經過下列程序加載python文件,編譯爲.avm格式,並與python文件存儲在一個地方。
fromboa.compiler import CompilerCompiler.load_and_save(‘path/to/your/file.py’)# return the compiler object for inspectioncompiler = Compiler.load(‘path/to/your/file.py’)# retrieve the default module for inpectiondefault_module = compiler.default# retreive the default/entry method for the smartcontractentry_method = default_module.main
七、defaule
取回默認或「入口」模塊。
返回值:默認反回值爲boa.code.Module對象,異常時無返回值
八、staticinstance()[source]
取回當前編譯器對象的實例(若有),不然建立一個實例
返回值:編譯器對象的單個實例
九、staticload(path)[source]
調用load來加載需編譯但無需寫爲.avm格式的Python文件
參數:path–Python文件的編譯路徑
返回值:編譯器實例
用途:經過下述程序返回編譯器對象進行檢查
fromboa.compiler import Compilercompiler = Compiler.load(‘path/to/your/file.py’)
十、staticload_and_save(path, output_path=None)[source]
調用load_and_save來加載需編譯爲.avm格式的Python文件,並保存結果。
默認狀況下,最終生成的.avm文件將與源文件存儲在一個地方。
參數:
· path——Python文件的編譯路徑
· output_path——已編譯的.avm文件的可選保存路徑
返回值:返回編譯器實例
用途:經過下述代碼返回編譯器對象進行檢查
fromboa.compiler import Compiler
Compiler.load_and_save(‘path/to/your/file.py’)
十一、write()[source]
返回值:已編譯的Python程序的字節串
十二、staticwrite_file(data, path)[source]
經過指定路徑將輸出數據存儲至文件系統
參數:
· data——待寫入磁盤的數據字節串
· path——文件寫入路徑
1三、boa.code.module.Module
下文將介紹Module的具體實現細則。
1四、classboa.code.module.Module(path, module_name=」, is_sys_module=False, items_to_import=None)[source]
模塊是包含代碼對象的頂層組件。例如,在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.compiler import Compilermodule = Compiler.load(‘./boa/tests/src/AddTest1.py’).defaultprint(module.bp.code)LOAD_CONST <byteplay3.Code object at 0x10cc3d6a0>LOAD_CONST ‘Main’MAKE_FUNCTION 0STORE_NAME MainLOAD_CONST NoneRETURN_VALUE
對可執行項進行處理與標記化後,便會生成虛擬機標記集,虛擬機標記雖與byteplay3標記相相似,但仍存在顯著區別。這些標記均包含在該模塊的all_vm_tokens屬性中。
您可調用module.to_s()來查看該程序,由於該程序已根據NEO虛擬機的特色進行了標記化。
>>> module.to_s()LOAD_FASTLOAD_CONSTBINARY_MULTIPLSTORE_FASTLOAD_FASTLOAD_CONSTBINARY_ADD LOAD_FASTLOAD_CONSTBINARY_TRUE_DIVIDESTORE_FASTLOAD_FASTLOAD_CONSTBINARY_SUBTRACTSTORE_FASTb''LOAD_FASTLOAD_FASTBINARY_ADDLOAD_FASTBINARY_ADDLOAD_FASTBINARY_ADDNOP
1五、add_method(method)[source]
在模塊中添加方法以下:
Parameters: method (boa.code.method.Method) ——模塊中待添加的方法對象
返回值:顯示是否已添加該方法
返回值類型:布爾值
1六、build()[source]
將bp.code對象拆分紅行,併合並多行,生成不一樣的項目。
1七、link_methods()[source]
關聯各方法地址
1八、main
返回該模塊的默認方法
返回值:該模塊的默認方法
返回值類型:boa.code.method.Method
1九、method_by_name(method_name)[source]
在模塊的methods列表中查找方法名稱:param method_name:
待查找的方法名稱:typemethod_name: str
返回值:方法(若有)
返回值類型:boa.code.method.Method
20、module_path
返回該模塊的文件路徑
返回值:模塊路徑
返回值類型:str
2一、orderered_methods
方法序列表
返回值:該模塊中的方法序列表
返回值類型:列表
2二、process_action(lineset)[source]
處理模塊中的動做,樣本以下,其目的相似於建立下列事件:
fromboa.blockchain.vm.Neo.Action import RegisterAction# Register the action.onRefund = RegisterAction(‘refund’,’to_address’,’amount’)# Dispatch an action.onRefund(my_address,100)
參數:lineset (list) – 包含應用程序調用註冊功能的行集
2三、process_import(import_item)[source]
處理該模塊中的導入語句
Parameters: import_item (boa.code.items.Import subclass) –
2四、process_method(lineset)[source]
處理包含byteplay3代碼對象的行集
參數:lineset (list) – 需處理與添加的行集
2五、process_smart_contract_app_registration(lineset)[source]
在智能合約中調用另外一個智能合約時處理智能合約應用程序註冊事宜:
fromboa.blockchain.vm.Neo.App import RegisterAppCall# register the contractotherContract = RegisterAppCall(‘contract_hash’,’param1′,’param2′)# call the contractresult = otherContract(a,b )
參數:lineset (list) – 包含應用程序調用註冊功能的行集
2六、split_lines()[source]
將模塊中的行集拆分紅可編譯的對象集
2七、to_s()[source]
該方法的目的在於以可讀/標記化的格式打印可執行項的輸出值,樣本以下:
>>> from boa.compiler import Compiler
>>> module = Compiler.load('./boa/tests/src/LambdaTest.py').default>>> module.write()>>> module.to_s()LOAD_CONSTSTORE_FASTLOAD_FASTCALL_FUNCTION Main.<locals>.q_1[<boa.code.pytoken.PyToken object at 0x10cb53c50>]STORE_FASTb''mNOP RETURN_VALUE b''LOAD_FAST xLOAD_CONSTBINARY_ADD NOP RETURN_VALUE
2八、tokenize()[source]
將boa.code.pytoken.PyToken對象集轉化爲boa.code.vmtoken.VMToken對象。
2九、total_lines
獲取該方法的總行(即區塊)數
返回值:總行數
返回值類型:int
30、total_module_variables
獲取局部變量總數
返回值:該模塊中的變量總數
返回值類型:int
3一、vm_tokens
返回該方法中的虛擬機標記列表
返回值:該方法中的虛擬機標記列表
返回值類型:列表
3二、write()[source]
將標記器當前的狀態寫爲字節串
返回值:當前標記器的字節串
返回值類型:字節
原文連接:https://github.com/localhuman/neo-python
往期精彩內容
NEXT社區小課堂 | 第五課:NEO-共識算法dBFT源碼解析
NEXT社區小課堂 | 第八課:若是往錯誤的NEO地址轉帳會發生什麼
NEXT社區小課堂 | 第十課:如何正確理解NEO平臺上的GAS(NeoGas)
聯繫咱們
微博:https://weibo.com/u/6724929880
官網:https://neonext.club/
QQ羣:612334080
電報:https://t.me/neonextop
twitter:https://twitter.com/NE0NEXT
掃碼關注NEO NEXT官方公衆號
獲取更多一手社區資訊
▼