在本教程中,咱們將使用neo-local項目爲本地開發和測試Neo智能合約設置私有鏈。 使用私有鏈可使咱們可以徹底控制咱們的環境,使咱們可以獨立工做而不用與外部測試網絡打交道。python
爲了更好地理解文檔的內容,你須要使用類Unix的終端和某種文本編輯器。 本文我將在虛擬機中操做,並使用nano進行文本編輯:git
請注意,你可能須要至少20GB的磁盤空間來存儲你的私有鏈。github
Neo-local項目須要運行在Docker上,所以首先要作的事情就是安裝好Docker。 Docker是一個容器引擎,能夠運行預先配置的設置,這正是neo-local使用它的緣由。咱們將使用Docker 社區版(Docker CE)。docker
你能夠在Docker文檔中找到所選操做系統的詳細安裝說明。如下是幾種常見操做系統的安裝文檔連接:網絡
咱們還須要Docker 組件。對於Windows和MacOS系統,它應該已經包含在上一步安裝的軟件包中了。 Linux用戶須要按照文檔的組件安裝部分進行操做。確保已經按照指南中的說明查看了GitHub版本頁面,保證下載的是最新的版本- 不要只是複製/粘貼命令而不檢查。編輯器
就像快速測試同樣,你如今應該可以運行下面的這些命令(以’$’開頭的行)並查看相應的輸出:測試
$ docker --version Docker version 18.06.0-ce, build 0ffa825 $ docker-compose --version docker-compose version 1.22.0, build f46880fe
你的版本號可能與個人版本號不徹底匹配,只要保證運行的是最新版本,就能夠了。網站
若是安裝後的步驟有效,Linux用戶也應該可以在沒有sudo權限的狀況下運行’hello-world’ docker容器。 請注意,若是你收到某種「拒絕權限」錯誤,則可能須要從新啓動計算機:ui
$ docker run hello-world
最後,咱們須要經過克隆倉庫代碼並安裝預配置的錢包文件來設置neo-local,以便咱們能夠在咱們的私人網絡上使用GAS。操作系統
在終端中,導航到與NEO存儲相關的文件目錄下,而後克隆倉庫。 對於那些不熟悉git的人來講,這個操做將建立一個名爲「neo-local」的目錄,裏面包含有咱們須要的文件。 導航到neo-local目錄。
$ git clone https://github.com/CityOfZion/neo-local.git $ cd neo-local
這裏的大多數文件都與neo-local項目自己有關,咱們不用對它們進行任何修改。 咱們只會在設置過程當中處理wallets/目錄。 一旦咱們啓動並運行,咱們的大多數文件都將保存在smart-contracts /目錄中。
咱們將使用的錢包文件不太容易找到。 你能夠在Docker NEO私有鏈中心頁面上找到它,或者只是點擊這個連接中獲取它。 將下載好的錢包文件放在neo-local項目倉庫的wallets /目錄中。 做爲參考,這個錢包的密碼是coz。
在不一樣的操做系統之間啓動堆棧的方法略有不一樣。 這兩組命令都會讓你進入neo-python命令行界面(CLI)。
$ docker-compose up -d --build --remove-orphans $ docker exec -it neo-python np-prompt -p -v
安裝make命令,若是你還沒安裝的話:
$ sudo apt install make
啓用堆棧
$ make start
使用智能合約以前的最後一個設置步驟是打開咱們以前複製的錢包。 Docker設置在根目錄下掛載wallets /目錄,所以咱們的錢包位於/wallets/neo-privnet.wallet路徑下。 neo-python中的help命令將顯示全部可能的命令列表。 咱們正在查找的命令是open wallet {path},輸入這個命令後會提示你輸入錢包的密碼(coz)。 整個過程應該以下所示:
neo> open wallet /wallets/neo-privnet.wallet [password]> *** Opened wallet at /wallets/neo-privnet.wallet neo>
基本的智能合約
因爲neo-local堆棧使用neo-python,咱們將使用Python語言編寫一個基本的智能合約。 在smart-contracts /目錄中建立文件plus_one.py並添加如下代碼:
def Main(num): return num + 1;
如你所見,合約接受一個數字做爲輸入並返回該數字加1後的值。 就像wallets /目錄同樣,smart-contracts /也掛載在根目錄上,所以合約的路徑是/smart-contracts/plus_one.py。
Neo智能合約在NeoVM(Neo虛擬機)上運行,並且必須首先轉換爲字節碼,這相似於Java,轉爲字節碼後才能部署它們。 neo-python中的build {path}命令能夠爲咱們執行此操做,提供.py文件做爲輸入參數,而後輸出生成的.avm文件。 可是,這個文件自己並無給咱們帶來太多好處。 咱們將要從這個命令的變形build..test命令開始:
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5
在咱們獲取輸出文件以前將這個命令拆開來看看。 命令的完整簽名是:
neo> build {path/to/file.py} test {param_types} {return_type} {needs_storage} {needs_dynamic_invoke} {is_payable} [params]
文件的路徑是至關不言自明的。 可是,類型是按照 ContractParameterType頁面中的形式提供的,其中參數和返回類型均表示爲單個字節:
Type Byte
Signature 00
Signature 01
Integer 02
Hash160 03
Hash256 04
ByteArray 05
PublicKey 06
String 07
Array 10
InteropInterface F0
Void ff
在咱們的例子中,合約採用integer (整數)(02)並返回一個integer(02)。 接下來的三個參數是在合約上設置的屬性,咱們如今不會考慮這些。 最後一個參數是填寫實際調用合同的時使用的數據。 在neo-python提示符下運行此命令應輸出以下內容:
neo> build /smart-contracts/plus_one.py test 02 02 False False False 5 [I 180909 22:53:38 BuildNRun:50] Saved output to /smart-contracts/plus_one.avm [I 180909 22:53:38 Invoke:586] Used 0.021 Gas ----------------------------------------------------------- Calling /smart-contracts/plus_one.py with arguments ['5'] Test deploy invoke successful Used total of 19 operations Result [{'type': 'Integer', 'value': 6}] Invoke TX gas cost: 0.0001 ------------------------------------------------------------- neo>
第一個輸出行是確認字節碼是否已構建完成以及它所保存的位置。 輸出的其他部分描述了合約的設置和結果。 咱們用值「5」調用它,調用成功了,咱們收到返回結果是整數’6’。 看起來咱們的合約生效了!
最後,一旦咱們構建並測試了咱們的智能合約,咱們就須要將其部署到網絡中。 這其實是一個至關簡單的過程,咱們只須要使用import contract命令。
neo> import contract /smart-contracts/plus_one.avm 02 02 False False False
系統將提示你填寫一些字段,例如合同名稱和版本,做者姓名和電子郵件等。填寫完成後,將打印輸出一些有關合同的元數據信息,同時系統將提示你輸入錢包密碼。 輸入密碼後將開始部署合同並向你收取必要數量的GAS。 因爲這是一個私人網絡,你應該能夠繼續部署 – 測試錢包種有不少可使用的GAS。
部署完成後,從打印的元數據中獲取「哈希」並運行testinvoke命令(替換爲你本身的合約哈希):
testinvoke 0x2b46bfe08185fbda2cb8121d6a2fd1a1d228c586 8
你應該看到預期結果的輸出:
---------------------------------------------------------------- Test invoke successful Total operations: 19 Results [{'type': 'Integer', 'value': '9'}] Invoke TX GAS cost: 0.0 Invoke TX fee: 0.0001 ----------------------------------------------------------------
若是你收到消息提示說找不到合約,那麼你可能須要等待一兩分鐘,等你的合約能被一個區塊挖礦後才能調用它。 再次提醒,這將是一個本地調用,而且輸入你的密碼能夠在網絡上運行真實的合約,這個過程當中向你收取GAS費用。
下一步
寫這篇文章的時候,Neo文檔還是至關的分散。 不過如下這些網站提供了關於智能合約開發的很好的資料信息:
此外,neon-js可用於與JavaScript環境中的智能合約進行交互。
NEOFANS:neofans.org
NEOFANS 微博:https://www.weibo.com/neofans...
NEOFANS telegram羣:https://t.me/NEOfansCN