使用GO語言在NEO私有鏈發行NEP-5 Token的開發指南 轉

Gopher and NEO

本文是一篇關於使用Go語言設置NEO智能合約和NEO DApps開發環境的教程。 如果您還不瞭解NEO,智能合約和DApps是什麼,您可以參考以下資料:

What is NEO, and what is GAS? — blockknight NEO Smart Contract Introduction What is NEO DApps?

補充材料:

NEO Smart Economy — NEO DApps NEO For Beginners — NEO News Today — NEOFANS Awesome NEO

介紹

開發語言

在NEO智能合約開發平臺進行開發的優勢之一是平臺支持各種開發語言。

NEO推薦使用C#語言,不過它也支持使用Python, Java, Go, Ruby,之後還會進一步支持Kotlin, C/C++, JavaScript等開發語言。.

儘管支持多種語言,但我們仍可以發現現有的很多項目使用的是C#、Python、Java,使用GO語言的並不多。因此,參考City of Zion (CoZ)上的資料,我想嘗試寫一篇關於使用GO語言開發的簡單教程,希望能吸引更多使用GO語言的開發人員參與開發。

給GO開發人員的建議

無論你是編程新手還是經驗豐富的開發人員,剛開始時都建議你在私有域或測試網上進行開發。

爲什麼?

因爲在主網上部署NEP-5 Token需要消耗490個GAS。

寫這篇文章的時候(2018年9月15日),GAS的市場價格是5.8美元,那麼該筆費用就高達2842美元。對於任何創業公司而言,這都是一筆不小的費用。

按照GAS的歷史最高價,每個Token的價格爲95.87美元,那麼僅僅部署一次智能合約,你的成本就要增加4,7000美元。

因此,剛開始開發的時候,建議你在私有域或者測試網上操作,當你準備好之後,再轉到主網上部署合約。

要求

本教程中,開發環境的需求如下所示:

操作系統 – 桌面版Ubuntu Desktop 18.04.1 LTS Git 命令行接口 –Git 語言 – GO語言 Go語言依賴管理工具 – Dep Docker –Docker CE 和 Docker Compose 編輯器 – Visual Studio Code, Extension: Go

使用到的NEO的資料

GO語言智能合約框架 – neo-storm 預建好的使用Python語言編寫的neo-privnet-with-gas以及nep-scan鏡像 –  neo-scan-docker 重要提示:結果可能因NEO編譯器和節點版本不同而有差異。

本質上來說,有幾種方法可以運行私有域,例如使用 neo-go 或者 neo-privatenet-docker。 但是,在本教程中,我們會使用slipo編寫的 neo-scan-docker。 neo-scan-docker是用neo-python構建的,所以它帶有一些“Python”組件。 此外,它還帶有neo-scan的UI,允許您分析智能合約的部署事務。

*安裝方法可能因操作系統而異。 相關的詳細信息,請點擊上面的鏈接查看。

配置你的環境

首先,我們先用 neo-scan-docker來配置一下NEO私有域。

  1. 檢查一下Git, Docker and Docker Compose這些工具是否已經準備好。 richie[@Redbuntu](https://my.oschina.net/u/173150):~/Desktop$ sudo git --version git version 2.17.1 richie[@Redbuntu](https://my.oschina.net/u/173150):~/Desktop$ sudo docker -v Docker version 18.06.1-ce, build e68fc7a richie[@Redbuntu](https://my.oschina.net/u/173150):~/Desktop$ sudo docker-compose -v docker-compose version 1.22.0, build f46880fe

  2. 克隆(Clone) slipo的 neo-scan-docker倉庫代碼,並使用 docker-compose來加載Docker鏡像。 下載鏡像可能需要點時間,請耐心等待done狀態的出現。 richie[@Redbuntu](https://my.oschina.net/u/173150):~/Desktop$ git clone https://github.com/slipo/neo-scan-docker.git Cloning into 'neo-scan-docker'... remote: Counting objects: 27, done. remote: Total 27 (delta 0), reused 0 (delta 0), pack-reused 27 Unpacking objects: 100% (27/27), done. richie[@Redbuntu](https://my.oschina.net/u/173150):~/Desktop$ cd neo-scan-docker/ richie@Redbuntu:~/Desktop/neo-scan-docker$ sudo docker-compose up Starting neo-scan-docker_postgresql_1 ... done Starting neo-privnet ... done Starting neo-scan ... done Attaching to neo-scan-docker_postgresql_1, neo-privnet, neo-scan

  3. 在你的主機文件中,添加127.0.0.1 neo-privnet。注意:主機文件的位置可能因操作系統而異。 Unix/Linux/macOS - /etc/hosts

  4. 在瀏覽器中輸入http://127.0.0.1:4000/,可以看到City of Zion 提供的neo-scan網頁界面。

  5. 點擊錢包地址(Wallet Addresses),你可以看到預存有NEO和GAS的錢包地址。部署智能合約的時候我們需要使用到這些Token。更多信息,可以查看 neo-privatenet 。

導入WIF密鑰可以獲取預存有NEO和GAS的錢包的密鑰。 私鑰/WIF 密鑰 KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr 地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y 腳本哈希值 (用於檢查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9'

這樣你的NEO私有域和neo-scan就已經配置好了。

下一步,配置neo-storm。

1在終端中輸入下面這幾條命令, go version、dep version以及echo $GOPATH,確認一下Go, Dep, GOPATH都已經準備好。

richie@Redbuntu:~$ go version go version go1.10.1 linux/amd64 richie@Redbuntu:~$ dep version dep: version : devel build date : git hash : go version : go1.8.3 go compiler : gc platform : linux/amd64 richie@Redbuntu:~$ echo $GOPATH /home/richie/go

2輸入 go get命令獲取neo-storm,輸入dep命令檢查依賴包,使用make install命令進行安裝。 *忽略警告信息

richie@Redbuntu:~$ go get -u github.com/CityOfZion/neo-storm package github.com/CityOfZion/neo-storm: no Go files in /home/richie/go/src/github.com/CityOfZion/neo-storm richie@Redbuntu:~$ cd $GOPATH/src/github.com/CityOfZion/neo-storm richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo dep ensure -update dep: WARNING: Unknown field in manifest: prune richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ sudo make install installing project dependencies dep: WARNING: Unknown field in manifest: prune installing neo-storm framework done installing, happy coding!

3現在neo-storm已經安裝好了,你可以測試一下。

`richie@Redbuntu:~/go/src/github.com/CityOfZion/neo-storm$ neo-storm

NAME: neo-storm - Neo smart contract framework for the Go programming language

USAGE: neo-storm [global options] command[command options][arguments...]

VERSION: 0.0.0

COMMANDS: compile compile a smart contract to an .avm file testinvoke testinvoke a smart contract against a remote NEO RPC node init initialize a new smart-contract in a directory with boiler plate code help, h Shows a list of commands or help for one command

GLOBAL OPTIONS: --help, -h show help --version, -v print the version`

4“安裝完成,開心編碼” ——接下來開始我們的第一個智能合約吧。

richie@Redbuntu:~/Desktop$ cd ~/Desktop richie@Redbuntu:~/Desktop$ neo-storm init -n NeoStormTest Successfully initialized smart contract [NeoStormTest] richie@Redbuntu:~/Desktop$ cd NeoStormTest/ richie@Redbuntu:~/Desktop/NeoStormTest$ ls main.go richie@Redbuntu:~/Desktop/NeoStormTest$ cat main.go package NeoStormTest import "github.com/CityOfZion/neo-storm/interop/runtime" func Main(op string, args []interface{}) { runtime.Notify("Hello world!")

發行NEP-5通證合約

1要在NEO上發行NEP-5通證,我們必須遵守它的通證標準。 *改進的NEP5可以在Github上查看,它允許Token上線NEX交易所。

`NEP-5 Token Standard

Methods -totalSupply() -name() -symbol() -decimals() -balanceOf(account) -transfer(from, to, amount)

Events -transfer(from, to, amount)

NEP-5(.1) by NEX Methods -totalSupply() -name() -symbol() -decimals() -balanceOf(ctx, account) -transfer(ctx, from, to, amount, callingScriptHash) -transferFrom(ctx, from, to, amount) -approve(ctx, owner, spender, amount, callingScriptHash) -allowance(ctx, owner, spender)`

2不用重新編寫一個Token合約,你可以fork/clone我的github倉庫。

richie@Redbuntu:~/Desktop$ git clone https://github.com/maplerichie/neo-go-nep5 MyFirstNeoGoContract

3啓動代碼編輯器(我用的是Visual Studio Code),將~/Desktop/MyFirstNeoGoContract 添加到你的工作區(workspace)。Neo-storm的examples文件夾裏也有例子,可以點擊https://github.com/CityOfZion/neo-storm/tree/master/examples/token查看。

4編輯package,修改NEP-5的屬性值,例如decimals, multiplier, owner Address, Name, Symbol, TotalSupply。

Package:應該將package修改爲 package MyFirstNeoGoContract ,從而與文件夾名稱保持一致。

Decimals:用來設置Token使用的小數位數或者Token可被分割的最小單位。

例如:NEO的小數點位數是0,意味着它是不可分的Token。因此不能轉賬或者接收小數個NEO,只能是整數個。小數只能在交易所使用,因爲它們創建了自己的十進制系統來方便交易。

Multiplier:這給出了Decimals和TotalSupply相乘時的值。 輸入格式爲10 ^ Decimals。

例如: decimals = 6時,multiplier的值應該是10^6,即multiplier = 1000000。

Owner: Token發行者的地址。這裏我們使用neo-privetenet的地址AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y。

Name: 字符串格式的NEP-5Token的名稱。

Symbol: NEP-5Token符號,通常是3個字符的長度,但不是必須的。

TotalSupply: 總發行量。設置一個總發行量可以防止通脹。

5修改參數同時確保符合NEP-5Token標準。然後使用neo-storm來編譯GO智能合約。

richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ neo-storm compile -i main.go -o main.avm

6當前目錄下你可以看到 main.avm文件。現在neo-storm不會運行檢查NEP-5Token標準。我的經驗是缺少owner Address信息時,會顯示錯誤信息。

7現在講NEP-5合約部署到Privatenet Docker。這麼做之前我們需要先獲取Privatenet Docker ID值,然後在主機上覆制main.avm文件並粘貼進Privatenet Docker鏡像中,然後將它附加到運行的Docker中。

`richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES

69c60667835b slipoh/neo-scan "/bin/sh -c 'sleep 3…" 6 hours ago Up About a minute 0.0.0.0:4000->4000/tcp
neo-scan

88b358cdd8ff
cityofzion/neo-privatenet
"/bin/bash /opt/run.…"
6 hours ago Up About a minute
0.0.0.0:20333-20336->20333-20336/tcp, 0.0.0.0:30333-30336->30333-30336/tcp
neo-privnet

ab96dc398c62 postgres:10.1
"docker-entrypoint.s…"
6 hours ago Up About a minute 0.0.0.0:5432->5432/tcp
neo-scan-docker_postgresql_1

richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm 88b358cdd8ff:/neo-python

richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it 88b358cdd8ff /bin/bash`

*共識節點運行在在screen sessions,使用’screen -ls’命令查看

*neo-python安裝在/neo-python目錄下,目錄下帶有a neo-privnet.wallet文件

*有問題可報告給:https://github.com/CityOfZion/neo-privatenet-docker

8在Docker上,打開neo-python-cli終端並使用密碼coz解鎖錢包。

root@88b358cdd8ff:/neo-python# neopy Privatenet useragent '/NEO:2.7.6/', nonce: 513759764 [I 180914 10:34:09 LevelDBBlockchain:114] Created Blockchain DB at /root/.neopython/Chains/privnet [I 180914 10:34:09 NotificationDB:73] Created Notification DB At /root/.neopython/Chains/privnet_notif NEO cli. Type 'help' to get started neo> open wallet neo-privnet.wallet [password]> *** Opened wallet at neo-privnet.wallet

9部署合約main.avm前,使用neo-scan看一看錢包餘額。

`neo> wallet [I 180914 11:01:22 UserWallet:538] Script hash b'#\xba'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' <class 'bytes'> Used 0.357 Gas Used 0.357 Gas Wallet { "path": "neo-privnet.wallet", "addresses": [ { "version": 0, "script_hash": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y", "frozen": false, "votes": [], "balances": {

"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b": "100000000.0",

"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7": "74589.9996" }, "is_watch_only": false, "tokens": [ "[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 : 2500000.00000000" ] } ], "height": 10294, "percent_synced": 100, "synced_balances": [ "[NEO]: 100000000.0 ", "[NEOGas]: 74589.9996 ", "[NXT2]: 2500000 " ], "public_keys": [ { "Address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y", "Public Key": "031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a" } ], "tokens": [ { "name": "NEX Template V2", "symbol": "NXT2", "decimals": 8, "script_hash": "0xa3640dd3c560c75528e5f861da5da98958d0d713", "contract_address": "AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b" } ], "claims": { "available": "0.0", "unavailable": "7730.0" } }`

10看來可以開始部署了。再次提醒,錢包密碼是coz。

`neo> import contract main.avm 0710 05 True False contract properties: 1 Please fill out the following contract details: [Contract Name] > MyFirstNEOToken [Contract Version] > 1.0 [Contract Author] > Richie [Contract Email] > [email protected] [Contract Description] > First NEO Token Creating smart contract.... Name: MyFirstNEOToken Version: 1.0 Author: Richie Email: [email protected] Description: First NEO Token Needs Storage: True Needs Dynamic Invoke: False { "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862", "script": "...", "parameters": "0710", "returntype": "05" } Used 500.0 Gas

Test deploy invoke successful Total operations executed: 11 Results: [<neo.Core.State.ContractState.ContractState object at 0x7f79b510d278>] Deploy Invoke TX GAS cost: 490.0 Deploy Invoke TX Fee: 0.0

Enter your password to continue and deploy this contract [password]> *** [I 180914 11:03:33 Transaction:613] Verifying transaction: b'9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114' Relayed Tx: 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114`

11使用給定的哈希值驗證交易。 注意:不同機器的哈希值是不一樣的。

neo> tx 9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114 { "txid": "0x9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114", "type": "InvocationTransaction", "version": 1, "attributes": [], "vout": [ { "n": 0, "asset": "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7", "value": "25493.9997", "address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y" } ], "vin": [ { "txid": "475a091ccaa6330320a29884f5f8796a260bdba91352dd409d16787b37d8be26", "vout": 0 } ], "sys_fee": "4.9e-06", "net_fee": "489.9999951", "scripts": [ { "invocation": "40510fa6630ef581108057ebe967cd306522466a32eaf068cf3717da1e640b866246c013033e3c878ebf9247a5a3500178b21b126b3af63ed07a86b0d2c4f34c89", "verification": "21031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4aac" } ], "script": "...", "gas": 49000000000, "height": 10302, "unspents": [ { "n": 0, "asset": "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7", "value": "25493.9997", "address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y" } ] }

12交易顯示後,再次查看錢包餘額。 在步驟9,我們的GAS餘額爲74589.9996,現在,GAS餘額變爲74099.9996。 因爲這減少的490個 GAS已用於合約部署!

`neo> wallet [I 180914 11:18:38 UserWallet:538] Script hash b'#\xba'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' <class 'bytes'> Used 0.357 Gas Used 0.357 Gas Wallet { "path": "neo-privnet.wallet", "addresses": [ { "version": 0, "script_hash": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y", "frozen": false, "votes": [], "balances": {

"0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b": "100000000.0",

"0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7": "74099.9995" }, "is_watch_only": false, "tokens": [

"[a3640dd3c560c75528e5f861da5da98958d0d713] NXT2 : 2500000.00000000" ] } ], "height": 10348, "percent_synced": 100, "synced_balances": [ "[NEO]: 100000000.0 ", "[NEOGas]: 48605.9999 ", "[NXT2]: 2500000 " ], "public_keys": [ { "Address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y", "Public Key": "031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a" } ], "tokens": [ { "name": "NEX Template V2", "symbol": "NXT2", "decimals": 8, "script_hash": "0xa3640dd3c560c75528e5f861da5da98958d0d713", "contract_address": "AHao29nmHmJ82Fsj1qDgqtDc2rtQ8u2n2b" } ], "claims": { "available": "0.0", "unavailable": "8652.0" } }`

我們也可以看一看部署好的合約。

neo> contract search My Found 1 results for My { "version": 0, "code": { "hash": "0x4e9b87c96158a8e2cc4b74794f727b38947e9862", "script": "...", "parameters": "0710", "returntype": 5 }, "name": "MyFirstNEOToken", "code_version": "1.0", "author": "Richie", "email": "[email protected]", "description": "First NEO Token", "properties": { "storage": true, "dynamic_invoke": false } }

13最後,我們可以嘗試使用錢包的密碼coz,來調用這個帶有合約哈希值的Token。

neo> testinvoke 0x4e9b87c96158a8e2cc4b74794f727b38947e9862 deploy []

好了,現在你已經在NEO的私有域上成功的發行了NEP-5Token。

最後

希望對於Gophers來說,能很輕鬆地照着本教程學習。也希望GO開發人員能加入 NEO’s Discord,一起開發學習。你一定要試一試!

如果您真的需要我的幫助,請在Discord上聯繫我(LikKee.Richie#5647)

作者:Richie Chong,馬來西亞人,NEOMY Community 社區成員 校對者:Aaron Hong,馬來西亞人

翻譯:包子

原文鏈接:https://medium.com/coinmonks/neo-token-contract-nep-5-in-go-f6b0102c59ee


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章