精华内容
下载资源
问答
  • 以太坊挖矿软件
    万次阅读 热门讨论
    2021-03-09 02:39:05

    目前数字货币有很多种,比如比特币,以太坊,莱特币等。因币种的不同,其挖矿的算法也不同,总的来说有专业算法矿机和显卡(GUP)矿机。既然是新手我们来讲一下显卡矿机,目前显卡挖矿收益最大的就是以太坊,同时以挖ETH(以太坊)为例,讲解新手如何挖矿,如下图:
    在这里插入图片描述
    挖矿需要三部分:钱包、矿池和挖矿软件。
    1.钱包

    • 钱包的话需要注册,实名认证,找到对应货币,比如eth,点充值,找到自己的钱包地址,粘贴到挖矿软件里。然后挖矿软件点开始就行了。后面我会写一篇专门的钱包的文章,既然是新手,推荐使用云钱包,或者三大交易所钱包,今天以我使用的钱包Cobo钱包(云钱包)为例:

    在这里插入图片描述

    2.矿池

    • 比如F2Pool矿池(鱼池),星火矿池,一般情况下你的贡献度达到0.1个ETH币就会给你打一次。矿池也都是大同小异,1%-2%的抽水。当然,矿池其实也可以不注册,只要你在软件里填写对你的钱包地址即可。我使用的矿池为星火矿池,如下图:
      在这里插入图片描述

    (给小白补充一下,散户只靠自己基本是没办法挖到的,所以就有了矿池,然后按照你机器的算力给你分成。抽水方式也有很多,比较稳定的是pps+,一般是1%-2%)

    3.挖矿软件
    在这里插入图片描述

    软件蛮多的,试了几个大同小异,一般主流的都不抽水。使用方法也很简单,钱包地址填写对,矿池选对,点击开始,一键挖矿。比如说轻松矿工:

    上图中的钱包就填你上一步注册钱包的ETH地址。

    最后给大家几点需要注意的地方:

    1.ETH挖矿,需要大于4G的显卡(等于4G的也不行)

    2.显卡挖矿一定要做好扇热,能够延长显卡的使用时间

    3.以目前的行情即使是使用笔记本挖矿,也是能够有收益的

    最后欢迎大家关注,评论,收藏

    更多相关内容
  • 以太坊挖矿软件配置

    千次阅读 2020-12-23 15:39:37
    关键词: 以太坊挖矿 挖矿软件配置 ETH挖矿软件配件在挖矿系统选择上,可以选择windows 或者Linux,我们以windows为例 。(如果想要超频的矿友建议使用Windows系统,因为它对驱动的支持全面,超频工具种类多)系统设置...

    关键词: 以太坊挖矿  挖矿软件配置  ETH挖矿软件配件

    在挖矿系统选择上,可以选择windows 或者Linux,我们以windows为例 。(如果想要超频的矿友建议使用Windows系统,因为它对驱动的支持全面,超频工具种类多)

    系统设置步骤:

    一.首先我们要为矿机安装一个操作系统,本教程将按照Windows10系统进行讲解。

    这里是win10系统的下载地址:https://msdn.itellyou.cn/(1.选择操作系统 2.选择windows 10 3.根据自己的计算机型号选择对应版本下载)

    二.对系统进行挖矿适配:

    1.将视觉效果调到最佳,避免因系统原因限制显卡的性能。

    (1).点击屏幕左下角搜索,输入“系统”,点击“系统”选项卡进入系统配置

    (2).点击“高级系统设置”

    (3).选择“高级”标签,然后单击性能模块的“设置”按钮

    (4).选择“视觉效果”标签,然后点击“调整为最佳性能”。

    (5).选择“高级”标签,单击“虚拟内存”模块的“更改”按钮

    (6).选择“自定义大小”。“初始大小”设置为16384,“最大值”设置为20480,然后单击“设置”按钮确定新的设置(注意:这里一定要单击一下“设置”按钮,直接点 击确定保存不生效), 最后单击“确定”按钮保存。在“性能效果”和“系统属性”两个窗口均点确定按钮,保存新的设置。

    2.关闭windows系统更新。保证矿机稳定运行,不会受到系统更新的影响。不同版本的win10系统操作的方法会有区别,这里介绍给大家两种最常见的关闭方式。

    方式一:

    (1).按下键盘上windows徽标键 + R键 ,打开运行窗口,输入“gpedit.msc”

    (2). 打开组策略编辑器后,依次点击计算机配置-管理模板-Windows组件菜单选项

    (3). 在Windows组件菜单窗口中,双击“Windows更新”子菜单项,然后在右侧的配置选项中找到“配置自动更新”

    (4).双击“配置自动更新”进入,选择“已禁用”,然后单击“确定”。即可关闭windows更新。

    方式二:

    (1).单击屏幕左下角搜索,输入“服务”,单击上面的服务选项卡,打开服务界面

    (2).鼠标单击“自然身份验证”

    (3).键盘切换为英文输入法按下“w”键,会跳到以w开头的文件处,然后向下找到“Windows Update”

    (4).双击进入“Windows Update”,“启用类型”选为“禁用”,“服务状态”点击“停止”,然后单击确定按钮。即可关闭windows更新。

    这是禁用后的状态

    3.关闭Windows系统防火墙

    (1).右键点击任务栏,打开任务管理器

    (2).选择“启动”标签,找到“Windows Defender”选中,然后点击右下角的禁用。即可关闭Windows系统防火墙。

    4.调整电源与睡眠模式设置

    (1).在屏幕左下角点击搜索,输入“设置”,单击“设置”选项卡进入设置页面

    (2).点击“系统”进入系统设置

    (3).找到“电源和睡眠”选项,单击。

    (4).在屏幕模块和睡眠模块的选项中都选择“从不”。(如果有四个选择框的所有选择框都选“从不”)

    做完以上步骤,我们的矿机操作系统就已经适配完毕了。 为了便于您日后对矿机的调整及维护,我们强烈建议您配置矿机的远程连接,具体配置步骤如下:

    1.设置网络,查看矿机IP并记录。

    2. 开启远程连接【设置RDC安全选项(支持mac访问)】

    3.设置完毕,远程登录矿机IP即可。

    下面为显卡驱动安装:

    A卡:http://support.amd.com/zh-cn/download在这个网址中找到匹配的显卡驱动,并下载。

    在安装时,如果安装不成功,请使用下面的工具卸载,然后重新安装驱动

    在需要卸载AMD驱动时我们推荐使用AMD CleanUninstall Utility 。下载地址:http://support.amd.com/en-us/kb-articles/Pages/AMD-Clean-Uninstall-Utility.aspx(复制到地址栏进入下载)

    安装完成后在控制面板-设备和声音-设备管理器-显示适配器中查看,如果显示的显卡数量与实际组装数量不符,就说明在硬件装配上或驱动方面存在问题。

    N卡:http://www.nvidia.cn/Download/index.aspx?lang=cn在这个网址中找到匹配的显卡驱动,并下载。

    N卡在安装驱动时会先检查是否有旧版,如果有就先卸载然后安装新版驱动。(这点N卡要比A卡做的更人性化一点)

    安装完成后在控制面板-设备和声音-设备管理器-显示适配器中查看,如果显示的显卡数量与实际组装数量不符,就说明在硬件装配上或驱动方面存在问题。

    注:在安装显卡驱动时,只需为一块显卡安装驱动,其余的显卡会自动按序安装,在安装过程中显示器有可能出现无信号的情况,这是系统在给每个显卡安装驱动。您需等待半小时左右即可恢复正常。

    挖矿软件的使用

    在挖矿软件中,我们比较推荐使用Claymore,因为它稳定而且高效,并且它一直在更新维护,不断的改良算法、提高算力。所以建议大家使用最新版本的Claymore软件。

    Claymore使用教程:

    1.下载最新版本的Claymore软件地址:https://pan.baidu.com/s/1i58E6kl(提取码: 1srt)

    2.下载完成后把压缩包解压(解压码:dragonpool)

    3.解压完成后找到名为start_only_eth.bat 的文件,右键单击,在出现的菜单里选择编辑,单击进入

    4.把代码中中文部分修改为自己的钱包地址即可,保存并退出(如果您的矿机数量过多可以在-eworker参数后为您的矿机命名)        5.双击start_only_eth.bat文件开始挖矿

    如果您使用的是ethminer工具需要在您的启动文件中配置如下设置:

    setxGPU_FORCE_64BIT_PTR 0

    setxGPU_MAX_HEAP_SIZE 100

    setxGPU_USE_SYNC_OBJECTS 1

    setxGPU_MAX_ALLOC_PERCENT 100

    setxGPU_SINGLE_ALLOC_PERCENT 100

    启动之后,可在龙池官网查看挖矿收益:

    http://pool.dragonpool.cn/

    更精彩内容:http://www.dragonpool.cn

    展开全文
  • 以太坊挖矿算法和难度调整(四)

    千次阅读 2022-01-09 18:57:31
    以太坊挖矿算法及其难度调整.,

    以太坊 挖矿算法

    对于基于工作量证明的系统来说,挖矿是保障区块链安全的重要手段,有时候说Block chain is secured by mining,比特币里面的挖矿算法总的来说是比较成功的,经受了时间的检验,到目前为止,没有人发现,也没有什么大的漏洞。

    bug bounty:bounty(赏金)

    美国电影有一个叫bounty hunter(赏金猎人),专门去抓那些政府悬赏捉拿的逃犯

    bug bounty:有的公司悬赏来找软件中的漏洞,如果能找到软件中的安全漏洞就可以得到一笔赏金。

    比特币的挖矿算法是一个天然的bug bounty,如果你能找到里面的漏洞,或者是某一个挖矿的捷径就能取得很大的利益。但是到目前为止还没有人发现有什么捷径可走,所以比特币的挖矿算法总的来说是比较成功的,是经受住时间检验的,但是比特币的挖矿算法也有一些值得改进得地方,其中有一个保守争议得问题就是挖矿设备得专业化,有普通的计算机挖不倒矿,只能用专门的设备,专用的ASIC芯片来挖矿,那么很多人认为这种去中心化的做法和去中心化的理念是背道而驰的,也跟比特币的设计初衷相违背的,中本聪最早的一篇论文,提出One cpu,one vote,理想状况下,应该让普通老百姓也能参与挖矿过程,就用家里的桌面机,笔记本电脑,甚至手机来挖矿,这样也更安全,因为算力分散之后,有恶意的攻击者想要聚集到51%的算力发动攻击,这个难度就会大得多。所以比特币之后出现的加密货币包括以太坊设计mining puzzle的时候,一个目标就是要做到ASIC resistance,那么怎么才能设计出对ASIC芯片不友好的mining puzzle呢?

    一个常用的做法就是增加mining puzzle对内存访问的需求,也就是所谓的memory hard mining puzzle,ASIC芯片相对于普通计算机而言,主要优势是算力强,但是在内存访问的性能上没有那么大的优势,同样的价格买一个ASIC矿机和买一个普通的计算机,这个ASIC矿机的计算能力是普通计算机的几千倍,但是内存访问方面的性能差距远远没有这么大,所以能设计出一个对内存要求很高的puzzle,就能起到遏制芯片的作用。

    • 怎么设计呢?

    一个早期的例子是莱特币LiteCoin,曾经是市值仅次于比特币的第二大加密货币,他用的Puzzle是基于Scrypt,这个是对内存要求很高的哈希函数,以前用于计算机安全领域,跟密码相关,那么他的具体设计思想是说,开一个很大的数组,然后按照顺序填充一些伪随机数,比如说有一个种子节点,seed的值通过一些运算,算出一个数来,填在第一个位置,然后后面每个位置都是前一个位置的值取哈希得到的,伪随机数是说取哈希值后的值你也不知道,看上去就是乱七八糟的数一样,就好像随机数,但我们不可能真的用随机数,真的用随机数没法验证。填充完之后,里面的数值是有前后依赖关系的,是从第一个数依次算出来的,然后需要求解这个puzzle的时候,按照伪随机数的顺序从数组当中读取一些数,每次读取的位置跟前一个数相关,比如说要解puzzle了,一开始读取A这个位置的数,把A位置的值读取出来之后,根据他的取值进行一些运算,算出下次要读取的位置,比如说是B这个位置,然后把B这个位置的数读出来,再进行一些运算得到下一个读取的位置,比如说C这个位置,这个也是一种伪随机数的顺序,因为经过哈希运算之后得到下一个读取的位置。
    image-20210813211553593

    这样做的好处:
    如果这个数组开的足够大的时候,挖矿的矿工就是memory hard,因为如果不保存数组,那么挖矿的计算复杂度会大幅度上升,比如说,在读取数组里面这些数的时候,你没有保存数组,那要怎么办,比如说求解puzzle的时候,一开始在A这个位置,如果没有数组的话,还得从第一个数,依次算出这个值,然后要读取第二个位置的数,这些没有存起来,再算一遍算到B位置的值,下面是C,也一样,要算到C位置的值,这个计算复杂度会大幅度上升。

    所以要想高效地挖矿,这个内存区域是需要保存的,有的矿工可能保存一部分内存区的内容,比如说,这个数组当中只保留奇数位置地元素,偶数位置地元素就不存了,这样数组可以少一半,那用到偶数位置的数怎么办呢,要根据另外一半去算一下,计算复杂度会提高一点,但是内存量可以减小一半,管它叫做time-memory trade off。

    这个设计的核心思想是不能像比特币那样主要进行哈希运算,比特币其实也不是取一次哈希,他是取两次哈希,但这个不够,要增加他的运算过程中对内存访问的需求,要设计一个对ASIC芯片不友好的,对普通计算机能参与的。设计的任务更像是普通计算机干的事情,而不是像一个挖矿专用的ASIC芯片干的事情,普通计算机内存很大,就要利用这个特性,设计puzzle对资源的需求,特别像是普通计算机对资源的配备比例。

    这个puzzle好的地方:对于矿工挖矿的时候是memory hard。

    坏的地方:对轻节点来说也是memory hard。

    前面讲过设计puzzle的一个原则:difficult to solve,but easy to verify,这个问题就在于验证这个puzzle需要的内存区域跟求解这个puzzle需要的区域几乎是一样大的,轻节点验证的时候也得保存这个数组,要不然他的计算复杂度也是大幅度提高,对于scrypt早期计算机的安全领域,这个密码方面的话他不是一个问题,他没有轻节点验证这个问题,但对于我们这个来说是不行的,这样造成一个结果就是莱特币在真正使用的时候,这个内存区域不敢设置的太大,比如说你设一个1G的数组,这对于计算机来说是不大的,但是如果是一个手机上的app,1G的内存可能就太大了,因为这个原因,实际莱特币在使用的时候,这个数组只有128Ks,这个是非常小的,连1M都不到,就是为了照顾轻节点,那么最后的效果怎么样呢

    当初莱特币在发行的时候,目标不仅仅是ASIC resistance,还是GPU resistance,就是挖矿最好连GPU都不要用,都用普通的CPU挖矿就行了,结果后来就出现GPU挖矿的,再后来就出现用ASIC芯片挖矿的,实践证明莱特币要求的128k内存不足以对ASIC芯片的生产和设计带来实际上的障碍,所以从这一点来说,莱特币的设计目标没有达到,但是他早期宣传的设计目标对于解决能启动问题是很有帮助的,任何一个加密货币,都存在能启动问题,包括比特币,一开始的时候,没有人知道这个加密货币,你就发行一个货币,也没有人理你,那怎么办呢,没有人参与,这是一个问题,而且对于基于工作量证明的加密货币来说,挖矿人太少是不安全的,因为发动恶意攻击难度太低,比特币早期也是不安全的,一开始只有中本聪一个人在用,后来变成少数几个人在挖矿,那个时候,如果想对比特币发动恶意攻击是很容易的,那么比特币是怎么解决这个能启动的问题呢,现在谁也说不清楚了,但总的来说是一个循坏迭代的过程,中本聪宣传的多了,对比特币感兴趣的人就多了,然后参与挖矿人就多了,变得更安全,价值也提高了,然后对比特币感兴趣的人就更多了,挖矿的人也更多了,然后比特币变得更安全了,价值就更进一步提高了,形成一个良性循坏。莱特币虽然没有达到当初的设计目标,但是他早期的宣传,更民主,让更多人参与的理念对于聚集人气来说是很重要的,所以莱特币一直到现在也是一个比较主流的加密货币,除了这个mining puzzle之外,莱特币跟比特币的另一个区别是来特比的出块速度是比特币的4倍,他的出块间隔是两分半,而不是十分钟,除此之外,这两种加密货币基本上是一样的。

    以太坊也是用一种memory hard mining puzzle,但是在设计上,跟莱特币有很大的不同

    以太坊用的是两个数据集,一大一小,小的是16M cache,大的数据集是一个1G dataset,DAG,这1G的数据集是从16M的cache生成出来的,为什么要设计成一大一小的两个数据集呢,就是为了便于验证,轻节点只要保存16M cache就行了,只有需要挖矿的矿工才需要保存1G的dataset。

    基本思想:
    小的数据集的生成方式跟前面讲的数组的生成方式是比较类似的,首先从一个种子节点seed,进行一些运算,算出数组的第一个元素,然后依次取哈希,第一个元素取哈希得到第二个元素,第二个元素取哈希得到第三个元素,这样从前往后,把这个数组从前往后,填充一些伪随机数得到一个cache,下面和莱特币就不一样了,莱特币是直接从数组当中按照伪随机数的顺序读取一些数,然后进行运算,以太坊是要先生成一个更大的数组,这里没有按比例画,就这个大数组应该比下面的小数组要大得多,下图看就大了一点,因为黑板画不下了,就意思意思,而且小的cache和大的dataset都是定期增长的,每隔一段时间,大小要增大,因为计算机的内存容量也是定期增长的,比如说这个大的dataset涨到了2.5G,就已经不是一个G了,那大的dataset是怎么生成的呢,他的每个元素小的cache里按照伪随机数的顺序读取一些元素,方法和刚才讲的莱特币里面求解puzzle的过程是类似的,比如说,第一次读取A位置的元素,读取完之后,对当前的哈希值进行一些更新迭代,算出下一个要读取的位置,比如说B这个位置,然后把B位置的数再进行一些哈希值的更新,算出C这个位置,那么从这个cache里面这么来回读,一共读256次,读256个数,最后算出来一个数放在大的dataset的第一个元素,然后第二个元素也是一样的,dataset的每个元素都是从这个cache里面按照伪随机数的顺序,不断进行迭代更新,最后得到一个值存在里面,然后求解puzzle的时候,用的是大数据集中的数,这个cache是不用的,按照伪随机数的顺序在大的数据集中读取128个数,就是一开始的时候根据区块的块头,包括里面的nonce值算出一个初始的哈希,根据这个哈希,映射到大数据集里面的某个位置,把这个数读取出来,然后进行一些运算,算出下一个要读取的位置,比如说又在大数据集里面的另一个位置,又把这个数读取出来,这里有一个区别:他每次读取的时候除了计算出这个元素的位置之外,还要把相邻元素也要读取出来,这个例子当中每次读取的时候是读取两个相邻元素,这样循环64次,每次读两个元素,所以一共是符合难度要求128个数,最后算出一个哈希值来,跟挖矿难度的目标域值比较是不是符合难度要求,如果不是,把block header 里面的nonce替换一下,换另外一个nonce,因为换了nonce之后,第一次算的那个哈希值就变了,然后重复这个过程,根据这个哈希值找到数组中的元素,读取两个相邻的元素,反复循环64次,再得到一个哈希值,然后再去比较。
    image-20210813211608230

    上面讲的比较抽象,下面是写的一个伪代码,没有直接用以太坊中的源代码,这个伪代码省略了源代码中的一些实现的细节,更有利于理解。


    ethash算法伪代码

    第一步首先生成16M cache,cache中每个元素都是64个字节的哈希值,生成的方法与莱特币类似,第一个元素是种子的哈希,就是这个seed的哈希,后面每个元素是前一个的哈希,这个哈希的内容每隔3万个区块会变化一次,这个seed每隔3万个区块会发生变化,然后重新生成cache中的内容,同时cache的容量要增加原始大小的1/128,也就是16M的1/128=128K。
    image-20210813211618636

    第二步是从这个cache生成1G的大数据集,这个函数的功能是通过cache来生成dataset中的第i个元素,基本思想是按照伪随机数的顺序读取cache中的256个数,每次读取的位置是由上一个位置的数值经过计算得到的,这里用的两个函数get_int_from_item和make_item,是自己定义的,源代码中是没有的,把源代码中一些相关的内容总结成了这两个函数,可以避免源代码中不是很重要的细节,这个get_int_from_item函数就是用当前算出来的哈希值求出下一个要读取的位置,然后make_item函数用cache中这个位置的数和当前的哈希值计算出下一个哈希值,这样迭代256轮,最后得到一个64字节的哈希值,作为大数据集中的第i个元素。

    image-20210813211633339

    这个calc_dataset是生成整个1G数据集的过程,就是不断调用前的函数来依次生成大数据集中的每个元素

    image-20210813211643556

    这一页的两个函数,分别是矿工用来挖矿的函数,和轻节点用来验证的函数,先看一下上面这个函数,这个矿工用来挖矿的函数,他有四个参数,header是当前要生成的区块的块头,以太坊和比特币一样,挖矿只用到块头的信息,这样设计的原因,是轻节点只下载块头,就可以验证这个区块是否符合挖矿的难度要求,第二个参数nonce就是当前尝试的nonce值,以太坊就像比特币一样,挖矿的时候,也是要尝试大量的nonce才能找到一个符合要求的,第三个参数full_size是大数据集中元素的个数,元素的个数每3万个区块会增加一次,增加原始大小的1/128也就是1G的1/128=8M,最后参数dataset就是前面生成的大数据集,挖矿的过程是这样的,首先根据块头的信息,和当前Nonce算出一个初始哈希值,然后要经过64轮的循环,每一轮循环读取大数据集中两个相邻的数,读取的位置是由当前哈希值计算出来的,然后再根据这个位置上的数值来更新当前的哈希值,这跟前面生成大数据集的方法是类似的,循环64次,最后返回一个哈希值,跟挖矿难度目标域值相比较。

    这里提个小问题,每次读取大数据集中两个相邻位置的哈希值,这两个哈希值有什么联系吗?

    其实是没有联系的,他们虽然位置相邻,但是生成的过程是独立的,每个都是由前面那个16M的cache中的256个数生成的,而且256个数的位置是按照伪随机数的顺序产生的,这个是构造大数据集的一个特点,每个元素独立生成,这才给轻节点的验证提供了方便,所以每次读取的相邻两个位置的哈希值是没有什么联系的。

    下面这个函数是轻节点用来验证的函数,也是有四个参数,但是含义跟上面那个矿工用的函数有所不同,轻节点不挖矿,当他收到某个矿工发的区块的时候,这里用来验证的函数的第一个参数header是这个区块的块头,第二参数是包含在这个块头里的Nonce,是发布这个区块的矿工选好的,轻节点的任务是验证这个nonce是否符合要求,验证用的是16M的cache,也就是最后的参数cache,注意,第三个参数full_size仍然是大数据集的元素个数,跟上面那个挖矿的那个full_size含义是一样的,并不是cache中的元素个数,验证的过程也是64轮循环,看上去与挖矿的过程类似,只有一个地方有区别,比较这一页的上下两个函数,有什么区别?

    每次需要从大数据集中读取元素的时候,因为轻节点没有保留大数据集,所以要从cache中重新生成其他地方的代码逻辑是一样的,每次从当前的哈希值算出要读取的元素的位置,这个位置是指在在大数据集中的位置,但是轻节点并没有这个大数据集,所以要从cache中生成大数据集中这个位置的元素,我们前面说过大数据集中每个元素都可以独立生成出来。
    image-20210813223417890

    最后这个函数,是矿工挖矿的主循环,其实是不断尝试nonce的过程,这里的target就是挖矿的难度目标,跟比特币类似,也是可以动态调整的,nonce的可能取值是从0-2的64次方,对每个nonce用前面讲的那个函数算出一个哈希值,看看是不是小于难度目标,如果不行的话,就再试下一个nonce。

    image-20210813223432497

    最后这一页是前面讲过的所有函数的一个汇总,同时解释了为什么轻节点可以只保存cache,而矿工要保存整个大数据集。其实轻节点做一次验证的计算量也不算少,同样要经过64轮循环,每次循环用到大数据集中的两个数,所以是128个数,每个数是从cache里的256个数计算得到的,跟比特币相比,以太坊中验证一个nonce的计算量要大很多,但是仍然在可以接受的范围内,相比之下,如果矿工每次都这么折腾的话,代价就太大了,因为要尝试的nonce就太多了。

    image-20210813223449656


    那以太坊设计的这个puzzle实际效果怎么样呢?

    到目前为止,以太坊挖矿主要还是以GPU为主,用ASIC矿机的很少,所以从这一点来说,他比莱特币来说要成功,起到了ASIC resistance的作用,这个跟以太坊的挖矿算法需要的大内存是很有关系的,这个挖矿算法就是ethash,这个起的很有意思,前三个字母eth是以太坊的代码,后面这个hash,h用了两遍,矿工挖矿需要1G的内存,跟莱特币的128K比,差了有八千多倍,即使是16M的cache跟128K比,也要大了一百多倍,所以这个差距是很大的,而且还是按照这两个数据集的最初的大小算的,因为定期会增长嘛,如果按照现在这个2.5G差距就更大了,以太坊没有出现ASIC矿机还有另外一个原因,以太坊从很早就计划要从工作量证明转移到权益证明,所谓的PoW->PoS(Proof of Stake),所谓的权益证明,就是按照所占的权益进行投票来形成共识,就不用挖矿了,权益证明是不挖矿,就类似于股份公司按照股票多少来进行投票,这个对于ASIC矿机的厂商来说是个威胁,因为ASIC芯片的研发周期是很长的,一款芯片从设计研发流片到最后生产出来,一年的周期就已经算是很快的了,而且研发的成本也很高,将来以太坊转入权益证明之后,就不挖矿,那些投入的研发费用就白费了,其实到目前为止,以太坊是基于工作量证明,以太坊很早就说要转入权益证明,但是转移的时间点一再往后推迟,到现在也没转过来,但是他不停的宣称要这么做,所以要想达到ASIC resistance一个简单的办法就是不断地吓唬大家:大家注意哦,下面要搞权益证明就不挖矿了,所以你就不要设计ASIC矿机了,你设计出来到时候也没用了,因为要设计一年嘛,一年以后,我们就不挖矿了。

    等过了一年,不行,还是得继续挖矿,那怎么办呢,再吓唬一次:我们真的再挖一年,然后就再也不挖了,所以你还是不要再设计了。

    从历史看,以太坊成为一个主流的加密货币,其实就是最近两年的事情(2018),以前市值很小的时候,没有人会去设计ASIC芯片,因为划不来啊,无利可图,等到市值上来之后呢,你这么吓唬他几次,就能起到ASIC resistance的作用,这也是另外一方面的原因。

    关于以太坊的挖矿还有一个要说明的

    以太坊中采用了预挖矿,叫pre-mining,所谓预挖矿并不是说真的去挖矿,而是说,在当初发行货币的时候,预留一部分货币给以太坊的开发者,有点像创业公司会留一部分股票给创始人和早期员工一样,将来这个加密货币成功了的话,这些预留的币就变得是很值钱了。

    像以太坊的早期开发者,现在就都很有钱,比北大教授要有钱多了,跟这个比特币相比呢,比特币就没有采用pre-mining的模式,所有的比特币都是挖出来的,只不过早期的时候,挖矿的难度,要容易的多,与pre-mining相关的一个概念叫pre-sale(就是把pre-mining预留的那些币通过出售的方法来换取一些资产用于加密货币的开发工作),有点类似于众筹,如果你看好这个加密货币的未来,可以在pre-sale的时候买入,将来这个加密货币成功之后呢,同样可以赚很大一笔钱

    下面看一下以太坊上的一些统计数据

    下面这个图显示了以太坊中货币供应量的分布情况,总共有大约一亿个以太币,每个以太币的市场价格是五百多美元,这里的数据是以前的,现在以太币的价格没有了解,整个以太坊的市值大概是五百多亿美元,下面这个图显示了这一亿的来源,绝大部分是通过pre-mining方法产生的,这个蓝色部分Genesis是指创世纪块中就已经包含了这些以太币,上线以后,再挖出来的以太币中Block Rewrad占了绝大多数,Uncle Reward就是前面讲的叔父区块得到的奖励只占很少一部分。有没有觉得毁三观,挖矿挖的再努力,关键还是不能输在起跑线上。
    image-20210813223510176

    下图显示的是最大的以太坊矿池所占的算力比重,可以看出挖矿集中化的程度也是很高的,尤其是最大的几个矿池所占的比例很高,与比特币的情况类似

    image-20210813223520824

    下图显示的是以太币的价格随时间变化的情况,可以看到在以太坊早期的那几年价格基本没怎么涨,真正的大涨是2017年,这一年的价格涨得非常猛,直到2018年初达到了顶峰,然后开始走下坡路,这个图显示的是以太坊的市值,叫Market Capitalization,这个跟价格的走势基本上是符合的

    image-20210813223534420

    下图显示的是以太坊HashRate的变化情况,HashRate是指系统中所有的矿工加在一起,每秒钟计算的哈希次数,可以看到HashRate从总体来说是处于上升趋势的,而且也是从2017年开始大幅度上升的,2018年以太币的价格下跌了不少,HashRate总体上趋于平稳,并没有出现明显的下降,不同的货币入宫采用的mining puzzle不一样的话,那么它们的HashRate是不可比的,比特币和以太坊的HashRate就不能直接比较,因为以太坊中尝试一个nonce的工作量要比比特币大得多。
    image-20210813223546195

    这篇文章讲的是挖矿的算法设计要尽可能让通用的设备也能参加,参加的人越多,挖矿的过程越民主,那么区块链就越安全,这也是为什么莱特币,以太坊要设计memory hard mining puzzle,但是也有一些人有不同的观点,认为让通用设备参加反而是不安全的,像比特币那样只能用专门的ASIC芯片挖矿才是更安全的,假设要对比特币系统发动攻击,需要投入大量资金买入ASIC矿机,才能聚集到发动攻击所需要的算力,而这些矿机除了挖矿之外,干不了别的任何事情,而且是为某一个加密货币设计的加密芯片,只能挖这一种加密货币,像比特币的ASIC芯片去挖莱特币就不行,所以呢,发动这个攻击的成本是很高的,早期需要投入大量的硬件资源,而且一旦攻击成功比特币系统的安全性被证明存在安全问题,大家对比特币的信心会大幅度下跌,然后比特币的价格也会跳水,这样早期投入的硬件成本就收不回来了,因为比特币本身就不值钱了,你买的那些比特币的矿机当然也不值钱了。相反如果让通用设别参与挖矿的话,发动攻击的成本就大幅度下降。所以有些人认为让通用设备参与挖矿是不安全的,让ASIC矿机一统天下才是安全的

    挖矿难度调整

    比特币是每隔2016个区块会调整一下挖矿难度,目的是维持出块时间在十分钟左右,以太坊是每个区块都有可能调整挖矿难度,调整的方法也比较复杂也改过好几个版本,网上的一些资料,像论坛,博客对这些介绍也有很多不一致的地方包括以太坊的黄皮书和实际代码也有一些出入,我们遵循以代码为准的原则,从以太坊的代码当中找到了这部分的内容,把他们总结了一个ppt。

    image-20210813224338610

    这是难度调整的公式,这里的H是指当前这个区块,Hi是这个区块的序号,D(H)是这个区块当前的难度,那么这个难度调整的公式有两部分,这个max括号里的是第一部分,管它叫基础部分,目的是为了维持出块时间大概在十五秒左右,后面跟的是第二部分,也称为难度炸弹,主要是为了向权益证明过渡,将来的以太坊想把共识机制从工作量证明逐步转入权益证明。

    第一部分调整的方法是在父区块的难度基础上,加上一些自调整的部分,这个P(H)就是红框里的父区块的难度

    所谓的父区块就是当前区块链的最后一个区块,对于我们正在挖的这个区块来说,他是这个区块的父区块。

    第一部分的难度调整有一个下限,就是这里的D0,131072,这一部分无论你去怎么调整,最小不能低于这个难度,这是为了保证挖矿有一个最低的难度。

    image-20210813224411745

    后面的红框里的就是难度炸弹部分

    image-20210813224423303

    先看一下第一部分,这个x是调整的力度,是父区块的难度除以2048,所以调整难度时,无论上调下调,都是按照这个力度的整数倍进行调整的,按照父区块的难度的1/2048作为调整的一个单位。

    image-20210813224433619

    下面那个奇怪的符号是y-后面的一项,奇怪符号的取值跟两个因素有关,一个是出块时间,另外一个是有没有叔父区块,就是父区块有没有叔父区块,那么为什么要跟叔父区块相关呢?
    因为如果是当前区块的最后一个区块,它包含有一个叔父区块的话,这个时候,系统中的货币总供应量是增加的,因为叔父区块要得到出块奖励,那么包含叔父区块的这个父区块也有得到一定的奖励,所以这两个合在一起就会使货币的总供应量增加,那么他为了维持系统中的总供应量的稳定,一种平衡,所以挖这个区块的难度就要提高一个单元,
    image-20210813224448052

    后面这个-99是说难度调整系数部分有一个下限,Max前面这部分有可能是正的,有可能是负的,如果是负的话,那么难度要往下调,最多一次性只能调整99个单元,每个单位是父区块难度的1/2048,所以一次性下调难度最多是99/2048,

    image-20210813224457860

    仔细看一下这个公式,这个y就是我们说的取决于有没有叔父区块,有叔父区块的话,y=2,没有叔父区块的话,y=1,那么不论是哪种情况,都是常数,所以都是常数减去后面这一项,但如果后面这一项比前面这个常数大的话,减出来是个负数,说明这个难度是要下调的。相反,如果后面那一项比前面那一项要小的话,减出来就是个正数,说明难度要上调。
    image-20210813224510962

    看几个具体的例子,这个Hs是当前区块的时间戳

    image-20210813224521461

    P(H)是父区块的时间戳,这两项相减,就是当前区块的出块间隔,这个出块间隔除以9,然后向下取整

    image-20210813224531182

    为什么要这么设计?

    比如说,我们当前这个区块的出块时间是在18s之间,这个时候,后面往下取整的那一部分算出来是0对吧,那么y-0=y,假设没有叔父区块,那么y是等于1的,那么这整个就是等于是1,说明这种情况下,难度要上调一个单位,这个也是可以的,因为我们希望保证稳定的出块时间是在15秒,现在的出块时间变成了18s,说明出块速度有点太快了,把难度上调一个单位维持下平衡。相反如果出块时间是在917s之间,后面是1,前面也是1,1-1=0,说明这个时候出块时间是符合要求的,希望是15s,他是917s之间,这个时候可以不用调,光考虑基础部分,不考虑难度炸弹的话,就是基本上可以不用调。最后一项,如果出块时间是在18~26s之间,那么后面那项算出来是2,变成了1-2=-1,说明难度要下调一个单位,如果出块时间更长呢,比26s更长,那么下调的幅度也会更大

    image-20210813224603500

    但是不要忘了,上面那个公式里max的第二项有一个-99,如果单次的出块时间非常非常长,你可能前面算出来是个负的很厉害的数,但是你一次性下调也不能超过99个单位,这是为了防止一些系统中出现的异常情况,像一些黑天鹅事件,正常情况下,不能出现这个幅度的下调,前面又讲完了第一部分,基础部分。

    image-20210813224618129

    下面讲难度炸弹,他的初衷是这样的,以太坊的共识机制要从工作量证明逐步转入权益证明,而权益证明是不挖矿的,这就带来一个问题,那些已经在挖矿设备上投入大量资金的矿工会不会联合起来抵制这个转换。比如说,我已经花了好多钱买这个矿机,现在被告知要搞权益证明了,那我这些挖矿设备都没用了,那我肯定有意见,所以以太坊就担心大家不愿意转入权益证明,本来从工作量证明转入权益证明就是要经过硬分叉来实现,相当于你改了这个共识协议了,如果因为这些挖矿设备有些人不原意转过来,造成社区的分裂,可能出现的情况是,以太坊可能出现两条平行的链,那怎么办呢,为了避免这种情况,所以以太坊在设计这个难度调整公式的时候就加了一个难度炸弹,看一下难度炸弹设计的特点

    当初设计这个难度炸弹的时候,没有第二行,没有减去三百万这一行,第一行直接用的就是Hi,当前区块的序号,没有Hi一撇这一项。

    当前的区块号除以10万,向下取整,然后作为2的指数,也就是说,难度炸弹这部分的取值,是从指数形式增长的,那么指数函数的特点是什么,早期的时候,以太坊刚刚上线不久的时候,区块号都比较小,所以难度炸弹这部分算出来的值是很小的,基本上可以忽略不计,那么难度调整主要还是由刚才讲完的第一部分,基础部分来决定的,或者是由系统中的出块时间来决定的,然而随着时间的推移,区块号变得越来越大,这个时候难度炸弹的威力开始显现出来,我们知道指数函数增长到后期,速度是非常恐怖的,所以当初设计的思想是等到这个难度炸弹的威力开始发挥出来的时候,也正是从以太坊需要从工作量证明转入权益证明的时候,那个时候因为挖矿变得越来越难了,所以大家也就原意转入权益证明了,因为如果不转的话,要挖出矿来,就太费劲了,这是当初设计以太坊时候的如意算盘,但实际情况,基于权益证明的共识机制实际设计出来有很多问题要解决,远远没有当初想象的那么顺利,这样造成的结果就是,转入权益证明的时间点被一再的推迟,然后出现的情况就是挖矿已经变得越来越难了,因为难度炸弹的威力已经显现出来了,但是大家还是得继续挖,因为没有别的方法可以达成共识。

    原来是担心大家不愿意转,现在变成了想转也没法转,因为权益证明的共识机制还没有开发出来,这个情况到2017年四五月份中旬的时候就已经很明显了,就出块时间已经逐渐开始增长了,原来是说要稳定在15秒,那个时候就不断的变成了从15秒不断地增加,从十五秒,十六秒,十七秒,最后增加到三十秒左右,而且如果不采取措施,还会继续增长上去,那怎么办呢

    以太坊最后在一个EIP当中,决定计算难度炸弹地时候,要把区块号,回退三百万个区块来计算,就这个公式中,把真实的区块号减去三百万,算出Hi一撇,这个可以看成是假的区块号,然后算难度炸弹的时候是用这个假的区块号算的。这个给权益证明的上限争取了一些时间。

    image-20210813224632142

    那么这样做的结果怎么样呢

    y轴是难度炸弹的取值,x轴是区块号,是以10万为单位,可以看到早期的时候,区块号比较小的时候,这个难度炸弹的作用是很不明显的,基本可以忽略不计,难度调整基本上是根据系统中的出块时间进行调整的,然后,这个图的前半部分是按照原来那个公式算的,就是在没有决定回调之间的原始公式算的,直接用正常的区块号算,大概是370万个区块左右,这个难度炸弹的威力开始指数上升,到上面这个尖峰,这个尖峰的位置就是以太坊决定回调这个难度炸弹的时候,减了三百万个区块,所以他一下就掉下来了,这个难度炸弹的取值一下就掉下来了,后面看上去好像是个平的直线,其实也是在增长,只不过是因为那个尖峰的位置太高了,所以看上去好像是直线,前面这个部分其实也是在增长,也是因为这个尖峰太高了,所以看不出来

    image-20210813224644811

    以太坊的发展被分成了四个阶段,Frontier,Homestead,Metropolis,Serenity,其中Metropolis又分为两个阶段,Byzantium和Constantinople,我们处于Byzantium阶段,难度炸弹的回调就是在Byzantium阶段进行的

    image-20210813224655092

    EIP:Ethereum Improvement Proposal,BIP:BitCoin Improvement Proposal

    在难度回调的同时,把出块奖励从五个以太币降到了三个以太币,因为如果不这么调的话,对于回调之前的矿工是不公平的,他这个回调是突然进行的,昨天挖矿的时候挖的很辛苦,得到的是五个以太币,结果今天一夜之间难度降低了,你挖矿也是得了五个以太币,那对我来说就不公平,而且从系统当中获益的总供应量来说要维护总供应量的稳定,现在变得是挖矿要容易了,所以就相应的把出块奖励减少一些,这里说明一点,比特币当中每隔一段时间出块奖励减半的做法在以太坊中是没有的,像这个把五个以太币降低三个就是一次性的,并不是说以后定期都这么做。

    image-20210813224705817

    下面看一下具体的代码实现

    这个是Byzantium阶段,挖矿难度调整的代码,输入时父区块的时间戳和父区块的难度,计算出当前挖的这个区块的难度,这里面的注释给出了难度计算公式,也是分成两部分,括号里面是第一部分是难度调整的基础部分,后面加上2的periodCount-2次方,这就是难度炸弹,基础部分是在parent_diff的基础上加上后面那一项,后面那一项就是前面这个难度调整的力度,parent_diff/2048乘以后面的系数,后面max的前面那一串就是前面ppt公式的那个y,如果有叔父区块是2,没有的话是1,减去后面这个就是出块间隔除以9向下取整,后面这个-99也是难度调整的下限。

    下面这几行代码,这个BigTime就是当前区块的时间戳,bigParentTime就是父区块的时间戳

    image-20210813224719207

    这一页的代码主要是计算基础部分的难度调整,第一行就是把当前时间戳减去父区块的时间戳算出出块时间,然后第二行除以9向下取整。

    下面这个if.else就是判断一下是不是有叔父区块,有的话,是用2减去前面这个数x,没有的话用1减去前面这个数x,然后接下来跟负的99相比,往下调有一个节限,不能比-99还要小,接下来算的是难度调整的力度,父区块的难度除以这个DifficultyBoundDivisor实际上就是2048,然后跟前面算出的系数相乘,加到父区块的难度上面去,基础部分的难度调整有一个下限,难度再小也不能小于那个D0,这个MinimumDifficulty就是那个D0,131072

    image-20210813224733827

    下一页就是难度炸弹的计算,fakeBlockNumber假的区块号就是前面讲的Hi一撇。下面这个if的判断跟2999999相比,比她大的话,就要减掉2999999,为什么不减3000000,前面的公式不是减三百万吗,其实是因为,这里判断的是父区块的序号,而我当前挖的这个区块,比父区块要多一个,所以按照父区块的序号算的话,就正好差一个

    image-20210813224748259

    下面看一下以太坊中实际统计情况

    这个就是以太坊中的难度统计

    显示的是以太坊中挖矿难度的变化曲线,可以看到在以太坊早期,挖矿难度的变化是不明显的,增长的是比较慢的,当时以太坊市值很小,谁也没有想到以太坊未来会成为一个主流的加密货币,从2017年开始,挖矿难度的增长就比较明显了,尤其是难度炸弹这一部分

    image-20210813224801321

    看到这一部分的曲线,看上去像是指数形状,到尖峰的位置就是以太坊决定回滚难度炸弹,回滚三百万个区块,所以挖矿难度一下就掉下来了,就好像从悬崖中掉下来了,之后又震荡一会,之后又逐步上升,2018年以太坊的挖矿难度已经恢复到了以前的水平,而且还略有些增加,从图上看出,目前以太坊的挖矿难度基本上是区域稳定的

    image-20210813224820584

    这个图显示的是出块时间,不考虑个别波动,总体来说,出块时间稳定在十五秒上下有了很长时间,说明以太坊在早期的时候,挖矿难度额调整主要是以稳定出块时间为主的,达到这个预期的效果,同样是在2017年中旬5,6月份的时候,出块时间出现了大幅度增长,就是这个难度炸弹的效应

    image-20210813224830674

    到这个地方,可以看到出块时间达到了 三十秒左右,然后是难度炸弹的回调,一下子断崖似的下降,又恢复到了十五秒,而且一直维持到现在,这个图跟前一个图对比,前一个图显示的是难度炸弹回调之后总的挖矿难度逐渐又恢复到了原来的水平,这个是因为挖矿变容易之后,有更多的矿工加入,竞争更激烈了,而我们这个图显示呢,从出块角度来讲并没有收到影响,出块时间一直到现在还算是维持的比较好的15秒左右

    image-20210813224842546

    最后这个图显示的之前看过的两个区块,讲GHOST协议的时候看过的两个区块

    image-20210813224851390

    主要看这两行

    Difficulty就是当前区块的难度,Total Difficulty是把当前这个区块所在的这条链上的所有区块的难度加在一起,也就是这条链的总难度,所以之前讲的最长合法链对于以太坊来说,其实应该叫做最难合法链,就是总难度最大额合法链,每个区块的难度,反应的是挖出这个区块所需要的工作量,而总难度最大,就是挖出这条链上的所有区块需要的总工作量最大,一般来说,靠后的区块,他挖出来需要的工作量也是比较大的

    image-20210813224902561

    展开全文
  • 十八、以太坊挖矿算法 对于基于工作量证明的系统来说,挖矿是保障区块链安全的重要手段,有时候说Block chaim is secured by mining,比特币里面的挖矿算法总的来说是比较成功的,经受了时间的检验,到目前为止,...

    十八、以太坊的挖矿算法

    对于基于工作量证明的系统来说,挖矿是保障区块链安全的重要手段,有时候说Block chaim is secured by mining,比特币里面的挖矿算法总的来说是比较成功的,经受了时间的检验,到目前为止,没有人发现,也没有什么大的漏洞。

    bug bounty:bounty(赏金)

    美国电影有一个叫bounty hunter(赏金猎人),专门去抓那些政府悬赏捉拿的逃犯

    bug bounty:有的公司悬赏来找软件中的漏洞,如果能找到软件中的安全漏洞就可以得到一笔赏金。

    比特币的挖矿算法是一个天然的bug bounty,如果你能找到里面的漏洞,或者是某一个挖矿的捷径就能取得很大的利益。但是到目前为止还没有人发现有什么捷径可走,所以比特币的挖矿算法总的来说是比较成功的,是经受住时间检验的,但是比特币的挖矿算法也有一些值得改进得地方,其中有一个保守争议得问题就是挖矿设备得专业化,有普通的计算机挖不倒矿,只能用专门的设备,专用的ASIC芯片来挖矿,那么很多人认为这种去中心化的做法和去中心化的理念是背道而驰的,也跟比特币的设计初衷相违背的,中本聪最早的一篇论文,提出One cpu,one vote,理想状况下,应该让普通老百姓也能参与挖矿过程,就用家里的桌面机,笔记本电脑,甚至手机来挖矿,这样也更安全,因为算力分散之后,有恶意的攻击者想要聚集到51%的算力发动攻击,这个难度就会大得多。所以比特币之后出现的加密货币包括以太坊设计mining puzzle的时候,一个目标就是要做到ASIC resistance,那么怎么才能设计出对ASIC芯片不友好的mining puzzle呢?

    一个常用的做法就是增加mining puzzle对内存访问的需求,也就是所谓的memory hard mining puzzle,ASIC芯片相对于普通计算机而言,主要优势是算力强,但是在内存访问的性能上没有那么大的优势,同样的价格买一个ASIC矿机和买一个普通的计算机,这个ASIC矿机的计算能力是普通计算机的几千倍,但是内存访问方面的性能差距远远没有这么大,所以能设计出一个对内存要求很高的puzzle,就能起到遏制芯片的作用。

    怎么设计呢?

    一个早期的例子是莱特币,曾经是市值仅次于比特币的第二大加密货币,他用的Puzzle是基于Scrypt,这个是对内存要求很高的哈希函数,以前用于计算机安全领域,跟密码相关,那么他的具体设计思想是说,开一个很大的数组,然后按照顺序填充一些伪随机数,比如说有一个种子节点,seed的值通过一些运算,算出一个数来,填在第一个位置,然后后面每个位置都是前一个位置的值取哈希得到的,伪随机数是说取哈希值后的值你也不知道,看上去就是乱七八糟的数一样,就好像随机数,但我们不可能真的用随机数,真的用随机数没法验证。填充完之后,里面的数值是有前后依赖关系的,是从第一个数依次算出来的,然后需要求解这个puzzle的时候,按照伪随机数的顺序从数组当中读取一些数,每次读取的位置跟前一个数相关,比如说要解puzzle了,一开始读取A这个位置的数,把A位置的值读取出来之后,根据他的取值进行一些运算,算出下次要读取的位置,比如说是B这个位置,然后把B这个位置的数读出来,再进行一些运算得到下一个读取的位置,比如说C这个位置,这个也是一种伪随机数的顺序,因为经过哈希运算之后得到下一个读取的位置。

    在这里插入图片描述

    这样做的好处:
    如果这个数组开的足够大的时候,挖矿的矿工就是memory hard,因为如果不保存数组,那么挖矿的计算复杂度会大幅度上升,比如说,在读取数组里面这些数的时候,你没有保存数组,那要怎么办,比如说求解puzzle的时候,一开始在A这个位置,如果没有数组的话,还得从第一个数,依次算出这个值,然后要读取第二个位置的数,这些没有存起来,再算一遍算到B位置的值,下面是C,也一样,要算到C位置的值,这个计算复杂度会大幅度上升。

    所以要想高效地挖矿,这个内存区域是需要保存的,有的矿工可能保存一部分内存区的内容,比如说,这个数组当中只保留奇数位置地元素,偶数位置地元素就不存了,这样数组可以少一半,那用到偶数位置的数怎么办呢,要根据另外一半去算一下,计算复杂度会提高一点,但是内存量可以减小一半,管它叫做time-memory trade off。

    这个设计的核心思想是不能像比特币那样主要进行哈希运算,比特币其实也不是取一次哈希,他是取两次哈希,但这个不够,要增加他的运算过程中对内存访问的需求,要设计一个对ASIC芯片不友好的,对普通计算机能参与的。设计的任务更像是普通计算机干的事情,而不是像一个挖矿专用的ASIC芯片干的事情,普通计算机内存很大,就要利用这个特性,设计puzzle对资源的需求,特别像是普通计算机对资源的配备比例。

    这个puzzle好的地方:对于矿工挖矿的时候是memory hard。

    坏的地方:对轻节点来说也是memory hard。

    前面讲过设计puzzle的一个原则:difficult to solve,but easy to verify,这个问题就在于验证这个puzzle需要的内存区域跟求解这个puzzle需要的区域几乎是一样大的,轻节点验证的时候也得保存这个数组,要不然他的计算复杂度也是大幅度提高,对于scrypt早期计算机的安全领域,这个密码方面的话他不是一个问题,他没有轻节点验证这个问题,但对于我们这个来说是不行的,这样造成一个结果就是莱特币在真正使用的时候,这个内存区域不敢设置的太大,比如说你设一个1G的数组,这对于计算机来说是不大的,但是如果是一个手机上的app,1G的内存可能就太大了,因为这个原因,实际莱特币在使用的时候,这个数组只有128Ks,这个是非常小的,连1M都不到,就是为了照顾轻节点,那么最后的效果怎么样呢

    当初莱特币在发行的时候,目标不仅仅是ASIC resistance,还是GPU resistance,就是挖矿最好连GPU都不要用,都用普通的CPU挖矿就行了,结果后来就出现GPU挖矿的,再后来就出现用ASIC芯片挖矿的,实践证明莱特币要求的128k内存不足以对ASIC芯片的生产和设计带来实际上的障碍,所以从这一点来说,莱特币的设计目标没有达到,但是他早期宣传的设计目标对于解决能启动问题是很有帮助的,任何一个加密货币,都存在能启动问题,包括比特币,一开始的时候,没有人知道这个加密货币,你就发行一个货币,也没有人理你,那怎么办呢,没有人参与,这是一个问题,而且对于基于工作量证明的加密货币来说,挖矿人太少是不安全的,因为发动恶意攻击难度太低,比特币早期也是不安全的,一开始只有中本聪一个人在用,后来变成少数几个人在挖矿,那个时候,如果想对比特币发动恶意攻击是很容易的,那么比特币是怎么解决这个能启动的问题呢,现在谁也说不清楚了,但总的来说是一个循坏迭代的过程,中本聪宣传的多了,对比特币感兴趣的人就多了,然后参与挖矿人就多了,变得更安全,价值也提高了,然后对比特币感兴趣的人就更多了,挖矿的人也更多了,然后比特币变得更安全了,价值就更进一步提高了,形成一个良性循坏。莱特币虽然没有达到当初的设计目标,但是他早期的宣传,更民主,让更多人参与的理念对于聚集人气来说是很重要的,所以莱特币一直到现在也是一个比较主流的加密货币,除了这个mining puzzle之外,莱特币跟比特币的另一个区别是来特比的出块速度是比特币的4倍,他的出块间隔是两分半,而不是十分钟,除此之外,这两种加密货币基本上是一样的。

    以太坊也是用一种memory hard mining puzzle,但是在设计上,跟莱特币有很大的不同

    以太坊用的是两个数据集,一大一小,小的是16M cache,大的数据集是一个1G dataset,DAG,这1G的数据集是从16M的cache生成出来的,为什么要设计成一大一小的两个数据集呢,就是为了便于验证,轻节点只要保存16M cache就行了,只有需要挖矿的矿工才需要保存1G的dataset。

    基本思想:
    小的数据集的生成方式跟前面讲的数组的生成方式是比较类似的,首先从一个种子节点seed,进行一些运算,算出数组的第一个元素,然后依次取哈希,第一个元素取哈希得到第二个元素,第二个元素取哈希得到第三个元素,这样从前往后,把这个数组从前往后,填充一些伪随机数得到一个cache,下面和莱特币就不一样了,莱特币是直接从数组当中按照伪随机数的顺序读取一些数,然后进行运算,以太坊是要先生成一个更大的数组,这里没有按比例画,就这个大数组应该比下面的小数组要大得多,下图看就大了一点,因为黑板画不下了,就意思意思,而且小的cache和大的dataset都是定期增长的,每隔一段时间,大小要增大,因为计算机的内存容量也是定期增长的,比如说这个大的dataset涨到了2.5G,就已经不是一个G了,那大的dataset是怎么生成的呢,他的每个元素小的cache里按照伪随机数的顺序读取一些元素,方法和刚才讲的莱特币里面求解puzzle的过程是类似的,比如说,第一次读取A位置的元素,读取完之后,对当前的哈希值进行一些更新迭代,算出下一个要读取的位置,比如说B这个位置,然后把B位置的数再进行一些哈希值的更新,算出C这个位置,那么从这个cache里面这么来回读,一共读256次,读256个数,最后算出来一个数放在大的dataset的第一个元素,然后第二个元素也是一样的,dataset的每个元素都是从这个cache里面按照伪随机数的顺序,不断进行迭代更新,最后得到一个值存在里面,然后求解puzzle的时候,用的是大数据集中的数,这个cache是不用的,按照伪随机数的顺序在大的数据集中读取128个数,就是一开始的时候根据区块的块头,包括里面的nonce值算出一个初始的哈希,根据这个哈希,映射到大数据集里面的某个位置,把这个数读取出来,然后进行一些运算,算出下一个要读取的位置,比如说又在大数据集里面的另一个位置,又把这个数读取出来,这里有一个区别:他每次读取的时候除了计算出这个元素的位置之外,还要把相邻元素也要读取出来,这个例子当中每次读取的时候是读取两个相邻元素,这样循环64次,每次读两个元素,所以一共是符合难度要求128个数,最后算出一个哈希值来,跟挖矿难度的目标域值比较是不是符合难度要求,如果不是,把block header 里面的nonce替换一下,换另外一个nonce,因为换了nonce之后,第一次算的那个哈希值就变了,然后重复这个过程,根据这个哈希值找到数组中的元素,读取两个相邻的元素,反复循环64次,再得到一个哈希值,然后再去比较。

    在这里插入图片描述

    上面讲的比较抽象,下面是写的一个伪代码,没有直接用以太坊中的源代码,这个伪代码省略了源代码中的一些实现的细节,更有利于理解。

    ethash算法伪代码

    第一步首先生成16M cache,cache中每个元素都是64个字节的哈希值,生成的方法与莱特币类似,第一个元素是种子的哈希,就是这个seed的哈希,后面每个元素是前一个的哈希,这个哈希的内容每隔3万个区块会变化一次,这个seed每隔3万个区块会发生变化,然后重新生成cache中的内容,同时cache的容量要增加原始大小的1/128,也就是16M的1/128=128K。

    在这里插入图片描述

    第二步是从这个cache生成1G的大数据集,这个函数的功能是通过cache来生成dataset中的第i个元素,基本思想是按照伪随机数的顺序读取cache中的256个数,每次读取的位置是由上一个位置的数值经过计算得到的,这里用的两个函数get_int_from_item和make_item,是自己定义的,源代码中是没有的,把源代码中一些相关的内容总结成了这两个函数,可以避免源代码中不是很重要的细节,这个get_int_from_item函数就是用当前算出来的哈希值求出下一个要读取的位置,然后make_item函数用cache中这个位置的数和当前的哈希值计算出下一个哈希值,这样迭代256轮,最后得到一个64字节的哈希值,作为大数据集中的第i个元素。

    在这里插入图片描述

    这个calc_dataset是生成整个1G数据集的过程,就是不断调用前的函数来依次生成大数据集中的每个元素

    在这里插入图片描述

    这一页的两个函数,分别是矿工用来挖矿的函数,和轻节点用来验证的函数,先看一下上面这个函数,这个矿工用来挖矿的函数,他有四个参数,header是当前要生成的区块的块头,以太坊和比特币一样,挖矿只用到块头的信息,这样设计的原因,是轻节点只下载块头,就可以验证这个区块是否符合挖矿的难度要求,第二个参数nonce就是当前尝试的nonce值,以太坊就像比特币一样,挖矿的时候,也是要尝试大量的nonce才能找到一个符合要求的,第三个参数full_size是大数据集中元素的个数,元素的个数每3万个区块会增加一次,增加原始大小的1/128也就是1G的1/128=8M,最后参数dataset就是前面生成的大数据集,挖矿的过程是这样的,首先根据块头的信息,和当前Nonce算出一个初始哈希值,然后要经过64轮的循环,每一轮循环读取大数据集中两个相邻的数,读取的位置是由当前哈希值计算出来的,然后再根据这个位置上的数值来更新当前的哈希值,这跟前面生成大数据集的方法是类似的,循环64次,最后返回一个哈希值,跟挖矿难度目标域值相比较。

    这里提个小问题,每次读取大数据集中两个相邻位置的哈希值,这两个哈希值有什么联系吗?

    其实是没有联系的,他们虽然位置相邻,但是生成的过程是独立的,每个都是由前面那个16M的cache中的256个数生成的,而且256个数的位置是按照伪随机数的顺序产生的,这个是构造大数据集的一个特点,每个元素独立生成,这才给轻节点的验证提供了方便,所以每次读取的相邻两个位置的哈希值是没有什么联系的。

    下面这个函数是轻节点用来验证的函数,也是有四个参数,但是含义跟上面那个矿工用的函数有所不同,轻节点不挖矿,当他收到某个矿工发的区块的时候,这里用来验证的函数的第一个参数header是这个区块的块头,第二参数是包含在这个块头里的Nonce,是发布这个区块的矿工选好的,轻节点的任务是验证这个nonce是否符合要求,验证用的是16M的cache,也就是最后的参数cache,注意,第三个参数full_size仍然是大数据集的元素个数,跟上面那个挖矿的那个full_size含义是一样的,并不是cache中的元素个数,验证的过程也是64轮循环,看上去与挖矿的过程类似,只有一个地方有区别,比较这一页的上下两个函数,有什么区别?

    每次需要从大数据集中读取元素的时候,因为轻节点没有保留大数据集,所以要从cache中重新生成其他地方的代码逻辑是一样的,每次从当前的哈希值算出要读取的元素的位置,这个位置是指在在大数据集中的位置,但是轻节点并没有这个大数据集,所以要从cache中生成大数据集中这个位置的元素,我们前面说过大数据集中每个元素都可以独立生成出来。

    在这里插入图片描述

    最后这个函数,是矿工挖矿的主循环,其实是不断尝试nonce的过程,这里的target就是挖矿的难度目标,跟比特币类似,也是可以动态调整的,nonce的可能取值是从0-2的64次方,对每个nonce用前面讲的那个函数算出一个哈希值,看看是不是小于难度目标,如果不行的话,就再试下一个nonce。

    在这里插入图片描述

    最后这一页是前面讲过的所有函数的一个汇总,同时解释了为什么轻节点可以只保存cache,而矿工要保存整个大数据集。其实轻节点做一次验证的计算量也不算少,同样要经过64轮循环,每次循环用到大数据集中的两个数,所以是128个数,每个数是从cache里的256个数计算得到的,跟比特币相比,以太坊中验证一个nonce的计算量要大很多,但是仍然在可以接受的范围内,相比之下,如果矿工每次都这么折腾的话,代价就太大了,因为要尝试的nonce就太多了。

    在这里插入图片描述

    那以太坊设计的这个puzzle实际效果怎么样呢?

    到目前为止,以太坊挖矿主要还是以GPU为主,用ASIC矿机的很少,所以从这一点来说,他比莱特币来说要成功,起到了ASIC resistance的作用,这个跟以太坊的挖矿算法需要的大内存是很有关系的,这个挖矿算法就是ethash,这个起的很有意思,前三个字母eth是以太坊的代码,后面这个hash,h用了两遍,矿工挖矿需要1G的内存,跟莱特币的128K比,差了有八千多倍,即使是16M的cache跟128K比,也要大了一百多倍,所以这个差距是很大的,而且还是按照这两个数据集的最初的大小算的,因为定期会增长嘛,如果按照现在这个2.5G差距就更大了,以太坊没有出现ASIC矿机还有另外一个原因,以太坊从很早就计划要从工作量证明转移到权益证明,所谓的PoW->PoS(Proof of Stake),所谓的权益证明,就是按照所占的权益进行投票来形成共识,就不用挖矿了,权益证明是不挖矿,就类似于股份公司按照股票多少来进行投票,这个对于ASIC矿机的厂商来说是个威胁,因为ASIC芯片的研发周期是很长的,一款芯片从设计研发流片到最后生产出来,一年的周期就已经算是很快的了,而且研发的成本也很高,将来以太坊转入权益证明之后,就不挖矿,那些投入的研发费用就白费了,其实到目前为止,以太坊是基于工作量证明,以太坊很早就说要转入权益证明,但是转移的时间点一再往后推迟,到现在也没转过来,但是他不停的宣称要这么做,所以要想达到ASIC resistance一个简单的办法就是不断地吓唬大家:大家注意哦,下面要搞权益证明就不挖矿了,所以你就不要设计ASIC矿机了,你设计出来到时候也没用了,因为要设计一年嘛,一年以后,我们就不挖矿了。

    等过了一年,不行,还是得继续挖矿,那怎么办呢,再吓唬一次:我们真的再挖一年,然后就再也不挖了,所以你还是不要再设计了。

    从历史看,以太坊成为一个主流的加密货币,其实就是最近两年的事情(2018),以前市值很小的时候,没有人会去设计ASIC芯片,因为划不来啊,无利可图,等到市值上来之后呢,你这么吓唬他几次,就能起到ASIC resistance的作用,这也是另外一方面的原因。

    关于以太坊的挖矿还有一个要说明的

    以太坊中采用了预挖矿,叫pre-mining,所谓预挖矿并不是说真的去挖矿,而是说,在当初发行货币的时候,预留一部分货币给以太坊的开发者,有点像创业公司会留一部分股票给创始人和早期员工一样,将来这个加密货币成功了的话,这些预留的币就变得是很值钱了。

    像以太坊的早期开发者,现在就都很有钱,比北大教授要有钱多了,跟这个比特币相比呢,比特币就没有采用pre-mining的模式,所有的比特币都是挖出来的,只不过早期的时候,挖矿的难度,要容易的多,与pre-mining相关的一个概念叫pre-sale(就是把pre-mining预留的那些币通过出售的方法来换取一些资产用于加密货币的开发工作),有点类似于众筹,如果你看好这个加密货币的未来,可以在pre-sale的时候买入,将来这个加密货币成功之后呢,同样可以赚很大一笔钱

    下面看一下以太坊上的一些统计数据

    下面这个图显示了以太坊中货币供应量的分布情况,总共有大约一亿个以太币,每个以太币的市场价格是五百多美元,这里的数据是以前的,现在以太币的价格没有了解,整个以太坊的市值大概是五百多亿美元,下面这个图显示了这一亿的来源,绝大部分是通过pre-mining方法产生的,这个蓝色部分Genesis是指创世纪块中就已经包含了这些以太币,上线以后,再挖出来的以太币中Block Rewrad占了绝大多数,Uncle Reward就是前面讲的叔父区块得到的奖励只占很少一部分。有没有觉得毁三观,挖矿挖的再努力,关键还是不能输在起跑线上。

    在这里插入图片描述

    下图显示的是最大的以太坊矿池所占的算力比重,可以看出挖矿集中化的程度也是很高的,尤其是最大的几个矿池所占的比例很高,与比特币的情况类似

    在这里插入图片描述

    下图显示的是以太币的价格随时间变化的情况,可以看到在以太坊早期的那几年价格基本没怎么涨,真正的大涨是2017年,这一年的价格涨得非常猛,直到2018年初达到了顶峰,然后开始走下坡路,这个图显示的是以太坊的市值,叫Market Capitalization,这个跟价格的走势基本上是符合的

    在这里插入图片描述

    下图显示的是以太坊HashRate的变化情况,HashRate是指系统中所有的矿工加在一起,每秒钟计算的哈希次数,可以看到HashRate从总体来说是处于上升趋势的,而且也是从2017年开始大幅度上升的,2018年以太币的价格下跌了不少,HashRate总体上趋于平稳,并没有出现明显的下降,不同的货币入宫采用的mining puzzle不一样的话,那么它们的HashRate是不可比的,比特币和以太坊的HashRate就不能直接比较,因为以太坊中尝试一个nonce的工作量要比比特币大得多。

    在这里插入图片描述

    这篇文章讲的是挖矿的算法设计要尽可能让通用的设备也能参加,参加的人越多,挖矿的过程越民主,那么区块链就越安全,这也是为什么莱特币,以太坊要设计memory hard mining puzzle,但是也有一些人有不同的观点,认为让通用设备参加反而是不安全的,像比特币那样只能用专门的ASIC芯片挖矿才是更安全的,假设要对比特币系统发动攻击,需要投入大量资金买入ASIC矿机,才能聚集到发动攻击所需要的算力,而这些矿机除了挖矿之外,干不了别的任何事情,而且是为某一个加密货币设计的加密芯片,只能挖这一种加密货币,像比特币的ASIC芯片去挖莱特币就不行,所以呢,发动这个攻击的成本是很高的,早期需要投入大量的硬件资源,而且一旦攻击成功比特币系统的安全性被证明存在安全问题,大家对比特币的信心会大幅度下跌,然后比特币的价格也会跳水,这样早期投入的硬件成本就收不回来了,因为比特币本身就不值钱了,你买的那些比特币的矿机当然也不值钱了。相反如果让通用设别参与挖矿的话,发动攻击的成本就大幅度下降。所以有些人认为让通用设备参与挖矿是不安全的,让ASIC矿机一统天下才是安全的

    展开全文
  • 以太坊(ETH)是什么?它是公链之王,有人说它可能会超越比特币(BTC),其应用非常广泛,在以太坊世界里挖矿可以得到奖励,那么怎么挖矿?一下是以太坊挖矿教程,相信看完教程后,你也能迅速的开始自己的挖矿之旅!我...
  • geth控制台操控以太坊私链挖矿

    千次阅读 2021-12-14 11:29:41
    geth控制台操控以太坊私链的基本命令
  • 7个顶级Eth挖矿软件的评测对比【2021最新】

    万次阅读 多人点赞 2021-02-13 15:30:39
    在这个教程中,我们将对GMiner、T-Rex、EthMiner、lolMiner、Phoenix Miner、NBMiner、Team Red Miner等7个主流的eth挖矿软件进行客观评测,并给出确定的测试结果,希望有助于你选择合适的ETH挖矿软件。 用自己熟悉...
  • 使用Ubuntu系统进行以太坊挖矿

    千次阅读 2021-04-15 21:01:58
    进入以太坊挖矿地址 点击 Start Mining,显示四个不同的挖矿地址 矿池地址选择 us2.ethermine.org 软件版本选择 T-Rex0.19.14 cuda10稳定版本 使用命令 wgethttps://github....
  • 本奔牛矿工软件适合多种虚拟币的挖掘,可以挖以太坊(ETH),以太经典(ETC),零币(ZEC),云储币(SC),Decred(DCR)。 1、本挖矿软件完全将claymore原版核心的抽水返还,在矿池的页面上会多出一个矿工,该矿工...
  • 比特币以太坊 区块链以太坊挖矿原理 关于比特币和以太坊,熟悉区块链的朋友相比都不陌生。比特币是一种加密数字货币,可从别人手中购买或通过挖矿获得。通常是加入比特币矿池进行挖,2020年比特币第3次减产,之后...
  • 以太坊挖矿--谈谈挖矿圈子里的那些坑[纯干货]1.预期收益2.矿池抽成3.算力4.抽成返水 1.预期收益 纵观现在大量的以太坊矿池,绝大多数的挖矿模式都是PPS/PPS+. 这种每日相对稳定的收益模式也被大多数的矿工们所接受.相...
  • 安装以太坊源码,即安装Go Ethereum(安装Geth) 1、安装Golang 可以直接使用 yum 这个包管理器安装Golang yum install golang 2、下载以太坊源码(Go Ethereum) 首先下载geth源码go-ethereum,这里以go-...
  • 前面我们分析了以太坊挖矿的源码,挖了一个共识引擎的坑,研究了DAG有向无环图的算法,这些都是本文要研究的Ethash的基础。Ethash是目前以太坊基于POW工作量证明的一个共识引擎(也叫挖矿算法)。它的前身是Dagger ...
  • 随着时间的推移,全网算力越来越大,挖矿难度越来越高,以太坊挖矿一天收益多少?那么怎么才能提高挖矿收益呢? 挖矿的最基本的物理条件就是得有一台运行稳定稳定的矿机,这个不在今天的讨论范围之内。 有了一台硬件...
  • 以太坊挖矿程序Ethminer

    千次阅读 2021-08-20 08:01:23
    概述: 区块链:本质是分布式账本,账本分布在全球各处,很难被篡改 以太坊Eth:Eth是区块链技术中的一种,是区块链中的二师兄...Ethminer:就是以太坊开源的挖矿程序,负责接收计算任务,计算结果上报,获得报酬 ...
  • [2018年新版]以太坊ETH挖矿教程

    万次阅读 2018-06-10 19:53:56
    硬件准备ETH以太坊挖矿主要是使用高端3G显存以上显卡来挖矿,因此你需要一台拥有以下设备的电脑:显卡:6张rx470或gtx1060以上显卡,显存推荐4G以上主板:需要有6个以上pci-e插槽,目前市面上有主板直插和转接板2种...
  • 近期以太坊涨势喜人,吸引了很多人的关注,由于以太坊挖矿的利润较高,因此很多比特币矿工都开启了以太坊的挖矿之路,市面上的显卡现在又显得比较紧俏了。当然对于一些准备挖矿以太坊的矿工来说,目前有一个难题摆在...
  • 如今加密货币非常火爆,有很多人加入了挖矿的行列,而市值第二大的以太币也在其中,虽然其原理和现实中的挖矿相似,但也存在一些差异,因此让一些没有专业知识的人很难理解。以下小编就来给大家说说,希望能对您有所...
  • 链客,专为开发者而生,...学习以太坊挖矿之前,我们要先搞清楚几个概念: 拜占庭将军问题 分布式系统的状态同步问题。 拜占庭帝国繁荣富饶,周边的几个小国家的将军对其垂涎已久但又各自心怀鬼胎。他们必须有超过...
  • Geth客户端的CPU挖矿效率非常低,纯属鸡肋。如对CPU挖矿感兴趣,请参照此帖。下面介绍GPU挖矿。硬件GPU挖矿需要1-2GB显存(译者注:1GB显存不可以),显存不够会一直报错。GPU矿机是基于OpenCL的,所以AMD显卡比NVIDI...
  • 以太坊挖矿矿机组装指南

    万次阅读 2017-11-13 10:13:00
    以太坊挖矿矿机组装指南 伴随着比特币的热潮,“矿机”一词出现在了大众的视野中。那么何为“矿机”呢?一个矿机的本质就是一个电脑机箱,它的硬件组成与普通的台式机箱几乎相同。有区别的是它的主板上PCIE插槽比较...
  • 以太坊(Ethereum)挖矿数据分析

    千次阅读 2018-04-29 23:06:18
    原文链接:https://zhuanlan.zhihu.com/p/35035448Linux之父Linus说过一句名言:“Talk is cheap. Show me the code.”(口说无凭,代码为证)...本文整理自一年前的一次客户咨询,客户希望得到是否可以投资以太坊挖...
  • 以太坊发展历史回顾

    万次阅读 2019-04-10 09:39:02
    以太坊历史 最近历史记录,请查看Taylor Gerring博客发帖。 诞生 2013年末Vitalik Buterin第一次描述了以太坊,作为他研究比特币社群的成果,不久后,Vitalik发表了以太坊白皮书,他在书中详细描述了以太坊协议的...
  • 以太坊ETH,全球第二大加密货币,对以太坊的追求者都有一种浓重的信仰与情怀,特别是最近消息称以太坊2.0即将来临,更加的激动人心。但最终的目的也是要获得收益,影响收益最大的因素就是矿池收益分配模式,现在矿池...
  • 市值排行世界第二的区块链资产是一个建立在区块链技术...对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用。 ▶ ▷▶
  • 周四,世界第二大加密货币以太坊很快将进行一次重大的软件升级,而此次升级将有可能提振以太坊的价格。以太坊「伦敦升级」已准备就绪,预计在区块高度12965000时激活,官方博客推算的时间为8月3日至5日之间,中文...
  • 无意中发现一款以太坊挖矿神器-ETH超级矿工,支持ETH,ETC+SC等各种双挖(11.7内核)破解抽水 小编无意中发现一款以太坊挖矿神器-ETH超级矿工。这款ETH挖矿软件支持ETH,ETC+SC双挖,经分析内核采用Claymore's...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,650
精华内容 1,460
关键字:

以太坊挖矿软件

友情链接: New_Energy_28379D.zip