EOS錢包開發:詳解與獲取RAM、NET、CPU資源資料
目標
前言
基於本地網路與真實的正式網路和測試網路在功能上有一個重要的區別:網路資源的利用機制。前面的課程在本地網路中的交易都是免費、沒有限制資源的,但是在正式網路或測試網路中是需要消耗資源的,下面我們將介紹基於測試網路的資源管理。
一、賬號在各種網路中的資源的區別
1. 賬號在本地網路中的資源
先來回顧一下前面章節“使用cleos管理賬號許可權”中檢視賬號“lixu”的許可權分配,即“permissions“欄位的內容,如下所示。
後面各項的含義如下:
- memory: 是RAM,即記憶體。
- net bandwidth: 是NET寬頻。
- cpu bandwidth: 是CPU寬頻。
RAM、NET、CPU就是EOS中的網路資源,上圖可以看到各項資源都是unlimited,即無限制。
2. 賬號在正式網路中的資源
我們再來看一下正式網路中的賬號“lixulixucode”詳情,如下圖。
可見在主網中的賬號是需要消耗網路資源,並且是有限制的。
3. 賬號在測試網路中的資源
我們再來看一下測試網路中的賬號詳情,如下圖。
可見在測試網中的賬號是需要消耗網路資源,並且是有限制的。
4. 結論
在實際的正式網路和測試網路中是需要購買或抵押才能獲取資源的,並且是有限制的。下面我們基於測試網路來進行開發,它與正式網路一樣,只需更換節點地址即可。
解釋一下各個欄位的含義
- memory: RAM,即記憶體
- quota: 限使用的界限
- used: 用量
- net bandwidth: 網路寬頻
- staked: 自己賬號購買的總量
- delegated: 其它賬號購買的總量
- used: 已使用的量
- available: 剩餘可用量
- limit: 限使用的界限
- cpu bandwidth:CPU寬頻,子欄位含義與net bandwidth一樣。
- EOS balances: EOS的餘額 liquid: 可用餘額 staked: 購買資源的金額 total: 所有可用餘額
二、EOS的資源利用機制
我們知道,比特幣和以太坊中的交易手續費機制,其目的就是防止大量交易使系統擁堵。而EOS取消了交易手續費,那麼如何避免系統資源的濫用?因而EOS設計了一種新的資源使用機制:根據賬戶中EOS的數量來分配系統資源,包括:RAM(記憶體), Network BandWidth (NET頻寬) 以及 CPU BandWidth (CPU 頻寬)。
1. RAM(記憶體):
在 EOS 中, RAM(記憶體)的主要特點包括:
- 要將資料儲存在區塊鏈中需要消耗RAM,比如在 EOS 中轉賬、購買資源、投票等操作的時候,都有可能會消耗 RAM (記憶體)。
- 如果你的 RAM 消耗殆盡,那麼你是無法進行上述這些需要消耗RAM的操作的,所以我們需要有足夠的RAM。
- 通過購買獲得的 EOS RAM 資源可以買賣,買賣的價格根據市場行情動態調節,這個特點與買賣EOS一樣。
- RAM可以通過EOS購買的方式獲得也可以通過好友幫你購買,這個特點和通過抵押方式獲取 CPU 資源以及 NET 資源不太一樣。
- 使用者在買賣 RAM 資源的時候,各需要消耗 0.5 % (千分之五) 的手續費,總共是 1% 的手續費。這筆費用被存在 eosio.ramfee 中,由 BP 節點進行管理。
- 記憶體是消耗資源,不可贖回,只能買賣。
- RAM本質上是為智慧合約中呼叫的每個交易提供資源的gas。
2. NET頻寬與CPU頻寬
在EOS中,NET頻寬與CPU頻寬的特性差不多,它們的主要特點包括:
- 它們採用抵押EOS的方式獲取。當不再需要CPU與頻寬時,抵押的EOS通證可以贖回,在贖回的時候,存在三天的贖回期。
- 如果你持有全網1%的EOS,那就可以抵押這些EOS來獲得全網1%的CPU和頻寬。這樣就可以隔離開所有的DAPP,防止資源競爭和惡意的DDOS供給,無論其他的DAPP如何擁堵, 你自己的頻寬都不受影響。
- 每次使用轉賬功能時,都會消耗網路頻寬資源。
- 網路頻寬取決於過去三天消費的平均值,作為你下一次執行操作的費率。
- 如果沒有足夠的網路頻寬資源的話,你是無法使用 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 },
{ "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
。
下面獲取我們需要的資料:
- 賬號名稱:"account_name": "lixutest1111"。
- 可用餘額:"core_liquid_balance": "79.4019 EOS"。
- RAM總量:"ram_quota": 5475,注意單位是byte,相當於5475/1024=5.35KB。
- RAM已用量:"": 3734,注意單位是byte,相當於3734/1024=3.65KB。
- RAM可賣量:ram_quota - ram_usage = 5475 - 3734 = 1.74KB。
- NET寬頻抵押金額:"net_weight": 1000000,注意是使用的最小單位,其精度是4位小數,相當於1000000/10000=100EOS。
- NET寬頻總量:"net_limit": {"max": 19130792},相當於19130792/1024=18682.41KB。
- NET寬頻已用量:"net_limit": {"used": 337},相當於337/1024=0.33KB。
- NET可贖回量:"self_delegated_bandwidth": {"net_weight": "100.0000 EOS",}。
- CPU寬頻抵押金額:"cpu_weight": 1000000,注意是使用的最小單位,其精度是4位小數,相當於1000000/10000=100EOS。
- CPU寬頻總量:"cpu_limit": {"max": 3639846},注意是使用的最小單位,其精度是4位小數,相當於1000000/10000=100EOS。
- CPU寬頻已用量:"cpu_limit": {"used": 1385},注意單位是微妙,換算成毫秒,為3639846/1000 = 3639.846 ms,它會根據價格變化。
- CPU可贖回量:"self_delegated_bandwidth": {"cpu_weight": "100.0000 EOS",},注意單位是微妙,換算成毫秒,為3639846/1000 = 3639.846 ms,它會根據價格變化。
- 可抵押金額:相當於就是可用餘額,79.4019 EOS。
- 總抵押金額:NET寬頻抵押金額+CPU寬頻抵押金額 = 200EOS。
- 總資產:總抵押金額+可用餘額 = 200+79.4019 = 279.4019EOS。
四、專案原始碼
後端無需作更改,只需增加一個資源管理的頁面,入口在賬號詳情裡面。
1. views/accountInfo.html
新增一個a標籤可跳轉到資源管理頁面。
...... <h1></h1> <a class=button href="/netresource.html">資源管理</a> <table id="account-balance-table"> ......
2. router/router.js
將資源管理頁面的介面繫結到路由。
...... router.get("/netresource.html", webController.getNetRosourceHtml)
3. controllers/web.js
返回資源管理頁面。
...... getNetRosourceHtml:async(ctx) => { await ctx.render("netResource.html") },
4. views/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>
5. static/js/netResource.js
對資源管理頁面進行網路請求處理與頁面渲染。
$(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) } }) })
五、專案效果
這是入口位置
網路資源管理頁面如下
六、小結
現在我們獲取了基於測試網路的賬號的網路資源資料,並且進行了顯示,剩下的買入、賣出、抵押、贖回將在下一章介紹。
ofollow,noindex" target="_blank">專案原始碼Github地址
版權宣告:部落格中的文章版權歸博主所有,未經授權禁止轉載,轉載請聯絡作者取得同意並註明出處。