本文是一篇关于使用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...。
四、 编辑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