作者:michael@比特天梯
先决条件
- 安装cleos客户端
- 安装eosio-cpp合约编译器
详见 《EOS开发客户端安装》
麒麟测试网相关信息
- 官网
https://www.cryptokylin.io/
- 代码
https://github.com/cryptokylin/CryptoKylin-Testnet
- RPC入口
https://api.kylin.alohaeos.com
https://api-kylin.eoslaomao.com
chainID: 5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191
- 浏览器
http://tools.cryptokylin.io
https://kylin.bloks.io/
https://kylin.eosq.app/
- 在线钱包
https://kylin.bloks.io/wallet
https://eostoolkit.io/
开发合约
编辑以下代码并保持为hello.cpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public contract {
public:
using contract::contract;
[[eosio::action]]
void hi( name user ) {
eosio::print( "Hello, ", name{user});
}
};
EOSIO_DISPATCH( hello, (hi));
注意:不同版本的编译器对合约的语法有些不太一样(后续讲解合约语法的时候详解)
编译合约
到合约存放目录,执行以下命令进行合约编译
$ eosio-cpp -o hello.wasm hello.cpp --abigen
执行后,检查目录下是否生成.wasm和.abi文件;打开.abi文件如下:
{
"____comment": "This file was generated with eosio-abigen. DO NOT EDIT Sat Nov 24 15:42:53 2018",
"version": "eosio::abi/1.0",
"structs": [
{
"name": "hi",
"base": "",
"fields": [
{
"name": "user",
"type": "name"
}
]
}
],
"types": [],
"actions": [
{
"name": "hi",
"type": "hi",
"ricardian_contract": ""
}
],
"tables": [],
"ricardian_clauses": [],
"abi_extensions": []
}
注意:有的时候ABI文件生成可能会有问题,可以考虑手写该文件(后续章节详细讲解abi文件内容)
部署准备
- 创建钱包
$ cleos --url https://api.kylin.alohaeos.com wallet create --to-console
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5Oj2NUsuj1t1CrqfVEoFyRoCDvZMJKuBckE5Nb1vodcITCTfjKc"
- 创建Account
将ACCOUNT_NAME替换成你想创建的账户名称
$ curl http://faucet.cryptokylin.io/create_account\?ACCOUNT_NAME
创建成功会获得以下输出
{"msg": "succeeded", "keys": {"active_key": {"public": "EOS5DogFUDGtR9fmGDzZh2t6VDB8P1LJjts1sOjoN2Ej76zkYA73Z", "private": "5KDzFxeKT9F3R1ZDGRH9vabbvHvD3JoAW2YtGh5FmRW3WEeC6qi"}, "owner_key": {"public": "EOS6eXvZV6Hw4efXoEpNmj1HbQNdCfdbxLmDqborfsviajSr6c1yy", "private": "5CMrjVN5BPdqLAhv8oZRKWQgcAa1kNpvHjXRdf6HtXJbdeZAHRc"}}, "account": "ACCOUNT_NAME"}
- ACCOUNT_NAME必须是小写字母数字组成的12位字符;
- 创建成功的输出结果一定要记录,后续导入钱包的时候需要owner_key和active_key
- 将账户的private key导入钱包
$ cleos --url https://api.kylin.alohaeos.com wallet import --private-key 5KDzFxeKT9F3R1ZDGRH9vabbvHvD3JoAW2YtGh5FmRW3WEeC6qi
$ cleos --url https://api.kylin.alohaeos.com wallet import --private-key 5CMrjVN5BPdqLAhv8oZRKWQgcAa1kNpvHjXRdf6HtXJbdeZAHRc
- 查看账户信息
$ cleos --url https://api.kylin.alohaeos.com get account ACCOUNT_NAME
created: 2018-11-24T08:19:54.000
permissions:
owner 1: 1 EOS6eXvZV6Hw4efXoEpNmj1HbQNdCfdbxLmDqborfsviajSr6c1yy
active 1: 1 EOS5DogFUDGtR9fmGDzZh2t6VDB8P1LJjts1sOjoN2Ej76zkYA73Z
memory:
quota: 9.322 KiB used: 2.926 KiB
net bandwidth:
delegated: 1.0000 EOS (total staked delegated to account from others)
used: 0 bytes
available: 715.5 KiB
limit: 715.5 KiB
cpu bandwidth:
delegated: 1.0000 EOS (total staked delegated to account from others)
used: 0 us
available: 134.7 ms
limit: 134.7 ms
这个时候该账户的余额为0,所以输出信息中不包含EOS balances信息。并且初始拥有资源也很少,不足以支撑合约部署和执行。需要进行EOS账户充值并购买RAM资源
- 账户充值
$ curl http://faucet.cryptokylin.io/get_token?ACCOUNT_NAME
{"msg": "succeeded"}
每次充值100eos,每天最多获得1000个
- 购买RAM
账户操作需要scatter钱包支撑,所以需要首先安装钱包并关联账户信息。
- 安装scatter钱包桌面客户端
https://get-scatter.com/
- 配置钱包
- 打开scatter桌面应用程序;
- 输入密码并创建钱包(一定要记住该密码和生成的助记词),如果该钱包真实使用,为了安全应该讲这两个信息手抄保存;
- 打开设置-网络,输入钱包密码;添加测试网络信息如下:
名称:EOS TestNet - Kylin
主机名:api-kylin.eoslaomao.com
协议:https
端口:443
ChainId:5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191
保持后返回到主页
- 点击Vault,创建两个Vault分别叫active和owner,将测试网中创建的账号active和owner的私钥导入;
- 导入成功后,将可以看到“1 linked accounts”字样
- 购买RAM
- 点击Owner Vault下关联的账户,可以看到改账户拥有的资源信息;
- 点击Manage RAM,进入后可以进行RAM的购买和卖出;
- 买4096KB的RAM;
部署合约
$ cleos --url https://api.kylin.alohaeos.com set contract ACCOUNT_NAME hello
Reading WASM from hello/hello.wasm...
Publishing contract...
executed transaction: a282dab0f5c4f189871c0fa34eaa0b64acac25cd055ed2c9135ed9bea03d2836 1440 bytes 294 us
# eosio <= eosio::setcode {"account":"eosmimi12345","vmtype":0,"vmversion":0,"code":"0061736d0100000001390b60027f7e006000017f6...
# eosio <= eosio::setabi {"account":"eosmimi12345","abi":"0e656f73696f3a3a6162692f312e30000102686900010475736572046e616d65010...
warning: transaction executed locally, but may not be confirmed by the network yet ]
要在contract的根目录执行该命令,否则会提示找不到合约文件;另外,执行完前面步骤后,钱包状况可能已经是被锁了需要解锁一下;
执行合约
$ cleos --url https://api.kylin.alohaeos.com push action ACCOUNT_NAME hi '["bob"]' -p ACCOUNT_NAME
executed transaction: 8494b680ed90e088b8dfa4b8dc6c152cd0ac942c91ff721fea04216918ddf4bc 104 bytes 199 us
# eosmimi12345 <= eosmimi12345::hi {"user":"bob"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
如果要在终端现实print的结果,需要在配置文件config.ini中,将contracts-console 设为 true,即:
contracts-console = true