风险提示:理性看待区块链,提高风险意识!
EOS钱包开发:抵押和赎回NET与CPU带宽
首页 > 币界资讯 > 区块链知识 2018-11-18 09:45:00

目标

  1. 计算NET带宽价格
  2. 计算CPU带宽价格
  3. 抵押EOS获取NET带宽
  4. 抵押EOS获取CPU带宽
  5. 赎回NET带宽与获取赎回金额
  6. 赎回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”的网络资源数据。

AF5DFDD5-D8BE-4834-B892-5C36815BEA41

运行测试代码后查看NET带宽数据如下

B5520481-E28A-4644-9D56-F34F5451B8BB

可以看到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”的网络资源数据。

F45365EB-5E1D-44D4-A678-BC24997FE41D

运行测试代码后查看NET带宽数据如下

949CB295-BE1D-4DFB-B7EB-FBB7C5694838

可以看到赎回NET带宽后EOS可用余额并没有增加,而用于NET带宽抵押的EOS的数量由101减少到了100,总量也由18877KB减少到了18680KB。那么问题来了,NET宽带资源已经被扣了,但是赎回的EOS没有到账,这是为什么呢?

2. 获取赎回期中的赎回金额

之前已经说过了,在赎回宽带资源的时候,存在三天的赎回期,因此我们的赎回交易已经完成了,但是需要三天后EOS才会到账。那么我们需要将此数据显示给用户查看。如何获取赎回的金额数据呢?

再使用cleos工具查看账号“lixutest1111”的账号信息,如下

098815BB-E442-43F9-968A-011DEBA205F1

可以看到“refund_request”字段数据中包含了“net_amount”字段的数据有“1.0000 EOS”,这正是我们赎回的EOS。之前没有赎回金额的时候,该字段为null。

6D550084-429C-477D-A78B-2CC976C61DE3

因此我们获取该字段数据返回给前端,用于显示赎回金额。

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()

运行测试代码后查看宽带资源数据如下

3190E7A5-593E-4C7A-B869-89D373E13E76

可以看到赎回NET、CPU带宽后EOS可用余额并没有增加,而用于NET带宽抵押的EOS的数量都减少了一个,宽带资源也相应地减少了。

再来看看账号“lixutest1111”赎回期中的赎回金额

ACAE59A0-8B9E-4AA0-87A7-6791018BB974

五、项目源码

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)
                }
            });
        }
    })
})

六、项目效果

233ED4C8-A3BE-4534-9353-3DF149726638

项目源码Github地址

版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者(微信:lixu1770105)取得同意并注明出处。

未经授权禁止转载、改编,转载请注明出处!

上一篇: 以太坊通证标准:ERC20系列、ERC721系列、ERC865
下一篇: 精通EOS:EOS 插件系统
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,723.74
37,091.22 USDT
+0.1%
ETH以太坊
¥14,416.22
2,019.90 USDT
-0.12%
USDT泰达币
¥7.20
1.01 USDT
0%
BNB币安币
¥1,625.40
227.74 USDT
+0.36%
XRP瑞波币
¥4.32
0.60460 USDT
+0.37%
USDC
¥7.14
1.00 USDT
+0.03%
SOLSolana
¥398.85
55.89 USDT
+1.54%
OKBOK币
¥398.61
55.85 USDT
-1.64%
ADA艾达币
¥2.68
0.37580 USDT
-1.16%
DOGE狗狗币
¥0.55160
0.07730 USDT
-1.52%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.402E-5 USDT
-18.95%
Gala
¥0.18
0.025374 USDT
-4.66%
dYdX
¥22.58
3.1918 USDT
-0.91%
比特股
¥0.05
0.006964 USDT
+4.28%
PancakeSwap
¥15.52
2.1936 USDT
-2.74%
Conflux
¥1.08
0.1524 USDT
-2.87%
Filecoin
¥31.45
4.4454 USDT
-0.69%
FTX Token
¥29.82
4.2155 USDT
+16.96%
Yield Guild Games
¥2.55
0.3608 USDT
-0.52%
Shiba Inu
¥0.00
8.14E-6 USDT
-2.51%
比特币
¥262,381.44
37091.22 USDT
+0.1%
比原链
¥0.07
0.010011 USDT
-4.38%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP