基于本地网络与真实的正式网络和测试网络在功能上有一个重要的区别:网络资源的利用机制。前面的课程在本地网络中的交易都是免费、没有限制资源的,但是在正式网络或测试网络中是需要消耗资源的,下面我们将介绍基于测试网络的资源管理。
先来回顾一下前面章节“使用cleos管理账号权限”中查看账号“lixu”的权限分配,即“permissions“字段的内容,如下所示。
后面各项的含义如下:
RAM、NET、CPU就是EOS中的网络资源,上图可以看到各项资源都是unlimited,即无限制。
我们再来看一下正式网络中的账号“lixulixucode”详情,如下图。
可见在主网中的账号是需要消耗网络资源,并且是有限制的。
我们再来看一下测试网络中的账号详情,如下图。
可见在测试网中的账号是需要消耗网络资源,并且是有限制的。
在实际的正式网络和测试网络中是需要购买或抵押才能获取资源的,并且是有限制的。下面我们基于测试网络来进行开发,它与正式网络一样,只需更换节点地址即可。
解释一下各个字段的含义
我们知道,比特币和以太坊中的交易手续费机制,其目的就是防止大量交易使系统拥堵。而EOS取消了交易手续费,那么如何避免系统资源的滥用?因而EOS设计了一种新的资源使用机制:根据账户中EOS的数量来分配系统资源,包括:RAM(内存), Network BandWidth (NET带宽) 以及 CPU BandWidth (CPU 带宽)。
在 EOS 中, RAM(内存)的主要特点包括:
在EOS中,NET带宽与CPU带宽的特性差不多,它们的主要特点包括:
通过查看账号“lixulixu1111”,会触发如下方法
accountInfo: async (ctx) =>{
let {account} = ctx.request.body
let res = await httpRequest.postRequest(config.accountInfo, {"account_name":account})
ctx.body = res
},
res是返回给前端的数据,如下
{
"code": 0,
"status": "success",
"data": {
"account_name": "lixutest1111",
"head_block_num": 22394902,
"head_block_time": "2018-11-02T02:19:01.000",
"privileged": false,
"last_code_update": "1970-01-01T00:00:00.000",
"created": "2018-11-01T09:29:34.500",
"core_liquid_balance": "79.4019 EOS",
"ram_quota": 5475,
"net_weight": 1000000,
"cpu_weight": 1000000,
"net_limit": {
"used": 337,
"available": 19130455,
"max": 19130792
},
"cpu_limit": {
"used": 1385,
"available": 3638461,
"max": 3639846
},
"ram_usage": 3734,
"permissions": [
{
"perm_name": "active",
"parent": "owner",
"required_auth": {
"threshold": 1,
"keys": [
{
"key": "EOS7EoByXW7ddKvE7MnTkY3REB4nzXdsWPN19au9TTTFDyPq9EobR",
"weight": 1
}
],
"accounts": [],
"waits": []
}
},
{
"perm_name": "owner",
"parent": "",
"required_auth": {
"threshold": 1,
"keys": [
{
"key": "EOS7EoByXW7ddKvE7MnTkY3REB4nzXdsWPN19au9TTTFDyPq9EobR",
"weight": 1
}
],
"accounts": [],
"waits": []
}
}
],
"total_resources": {
"owner": "lixutest1111",
"net_weight": "100.0000 EOS",
"cpu_weight": "100.0000 EOS",
"ram_bytes": 4075
},
"self_delegated_bandwidth": {
"from": "lixutest1111",
"to": "lixutest1111",
"net_weight": "100.0000 EOS",
"cpu_weight": "100.0000 EOS"
},
"refund_request": null,
"voter_info": {
"owner": "lixutest1111",
"proxy": "",
"producers": [],
"staked": 2200000,
"last_vote_weight": "0.00000000000000000",
"proxied_vote_weight": "0.00000000000000000",
"is_proxy": 0,
"reserved1": 0,
"reserved2": 0,
"reserved3": "0 "
}
}
}
这样的输出其实和cleos命令行加上“-j”一样,cleos -u http://jungle.cryptolions.io:18888 get account lixutest1111 -j
。
下面获取我们需要的数据:
后端无需作更改,只需增加一个资源管理的页面,入口在账号详情里面。
添加一个a标签可跳转到资源管理页面。
......
<h1></h1>
<a class=button href="/netresource.html">资源管理</a>
<table id="account-balance-table">
......
将资源管理页面的接口绑定到路由。
......
router.get("/netresource.html", webController.getNetRosourceHtml)
返回资源管理页面。
......
getNetRosourceHtml:async(ctx) => {
await ctx.render("netResource.html")
},
在views文件夹下新建netResource.html文件,实现资源管理页面的显示。
<html>
<head>
<title>资源管理</title>
<script src="js/lib/jquery-3.3.1.min.js"></script>
<script src="/js/lib/jquery.url.js"></script>
<script src="js/netResource.js"></script>
<link rel="stylesheet" href="css/eoswallet.css">
<style>
#current-account {
color:#0abc9c;
font-size:26px;
}
#net-resource-content {
display: flex;
flex-wrap: wrap;
width: 700px;
}
#net-resource-content>div {
margin: 10px 10px 0 10px;
border: #37cad2 1px solid;
width: 300px;
}
.interactive {
align-self: center;
}
</style>
</head>
<body>
<%include block/nav.html%>
<div id="main">
<h1>资源管理</h1>
<b id="current-account"></b> <b> 总资产:<span id="my-total-balance"></span></b>
<table cellspacing="10">
<tr>
<th>可用余额</th>
<th>赎回金额</th>
<th>NET抵押</th>
<th>CPU抵押</th>
</tr>
<tbody id="my-balance-table"></tbody>
</table>
<div id="net-resource-content">
<div>
<table cellspacing="10">
<caption><b>RAM内存</b></caption>
<tr>
<td>可用</td>
<td>总量</td>
</tr>
<tbody id="my-ram-table"></tbody>
</table>
</div>
<div class="interactive">
<div>买入 卖出</div>
</div>
<div>
<table cellspacing="10">
<caption><b>NET宽带</b></caption>
<tr>
<td>抵押</td>
<td>可用</td>
<td>总量</td>
</tr>
<tbody id="my-net-table"></tbody>
</table>
<table cellspacing="10">
<caption><b>CPU宽带</b></caption>
<tr>
<td>抵押</td>
<td>可用</td>
<td>总量</td>
</tr>
<tbody id="my-cpu-table"></tbody>
</table>
</div>
<div class="interactive">
<div>抵押 赎回</div>
</div>
</div>
<div style="position: fixed;left: 30%;bottom:30px;">Copyright © 2016-2018 北京从零到壹科技有限公司</div>
</div>
</body>
</html>
对资源管理页面进行网络请求处理与页面渲染。
$(document).ready(function () {
let currentAccount = localStorage.getItem("currentAccount")
$("#current-account").text(currentAccount)
//我的网络资源详情ramAvailable
$.post("/account/info", { "account": currentAccount }, function (res, status) {
console.log(status + JSON.stringify(res))
if (res.code == 0) {
let data = res.data
let availableBalance = 0.0
if (data.core_liquid_balance) {
availableBalance = parseFloat(data.core_liquid_balance.slice(0,-4))
}
let redeemBalance = 0
let netBalance = data.net_weight / 10000
let cpuBalance = data.cpu_weight / 10000
//总资产
let totalBalance = availableBalance + redeemBalance + netBalance + cpuBalance
$("#my-total-balance").text(totalBalance + " EOS")
//余额
let myBalanceTable = $("#my-balance-table")
let rowTr = `<tr>
<td>${availableBalance} EOS</td>
<td>${redeemBalance} EOS</td>
<td>${netBalance} EOS</td>
<td>${cpuBalance} EOS</td>
</tr>`
myBalanceTable.append(rowTr)
//RAM
let ramAvailable = (data.ram_quota - data.ram_usage) / 1024
let ramTotal = data.ram_quota / 1024
let myramTable = $("#my-ram-table")
rowTr = `<tr>
<td>${ramAvailable.toFixed(2)} KB</td>
<td>${ramTotal.toFixed(2)} KB</td>
</tr>`
myramTable.append(rowTr)
//NET
let netAvailable = (data.net_limit.max - data.net_limit.used)/1024
let netTotla = data.net_limit.max/1024
let myNetTable = $("#my-net-table")
rowTr = `<tr>
<td>${netBalance} EOS</td>
<td>${netAvailable.toFixed(2)} KB</td>
<td>${netTotla.toFixed(2)} KB</td>
</tr>`
myNetTable.append(rowTr)
//CPU
let cpuAvailable = (data.cpu_limit.max - data.cpu_limit.used) / 1000
let cpuTotla = data.cpu_limit.max / 1000
let myCpuTable = $("#my-cpu-table")
rowTr = `<tr>
<td>${cpuBalance} EOS</td>
<td>${cpuAvailable} ms</td>
<td>${cpuTotla} ms</td>
</tr>`
myCpuTable.append(rowTr)
}
})
})
这是入口位置
网络资源管理页面如下
六、小结
现在我们获取了基于测试网络的账号的网络资源数据,并且进行了显示,剩下的买入、卖出、抵押、赎回将在下一章介绍。
项目源码Github地址
版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者取得同意并注明出处。