G节点Hello World入门教程

第1步:注册帐户


点击上面的按钮,如下图:

如果未注册帐户,请先注册帐户:

注意:一定要使用自己的手机号码注册,否则后续将无法改密。
其中英文名为您的nodeid(亦节点用户ID)--非常重要,建议填写与团队名、公司名相关。

第2步:创建G节点

我们使用第一步注册得到的帐号登录6DGS云控制台,登录后如下图:

我们看到有免费的1GB的G节点额度,这个额度可以立即使用,直接点击【创建G节点】或点击下图菜单:

点击创建G节点链接或菜单,进入创建G节点页面:

按上述内容填写(注意配置只能选择1GB,合约按流程我们先体验COIN-记帐型合约;
token命名可以直接使用自动生成的coin,如果已经创建过coin的G节点,须修改);
COIN币的数量上限可以随便选,这里因为我们仅仅是测试,设置为1个亿;
云服务商是指G节点集群托管所在地,推荐次序为:华为云-百度云-阿里云-腾讯云;
购买数量为月份数量,也就是这个G节点开通的月数,这里因为是免费额度只能选择1个月;
付款方式这里因为余额还没充值(充值了可以使用余额支付),只能选择会员特权(VIP0也是会员,特权为免费1个GB)
上述内容填写完成后,点击【确定购买】,出现下述弹窗:

可以看到需要支付60元,由于使用了会员特权,所以帐户没钱也是可以直接点击【确定购买】,如下图所未:

购买成功后,等待5秒钟,通过【刷新】按钮可刷新出下图数据,代表创建G节点成功:

至此,一个COIN-记帐型合约的G节点已经创建成功!

第3步:熟悉G节点的菜单功能

依据第2步创建了G节点,现在我们找到管理G节点的菜单:

因为刚才创建的这个G节点托管在了华为云,所以我们点击【G节点】华为云也可以找到它

找到它了,下面我们看一下G节点控制台页面的功能,如下图:

其中API接口和API接口密钥,在下页使用/fork等API接口时需要用到;
我们现在看一下如何管理数据,点击【管理】进入链数据管理操作台界面如下图:

注解:操作区【1】重启仅重启进程,【2】重启会更新代码逻辑并重启,
【3】清空cahe是清空状态缓存,清空数据是将链上的数据清除(会重新构建该G节点)
【4】会删除该G节点,删除后在G节点控制台就找不到它了。
对于数据区,我们看到token-id、height、txid、txjson、hash、sign、timestamp即为一个txid交易纪录在token-id这个高度为height上的一行链纪录;
这里值得注意的是,一个txid会分别出现在多个token-id上,代表了tx交易纪录在有关系的token上的六度共识同步!
下面我们使用G节点的API接口来实现helloworld功能,从而了解到G节点发挥作用的过程!

第4步,使用/fork接口API创建token帐户(token-id)

在使用/fork接口之前,先阅读API文档的接口规范,点击查看API接口文档
如下图所示:

这里可以看到,拼接一个可用的API接口,先在G节点控制台拿到API接口地址和接口密钥,如下图:

API接口地址复制到这里:https://c0.6dgs.opencom.cn/node.testphone.coin
API接口密钥复制到这里:appid=10001&secret_key=bfc51077860b2927be95c0807766ca56
按规范拼接API的接口URL:https://c0.6dgs.opencom.cn/node.testphone.coin/fork?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56

这里在【API接口地址】后面添加了/fork?,还有API接口密钥,这样,一个有效的/fork接口地址就生产了。
我们看API文档,/fork接口需要哪些参数,如下图:

这里我们先不使用dst_token参数和space参数,但token_root一定懂得如何拼接出来,我们的token_name为coin,故token_root为coin_0000000000000000
所以,创建token-id的第一个fork接口URL拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/fork?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token=coin_0000000000000000
得到的返回结果如下:
{"ret":true,"msg":"success","txid":"txid_23YMEoYHpz1o9xgE","token_x":"coin_24ugygVxTD2nz2Gy","token_y":"coin_0000000000000000","x_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"0","token_height":0,"pre_txid":"null","private_key":"CSBFzUX1vB8wSH3Qjxi47Lvwgvvx63F4QhWMfzyrWpFM","public_key":"yFnXjsj5v3EtPBrFdWTq28rdw6NWoYd6VYxyxKA7JHZD","token":"coin_24ugygVxTD2nz2Gy"},"y_state":{"token_state_p":"[]","token_state_val":"0","token_height":1,"private_key":"8egL8ivrhE3KkpW639f1fXv1Qb97psiudMqs5Kfb2WmL","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"}
ret=true代表fork成功,token_x=coin_24ugygVxTD2nz2Gy为成功创建的token-id。

使用dst_token,例如dst_token=coin_1234567890123456,API接口拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/fork?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token=coin_0000000000000000&dst_token=coin_1234567890123456
返回结果:{"ret":true,"msg":"success","txid":"txid_29LwnN76HqgB7wth","token_x":"coin_1234567890123456","token_y":"coin_0000000000000000","x_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"0","token_height":0,"pre_txid":"null","private_key":"vyDFhhHixhQzcfBFJ7tk65jW2qAm6Cymz4Vv3nZsPYh","public_key":"246WqwPJKiYWkoNuTVhcohdMoiNeQYxw836rQKmxH6mjV","token":"coin_1234567890123456"},"y_state":{"token_state_p":"[]","token_state_val":"0","token_height":2,"private_key":"8egL8ivrhE3KkpW639f1fXv1Qb97psiudMqs5Kfb2WmL","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"}}
可以看到ret=true,代表fork新帐户调用成功,同时返回token_x=coin_1234567890123456;
这里注意,因为token-id的唯一性,所以多次调用同一个/fork接口URL,创建dst_token=coin_1234567890123456会在第二次调用以后全部返回失败结果如下:
{"ret":false,"msg":"wallet new token failed! "}
意思是:token-id已经存在于G节点中了,所以fork创建该dst_token失败了(不能多次fork同一个目标token-id)。
使用space,例如space=area1,API接口拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/fork?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token=coin_0000000000000000&space=area1
点击上述链接,调用结果如下:
{"ret":true,"msg":"success","txid":"txid_2xsSRiHRqJuW3RV8","token_x":"coin_area1y79Ex4TMH4p","token_y":"coin_0000000000000000","x_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"0","token_height":0,"pre_txid":"null","private_key":"6XTEu7e3uFrjXnxToy9Y9TsiNhMU99hqH7ZCd1iYjqGM","public_key":"uzhxkTGeszukKUaS9Y9brk7fj6hsDWBQBWWBbhNsujFN","token":"coin_area1y79Ex4TMH4p"},"y_state":{"token_state_p":"[]","token_state_val":"0","token_height":3,"private_key":"8egL8ivrhE3KkpW639f1fXv1Qb97psiudMqs5Kfb2WmL","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"}}
再次点击链接 ,调用结果如下:
{"ret":true,"msg":"success","txid":"txid_2wwqmUUNBvaSr5uk","token_x":"coin_area12zFnNW9XR1R","token_y":"coin_0000000000000000","x_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"0","token_height":0,"pre_txid":"null","private_key":"7UuXdeeqH3ug2YjgZ7VZRCz2Ujm4CmWVs4oZEz9CXcpC","public_key":"25EPKuHSTHR2mn93cNz2sRtiNyiXds88j7JtuXmmJDi5L","token":"coin_area12zFnNW9XR1R"},"y_state":{"token_state_p":"[]","token_state_val":"0","token_height":5,"private_key":"8egL8ivrhE3KkpW639f1fXv1Qb97psiudMqs5Kfb2WmL","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"}}
可见多次fork出来的token-id均不一样,但是都带有area1前缀(coin_area1y79Ex4TMH4p、coin_area12zFnNW9XR1R),space参数会形成以该参数为前缀的随机token-id(16位英文+数字的ID)
【注】space用于生成带来命名前缀的token-id,这在编程中非常实用(形成了命名空间)。而dst_token参数用于生成目标token-id,当两个参数同时存在时,优先使用dst_token参数 。
我们回去看看G节点的数据管理,查看链数据如下图:

由此可见,一次fork创建帐户的交易纪录(txid),会在新创建的token-id纪录一行数据(首行数据必然为fork,并且仅能fork一次),同时也会在父节点帐户token_root纪录一次数据
点击了解云组件-数据结构-六度共识同步算法

第5步,使用/send接口API充值帐户余额(Hello World)

在使用/send接口之前,先阅读/send的接口API文档,点击查看/send的API接口文档
如下图所示:

转帐交易纪录为:token_x send token_y money extra_data ;(这里由于是COIN-合约,充值可从token_root转出金额)
所以token_x=coin_0000000000000000(即token_root)
token_y=coin_area1y79Ex4TMH4p(我们使用上面fork接口API创建的token-id)
另外充值金额为10,即opval=10;并且让extra_data=helloworld(第一个Hello World产生了)
故send接口API的URL拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/send?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token_x=coin_0000000000000000&token_y=coin_area1y79Ex4TMH4p&opval=10&extra_data=helloworld
得到的返回结果如下:
{"ret":true,"msg":"success","txid":"txid_32NnRAUpXXLWKWjT","token_x":"coin_0000000000000000","token_y":"coin_area1y79Ex4TMH4p","x_state":{"token_state_p":"[]","token_state_val":"-10","token_height":7,"pre_txid":"null","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"},"y_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"10","token_height":1,"public_key":"uzhxkTGeszukKUaS9Y9brk7fj6hsDWBQBWWBbhNsujFN","token":"coin_area1y79Ex4TMH4p"}}
ret=true代表fork成功,x_state为token_x的状态,y_state为token_y的状态(从token_state_val=10可看到余额变成10了)
多次点击,你会发现token_root的余额不断为负数,但token_y的余额不断为正,并且两者加减的余额均为opval,这就是COIN记帐型合约的自动状态机计算的余额结果。
通过/chain/opcode可以查询到交易流水纪录,和余额在每一次交易发生后的余额状态,点击查看/chain接口文档

第6步,使用/op接口设置E实体属性(Hello World)

在使用/op接口之前,先阅读接口API文档,点击查看/op的API接口文档
如下图所示:

交易纪录数据结构为:token_x op token_y opval extra_data ;(非转帐推荐使用assert、config、notice等指令)
一般情况下,除非是send消息,令token_x=coin_0000000000000000(即token_root)
令token_y=coin_area1y79Ex4TMH4p(我们使用上面fork接口API创建的token-id)
另外我们使用assert来保存实体属性信息,并且令opval={"name":"yourname","phone":13510000000}
因为在浏览器里直接使用该参数,所以我们进行urlencode转码:转码工具
故op接口API的URL拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/op?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token_x=coin_0000000000000000&token_y=coin_area1y79Ex4TMH4p&opcode=assert&opval=%7b%22name%22%3a%22yourname%22%2c%22phone%22%3a13510000000%7d&extra_data=helloworld-2
得到的返回结果如下:
{"ret":true,"msg":"success","txid":"txid_28CRrc3Mfo77U26s","token_x":"coin_0000000000000000","token_y":"coin_area1y79Ex4TMH4p","x_state":{"token_state_p":"[]","token_state_val":"-20","token_height":11,"pre_txid":"null","public_key":"yizNoHddKNvchoikGRdrTaqeDJptUh9XvpnRiDfb85vz","token":"coin_0000000000000000"},"y_state":{"token_state_p":"[\"coin_0000000000000000\"]","token_state_val":"20","token_height":3,"public_key":"uzhxkTGeszukKUaS9Y9brk7fj6hsDWBQBWWBbhNsujFN","token":"coin_area1y79Ex4TMH4p"}}
ret=true代表op接口调用成功,通过G节点控制台的【管理】,可以浏览数据存储情况下如图

通过/chain/opcode可以查询到op接口的每一条存储纪录点击查看/chain接口文档

第7步,使用/chain/opcode接口查询E-R的属性值

在使用/chain/opcode接口之前,先阅读接口API文档,点击查看/chain/opcode的API接口文档
如下图所示:

链纪录数据结构为:token height txid txjson hash sign timestamp
令token=coin_area1y79Ex4TMH4p(我们使用上面fork接口API创建的token-id)
查询opcode=assert的链纪录流水帐(当是send转帐操作时,才有余额信息)
故/chain/opcode接口API的URL拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/chain/opcode?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token=coin_area1y79Ex4TMH4p&opcode=assert&begin=0&len=1
注意这里begin=0代表偏移0,len代表数据分页长度为1,意为查询E实体属性的最新一条更新纪录,得到实体的最新属性值---非常实用且常用的参数和接口 得到的返回结果如下:
{"ret":true,"msg":"success","list":[{"token":"coin_area1y79Ex4TMH4p","height":3,"txid":"txid_28CRrc3Mfo77U26s","txjson":"{\"txid\":\"txid_28CRrc3Mfo77U26s\",\"token_x\":\"coin_0000000000000000\",\"token_y\":\"coin_area1y79Ex4TMH4p\",\"opcode\":\"assert\",\"opval\":\"{\\\"name\\\":\\\"yourname\\\",\\\"phone\\\":13510000000}\",\"extra_data\":\"helloworld-2\",\"timestamp_i\":\"1565778251\"}","hash":"ba96cd8820a047cfa87f54491d8205e29ee01de090809b611a7c77e1cf788552","sign":"55jb6GTgUGkUsHLkSJTFxD1t8bBSVAqCphj6R7xSCqZQniLf8iFy3NAuiAXPJWhAPPjFRmFXtFxH59FAYZJKAM4R","token_relate":"token_y","create_time_i":1565778251,"create_time":"2019-08-14T10:24:11.000Z"}]}
ret=true代表/chain/opcode接口调用成功,list代表链上的纪录数组结果,里面可以看到一行数据结构({"token":"coin_area1y79Ex4TMH4p","height":3,"txid":"txid_28CRrc3Mfo77U26s","txjson":...
通过G节点控制台的【管理】,可以浏览数据存储情况下如图,两者是一致的:

第8步,使用/chain/opcode接口查询交易流水和帐户余额

在使用/chain/opcode接口查询交易流水和余额之前,先阅读接口API文档,点击查看/chain/opcode的API接口文档
如下图所示:

链纪录数据结构为:token height txid txjson hash sign timestamp
令token=coin_area1y79Ex4TMH4p(我们使用上面fork接口API创建的token-id)
查询opcode=send的链纪录交易流水帐(因为该token-name为COIN-记帐型合约,所以有余额信息)
故/chain/opcode接口API的URL拼接如下:
https://c0.6dgs.opencom.cn/node.testphone.coin/chain/opcode?appid=10001&secret_key=bfc51077860b2927be95c0807766ca56&token=coin_area1y79Ex4TMH4p&opcode=assert&begin=0&len=10
注意这里begin=0代表偏移0,len代表数据分页长度为10,代表查询最新10条链上的交易流水纪录
得到的返回结果如下:
{"ret":true,"msg":"success","list":[{"token":"coin_area1y79Ex4TMH4p","height":2,"txid":"txid_21EfrwpDyD5MfHVq","txjson":"{\"txid\":\"txid_21EfrwpDyD5MfHVq\",\"token_x\":\"coin_0000000000000000\",\"token_y\":\"coin_area1y79Ex4TMH4p\",\"opcode\":\"send\",\"opval\":\"10\",\"extra_data\":\"helloworld\",\"timestamp_i\":\"1565777488\",\"token_state\":\"20\",\"token_height\":2,\"pre_txid\":\"null\"}","hash":"9fa0e9778fa208b8363e5744f13b6a89874ce64b1f4b9fc7bdc4091ee538606d","sign":"4wLoktRzhBvRm5xoiV4JhQ1xZVodQaJQ1j1n9EjPRuwHqAncwhACZLgqpivC4H2pQqncs8Y4aY2RAv3bw4m66Q56","token_relate":"token_y","create_time_i":1565777488,"create_time":"2019-08-14T10:11:28.000Z"},{"token":"coin_area1y79Ex4TMH4p","height":1,"txid":"txid_32NnRAUpXXLWKWjT","txjson":"{\"txid\":\"txid_32NnRAUpXXLWKWjT\",\"token_x\":\"coin_0000000000000000\",\"token_y\":\"coin_area1y79Ex4TMH4p\",\"opcode\":\"send\",\"opval\":\"10\",\"extra_data\":\"helloworld\",\"timestamp_i\":\"1565777307\",\"token_state\":\"10\",\"token_height\":1,\"pre_txid\":\"null\"}","hash":"12988558723f3ee1b8626998e298f05f3da7f7cc33a9ac1d38a7734b5db63fde","sign":"5esLzG5WpCFGTQnyRKoVmQXof72uzqgigMZjFWgf2c7Vm3aqMbFqepgt6nEbJsFP3vx66YpnKQP7PqaBN5sfHhsx","token_relate":"token_y","create_time_i":1565777307,"create_time":"2019-08-14T10:08:27.000Z"}]}
ret=true代表/chain/opcode接口调用成功,list代表链上的纪录数组结果,这里面可以看到2行数据结构,并且每一行都有opval为10,且出现了一个token_state字段(代表余额分别为20,10)
通过这个/chain/opcode接口,当G节点合约为COIN-记帐型或者SCORE-记帐型,且opcode=send的情况下,可以查询交易流水帐和余额信息了。
至此,入门教程已全部结束,希望您通过这个入门教程能快速掌握G节点的功能!

高级功能:建立E-R实体关系模式的映射关系

设置E-R实体关系模型的R关系(使用rela-relz或者relate、hold、join指令)

详见API接口文档或者云组件文档-关系组件


Copyright © 2012-2019 广州六度共识科技有限公司. All Rights Reserved.
粤ICP备14035184号