风险提示:理性看待区块链,提高风险意识!
使用Go语言进行NEO智能合约及DApps开发教程
首页 > 币界资讯 > 区块链知识 2019-06-18 23:23:08
币界网报道:

本文是一篇关于使用Go语言设置NEO智能合约和NEODApps开发环境的教程。 如果您还不了解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 ofZion (CoZ)上的资料,我想尝试写一篇关于使用GO语言开发的简单教程,希望能吸引更多使用GO语言的开发人员参与开发。

GO开发人员的建议

无论你是编程新手还是经验丰富的开发人员,刚开始时都建议你在私有域或测试网上进行开发。

为什么?

因为在主网上部署NEP-5 Token需要消耗490个GAS。

写这篇文章的时候(2018年9月15日),GAS的市场价格是5.8美元,那么该笔费用就高达2842美元。对于任何创业公司而言,这都是一笔不小的费用。

按照GAS的历史最高价,每个Token的价格为95.87美元,那么仅仅部署一次智能合约,你的成本就要增加4,7000美元。

因此,刚开始开发的时候,建议你在私有域或者测试网上操作,当你准备好之后,再转到主网上部署合约。

要求

本教程中,开发环境的需求如下所示:

  1. 操作系统 – 桌面版Ubuntu Desktop 18.04.1 LTS

  2. Git 命令行接口 –Git

  3. 语言 – GO语言

  4. Go语言依赖管理工具 – Dep

  5. Docker –Docker CE 和 Docker Compose

  6. 编辑器 – Visual Studio CodeExtension: Go

使用到的NEO的资料

  1. GO语言智能合约框架 – neo-storm

  2. 预建好的使用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:~/Desktop$ sudo git --versiongit version 2.17.1richie@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

2. 克隆(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

3. 在你的主机文件中,添加127.0.0.1 neo-privnet。注意:主机文件的位置可能因操作系统而异。

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

4. 在浏览器中输入http://127.0.0.1:4000/,可以看到City of Zion (CoZ)提供的neo-scan网页界面。


5. 点击钱包地址(Wallet Addresses),你可以看到预存有NEO和GAS的钱包地址。部署智能合约的时候我们需要使用到这些Token。更多信息,可以查看 neo-privatenet 

导入WIF密钥可以获取预存有NEO和GAS的钱包的密钥。
私钥/WIF 密钥
KxDgvEKzgSBPPfuVfw67oPQBSjidEiqTHURKSDL1R7yGaGYAeYnr
地址: AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y
脚本哈希值 (用于检查): b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc239\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 -ugithub.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 contractframework 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查看。

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

4. 编辑package,修改NEP-5的属性值,例如decimals, multiplier, owner Address, Name, Symbol,TotalSupply。

Package:应该将package修改为 packageMyFirstNeoGoContract ,从而与文件夹名称保持一致。

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-stormcompile -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$ sudodocker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                                                       NAMES
69c60667835b        slipoh/neo-scan             "/bin/sh -c 'sleep3…"   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 aminute  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 aminute   0.0.0.0:5432->5432/tcp                                                      neo-scan-docker_postgresql_1
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker cp main.avm88b358cdd8ff:/neo-python
richie@Redbuntu:~/Desktop/MyFirstNeoGoContract$ sudo docker exec -it88b358cdd8ff /bin/bash

*共识节点运行在在screen sessions,使用’screen -ls’命令查看

*neo-python安装在/neo-python目录下,目录下带有aneo-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 hashb'#\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": "NEXTemplate 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: 1Please fill out the following contract details:[Contract Name] > MyFirstNEOToken[Contract Version] > 1.0[Contract Author] > Richie[Contract Email] > [email protected][Contract Description] > First NEO TokenCreating 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> tx9d63e8977edb6448b7d9efa93e0ff0258324ab3b530d3848def4b29dd6569114{    "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 hashb'#\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": "NEXTemplate 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> testinvoke0x4e9b87c96158a8e2cc4b74794f727b38947e9862 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

上一篇: Linux下搭建NEO私有链的教程
下一篇: 在NEO区块链中部署NEP-5智能合约 (第1部分)
推荐专栏
Boss Wallet Web3 Econom Pass
专注币圈最新资讯
通俗浅显地聊透Web3大事小情
读懂区块链生态与未来,尽在币界网!
热门币种
更多
币种
美元价格
24H涨跌幅
BTC比特币
60,963.61 USDT
¥435,103.38
-2.72%
ETH以太坊
3,368.69 USDT
¥24,042.67
-0.3%
BNB币安币
570.68 USDT
¥4,073.00
-0.28%
USDT泰达币
1.02 USDT
¥7.25
-0.19%
SOL
135.96 USDT
¥970.36
+7.66%
USDC
1.00 USDT
¥7.15
-0.01%
TON
7.59 USDT
¥54.14
+4.55%
XRP瑞波币
0.47720 USDT
¥3.41
+0.48%
DOGE狗狗币
0.12210 USDT
¥0.87140
+2.43%
ADA艾达币
0.39050 USDT
¥2.79
+3.88%
热搜币种
更多
币种
美元价格
24H涨跌幅
比特币
61102.32 USDT
¥443,902.24
-1.28%
Solana
137.3 USDT
¥997.47
-0.56%
Filecoin
4.3497 USDT
¥31.60
-1.89%
Curve
0.2964 USDT
¥2.15
-6.5%
柚子
0.5735 USDT
¥4.17
+0.1%
Terra Classic
8.158E-5 USDT
¥0.00
-1.75%
Shiba Inu
1.722E-5 USDT
¥0.00
-3.26%
Conflux
0.156 USDT
¥1.13
-1.27%
狗狗币
0.1225 USDT
¥0.89
-3.47%
dYdX
1.379 USDT
¥10.02
-0.74%
Arweave
25.8273 USDT
¥187.63
-10.11%
以太坊
3383.95 USDT
¥24,584.06
-0.19%
最新快讯
更多
新SwellrswETH池已上线Penpie
2024-06-27 11:34:46
Custodia要求上诉法院指示地区法院撤销对Custodia主账户的拒绝
2024-06-27 11:26:52
Custodia寻求法官撤回授权美联储拒绝其主账户申请的决定
2024-06-27 11:26:52
XT即将上线新一期鲨鱼鳍理财
2024-06-27 11:26:33
WEEX唯客将于7月1日开启第二期Launchpool,投入WXT瓜分37,000ZK
2024-06-27 11:25:57
币界网实时价格午报:PEPE站上0.000012722美元/枚,涨幅达3.03%
2024-06-27 11:23:47
数字资产银行Custodia寻求法官撤回授权美联储拒绝其主账户申请的决定
2024-06-27 11:22:40
下载币界网APP