- A+
目标
- 计算NET带宽价格
- 计算CPU带宽价格
- 抵押EOS获取NET带宽
- 抵押EOS获取CPU带宽
- 赎回NET带宽与获取赎回金额
- 赎回CPU带宽
前言
现在我们能对RAM进行交易了,还差的NET、CPU交易将是本章重点。
同样,交易NET、CPU贷款的前提是我们需要知道它的价格,即买1KB NET带宽和1ms CPU带宽需要抵押多少EOS,赎回1个EOS能获得多少NET、CPU带宽。这就需要我们去链上查询数据库获取相应的实时的数据,再进行计算拿到价格。下面我们来一步步实现,最后展示在项目中的相应源码。
一、计算NET、CPU带宽价格
RPC和eosjs都没有提供API直接获取价格,那我们如何获取带宽的价格呢?我们可以通过特定的规则去计算NET、CPU带宽的价格。
1. 计算NET带宽价格
在前面“详解与获取RAM、NET、CPU资源数据”章节的学习中我们已经可以获取账号的网络资源详情了,包含NET宽带抵押金额和NET宽带总量。通过这个算法(NET宽带抵押金额 / NET宽带总量)/ 3
即可获取到NET宽带价格了。
let httpRequest = require("../utils/httpRequest")
let config = require("../config/config")
async function testGetNetPrice() { let account = "lixutest1111" let res = await httpRequest.postRequest(config.accountInfo, { "account_name": account }) if (res.code == 0) { data = res.data //抵押NET的EOS数量 var netBalance = data.net_weight / 10000 //NET贷款的总量 var netTotal = data.net_limit.max / 1024 //(netBalance / netTotal)获取到的是过去3天内的平均消耗量,除以3获取每天的平均消耗量,即价格 netPrice = ((netBalance / netTotal) / 3).toFixed(4) console.log(netBalance, netTotal, netPrice) } } testGetNetPrice()
输出如下
100 18680.2177734375 '0.00178442'
可以看到连接到的测试网络计算得到的NET价格为0.00178442,单位是EOS/KB/Day。
另外,修改config配置连接到主网后计算的价格是“0.0004887”左右。所以测试网络和主网的NET带宽价格相差很大。
2. 计算CPU带宽价格
计算CPU带宽价格的方式与NET带宽类似,我们直接看测代码。
let httpRequest = require("../utils/httpRequest")
let config = require("../config/config")
async function testGetCpuPrice() { let account = "lixutest1111" let res = await httpRequest.postRequest(config.accountInfo, { "account_name": account }) if (res.code == 0) { data = res.data //抵押CPU的EOS数量 var cpuBalance = data.cpu_weight / 10000 //CPU贷款的总量 var cpuTotal = data.cpu_limit.max / 1024 //(cpuBalance / cpuTotal)获取到的是过去3天内的平均消耗量,除以3获取每天的平均消耗量,即价格 cpuPrice = ((cpuBalance / cpuTotal) / 3).toFixed(4) console.log(cpuBalance, cpuTotal, cpuPrice) } } testGetCpuPrice()
输出如下
100 3554.1171875 '0.0094'、
可以看到连接到的测试网络计算得到的CPU价格为0.0094,单位是EOS/ms/Day。
另外,修改config配置连接到主网后计算的价格是“0.2148”左右。所以测试网络和主网的CPU带宽价格相差很大。
二、抵押EOS获取NET、CPU带宽
1. 抵押EOS获取NET带宽
抵押EOS获取NET带宽的API我们已经使用过了,在创建账号的时候我们为别人创建的账号就需要为它购买一定的NET带宽,现在我们在来单独调用抵押的API。由于现在需要交易,所以会使用资源,因此我们切换到测试网络进行测试。
let myUtils = require("../utils/myUtils")
async function testBuyNet() { eos = myUtils.getEOSJS(["5HqCj7sg4K2xZ1KD5sSH38kuJkKGqfE1wSGiLL3M599ajacVmTs"]) let account = "lixutest1111"
let data = await eos.transaction(tr => { tr.delegatebw({ from: account, receiver: account, stake_net_quantity: "1.0000 EOS", stake_cpu_quantity: "0.0000 EOS", transfer: 0 }) }) console.log(data) } testBuyNet()
特别注意:
- 若只买NET带宽,那么“stake_cpu_quantity”该字段必须设置,且一样须带有四个小数位,即“0.0000 EOS”。
- 若只买CPU带宽,那么“stake_net_quantity”该字段也必须设置,且一样须带有四个小数位,即“0.0000 EOS”。
在运行之前先记录下来账号“lixutest1111”的网络资源数据。
运行测试代码后查看NET带宽数据如下
可以看到EOS可用余额减少了一个,NET带宽抵押的EOS多了一个,总量从18280KB增加到了18867KB,增量是587KB。
刚才计算的每KB NET大约花费0.00178442个EOS,所以1个EOS大概能买到NET 1/0.00178442 = 560KB。这个计算的结果和链上获取的结果587KB相差无几。因为NET价格会随着市场波动而变化,所以导致结果有一点点偏差,这是不可避免的。另外我们在购买NET的时候,需要输入的是EOS数量,然后根据NET价格转换成他当前能购买到多少KB RAM,再进行交易。
2. 抵押EOS获取CPU带宽
抵押EOS获取CPU带宽的方式与抵押EOS获取NET带宽一样,下面我只给出代码,它的原理与获取NET带宽一样。
let myUtils = require("../utils/myUtils")
async function testBuyCpu() { eos = myUtils.getEOSJS(["5HqCj7sg4K2xZ1KD5sSH38kuJkKGqfE1wSGiLL3M599ajacVmTs"]) let account = "lixutest1111"
let data = await eos.transaction(tr => { tr.delegatebw({ from: account, receiver: account, stake_net_quantity: "0.0000 EOS", stake_cpu_quantity: "1.0000 EOS", transfer: 0 }) }) console.log(data) } testBuyCpu()
3. 抵押EOS同时获取NET与CPU带宽
正常情况下我们都是一起购买NET与CPU带宽的,需要前端同时传来抵押EOS购买NET的量,与抵押EOS购买CPU的量,然后设置上stake_net_quantity与stake_cpu_quantity相应的值。
三、赎回NET带宽与获取赎回金额
1. 赎回NET带宽
赎回需要用到另外一个API undelegatebw
,它与抵押的API delegatebw
相对应。传递的数据结构一样。
async function testSellNet() {
eos = myUtils.getEOSJS(["5HqCj7sg4K2xZ1KD5sSH38kuJkKGqfE1wSGiLL3M599ajacVmTs"])
let account = "lixutest1111"
let data = await eos.transaction(tr => { tr.undelegatebw({ from: account, receiver: account, unstake_net_quantity: "1.0000 EOS", unstake_cpu_quantity: "0.0000 EOS" }) }) console.log(data) } testSellNet()
在运行之前先记录下来账号“lixutest1111”的网络资源数据。
运行测试代码后查看NET带宽数据如下
可以看到赎回NET带宽后EOS可用余额并没有增加,而用于NET带宽抵押的EOS的数量由101减少到了100,总量也由18877KB减少到了18680KB。那么问题来了,NET宽带资源已经被扣了,但是赎回的EOS没有到账,这是为什么呢?
2. 获取赎回期中的赎回金额
之前已经说过了,在赎回宽带资源的时候,存在三天的赎回期,因此我们的赎回交易已经完成了,但是需要三天后EOS才会到账。那么我们需要将此数据显示给用户查看。如何获取赎回的金额数据呢?
再使用cleos工具查看账号“lixutest1111”的账号信息,如下
可以看到“refund_request”字段数据中包含了“net_amount”字段的数据有“1.0000 EOS”,这正是我们赎回的EOS。之前没有赎回金额的时候,该字段为null。
因此我们获取该字段数据返回给前端,用于显示赎回金额。
let redeemBalance = 0
if (data.refund_request) {
refundNetBalance = data.refund_request.net_amount.split(" ")[0]
refundCpuBalance = data.refund_request.cpu_amount.split(" ")[0]
redeemBalance = parseFloat(refundNetBalance) + parseFloat(refundCpuBalance)
}
四、同时赎回NET与CPU带宽
单独赎回CPU带宽也是可以的,与单独赎回NET带宽一样。下面我们看看同时赎回NET与CPU带宽的方式。
async function testSellNetAndCpu() {
eos = myUtils.getEOSJS(["5HqCj7sg4K2xZ1KD5sSH38kuJkKGqfE1wSGiLL3M599ajacVmTs"])
let account = "lixutest1111"
let data = await eos.transaction(tr => { tr.undelegatebw({ from: account, receiver: account, unstake_net_quantity: "1.0000 EOS", unstake_cpu_quantity: "1.0000 EOS" }) }) console.log(data) } testSellNetAndCpu()
运行测试代码后查看宽带资源数据如下
可以看到赎回NET、CPU带宽后EOS可用余额并没有增加,而用于NET带宽抵押的EOS的数量都减少了一个,宽带资源也相应地减少了。
再来看看账号“lixutest1111”赎回期中的赎回金额
五、项目源码
1. controllers/netResource.js
在controllers文件夹下编辑netResource.js文件,实现获取NET与CPU的价格、抵押和赎回NET与CPU带宽的功能。
......
let httpRequest = require("../utils/httpRequest") let config = require("../config/config")
module.exports = { ......
netResourceGetBandwidthPrice: async (ctx) => { console.log(ctx.request.body) let { account } = ctx.request.body
let res = await httpRequest.postRequest(config.accountInfo, { "account_name": account }) if (res.code == 0) { data = res.data //1. 计算NET价格 //抵押NET的EOS数量 var netBalance = data.net_weight / 10000 //NET贷款的总量 var netTotal = data.net_limit.max / 1024 //(netBalance / netTotal)获取到的是过去3天内的平均消耗量,除以3获取每天的平均消耗量,即价格 netPrice = ((netBalance / netTotal) / 3).toFixed(4) console.log(netBalance, netTotal, netPrice)
//1. 计算CPU价格 //抵押CPU的EOS数量 var cpuBalance = data.cpu_weight / 10000 //CPU贷款的总量 var cpuTotal = data.cpu_limit.max / 1024 //(cpuBalance / cpuTotal)获取到的是过去3天内的平均消耗量,除以3获取每天的平均消耗量,即价格 cpuPrice = ((cpuBalance / cpuTotal) / 3).toFixed(4)
ctx.body = success({ netPrice: netPrice, cpuPrice: cpuPrice, }) } else { ctx.body = res } },
netResourceTransactionBandwidth: async (ctx) => { console.log(ctx.request.body) let { net_amount, cpu_amount, bandwidth_transaction_type, account, wallet, password } = ctx.request.body
//获取钱包里面所有的私钥配置EOSJS let privatekeyList = await walletModel.getWalletPrivatekeyList(wallet, password) eos = myUtils.getEOSJS(privatekeyList)
let result if (bandwidth_transaction_type == '1') { //抵押EOS购买NET、CPU result = await eos.transaction(tr => { tr.delegatebw({ from: account, receiver: account, stake_net_quantity: parseFloat(net_amount).toFixed(4) + " EOS", stake_cpu_quantity: parseFloat(cpu_amount).toFixed(4) + " EOS", transfer: 0 }) }) } else { //从NET、CPU资源中赎回EOS result = await eos.transaction(tr => { tr.undelegatebw({ from: account, receiver: account, unstake_net_quantity: parseFloat(net_amount).toFixed(4) + " EOS", unstake_cpu_quantity: parseFloat(cpu_amount).toFixed(4) + " EOS", }) }) }
console.log("data:", result) if (result.broadcast) { ctx.body = success("ok") } else { ctx.body = fail("error") } }, }
2. router/router.js
将获取NET与CPU的价格、抵押和赎回NET与CPU带宽的接口绑定到路由。
//网络资源
router.post("/net_resource/bandwidth/price", netresourceController.netResourceGetBandwidthPrice)
router.post("/net_resource/bandwidth/transaction", netresourceController.netResourceTransactionBandwidth)
3. views/netResource.html
编辑views文件夹下的netResource.html文件,实现NET与CPU抵押和赎回的表单显示。
......
<div class="interactive"> <b>NET、CPU带宽交易</b> <form id="bandwidth-transaction"> <input type="radio" id="bandwidth-transaction-buy" name="bandwidth_transaction_type" value="1" checked="checked"> <label for="bandwidth-transaction-buy">抵押</label>
<input type="radio" id="bandwidth-transaction-sell" name="bandwidth_transaction_type" value="2" checked> <label for="bandwidth-transaction-sell">赎回</label> <br>
<div>NET带宽价格:<span id="net-price"></span> EOS/KB/Day</div> <label>数量:</label> <input type="text" name="net_amount" placeholder="请输入购买NET所抵押的EOS数量"><br>
<div>CPU带宽价格:<span id="cpu-price"></span> EOS/ms/Day</div> <label>数量:</label> <input type="text" name="cpu_amount" placeholder="请输入购买CPU所抵押的EOS数量"><br>
<input type="text" name="account" hidden="hidden"> <input type="text" name="wallet" hidden="hidden"> <input type="text" name="password" hidden="hidden"> <button type="submit" id="bandwidth-transaction-button">抵押</button> </form> </div>
......
4. static/js/netResource.js
对NET与CPU的价格、抵押和赎回NET与CPU带宽的表单进行网络请求处理与页面渲染。
$(document).ready(function () {
......
$("input[name=bandwidth_transaction_type]").change(function () { if (this.value == 1) { $("#bandwidth-transaction-button").text("抵押") } else { $("#bandwidth-transaction-button").text("赎回") } })
//NET、CPU价格 $.post("/net_resource/bandwidth/price", { "account": currentAccount }, function (res, status) { console.log(status + JSON.stringify(res)) if (res.code == 0) { $("#net-price").text(res.data.netPrice) $("#cpu-price").text(res.data.cpuPrice) } })
//交易NET、CPU $("#bandwidth-transaction").validate({ rules: { net_amount: {required: true,}, cpu_amount: {required: true,}, }, messages: { net_amount: {required: "请输入购买NET所抵押的EOS数量",}, cpu_amount: {required: "请输入购买CPU所抵押的EOS数量",}, }, submitHandler: function (form) { $(form).ajaxSubmit({ url: "/net_resource/bandwidth/transaction", type: "post", dataType: "json", success: function (res, status) { console.log(status + JSON.stringify(res)) if (res.code == 0) { alert("交易成功") location.reload() } else { alert("交易失败") } }, error: function (res, status) { console.log(status + JSON.stringify(res)) alert(res.data) } }); } }) })
六、项目效果
版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者(微信:lixu1770105)取得同意并注明出处。
未经授权禁止转载、改编,转载请注明出处!
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫