摘要:編譯器介紹編譯器可將文件編譯為格式,在虛擬機中運行。編譯器支持語言子集語言子集與的關系類似于蟒蛇與蟒屬的關系。
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
安裝 使用pippipinstallneo-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
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]復制代碼
113 NOP [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..q_1[ ] [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復制代碼
5 LOAD_CONST "Main..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 ()復制代碼
9 LOAD_CONST 3 ("Main..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-projec...。
可通過以下步驟進行編譯
>>> 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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42799.html
摘要:在社區開發的一些最新工具集的幫助下,出現了四步流程法,從而進一步加快了開發效率。兩步流程法傳統上來說,智能合約開發有兩步開發流程編碼和測試。四步工作流程法開發智能合約對于編輯和調試階段,我建議使用兩種方法和。 摘要:開發NEO智能合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測試(在測試網上部署、調用、檢查結果)。這個工作流需要編譯和部署來調試任...
摘要:在社區開發的一些最新工具集的幫助下,出現了四步流程法,從而進一步加快了開發效率。兩步流程法傳統上來說,智能合約開發有兩步開發流程編碼和測試。四步工作流程法開發智能合約對于編輯和調試階段,我建議使用兩種方法和。 摘要:開發NEO智能合約的典型開發流程有兩個實際階段:編碼(在IDE中編碼并將源碼編譯為.avm文件)以及測試(在測試網上部署、調用、檢查結果)。這個工作流需要編譯和部署來調試任...
摘要:下面,讓我們進入本次的之旅項目展示由于流浪地球的大熱以及筆者對此的欣賞,因此,此次的項目為分析中國電影票房排行。在中國電影票房排行榜的前名中,吳京主演了戰狼與流浪地球,且兩者沒有其他更多的相同主演。 什么是Neo4j? showImg(https://segmentfault.com/img/remote/1460000018262759); ??Neo4j是一個高性能的NoSQL圖形...
閱讀 2596·2023-04-25 15:07
閱讀 705·2021-11-24 10:21
閱讀 2298·2021-09-22 10:02
閱讀 3517·2019-08-30 15:43
閱讀 3222·2019-08-30 13:03
閱讀 2287·2019-08-29 17:18
閱讀 3586·2019-08-29 17:07
閱讀 1873·2019-08-29 12:27