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

圖片描述

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

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

補充材料:linux

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

**github

介紹

**
開發語言sql

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

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

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

給GO開發人員的建議bash

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

爲何?

由於在主網上部署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私有域。

一、 檢查一下Git, Docker and Docker Compose這些工具是否已經準備好。

richie@Redbuntu:~/Desktop$ sudo git --version
git version 2.17.1
richie@Redbuntu:~/Desktop$ sudo docker -v
Docker version 18.06.1-ce, build e68fc7a
richie@Redbuntu:~/Desktop$ sudo docker-compose -v
docker-compose version 1.22.0, build f46880fe

二、 克隆(Clone) slipo的 neo-scan-docker倉庫代碼,並使用 docker-compose來加載Docker鏡像。 下載鏡像可能須要點時間,請耐心等待done狀態的出現。

richie@Redbuntu:~/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:~/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

三、在你的主機文件中,添加127.0.0.1 neo-privnet。注意:主機文件的位置可能因操做系統而異。

Unix/Linux/macOS - /etc/hosts
Windows          - C:\Windows\System32\Drivers\etc\hosts

四、在瀏覽器中輸入http://127.0.0.1:4000/,能夠看到City of Zion (CoZ)提供的neo-scan網頁界面。

圖片描述

五、點擊錢包地址(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。

一、在終端中輸入下面這幾條命令, 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

二、 輸入 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!

三、 如今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

四、 「安裝完成,開心編碼」 ——接下來開始咱們的第一個智能合約吧。

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通證合約

一、要在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)

二、 不用從新編寫一個Token合約,你能夠fork/clone個人github倉庫。

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

三、 啓動代碼編輯器(我用的是Visual Studio Code),將~/Desktop/MyFirstNeoGoContract 添加到你的工做區(workspace)。Neo-storm的examples文件夾裏也有例子,能夠點擊https://github.com/CityOfZion...

https://github.com/maplerichie/neo-go-nep5

四、 編輯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: 總髮行量。設置一個總髮行量能夠防止通脹。

圖片描述

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

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

六、 當前目錄下你能夠看到 main.avm文件。如今neo-storm不會運行檢查NEP-5Token標準。個人經驗是缺乏owner Address信息時,會顯示錯誤信息。

七、 如今講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...

八、在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

九、 部署合約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"
    }
}

十、 看來能夠開始部署了。再次提醒,錢包密碼是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] > babierichie@hotmail.com
[Contract Description] > First NEO Token
Creating smart contract....
                 Name: MyFirstNEOToken 
              Version: 1.0
               Author: Richie 
                Email: babierichie@hotmail.com 
          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

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

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"
        }
    ]
}

十二、 交易顯示後,再次查看錢包餘額。 在步驟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": "babierichie@hotmail.com",
    "description": "First NEO Token",
    "properties": {
        "storage": true,
        "dynamic_invoke": false
    }
}

1三、最後,咱們能夠嘗試使用錢包的密碼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/...


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

相關文章
相關標籤/搜索