主页 > imtoken安卓版下载app > 39.《全链路体验浏览器挖矿》精读

39.《全链路体验浏览器挖矿》精读

imtoken安卓版下载app 2023-02-23 07:37:32

本期精读文章有:coinhive官方文档和门罗币官方文档

懒得看文章?没关系。

咦,官方文件是什么?

本期精读不同,重在实际操作,先操作感性理解,再引入相关概念,由浅入深,尽量不纠缠细节,更不掩盖环节。阅读本文需要一些加密货币的基础知识(如果你是开发者但对加密货币不太了解,可以参考这里。希望阅读本文后,同学们可以对加密货币有更深入、更真实的认识。加密货币领域,如果想了解更多细节,请参考文末的延伸阅读链接,列表是最好的起点。

需要注意的是,文中的很多说明默认都是基于XMR和BTC的。它们具有相同的起源并且具有非常相似的机制。因此,许多命题判断并不适用于所有数以千计的加密货币。恰恰相反,新货币的品种层出不穷,几乎打破了所有的常规,尝试了所有的可能性。下面将不解释这一点。

1 简介

首先,干货。10行代码,5分钟比特币挖矿算力怎么计算,无需部署,无需搭建直接浏览器挖矿。

在本地创建文件test.html,粘贴以下代码:

双击本地打开。等待 JS 加载,点击小部件“开始挖矿”。开始挖矿!如下所示

是的,数字已经在跳动,粉丝在工作,永无止境的挖矿已经开始。所以重要的是,开采的加密货币在哪里?原来我的 API 密钥仍然在上面的代码中使用,所以我仍然没有在那里挖掘自己:P 继续下一步

莱特币挖矿算力_比特币挖矿算力怎么计算_比特币挖矿速度计算

在coinhive中注册一个帐户并登录。它有什么作用?别着急,后面我会详细讲。在 coinhive/settings 中找到你的 API 密钥对,复制公钥,它看起来像 MUtCJzIDhrs01ERrf3qlqdawo35N0CYD

替换上面代码中的data-key部分,重新​​开始挖矿。好的,现在开采的门罗币(这是什么?见下一节)已经转移到你自己的 coinhive 账户。用下图说明,你名下计算的哈希总数为264K,当前难度换算为0.00002 Monero(Symbol:XMR)。目前难度是66G一个区块,一个区块奖励5.87 XMR,得到一个XMR是11.268G。264K/11.268G = 0.0000234. 这是您当前的收入。

怎么样,点击一下有没有玩999级浏览器的感觉。上述操作的便捷性和直接性,是基于无数前辈的开发和基础设施建设。越早在外地工作,越走越吃力,收据越丰富。现在加密货币已经到了成人阶段,并且逐渐稳步成熟。

接下来,我们重点关注上述过程的每一个环节,了解每一块拼图是如何组成全图的。

2 焦点

让我们从最后最接近用户的链接开始,一个一个关注,最后遍历整个链接。

2.1 从浏览器开始

这篇文章的标题叫做浏览器挖矿,也是贴合前端的部分。那么为什么你可以在浏览器中挖掘呢?为什么多个用户可以在多个终端浏览器中同时为同一个人(你)挖矿?

莱特币挖矿算力_比特币挖矿速度计算_比特币挖矿算力怎么计算

我们知道,挖矿是加密货币生成机制的通称。大多数主流采用工作证明(PoW)机制。最常见的 PoW 方法是使用网络中的所有节点作为矿工,每个节点根据区块链前面区块的现有信息计算出新的信息。这种新信息的计算方式往往是哈希函数,人为设置,需要巨大的算力和时间才能完成(其具体难度一般实时调整)。当一个节点运气好(也是依靠强大的算力)第一个计算出结果后,会将结果广播到网络上。所有其他节点都会验证结果(我们知道非对称加密算法,验证成本低,计算成本高),一旦确认,将停止在手头的计算下,确认计算结果。新的计算结果创建一个新的区块,区块链的高度增加一层,然后继续计算。每个区块的生成时间一般为 2-10 分钟。这个过程叫做挖矿。

既然是通用计算比特币挖矿算力怎么计算,既然是哈希值,那么民用级的CPU和GPU,浏览器或者任何沙盒、虚拟机、移动设备当然都可以。在我们的例子中,计算过程是分布式的,每个用户可以单独计算,并将结果分块发送回master进行汇总。这样就实现了最终用户-浏览器-贡献计算资源-交换XMR的过程。

这是对整个链接的描述。由此我们会有一些问题,例如:

告诉我计算的是什么哈希?为什么我应该计算 XMR 而不是比特币或其他?既然第一个计算出来的赢家通吃,为什么我的收入是线性的?这个描述不代表算力最大,难道一方总能算出来,另一方一无所获吗?

这取决于具体的算法,没有问题。比特币来了,XMR 是 CryptoNote Standard 008

看完这两种算法,我们对以上问题有了答案:

2.1.1 为什么要算 XMR 而不是比特币什么的

XMR 不是唯一的选择,但 BTC 也不是一个选择。因为双 SHA-265 在专业级 GPU 上的速度将比 CPU 快 10^4 倍(更多信息)。所以一百万用户一起做浏览器挖矿还是不如双向泰坦,也就失去了分发给终端用户的意义。而 CryptoNight 在 GPU 上仅比同等价值的 CPU 快 2 倍。此外,CryptoNight 算法也被设计为不适用于 ASIC。

比特币挖矿速度计算_莱特币挖矿算力_比特币挖矿算力怎么计算

如何实现?CryptoNight 算法明确指出,操作的主体是 Memory-Hard Loop,而不是 Computation-Hard Loop。每个循环都必须在内存中检索。实际运行 CryptoNight 时,CPU 会使用最快,最接近 ALU 的也是容量最小的 L3 Cache。显存虽然大,但没有L3 Cache那样极致的读写速度优化,而且由于显存读写成为瓶颈,GPU中大量的ALU无用。该图简要描述了 CryptoNight 循环体的结构:

2.1.2 算力最强的一方总能算出结果

看完比特币的具体算法,应该明白hash是通过不断改变nonce生成的。取一个随机值,算了,再随机取另一个nonce值……既然是随机取的,就不存在了,Winner总是赢。

2.1.3 为什么我的回报是线性的?

这是一个隐藏但非常重要的问题。答案是,这确实是赢家通吃。如果你的算力足够大,挖够长的时间总会轮到你,但收益会波动很大。

正因为如此,矿工们逐渐建立了矿池组织。大家把自己的算力放在一起,一起计算,然后不管这次到底是谁算的,都会按照贡献算力的比例来分配收益。矿池是一种加密货币在成立之初,去中心化的不可预知的结构得到了充分的推动,也产生了深远的影响。现在中国矿池的算力已经超过全网的50%,他们会在挖出的区块中标记矿池。,而这些矿池也在加密货币分叉的路线图中发挥着举足轻重的作用。

所以你的算力不是直接投入到 XMR 网络中,而是投入到矿池中。在我们的例子中,矿池是coinhive,它只是一个比较特殊的矿池,尤其是矿池的成员在浏览器中运行。这就是为什么您获得线性增益而不是全部或没有的原因。

自古以来,各行各业都自发成立了产业工会,建立了保险、行业规范等机制/为大家规范这些。加密行业也不例外。这是出乎意料和合理的。

比特币挖矿算力怎么计算_比特币挖矿速度计算_莱特币挖矿算力

2.2 浏览器发生了什么,或者,coinhive 做了什么

好的,我们已经弄清楚了一些基本的门罗币挖矿机制,我们来看看coinhive。我们已经知道,coinhive 帮助我们访问它的矿池,这样即使是最小的算力也可以按比例输出。但还有什么?? 最关键的一点,coinhive是如何将一个完整的挖矿过程分割成小块的,让一个可能并不强大的设备上的浏览器能够快速接收任务,快速完成并即时上传?

废话不多说,打开源代码。这个项目不是开源的。构建完成后,首先进行初步的格式处理。发现在后端,worker shard 端完成了一些工作。下面是一个松散的伪代码来总结客户端的主要成功。场景流程(注意很多地方都简化了):

  - start
  - loadWorkerResource
  - load worker-asmjs.min.js
  - CRYPTONIGHT_WORKER_BLOB = createObjectURL(Blob(response_of_worker-asmjs.min.js))
  - _startNow -> _connectAfterSelfTest
  - selfTest -> verify(testJob),
    testJob = {
      verify_id: "1",
      nonce: "204f150c",
      result: "6a9c7dea83b079ce0e012907dd6929bcb0aeec3c1f06c032ca7c3386432bca00",
      blob: "0606c6d8cfd005cad45b0306350a730b0354d52f1b6d671063824287ce4a82c971d109d56d1f1b00000000ee2d1d4fd7c18bdc1b24abb902ac8ecc3d201ffb5904de9e476a7bbb0f9ec1ab04"
    };
    verify = if (!this._isReady) {
        this.verifyJob = job
    } else {
        this.worker.postMessage(job)
    }
    // 实例化若干个JobThread, 每个对应一个worker, worker实际执行asmjs.min.js
  - _connect // verify成功, 终于建立连接. 根据public key固定hash到一个shard池然后随机选一个shard, 建立websocket
  - websocket.onmessage: if (type==job) work()
  - work:
    do { hash(input, output) } while !(meetTarget(output));
    websocket.postMessage({nonce, output}) // hash done successfully. submit

复制

看看这个过程,结合cns003 XMR区块链规范。XMR 的整体哈希输入很小,它是:

  - size of [block_header, Merkle root hash, and the number of
    transactions] in bytes (varint)
  - block_header,
  - Merkle root hash,
  - number of transactions (varint).

复制

莱特币挖矿算力_比特币挖矿算力怎么计算_比特币挖矿速度计算

这样通过websocket发送就没有问题了。之后是完全独立的计算,调整nonce来计算不同的hash结果。目标是当前难度的指示。

这使得整个链接更加清晰。思考以下问题:

2.2.1 为什么XMR适合分布式客户端计算

因为它可以利用每个用户的 CPU 和其中的高速 L3 Cache。这是集中执行的困难条件。

每当考虑是否将操作推送到客户端时,必须了解可以使用客户端的哪些资源,该资源在客户端是否具有明显优势,是否比后端集中执行更有利。很多时候的答案是优势不明显。那么网络通信成本、监管成本和额外开销可能不值得。

2.3 最后一步

此时,最后剩下的步骤非常标准和建模。作为一个矿场,coinhive 托管用户生产的加密货币。当用户发送提交 XMR 的请求时,他们需要提及自己的钱包地址以便妥善保管,例如 MyMonero。您也可以直接参考交易所的交易所,将其交易成其他货币,包括法币,然后以电汇等形式提现。

如果你对钱包或交易所感兴趣(这两个也是大话题,比如钱包分为硬件钱包和软件钱包,离线冷钱包和在线热钱包,私钥和恢复种子。交易所中有各种交易。是的,有杠杆、期货、空头和多头、多种挂单类型等),请参见此处和此处。

还有 3 个讨论

讨论地址为:精读《全链路体验浏览器挖掘》第55期dt-fe/weekly