NEO Python編譯器介紹

NEOWest發表於2018-12-11

neo-boa編譯器介紹

neo-boa編譯器可將Python檔案編譯為.avm格式,在Neo虛擬機器中執行。NEO虛擬機器可在Neo區塊鏈上執行合約。

編譯器支援Python語言子集(python語言子集與python的關係類似於蟒蛇與蟒屬的關係)。

目前功能

  • 將Python語言子集編譯成.avm格式,在Neo虛擬機器上執行。
  • 適用於Python3.4與3.5

未來功能

  • 編譯更廣泛的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 works

· x = list(length=10)

· x[3] = 84

·

· # this also works

· x = [1,3,65,23]

·

· # this does NOT work

· x = [ ]

· x.append(1)

·

  • 支援列表(building slices)操作

· x = [1,2,46,56]

· y = x[1:3]

在可能的情況下,Python的某些__builtins__已經根據NEO虛擬機器的特點以自定義的方式實現

  • fromboa.code.builtins import range

·

· xrange = range(1, 30)

·

· # this also works

· fori in range(2, 21):

· i = i + 1

安裝

使用pip

pipinstallneo-boa複製程式碼

手動安裝

克隆儲存庫,進入專案目錄後建立Python3虛擬環境,並通過以下指令啟用。

python3 -mvenvvenv複製程式碼
sourcevenv/bin/activate複製程式碼

或單獨安裝Python3.5

virtualenv -p /usr/local/bin/python3.5venv複製程式碼
sourcevenv/bin/activate複製程式碼

接著,通過以下指令安裝需求

pipinstall -rrequirements.txt複製程式碼

基本用途

編譯器使用指南如下

fromboa.compiler import Compiler複製程式碼
Compiler.load_and_save('path/to/your/file.py')複製程式碼

參見

boa.compiler.Compiler
與其他模組瞭解其他高階用途。

許可證

· 開源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 Compiler

Compiler.load_and_save('path/to/your/file.py')

# return the compiler object for inspection

compiler = Compiler.load('path/to/your/file.py')

# retrieve the default module for inpection

default_module = compiler.default

# retreive the default/entry method for the smartcontract

entry_method = default_module.main

default

取回預設或“入口”模組。

返回值:預設反回值為boa.code.Module物件,異常時無返回值

staticinstance()[source]

取回當前編譯器物件的例項(如有),否則建立一個例項

返回值:編譯器物件的單個例項

staticload(path)[source]

呼叫load來載入需編譯但無需寫為.avm格式的Python檔案

引數:path--Python檔案的編譯路徑

返回值:編譯器例項

用途:通過下述程式返回編譯器物件進行檢查

fromboa.compiler import Compiler

compiler = 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——檔案寫入路徑

boa.code.module.Module

下文將介紹Module的具體實現細則。

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 Compiler

>>> module = Compiler.load('./boa/tests/src/AddTest1.py').default

>>> print(module.bp.code)

2 1 LOAD_CONST <byteplay3.Code object at 0x10cc3d6a0>

2 LOAD_CONST 'Main'

3 MAKE_FUNCTION 0

4 STORE_NAME Main

5 LOAD_CONST None

6 RETURN_VALUE

對可執行項進行處理與標記化後,便會生成虛擬機器標記集,虛擬機器標記雖與byteplay3標記相類似,但仍存在顯著區別。這些標記均包含在該模組的all_vm_tokens屬性中。

您可呼叫module.to_s()來檢視該程式,因為該程式已根據NEO虛擬機器的特點進行了標記化。

>>> module.to_s()複製程式碼
4   31  LOAD_FAST       a       [data]複製程式碼
    36  LOAD_CONST      2       [data]複製程式碼
    37  BINARY_MULTIPL          [data]複製程式碼
    38  STORE_FAST      a2      [data]複製程式碼
6   45  LOAD_FAST       b       [data]複製程式碼
    50  LOAD_CONST      1       [data]複製程式碼
    51  BINARY_ADD              [data]複製程式碼
    52  STORE_FAST      b2      [data]複製程式碼
8   59  LOAD_FAST       c       [data]複製程式碼
    64  LOAD_CONST      2       [data]複製程式碼
    65  BINARY_TRUE_DIVIDE      [data]複製程式碼
    66  STORE_FAST      c2      [data]複製程式碼
10  73  LOAD_FAST       d       [data]複製程式碼
    78  LOAD_CONST      1       [data]複製程式碼
    79  BINARY_SUBTRACT         [data]複製程式碼
    80  STORE_FAST      d2      [data]複製程式碼
13  87  243             b''     [data] 
3   90  LOAD_FAST       a2      [data]複製程式碼
    95  LOAD_FAST       b2      [data]複製程式碼
    100 BINARY_ADD              [data]複製程式碼
    101 LOAD_FAST       c2      [data]複製程式碼
    106 BINARY_ADD              [data]複製程式碼
    107 LOAD_FAST       d2      [data]複製程式碼
    112 BINARY_ADD              [data]複製程式碼
    113 NOP                     [data]複製程式碼
    114 241                     [data]複製程式碼
    115 242                     [data]複製程式碼
    116 RETURN_VALUE            [data]
    複製程式碼

add_method(method)[source]

在模組中新增方法如下:

Parameters: method (boa.code.method.Method) ——模組中待新增的方法物件

返回值:顯示是否已新增該方法

返回值型別:布林值

build()[source]

將bp.code物件拆分成行,併合並多行,生成不同的專案。

link_methods()[source]

關聯各方法地址

main

返回該模組的預設方法

返回值:該模組的預設方法

返回值型別:boa.code.method.Method

method_by_name(method_name)[source]

在模組的methods列表中查詢方法名稱:param method_name:

待查詢的方法名稱:typemethod_name: str

返回值:方法(如有)

返回值型別:boa.code.method.Method

module_path

返回該模組的檔案路徑

返回值:模組路徑

返回值型別:str

orderered_methods

方法序列表

返回值:該模組中的方法序列表

返回值型別:列表

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) – 包含應用程式呼叫註冊功能的行集

process_import(import_item)[source]

處理該模組中的匯入語句

Parameters: import_item (boa.code.items.Import subclass) –

process_method(lineset)[source]

處理包含byteplay3程式碼物件的行集

引數:lineset (list) – 需處理與新增的行集

process_smart_contract_app_registration(lineset)[source]

在智慧合約中呼叫另一個智慧合約時處理智慧合約應用程式註冊事宜:

fromboa.blockchain.vm.Neo.App import RegisterAppCall

# register the contract

otherContract = RegisterAppCall('contract_hash','param1','param2')

# call the contract

result = otherContract(a,b )

引數:lineset (list) – 包含應用程式呼叫註冊功能的行集

split_lines()[source]

將模組中的行集拆分成可編譯的物件集

to_s()[source]

該方法的目的在於以可讀/標記化的格式列印可執行項的輸出值,樣本如下:

>>> from boa.compiler import Compiler複製程式碼
>>> module = Compiler.load('./boa/tests/src/LambdaTest.py').default複製程式碼
>>> module.write()複製程式碼
>>> module.to_s()複製程式碼
12  3   LOAD_CONST  9   [data]複製程式碼
    4   STORE_FAST  j   [data]複製程式碼
22  11  LOAD_FAST   j   [data]複製程式碼
    17  CALL_FUNCTION  Main.<locals>.q_1[<boa.code.pytoken.PyToken object at 0x10cb53c50>]                       [data] 複製程式碼
     22   20  STORE_FAST  m   [data]複製程式碼
24  27  243         b'' [data] 複製程式碼
3   30  LOAD_FAST   m   [data]複製程式碼
    35  NOP             [data]複製程式碼
    36  241             [data]複製程式碼
    37  242             [data]複製程式碼
    38  RETURN_VALUE    [data]複製程式碼
20  49  243         b'' [data] 複製程式碼
3   52  LOAD_FAST   x   [data]複製程式碼
    57  LOAD_CONST  1   [data]複製程式碼
    58  BINARY_ADD      [data]複製程式碼
    59  NOP             [data]複製程式碼
    60  241             [data]複製程式碼
    61  242             [data]複製程式碼
 62  RETURN_VALUE    [data]複製程式碼

write()[source]

將當前模組寫入位元組串

注:如果您使用的是Compiler.load('path/to/file.py'),執行module.write()呼叫後方可對模組進行檢查。

返回值:代表當前模組的位元組串

返回值型別:位元組

write_methods()[source]

將當前模組的所有方法寫入位元組串

返回值:該模組中當前存在的所有方法的位元組串

返回值型別:位元組

boa.code.method.Method

下文為Method的具體實現細則。

classboa.code.method.Method(code_object, parent, make_func_name=None)[source]

方法是主功能單元。

任何方法均可給多個自變數賦予0值,並返回1。

各方法包含的行數不同, boa.code.block.Block物件數也不同,意味著功能單元是互不相關的。

每行可被拆分為獨立的boa.code.pytoken.PyToken物件,這些物件即為Python直譯器使用的標記。

之後,每行便可形成一個區塊。一個完整的區塊生成後,將經歷一系列的處理程式,最終將轉化為可被NEO虛擬機器理解的語言。

區塊處理完畢後,我們可將其串聯在一起,併傳送給VMTokenizer。

VMTokenizer負責將PyToken物件轉化為VMToken物件。

對方法進行標記化後,各標記將在該方法內生成地址。生成完整的地址後,將呼叫convert_jumps方法來判斷需跳轉的流控制操作(地址)。

args

返回該方法中的自變數列表

返回值:該方法的自變數列表

返回值型別:列表

code

返回byteplay3程式碼物件

返回值:該方法的byteplay3程式碼物件

返回值型別:byteplay3.Code

convert_jumps()[source]

轉換流控制專案中發生的跳轉,如if、else、forloops、while loops及for breaks

firstlineno

獲取該方法的起始行號

返回值:起始行號

返回值型別:int

full_name

獲取該方法的全稱

返回值:該方法模組的名稱空間名稱

返回值型別:str

module

取回包含該方法的模組

返回值:包含該方法的模組

返回值型別:boa.code.module.Module

name

獲取該方法的名稱

返回值:該方法的名稱

返回值型別:str

print()[source]

列印該方法的byteplay3物件在python直譯器中的輸出值,並與boa.code.method.Method.to_dis()輸出值對比,您會發現兩者間微妙的區別。

輸出樣本

>>> method.print()複製程式碼
      2   STORE_FAST    j複製程式碼
      12  1 LOAD_CONST  9複製程式碼
      14  4 LOAD_CONST  <byteplay3.Code object at 0x10cb5ec88>複製程式碼
          5 LOAD_CONST  'Main.<locals>.q'複製程式碼
          6 MAKE_FUNCTION   0複製程式碼
          7 STORE_FAST      q複製程式碼
      22  9 LOAD_FAST       q複製程式碼
          10 LOAD_FAST      j複製程式碼
          11 CALL_FUNCTION  1複製程式碼
          12 STORE_FAST     m複製程式碼
      24  14 LOAD_FAST      m複製程式碼
          15 RETURN_VALUE複製程式碼

process_block_groups()[source]

獲取並處理當前區塊(類似於方法中的行),以便區塊能被適當地標記化

read_initial_tokens()[source]

從byteplay3程式碼物件中獲取初始標記集,並將其轉化為區塊

read_module_variables()[source]

獲取所有模組的global變數,並允許該方法訪問這些變數。

to_dis()[source]

列印該方法在python編譯器中的輸出值,並與boa.code.method.Method.print()的輸出值對比,您會發現兩者間微妙的區別。

>>> method.to_dis()複製程式碼
  3       STORE_FAST    0 (j)複製程式碼
 12     0 LOAD_CONST    1 (9)複製程式碼
 14     6 LOAD_CONST    2 (<code object q at 0x10cbbc810, file "./boa/tests/src/LambdaTest.py", line 14>)複製程式碼
        9 LOAD_CONST    3 ('Main.<locals>.q')複製程式碼
        12 MAKE_FUNCTION   0複製程式碼
        15 STORE_FAST      1 (q)複製程式碼
 22     18 LOAD_FAST       1 (q)複製程式碼
        21 LOAD_FAST       0 (j)複製程式碼
        24 CALL_FUNCTION   1 (1 positional, 0 keyword pair)複製程式碼
        27 STORE_FAST      2 (m)複製程式碼
 24     30 LOAD_FAST       2 (m)複製程式碼
        33 RETURN_VALUE複製程式碼

tokenize()[source]

將boa.code.pytoken.PyToken物件集轉化為boa.code.vmtoken.VMToken物件。

total_lines

獲取該方法的總行(即區塊)數

返回值:總行數

返回值型別:int

total_module_variables

獲取區域性變數總數

返回值:該模組中的變數總數

返回值型別:int

vm_tokens

返回該方法中的虛擬機器標記列表

返回值:該方法中的虛擬機器標記列表

返回值型別:列表

write()[source]

將標記器當前的狀態寫為位元組串

返回值:當前標記器的位元組串

返回值型別:位元組

Python檔案樣本

新增

本案例展示瞭如何新增數字,同時這也是一個可接受多個引數的智慧合約案例(4)。

boa.tests.src.AddTest1.Main(a, b, c, d)[source]

引數:

· a –

· b –

· c –

· d –

返回值:

列表

本案例展示瞭如何建立與操作列表

boa.tests.src.ArrayTest.Main()[source]

返回值:

boa.tests.src.ArrayTest.get_items_from_range(items, index)[source]

引數:

· items –

· index –

返回值:

boa.tests.src.ArrayTest.get_thing()[source]

返回值:

二元操作符

本案例展示瞭如何使用二元操作符

boa.tests.src.BinopTest.Main(a, b, c, d)[source]

引數:

· a –

· b –

· c –

· d –

返回值:

NEP-5代幣

本案例展示瞭如何生成NEP-5代幣。

將該檔案編譯為.avm格式後,需檢查其是否符合NEO區塊鏈上實施的的NEP-5代幣標準。

檢視代幣標準議案NEP-5代幣標準議案:https://github.com/neo-project/proposals/blob/master/nep-5.mediawiki。

可通過以下步驟進行編譯

>>> fromboa.compiler import Compiler複製程式碼
>>> Compiler.load_and_save('./boa/tests/src/NEP5Test.py')複製程式碼

下方為Python的編譯實現

boa.tests.src.NEP5Test.BalanceOf(account)[source]

某地址當前餘額數值的返回方法

引數:account (bytearray) ——需獲取餘額的賬戶地址

返回值:某地址的當前餘額

返回值型別:int

boa.tests.src.NEP5Test.CurrentSwapRate()[source]

NEO/NEP-5代幣的當前“費率”或兌換率計算方法

返回值:當前費率

返回值型別:int

boa.tests.src.NEP5Test.Decimals()[source]

NEP-5代幣小數點返回方法

返回值:NEP-5代幣的小數點

返回值型別:int

boa.tests.src.NEP5Test.Deploy()[source]

NEP-5代幣持有人將初始代幣部署至自己地址的方法

返回值:部署成功與否

返回值型別:布林值

boa.tests.src.NEP5Test.DoTransfer(t_from, t_to, amount)[source]

將一定量的NEP-5代幣從一個賬戶轉至另一個賬戶的方法

引數:

· t_from (bytearray) —— 轉出地址

· t_to (bytearray) ——轉入地址

· amount (int) ——待轉賬的NEP-5代幣量

返回值:轉賬成功與否

返回值型別:布林值

boa.tests.src.NEP5Test.Main(operation, args)[source]

此處是智慧合約的主要入口點

引數:

· operation (str) —— 待執行的操作 如

mintTokens
transfer
等)

· args (list) ——可選自變數列表

返回值:顯示智慧合約已成功執行

返回值型別:布林值

boa.tests.src.NEP5Test.MintTokens()[source]

某地址將NEO存入NEP-5代幣持有者的賬戶以換取一定量的NEP-5代幣的呼叫方法

返回值:鑄幣成功與否

返回值型別:布林值

boa.tests.src.NEP5Test.Name()[source]

NEP-5代幣名稱返回方法

返回值:代幣名稱

返回值型別:str

boa.tests.src.NEP5Test.Symbol()[source]

NEP-5代幣符號返回方法

返回值:代幣符號

返回值型別:str

boa.tests.src.NEP5Test.TotalSupply()[source]

流通中的NEP-5代幣總量數值返回方法

返回值:流通中的代幣總量

返回值型別:int

【互動操作】NEO區塊鏈

下列各操作的目的在於收集區塊鏈中包含的狀態資料。因為下列各項均是在NEO虛擬機器中實現的,因此這裡無法查詢其源。若欲瞭解具體實現方法,請參考neo-python專案。

專案地址:github.com/CityOfZion/…

區塊鏈

boa.blockchain.vm.Neo.Blockchain.GetAccount(script_hash) →boa.blockchain.vm.Neo.Account.Account[source]

引數:script_hash –

boa.blockchain.vm.Neo.Blockchain.GetAsset(asset_id) →boa.blockchain.vm.Neo.Asset.Asset[source]

引數:asset_id –

boa.blockchain.vm.Neo.Blockchain.GetBlock(height_or_hash) →boa.blockchain.vm.Neo.Block.Block[source]

引數:height_or_hash –

boa.blockchain.vm.Neo.Blockchain.GetContract(script_hash) →boa.blockchain.vm.Neo.Contract.Contract[source]

引數:script_hash –

boa.blockchain.vm.Neo.Blockchain.GetHeader(height_or_hash) →boa.blockchain.vm.Neo.Header.Header[source]

引數:height_or_hash –

boa.blockchain.vm.Neo.Blockchain.GetHeight() → int[source]

boa.blockchain.vm.Neo.Blockchain.GetTransaction(hash) →boa.blockchain.vm.Neo.Transaction.Transaction[source]

引數:hash –

boa.blockchain.vm.Neo.Blockchain.GetValidators() → [][source]

區塊頭

區塊頭物件包含了所有區塊資訊,但不包含交易資料。

boa.blockchain.vm.Neo.Header.GetConsensusData(header: boa.blockchain.vm.Neo.Header.Header) →bytearray[source]

獲取共識地址

boa.blockchain.vm.Neo.Header.GetHash(header: boa.blockchain.vm.Neo.Header.Header) →bytearray[source]

獲取區塊頭雜湊值

boa.blockchain.vm.Neo.Header.GetMerkleRoot(header: boa.blockchain.vm.Neo.Header.Header) →bytearray[source]

獲取區塊中交易資訊的默克爾根值

boa.blockchain.vm.Neo.Header.GetNextConsensus(header: boa.blockchain.vm.Neo.Header.Header) →bytearray[source]

獲取下一個共識發生的地址

boa.blockchain.vm.Neo.Header.GetPrevHash(header:boa.blockchain.vm.Neo.Header.Header) → bytearray[source]

獲取區塊鏈中上一個區塊頭的雜湊值

boa.blockchain.vm.Neo.Header.GetTimestamp(header: boa.blockchain.vm.Neo.Header.Header) →int[source]

獲取區塊頭建立時間戳

boa.blockchain.vm.Neo.Header.GetVersion(header: boa.blockchain.vm.Neo.Header.Header) →int[source]

獲取區塊頭的版本號

區塊

區塊物件包含區塊中的交易資料

boa.blockchain.vm.Neo.Block.GetTransaction(block:boa.blockchain.vm.Neo.Block.Block, index:int)→ boa.blockchain.vm.Neo.Transaction.Transaction[source]

引數:

· block——包含該交易的區塊

· index——區塊中交易的指數

boa.blockchain.vm.Neo.Block.GetTransactionCount(block: boa.blockchain.vm.Neo.Block.Block) →int[source]

返回區塊中的交易數

boa.blockchain.vm.Neo.Block.GetTransactions(block:boa.blockchain.vm.Neo.Block.Block) → list[source]

返回區塊中包含的交易列表

賬戶

賬戶物件代表區塊上的地址

boa.blockchain.vm.Neo.Account.GetBalance(account, asset_id)[source]

引數:

· account –

· asset_id –

boa.blockchain.vm.Neo.Account.GetScriptHash(account)[source]

引數:

account –

boa.blockchain.vm.Neo.Account.GetVotes(account)[source]

引數:

account –

boa.blockchain.vm.Neo.Account.SetVotes(account, votes)[source]

引數:

· account

· votes

動作

動作物件用於在區塊鏈上註冊動作/事件監聽器

boa.blockchain.vm.Neo.Action.RegisterAction(event_name, *args)[source]

引數:

· event_name –

· args –

應用程式

應用程式物件用於呼叫區塊鏈上的其他合約

boa.blockchain.vm.Neo.App.RegisterAppCall(smart_contract_hash, *args, **kwargs)[source]

引數:

· smart_contract_hash –

· args –

· kwargs –

資產

資產物件用於檢索NEO或GAS等本地資產資訊

boa.blockchain.vm.Neo.Asset.Create(asset_type, name, amount, precision, owner, admin, issuer)[source]

引數:

· asset_type –

· name –

· amount –

· precision –

· owner –

· admin –

· issuer –

boa.blockchain.vm.Neo.Asset.GetAdmin(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetAmount(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetAssetId(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetAssetType(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetAvailable(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetIssuer(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetOwner(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.GetPrecision(asset)[source]

引數:

asset –

boa.blockchain.vm.Neo.Asset.Renew(asset, years)[source]

引數:

· asset –

· years –

【互動操作】執行引擎

下列各操作的目的在於收集NEO虛擬機器當前執行狀態的參考資料。因為下列各項均是在NEO虛擬機器中實現的,因此這裡無法查詢其出處。若欲瞭解具體實現方法,請參考neo-python專案。

方法

classboa.blockchain.vm.System.ExecutionEngine.ExecutionEngine[source]

未使用

boa.blockchain.vm.System.ExecutionEngine.GetCallingScriptHash()[source]

獲取指令碼(智慧合約)的雜湊值,開始執行當前指令碼

返回值:指令碼(智慧合約)的雜湊值,開始執行當前指令碼

返回值型別:bytearray

boa.blockchain.vm.System.ExecutionEngine.GetEntryScriptHash()[source]

獲取指令碼(智慧合約)的雜湊值,開始執行智慧合約

返回值:指令碼(智慧合約)的雜湊值,開始執行智慧合約

返回值型別:bytearray

boa.blockchain.vm.System.ExecutionEngine.GetExecutingScriptHash()[source]

獲取執行中的指令碼(智慧合約)的雜湊值

· 該方法在NEO虛擬機器內部實現

返回值:執行中的指令碼(智慧合約)的雜湊值

返回值型別:bytearray

boa.blockchain.vm.System.ExecutionEngine.GetScriptContainer()[source]

返回當前執行智慧合約的Script Container,它是boa.blockchain.vm.Neo.Transaction物件

返回值:當前執行智慧合約的Script Container

返回值型別:boa.blockchain.vm.Neo.Transaction


原文出處:https://github.com/localhuman/neo-python


相關文章