过年前比较系统地科普了一些区块链与虚拟币的知识,对如今韭菜盛行的币圈也有了一点粗浅了解。这篇博客就是记录一下自己在折腾过程中,想实现在 Excel 中调用 JSON API 数据碰到的问题,以及解决办法,其实就是一个 VB 实例,和区块链没太大关系

如今的挖矿设备已经从 CPU 挖矿、GPU 挖矿升级到了 ASIC 专用设备挖矿,并且还已经出现了几家“云挖矿”服务,也就是租用别人的矿机获得算力,再投入到矿池去挖矿,最后坐等收益分成,而不用承担硬件折旧降价等风险。

那么看到这里就会想了,租用算力的成本和最后获得的收益相比较,到底是赚还是亏呢?

目前有行情统计的虚拟币已经多达一千多种,其中可以通过挖矿(算力)获得的占大部分,而各币种的挖矿算法也不尽相同。所以我就想做个简单的计算工具,看看按当前的行情,通过云算力去挖几个常见的币种,到底是个什么收益情况。

大致的计算流程

把需要的关键数据列了一下,要是这些数据全部能通过公开 API 获得,那当然是极好的。但是找了一圈,只找到了标红线数据的 API,其它的数据只能手动查再手动填。

关键数据来源及 API 接口

真是翻遍了国内外各种网站,各大交易平台基本都提供实时交易价格 API,但是我用不上,好不容易才挑出了几个自己需要的。

租用算力单价:

提供“云挖矿”的服务还不多,国内有几家是直接租用专用矿机,相当于硬件承包,不够零活。最后选择了 NiceHash ,多种云算法零活购买,用多少付多少,关键是提供 API。

算力单价:https://api.nicehash.com/api?method=stats.global.current

常见币种汇率:

这个就不太容易找了,提供法币汇率的不少,虚拟币汇率的还不多。好在最后发现了CoinAPI.io,可以提供1600多种虚拟币及法币的实时汇率。需要先申请一个免费的 API Key,每天限100次查询,自己玩玩足够了。

比特币/人民币:https://rest.coinapi.io/v1/exchangerate/BTC/CNY?apikey=0000
比特币/以太坊:https://rest.coinapi.io/v1/exchangerate/BTC/ETH?apikey=0000
比特币/莱特币:https://rest.coinapi.io/v1/exchangerate/BTC/LTC?apikey=0000

PPS理论收益值:

挖矿的理论收益还找不到全网的标准值,都是各矿池给出的参考值,并且没发现提供 API 的。最后选择了 F2Pool 矿池的收益值作为参考,有好几个主流币种,只能手动填写,好在收益值波动不是特别频繁。

理论收益值:https://www.f2pool.com/help

选择用 Excel 表格折腾

关键数据准备好了,接下来就是动手。凭直觉肯定是用 HTML 写个页面,但细想了一下,这么大堆数字和计算公式,后续更新维护起来不方便。所以最终决定使用相对直观的 Excel 来做。

那么问题就来了,怎么把 JSON 数据搞进 Excel?

用内置的公式肯定是不行,只有把希望寄托到宏上面了,接下来的问题就是得用到 VB 语言。这个陌生的词,还是我大学时期考“计算机二级”看过的,距今十多年了,现在完全不知道从哪下手。

幸好在即将放弃的时候搜到一篇贴子 ,提供了一个在 Excel 中获取 JSON API 数据的实例,虽然不能直接像 JavaScript 那样访问各维对象的键值,至少有了现成的语法框架,再从 W3School 查了几个函数,改吧改吧还是得到了想要的结果。

直接上代码吧,加了注释:

Set nhDom = CreateObject("htmlfile")
    Set nhWin = nhDom.parentWindow
    Cells(1, 2) = "Time: " & Now  '打印获取时间

	'nhValue

    Set nhAPI = CreateObject("WinHttp.WinHttpRequest.5.1")
    nhURL = "https://api.nicehash.com/api?method=stats.global.current"  '主接口

    With nhAPI
        .Open "GET", nhURL, False
        .setRequestHeader "Referer", nhURL
        .send
        Cells(1, 1) = "Status: " & .Status  '打印主接口状态
        nhTxt = .responsetext
    End With

    nhArr1 = Split(nhTxt, ",{")  '按逗号括号分割成数组

    For i = 0 To UBound(nhArr1)  '开始第一层循环
        nhArr2 = Split(nhArr1(i), ",")  '按逗号分割成数组
        priceVal = Filter(nhArr2, "price")  '提取price键值对

        For j = 0 To UBound(nhArr2)  '开始第二层循环
            nhArr2(j) = Join(priceVal)  '转为字符串
            nhArr2(j) = Mid(nhArr2(j), InStrRev(nhArr2(j), ":") + 1, 6)  '提取冒号后的数值
        Next j

        Cells(i + 5, 5) = nhArr2(0)  '打印到指定单元格
    Next i

    'BTC to CNY

    Set cnyAPI = CreateObject("WinHttp.WinHttpRequest.5.1")
    cnyURL = "https://rest.coinapi.io/v1/exchangerate/BTC/CNY?apikey=0000"  '汇率接口,需要key

    With cnyAPI
        .Open "GET", cnyURL, False
        .setRequestHeader "Referer", cnyURL
        .send
        cnyTxt = .responsetext
    End With

    cnyArr1 = Split(cnyTxt, ",")  '按逗号分割成数组

    For x = 0 To UBound(cnyArr1)
        rateVal = Filter(cnyArr1, "rate")  '提取rate键值对
        cnyArr2 = Join(rateVal)  '转为字符串
        cnyArr2 = Mid(cnyArr2, InStrRev(cnyArr2, ":") + 1, 9)  '提取冒号后的数值,最多9位
    Next x

    Cells(1, 16) = cnyArr2  '打印到指定单元格

    'Replace 清理多余字符

    Cells.Replace What:=Chr(34), Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
    MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Cells.Replace What:="}", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
    MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Cells.Replace What:="]", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, _
    MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Cells.Columns.AutoFit
End Sub

上面代码省略了目标币/比特币的汇率,而每个币种的汇率都需要单独调用一个 API,可以参照 BTC to CNY 部分自行增加。

填入了关键数据,剩下的就是给表格配置计算公式,再调调样式就能用了。

到底值不值得挖?

通过上图就可以看出结果,某一天,你通过 NiceHash 买了一个单位的算力(因为各算法的常用算力单位不同,统称为一个单位),再投入到 F2Pool 矿池进行 PPS 挖矿,扣除了各种服务费后,那么一天下来的收益情况是:

  • 挖 BTC 比特币,赚 0.0014BTC,折合 76.61CNY
  • 挖 ETH 以太坊,赚 0.0007BTC,折合 40.24CNY
  • 挖 XMR 门罗币,亏 0.0367BTC,折合 -2023.96CNY,呵
  • 挖 LTC 莱特币,亏 0.1519BTC,折合 -8427.64CNY,呵呵

最后,其实上面的计算结果是没什么意义的,也就是自己了解一下行情,毕竟“币圈一天,人间一年”。