利用Python在本地開發Neo智慧合約

NEO技術飯發表於2019-02-16

在本教程中,我們將使用neo-local專案為本地開發和測試Neo智慧合約設定私有鏈。 使用私有鏈可以使我們能夠完全控制我們的環境,使我們能夠獨立工作而不用與外部測試網路打交道。

為了更好地理解文件的內容,你需要使用類Unix的終端和某種文字編輯器。 本文我將在虛擬機器中操作,並使用nano進行文字編輯:

  • Ubuntu 18.04(最小安裝)
  • 4GB RAM
  • 50GB磁碟

請注意,你可能需要至少20GB的磁碟空間來儲存你的私有鏈。

Docker,Docker Compose和neo-local

Neo-local專案需要執行在Docker上,因此首先要做的事情就是安裝好Docker。 Docker是一個容器引擎,可以執行預先配置的設定,這正是neo-local使用它的原因。我們將使用Docker 社群版(Docker CE)。

安裝Docker

你可以在Docker文件中找到所選作業系統的詳細安裝說明。以下是幾種常見作業系統的安裝文件連結:

  • Windows
  • MacOS
  • Ubuntu (Linux的安裝後步驟-也看看這些內容遵循這些)

安裝Docker 元件

我們還需要Docker 元件。對於Windows和MacOS系統,它應該已經包含在上一步安裝的軟體包中了。 Linux使用者需要按照文件的元件安裝部分進行操作。確保已經按照指南中的說明檢視了GitHub版本頁面,保證下載的是最新的版本- 不要只是複製/貼上命令而不檢查。

測試Docker

就像快速測試一樣,你現在應該能夠執行下面的這些命令(以’$’開頭的行)並檢視相應的輸出:

$ 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容器。 請注意,如果你收到某種“拒絕許可權”錯誤,則可能需要重新啟動計算機:

$ docker run hello-world

設定neo-local

最後,我們需要通過克隆倉庫程式碼並安裝預配置的錢包檔案來設定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-local堆疊

在不同的作業系統之間啟動堆疊的方法略有不同。 這兩組命令都會讓你進入neo-python命令列介面(CLI)。

Windows (wiki)

$ docker-compose up -d --build --remove-orphans
$ docker exec -it neo-python np-prompt -p -v

MacOs (wiki) 和 Linux (wiki)

安裝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文件仍是相當的分散。 不過以下這些網站提供了關於智慧合約開發的很好的資料資訊:

  • neo-python docs (智慧合約部分)
  • Neo Docs (智慧合約部分)

此外,neon-js可用於與JavaScript環境中的智慧合約進行互動。

翻譯:包子

NEOFANS:neofans.org
NEOFANS 微博:https://www.weibo.com/neofans…
NEOFANS telegram群:https://t.me/NEOfansCN

相關文章