tokenpocket官网下载2.0|比特币挖矿算法
比特币挖矿算法详解 - 知乎
比特币挖矿算法详解 - 知乎首发于清源的区块链实验室切换模式写文章登录/注册比特币挖矿算法详解清源区块链工程师比特币网络中,源源不断的收到交易,需要节点不断的打包这些交易,而网络中的所有节点都是对等的,如何判断谁可以打包这些交易,如何避免重复打包这些交易呢?这个时候就需要用到工作量证明(PoW,Proof-of-Work)的方式决定记账权。网络中的任何全节点,都可以试图创建区块,但区块只有在至少满足下列条件时创建的区块才会被其他节点认可和接受。 区块中包含的交易都是合法的; 区块哈希要小于等于一个目标值;要满足第一个条件很简单,节点只要将每笔交易都验证一遍,丢弃掉不合法的交易即可。但要满足第二个条件就需要挖矿。挖矿比特币挖矿就是找到一个随机数(Nonce)参与哈希运算Hash(Block Header),使得最后得到的哈希值符合难度要求,用公式表示就是Hash(Block Header)<= target 比特币采用的哈希算法是 SHA-256 ,也就是说最后会产生256位的输出,一共2^256种可能的取值。 最后得到的哈希值小于target的意思是把哈希后得到的bytes转换成数字后小于target转换成的数字。举个例子,直观的感受一下挖矿的难度;SHA-256计算123的值
a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
下面这段字符是比特币第1000个区块的哈希(2009年1月产生);
00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09
可以看到前面有8个0,虽然哈希值的生成是随机的,但是生成前面有8个0的值对计算机穷举来说也并不算太难。
再看一下这段字符,是比特币第560000个区块的哈希(2019年1月产生);
0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122
可以看到前面有18个0,要生成满足这个条件的哈希对于普通电脑来说几乎是不可能完成的任务了。简单来看挖矿难度的高低就是生成区块头的哈希值有多少0。挖矿难度在比特币系统中出块时间被设置为一个常数10分钟,但是挖出区块的速度并不是固定的,而是随着挖矿难度的变化在10分钟上下浮动, 挖矿难度越大,出块时间就越长,为了得到相对平均的出块时间,需要动态调整挖矿难度。 比特币每产生2016个区块调整一次挖矿难度,一个块10分钟,2016个块大概是两周的时间,而调整挖矿难度的这些逻辑都在代码中,当大多数诚实节点采用这个策略的时候整个网络就会自动遵循这个策略。挖矿难度的计算公式如下:diffculty = difficulty_1_target / target此处的 difficulty_1_target 为一个常数,非常大的一个数字( 2^(256-32)−1 )。表示挖矿的初始难度,目标值越小,区块生成难度越大。 2^(256-32)−1 是比特币的初始难度,是前2016个块的难度。 这个难度被存储在比特币的区块头nBits字段中,当有恶意节点篡改这个策略时,挖矿产生的区块头的哈希值就会和诚实节点产生冲突,不会被接收,白白浪费了算力。 因为策略不同,也就是nBits不同,恶意节点产生的区块哈希无法被诚实节点验证。 调整出块时间比特币系统中区块的生产速度是根据之前产生区块速度调整的,之前出块速度大于10分钟,则认为需要降低难度,则需要提高第一个公式中target的值,而target则通过如下公式计算;target = current_target * ( actual time / excepted time )current_target是当前系统中的难度值,target是调整后的难度值,actual time是实际产生区块的时间,excepted time是期望出块时间(2016块*10分钟),actual time有上下限,actual time最多8周,最小二分之一周。挖矿算法比特币中nBits标识了挖矿的难度,也就是说这个区块头进行SHA-256哈希算法后得到的bytes转换成数字后要小于这个难度,而SHA-256计算后的结果有256位,如果直接存储需要32个字节比较占用空间,所以采用了一种压缩算法。压缩算法nBits有4个字节32位,将SHA-256计算得到的值经过如下算法压缩到32位;将数字转换为 256 进制。如果第一位数字大于 127(0x7f),则前面添加 0。压缩结果中的第一位存放该256进制数的位数。后面三个数存放该256进制数的前三位,如果不足三位,从后补零。举个例子,将十进制1000压缩;1. 1000转换256进制数,1000 = 3 * 256 + 232 = 3*256^(2-1) + 232*256^(1-1)
2. 3小于127,不需要补0,跳过
3. 从第一部看到1000转换成256位数有2位,压缩结果第一位应该存放2
4. 因为只有两位,所以最后一位补0,得到存放的值为 [2, 3, 232, 0]十进制,转换十六进制 [0x02, 0x03, 0xe8, 0x00] 合并存储到nbits为 0x0203e800难度计算在第一个公式中difficulty_1_target的值为 2^(256-32)-1,转换成256进制为;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF第一位大于0x7f,前面补0,变为00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF,因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。T=0x00FFFF * 256^(0x1b-3) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000比特币中的difficulty就是0x1d00FFFF,如果区块中的nBits为0x1d00FFFF则说明这个区块挖矿难度为最小挖矿难度1.实际上专业的矿池程序会保留被截断的FF:00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF我们算一下比特币101799号区块的挖矿难度,通过区块链浏览器可以看到101799号区块的nBits为0x1b0404cbD = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / 0x00000000000404CB000000000000000000000000000000000000000000000000 = 16307.669773817162 (pdiFF)pdiFF也被称为矿池难度。算力为了找到符合条件的值在挖矿的时候需要不断的调整区块头中Nonce的值,但是又会有一个问题,在比特币中Nonce的值是32位的,如果挖矿难度太大,就算穷尽Nonce的所有可能还是不能算出符合条件的值。铸币交易在一个区块产生的时候,会有一个铸币交易(coinbase),也就是矿工为自己铸币,产生新的比特币。铸币交易没有UTXO输入,只有输出指向自己的比特币地址,当挖矿成功,这个区块被网络接收的时候,新产生的币就转移到这个矿工地址了。看一下铸币交易包含的字段; transaction hash:“交易哈希”字段32个字节全部填充0(因为其没有UTXO输入);ouput index:“交易输出索引”字段全部填充0xFF(十进制的255); coinbase data:coinbase数据长度最小2字节,最大100字节。除了开始的几个字节外,矿工可以任意使用coinbase的其他部分,随意填充任何数据。以创世块为例,中本聪在coinbase中填入了这样的数据“The Times 03/Jan/ 2009 -Chancellor on brink of second bailout for banks“; - coinbase data size:coinbase数据大小; sequence number:现在未使用,设置为0xffffffff可以看到铸币交易的coinbase data字段是我们可以控制的,当Nonce不能满足挖矿难度的时候,我们可以通过调整coinbase data字段,从而影响区块头的默克尔树根的值,提供更多的可能来满足挖矿难度的要求。算力单位通过上面的流程,进行一次可能的挖矿尝试被称为H。 1 H/s = 每秒可执行一次哈希运算。 1 KH/s = 每秒1,000哈希(一千次)。 1 MH/s = 每秒1,000,000次哈希(百万次)。 1 GH/s = 每秒1,000,000,000次哈希(十亿次)。 1 TH/s = 每秒1,000,000,000,000次哈希(万亿次)。 1 PH/s = 每秒1,000,000,000,000,000次哈希。 1 EH/s = 每秒1,000,000,000,000,000,000次哈希。挖矿收益矿机挖矿的时候就会出现很长的时间找不到符合条件的哈希值,如果找不到哈希值不能打包区块就没有收益,显然对矿工十分不友好,但是如果挖到就像中彩票一样获得非常丰厚的回报。矿池为了避免单个矿工挖矿收益的不稳定性,就出现了矿池,矿池集合了大量的矿工,平均挖矿的收益,避免了挖矿收益的不稳定性。 矿池组织大量的矿工挖矿面临很重要的一个问题就是如何把高难度计算哈希的任务拆解成相对简单的任务,发送给单个矿工,回顾之前挖矿难度的计算,可以简单的认为前面0的多少表明了挖矿的难易。 0越多,挖矿难度越高,为了降低挖矿难度我们就要增加挖矿哈希0的数量,举个例子假设挖矿目标值 0x000abc,只要满足这个值就可以打包区块获得挖矿收益;
降低挖矿难度为 0x001abc,发送给矿工,矿工只要计算区块头满足这个相对低一点的难度就可以得到一个分片(shared),但是单个矿工挖到这个简单难度的块是无法发布到整个网络中的,但是矿池可以把这个分片记录下来,作为以后给这个矿工奖励的凭证。
0x001abc是0x000abc的子集,只要子集足够多总有一个会满足目标值。
当有一个矿工挖出一个满足目标值之后就可以获得挖矿收益,而挖矿就可以根据矿工分片多少来获得收益。
矿工收益 = 挖矿收益 / 挖到的分片数量但是现在还有一个问题没有解决,单个矿工挖到目标值以后如果私吞收益,私自广播区块怎么办?矿池有集中托管式的,也有分布式的。 集中托管式矿池,矿工可以把挖矿的机器托管给矿池,由矿池统一操作维护,只需要支付一些电费管理费即可,这样就避免了私自广播。 分布式矿池,矿工将机器自行管理,通过矿池协议从网络连接矿池即可,这样就会出现私自广播的可能。回顾一下铸币交易coinbase,可以看到有output字段,UTXO模型中币的来源都是上一个交易的output,所以可以把铸币交易的output字段设置为矿池的地址,然后随机生成一些coinbase data的填充后生成区块头的默克尔树,最后发由矿工去尝试目标值。通过这样的方式,即使矿工找到满足条件的哈希值,铸币交易的地址也是矿池的地址,私自广播区块没有任何收益,如果调整铸币交易的地址,这样又回到了独立挖矿的场景。全网算力如果要获知全网算力,可以通过出块时间,挖矿难度大致反推出全网算力。区块确认当一个区块产生之后,它不是立即可信的,网络上的节点总是相信最长的区块链,当一条交易记录被打包进一个区块之后,就有了一个确认,而这个区块所在的链后面被再加入一个区块,就是第二个确认,如此下去,一个交易有了6个确认,我们就认为这个交易已经确定了,会被永远记录在区块链中。 为什么是6个确认呢?因为每一个确认就是一个挖矿过程,需要大量的工作量证明,因此,这6个区块被同一个矿工创建的可能性微乎其微(可以说是不可能),因此矿工伪造交易也基本不可能。由于比特币的区块平均产生时间是10分钟,所以一个交易要1小时左右才能保证成功(最快),不过也不是所有的系统都这样认为,有些网站在接受比特币支付时,认为4个确认就可以给客户发货了,区块确认越多则越难被逆转。区块广播在区块链中,为了尽快收到其他节点的信息,节点间并不是直接传递区块信息的。 节点向附近节点发送一个Inv消息,Inv消息中包含已经被发送者(sender)接收并验证过的“交易记录的哈希”、以及“区块哈希”。接收者(receiver)收到Inv消息后,如果他还尚未从其他节点收到过相同的信息,他会发送一个getdata消息给发送者,要求得到交易记录及区块哈希包含的具体信息。此时,区块和交易记录的信息才会进行整体传递。 其中Inv消息结构如下;type MsgInv struct {
InvList []*InvVect
}
type InvVect struct {
Type InvType // Type of data
Hash chainhash.Hash // Hash of the data
}欢迎关注我的博客(qyuan.top),不定期分享一些区块链底层技术文章,博客排版要比知乎好一点(ㄟ( ▔, ▔ )ㄏ)。编辑于 2020-05-12 11:18挖矿区块链(Blockchain)比特币 (Bitcoin)赞同 8211 条评论分享喜欢收藏申请转载文章被以下专栏收录清源的区块链
如何通过挖矿,获得一枚比特币? - 知乎
如何通过挖矿,获得一枚比特币? - 知乎切换模式写文章登录/注册如何通过挖矿,获得一枚比特币?青春向上比特币挖矿是获取比特币最廉价的方式,但大部分人并不了解比特币是如何挖矿的,更不知道如何挖矿,下面就给大家讲一下如何通过挖矿获得一枚比特币。根据比特币基本算法,比特币每10分钟产生1个区块(block),每个区块里有N个比特币作为报酬(N的数量在下文中说明),这个区块包含了最近10分钟所有的比特币交易信息。制造比特币的过程叫做“挖矿”(mining),在这个过程中,计算机把最近收到的帐单打包在刚制造的区块里,这个打包的过程即制作的过程,只有极其稀少的几率被制造成功。(你可以理解成把新收到的帐单合在一起,一次成型不可修改,如果制造失败就要再来一次)一旦制造成功,你就把这个区块广播出去,这就意味着,你获得了这个区块中的N个比特币作为报酬。那么N是多少呢?根据比特币算法,在比特币发布之日起的头4年里,N = 基础报酬(50个比特币) + 交易报酬(过去10分钟内整个比特币网络耗费的交易手续费,前面已经说过,每笔比特币交易会消耗0.001比特币作为报酬给挖矿的人),每隔4年,N的基础奖励将减少一半,也就是说,头4年为50,第5-8年为25,第9-12年为12.5,以此类推。而随着比特币越来越普及,交易越来越频繁,N的交易奖励会逐渐增加。从2013年5月起,比特币正式进入了第5年,因此到2017年5月之前,每个区块的报酬N为25+交易报酬。挖矿步骤(1) 下载比特币官方客户端 (2) 安装好客户端后,启动客户端,客户端启动后一般3分钟内会开始同步网络数据,由于比特币数据非常庞大,这可能需要若干个小时(根据网速和电脑性能决定)。图为客户端同步网络数据:请保证你的C盘有10GB以上的剩余空间,如果C盘空间不够的话,需要将数据设置到D盘或E盘(3) 如果你的客户端显示的是英文,而你又对英文不太擅长,你可以把它设置成中文(4) 客户端同步网络数据不会影响我们挖矿,我们先获取我们的账户地址,点击客户端的“收款地址”按钮,这时你看到的一串非常长的地址,类似19G5E9SY5WKdMJEJd71Zs35G8V6x2o3qpG,就是你的比特币账户,比特币账户地址是自动生成的、全世界唯一的地址。(5) 你的账户里现在是0.00 BTC,意味着你还没有比特币,但你现在可以开始挖矿了,下载一个简单易用的挖矿软件CGMiner(CGMiner能挖比特币以及大部分的货币,但并非所有货币的挖矿都能用CGMiner)(6) 你需要确认你的显卡型号,如果是nvidia显卡,那么就可以直接挖矿了,请跳过本步骤。如果是ATI显卡,除了CGMiner你还需要安装一个AMD SDK包。(7) CGMiner是英文界面,不过这并不影响一个菜鸟来使用它,请将下载到的CGMiner解压到电脑的任意地方,然后进入到CGMiner的文件夹。(8) 在cgminer的文件夹里面,新建一个文本文件(TXT)该矿池是比特时代提供的完全免费的矿池),如果以后你想使用其它矿池和端口,请再自行修改矿池URL和端口(9) 然后双击运行上面的run.bat文件,就可以开始采矿了。你挖矿时产生的收益,比如你获得了0.001个比特币,会存放到你自己填写的BTC地址中(由于现在这个阶段BTC挖矿的难度非常大,你可能要等待一整天才会有BTC收益,挖矿时,电脑屏幕可能会有一些卡,是因为显卡的资源绝大部分被占用了)注:实际上,比特币挖矿的用户数量非常庞大,而每10分钟产出的比特币又十分有限,因此挖矿的难度已经是非常非常大了,如果你拥有性能强劲的显卡,那么会有一定的收益,如果你的显卡不好,那么你可能需要耗费N个小时才可以获得一点点比特币。发布于 2021-03-24 13:05比特币 (Bitcoin)比特币矿池比特币矿机赞同 206 条评论分享喜欢收藏申请
比特币挖矿原理与算法 - 知乎
比特币挖矿原理与算法 - 知乎切换模式写文章登录/注册比特币挖矿原理与算法知乎用户uh0xoh是的,你没有看错!七年之前,一枚比特币仅仅价值0.05美元;而仅仅七年之后,1000美元仅仅能买0.05个比特币而已。币价如此疯涨,多少人为之癫狂!你是否还在懊悔自己没有早点上车,或者你还在瞻望要把哪个币收作囊中之物?更有甚者早已紧锣密鼓地开启挖矿之旅(或许他们认为这是目前最为安全的投资)。面对诱人的利益,盲目投机比特小编是极不提倡的,切忌投资自己不熟悉的东西,所以今天我们就来科普下比特币的挖矿原理,以及它的算法等知识吧。比特币挖矿的原理比特币是一本大账簿,它需要有人来记账,而记账的奖励就是比特币。而这个记账的权利是矿工们需要争取的,而抢夺记账权的形式就是挖矿。谁的算力大,谁就更有可能抢到这个记账权。工欲善其事,必先利其器----挖矿需要的准备Step1:要是一台算力合理的矿机以及匹配的电源系统,当然网线和电脑是必不可少的。Step2:安装找IP软件(如已下载则跳过此步骤)每台矿机都有自己的IP,需要配备软件才能识别出来,可以在比特大陆的官网-技术支持-设备支持 里上找到该软件,软件叫作IPReporter。(实在找不到的可以在评论里留言,我来发给您。)Step3:准备自己的矿池、矿工号(如已注册则跳过此步骤)如果没有自己的矿池号和矿工号,那就不能保证挖到的比特币都是到自己账户上了,所以准备这些是必须滴。在蚂蚁矿池官网注册一个自己的矿池账号,并创建一个矿工号。比特币挖矿算法可以说比特币的整个实现就是建立在已有的甚至存在多年的计算机科学领域里的技术或概念的整合,其中哈希算法在比特币中的应用几乎是方方面面,主要包括SHA256和RIPEMD160,比特币将这两个哈希算法的应用组合成两个函数:hash256(d)=sha256(sha256(d))和hash160(d)=ripemd160(sha256(d)),其中d为待哈希的字节数组,两者分别生成256位(32字节)和160位(20字节)的16进制数值。hash256主要用于生成标志符,如区块ID,交易ID等,而hash160主要用于生成比特币地址。对于hash160比较认同的答案是ripemd160可以使得生成的地址更短,但是只做ripemd160一次哈希可能会存在安全漏洞所以同时使用sha256起到安全加固;至于hash256使用两次sha256哈希算法的原因来源于sha1算法,由于一次sha1哈希存在被生日攻击(birthday attack)的风险,所以当使用sha1运算时一种有效方式就是做两次sha1哈希,sha256本身并不存在生日攻击漏洞,但是防御性的使用两次sha256哈希借鉴于sha1.关注微信公众号“2100bit”获取更多资讯,史上最全币圈教程以及行情资讯。发布于 2017-12-13 08:53比特币 (Bitcoin)比特币矿池比特币矿机赞同 5010 条评论分享喜欢收藏申请
挖矿原理 - 廖雪峰的官方网站
挖矿原理 - 廖雪峰的官方网站
Index
廖雪峰的官方网站
Blog
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
More
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Profile
Passkey
Sign Out
Sign In
English
简体中文
Index
区块链教程
比特币
区块链原理
P2P交易原理
私钥
公钥和地址
签名
挖矿原理
可编程支付原理
多重签名
UTXO模型
Segwit地址
HD钱包
钱包层级
助记词
地址监控
以太坊
账户
区块结构
交易
智能合约
编写合约
部署合约
调用合约
编写Dapp
常用合约
ERC20
Wrapped Ether
关注公众号不定期领红包:
加入知识星球社群:
关注微博获取实时动态:
挖矿原理
Last updated: ...
/
Reads: 3275624
Edit
在比特币的P2P网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,打包新区块就被称为挖矿。
比特币的挖矿原理就是一种工作量证明机制。工作量证明POW是英文Proof of Work的缩写。
在讨论POW之前,我们先思考一个问题:在一个新区块中,凭什么是小明得到50个币的奖励,而不是小红或者小军?
当小明成功地打包了一个区块后,除了用户的交易,小明会在第一笔交易记录里写上一笔“挖矿”奖励的交易,从而给自己的地址添加50个比特币。为什么比特币的P2P网络会承认小明打包的区块,并且认可小明得到的区块奖励呢?
因为比特币的挖矿使用了工作量证明机制,小明的区块被认可,是因为他在打包区块的时候,做了一定的工作,而P2P网络的其他节点可以验证小明的工作量。
工作量证明
什么是工作量证明?工作量证明是指,证明自己做了一定的工作量。例如,在驾校学习了50个小时。而其他人可以简单地验证该工作量。例如,出示驾照,表示自己确实在驾校学习了一段时间:
比特币的工作量证明需要归结为计算机计算,也就是数学问题。如何构造一个数学问题来实现工作量证明?我们来看一个简单的例子。
假设某个学校的一个班里,只有一个女生叫小红,其他都是男生。每个男生都想约小红看电影,但是,能实现愿望的只能有一个男生。
到底选哪个男生呢?本着公平原则,小红需要考察每个男生的诚意,考察的方法是,出一道数学题,比如说解方程,谁第一个解出这个方程,谁就有资格陪小红看电影:
因为解高次方程没有固定的公式,需要进行大量的计算,才能算出正确的结果,这个计算过程就需要一定的工作量。假设小明率先计算出了结果x=2.5,小红可以简单地验证这个结果是否正确:
可以看出,解方程很困难,但是,验证结果却比较简单。所以,一个有效的工作量证明在于:计算过程非常复杂,需要消耗一定的时间,但是,验证过程相对简单,几乎可以瞬间完成。
现在出现了另一个问题:如果其他人偷看了小明的答案并且抢答了怎么办?
要解决这个问题也很容易,小红可以按照男生的编号,给不同的男生发送不同的方程,方程的第一项的系数就是编号。这样,每个人要解的方程都是不一样的。小明解出的x=2.5对于小军来说是无效的,因为小军的编号是3,用小明的结果验证小军的方程是无法通过验证的。
事实上如果某个方程被验证通过了,小红可以直接从方程的第一项系数得知是谁解出的方程。所以,窃取别人的工作量证明的结果是没有用的。
通过工作量证明,可以有效地验证每个人确实都必须花费一定时间做了计算。
在比特币网络中,矿工的挖矿也是一种工作量证明,但是,不能用解多项式方程来实现,因为解多项式方程对人来说很难计算,对计算机来说非常容易,可以在1秒钟以内完成。
要让计算机实现工作量证明,必须找到一种工作量算法,让计算机无法在短时间内算出来。这种算法就是哈希算法。
通过改变区块头部的一个nonce字段的值,计算机可以计算出不同的区块哈希值:
直到计算出某个特定的哈希值的时候,计算结束。这个哈希和其他的哈希相比,它的特点是前面有好几个0:
hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f
hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d
hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12
hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246
hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5
hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a
hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193
hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed
...
hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c
比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。
比特币使用的SHA-256算法可以看作对随机输入产生随机输出,例如,我们对字符串Hello再加上一个数字计算两次SHA-256,根据数字的不同,得到的哈希是完全无规律的256位随机数:
hash256("Hello?") = ????????????????????????????????????????????????????????????????
大约计算16次,我们可以在得到的哈希中找到首位是0的哈希值,因为首位是0出现的概率是1/16:
hash256("Hello1") = ffb7a43d629d363026b3309586233ab7ffc1054c4f56f43a92f0054870e7ddc9
hash256("Hello2") = e085bf19353eb3bd1021661a17cee97181b0b369d8e16c10ffb7b01287a77173
hash256("Hello3") = c5061965d37b8ed989529bf42eaf8a90c28fa00c3853c7eec586aa8b3922d404
hash256("Hello4") = 42c3104987afc18677179a4a1a984dbfc77e183b414bc6efb00c43b41b213537
hash256("Hello5") = 652dcd7b75d499bcdc61d0c4eda96012e3830557de01426da5b01e214b95cd7a
hash256("Hello6") = 4cc0fbe28abb820085f390d66880ece06297d74d13a6ddbbab3b664582a7a582
hash256("Hello7") = c3eef05b531b56e79ca38e5f46e6c04f21b0078212a1d8c3500aa38366d9786d
hash256("Hello8") = cf17d3f38036206cfce464cdcb44d9ccea3f005b7059cff1322c0dd8bf398830
hash256("Hello9") = 1f22981824c821d4e83246e71f207d0e49ad57755889874d43def42af693a077
hash256("Hello10") = 8a1e475d67cfbcea4bcf72d1eee65f15680515f65294c68b203725a9113fa6bf
hash256("Hello11") = 769987b3833f082e31476db0f645f60635fa774d2b92bf0bab00e0a539a2dede
hash256("Hello12") = c2acd1bb160b1d1e66d769a403e596b174ffab9a39aa7c44d1e670feaa67ab2d
hash256("Hello13") = dab8b9746f1c0bcf5750e0d878fc17940db446638a477070cf8dca8c3643618a
hash256("Hello14") = 51a575773fccbb5278929c08e788c1ce87e5f44ab356b8760776fd816357f6ff
hash256("Hello15") = 0442e1c38b810f5d3c022fc2820b1d7999149460b83dc680abdebc9c7bd65cae
如果我们要找出前两位是0的哈希值,理论上需要计算256次,因为00出现的概率是162=256,实际计算44次:
hash256("Hello44") = 00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5
如果我们要找出前3位是0的哈希值,理论上需要计算163=4096次,实际计算6591次:
hash256("Hello6591") = 0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c
如果我们要找出前4位是0的哈希值,理论上需要计算164=6万5千多次,实际计算6万7千多次:
hash256("Hello67859") = 00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87
如果我们要找出前5位是0的哈希值,理论上需要计算165=104万次,实际计算158万次:
hash256("Hello1580969") = 00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e
如果我们要找出前6位是0的哈希值,理论上需要计算166=1677万次,实际计算1558万次:
hash256("Hello15583041") = 0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76
对于给定难度的SHA-256:假设我们用难度1表示必须算出首位1个0,难度2表示必须算出首位两个0,难度N表示必须算出首位N个0,那么,每增加一个难度,计算量将增加16倍。
对于比特币挖矿来说,就是先给定一个难度值,然后不断变换nonce,计算Block Hash,直到找到一个比给定难度值低的Block Hash,就算成功挖矿。
我们用简化的方法来说明难度,例如,必须计算出连续17个0开头的哈希值,矿工先确定Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化nonce来计算哈希,直到找出连续17个0开头的哈希值。我们可以大致推算一下,17个十六进制的0相当于计算了1617次,大约需要计算2.9万亿亿次。
17个0 = 1617 = 295147905179352825856 = 2.9万亿亿次
实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:
Difficulty = 402937298
= 0x18 0455d2
= 0x0455d2 * 28 * (0x18 - 3)
= 106299667504289830835845558415962632664710558339861315584
= 0x00000000000000000455d2000000000000000000000000000000000000000000
注意,难度值的数值越小,说明哈希值前面的0越多,计算的难度越大。
比特币网络的难度是不断变化的,它的难度保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度也会减少。因此,难度随着全网算力的增减会动态调整。
比特币设计时本来打算每2016个区块调整一次难度,也就是两周一次,但是由于第一版代码的一个bug,实际调整周期是2015个区块。
根据比特币每个区块的难度值和产出时间,就可以推算出整个比特币网络的全网算力。
比特币网络的全网算力一直在迅速增加。目前,全网算力已经超过了100EH/每秒,也就是大约每秒钟计算1万亿亿次哈希:
所以比特币的工作量证明被通俗地称之为挖矿。在同一时间,所有矿工都在努力计算下一个区块的哈希。而挖矿难度取决于全网总算力的百分比。举个例子,假设小明拥有全网总算力的百分之一,那么他挖到下一个区块的可能性就是1%,或者说,每挖出100个区块,大约有1个就是小明挖的。
由于目前全网算力超过了100EH/s,而单机CPU算力不过几M,GPU算力也不过1G,所以,单机挖矿的成功率几乎等于0。比特币挖矿已经从早期的CPU、GPU发展到专用的ASIC芯片构建的矿池挖矿。
当某个矿工成功找到特定哈希的新区块后,他会立刻向全网广播该区块。其他矿工在收到新区块后,会对新区块进行验证,如果有效,就把它添加到区块链的尾部。同时说明,在本轮工作量证明的竞争中,这个矿工胜出,而其他矿工都失败了。失败的矿工会抛弃自己当前正在计算还没有算完的区块,转而开始计算下一个区块,进行下一轮工作量证明的竞争。
为什么区块可以安全广播?因为Merkle Hash锁定了该区块的所有交易,而该区块的第一个coinbase交易输出地址是该矿工地址。每个矿工在挖矿时产生的区块数据都是不同的,所以无法窃取别人的工作量。
比特币总量被限制为约2100万个比特币,初始挖矿奖励为每个区块50个比特币,以后每4年减半。
共识算法
如果两个矿工在同一时间各自找到了有效区块,注意,这两个区块是不同的,因为coinbase交易不同,所以Merkle Hash不同,区块哈希也不同。但它们只要符合难度值,就都是有效的。这个时候,网络上的其他矿工应该接收哪个区块并添加到区块链的末尾呢?答案是,都有可能。
通常,矿工接收先收到的有效区块,由于P2P网络广播的顺序是不确定的,不同的矿工先收到的区块是有可能的不同的。这个时候,我们说区块发生了分叉:
在分叉的情况下,有的矿工在绿色的分叉上继续挖矿,有的矿工在蓝色的分叉上继续挖矿:
但是最终,总有一个分叉首先挖到后续区块,这个时候,由于比特币网络采用最长分叉的共识算法,绿色分叉胜出,蓝色分叉被废弃,整个网络上的所有矿工又会继续在最长的链上继续挖矿。
由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。
小结
比特币挖矿是一种带经济激励的工作量证明机制;
工作量证明保证了修改区块链需要极高的成本,从而使得区块链的不可篡改特性得到保护;
比特币的网络安全实际上就是依靠强大的算力保障的。
Comments
Make a comment
Sign in to
make a comment
Index
区块链教程
比特币
区块链原理
P2P交易原理
私钥
公钥和地址
签名
挖矿原理
可编程支付原理
多重签名
UTXO模型
Segwit地址
HD钱包
钱包层级
助记词
地址监控
以太坊
账户
区块结构
交易
智能合约
编写合约
部署合约
调用合约
编写Dapp
常用合约
ERC20
Wrapped Ether
廖雪峰的官方网站
©Copyright 2019-2021
Powered by iTranswarp
Feedback
License
比特币挖矿一定要用计算机吗?用纸笔来计算可行吗? - 知乎
比特币挖矿一定要用计算机吗?用纸笔来计算可行吗? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册数学比特币 (Bitcoin)区块链(Blockchain)比特币挖矿一定要用计算机吗?用纸笔来计算可行吗?比特币挖矿在解一条方程吗?解方程一定要用到计算机吗能不能用纸笔算一个解出来? 相关问题: 如何笔算解码二维码?显示全部 关注者2,777被浏览1,901,444关注问题写回答邀请回答好问题 15375 条评论分享221 个回答默认排序Y2TT这位更是重量级 关注Mining Bitcoin With Pencil and Paper楼主,这里有教程,我很看好你。解出来以后比特币的开采就有你掌控了。挣钱了记得给我冲50元话费。结论写在这吧:作者做了个比喻,用手算出哈希值的难度比在全世界的沙子里面找到特定的一粒沙子还要难,可能性还要低。教程每天算出来手算的速度是0.67hash(不吃不喝不睡),楼主经过训练以后速度应该有所提升,和现在主流挖矿机比起来挖矿机的速度是楼主的一百万的三次方倍(quintillion)。但是楼主没问难不难,只问可不可以,所以答案是可以的。Ken ShirriffI decided to see how practical it would be to mine Bitcoin with pencil and paper. It turns out that the SHA-256 algorithm used for mining is pretty simple and can in fact be done by hand. Not surprisingly, the process is extremely slow compared to hardware mining and is entirely impractical. But performing the algorithm manually is a good way to understand exactly how it works.我决定看看用铅笔和纸来演算挖比特币的矿是不是一件可行的事情。结果我发现挖矿所用的SHA-256算法其实很简单并且也可以用手算。当然了,与硬件挖矿相比这个过程是漫长的,但这不失为一中理解比特币挖矿算法的一种好方法。The mining processBitcoin mining is a key part of the security of the Bitcoin system. The idea is that Bitcoin miners group a bunch of Bitcoin transactions into a block, then repeatedly perform a cryptographic operation called hashing zillions of times until someone finds a special extremely rare hash value. At this point, the block has been mined and becomes part of the Bitcoin block chain. The hashing task itself doesn't accomplish anything useful in itself, but because finding a successful block is so difficult, it ensures that no individual has the resources to take over the Bitcoin system. For more details on mining, see my Bitcoin mining article.比特币挖矿是比特币系统安全的保证。中心思想就是比特币矿工们汇聚到一个矿区并且重复进行加密的哈希运算(不计其数的,zillion应该是比trillion还大的多得多的计量单位。)直到找到产生合适的哈希的字符串。到此为止,这个区块就已经被挖到了并成为了比特币区块链上的一环。哈希运算本省并没有任何意义。但是挖矿的难度由于是巨大的,这就保证了没有任何一个人可以有足够多的资源占据整个比特币系统。A cryptographic hash function takes a block of input data and creates a smaller, unpredictable output. The hash function is designed so there's no "short cut" to get the desired output—you just have to keep hashing blocks until you find one by brute force that works. For Bitcoin, the hash function is a function called SHA-256. To provide additional security, Bitcoin applies the SHA-256 function twice, a process known as double-SHA-256.加密的哈希计算确保了解出这个运算没有任何捷径,只能够不断觉得进行运算用暴力的方法直至成功。In Bitcoin, a successful hash is one that starts with enough zeros. [1] Just as it is rare to find a phone number or license plate ending in multiple zeros, it is rare to find a hash starting with multiple zeros. But Bitcoin is exponentially harder. Currently, a successful hash must start with approximately 17 zeros, so only one out of 1.4x1020 hashes will be successful. In other words, finding a successful hash is harder than finding a particular grain of sand out of all the grains of sand on Earth.The following diagram shows a block in the Bitcoin blockchain along with its hash. The yellow bytes are hashed to generate the block hash. In this case, the resulting hash starts with enough zeros so mining was successful. However, the hash will almost always be unsuccessful. In that case, the miner changes the nonce value or other block contents and tries again.Structure of a Bitcoin blockThe SHA-256 hash algorithm used by BitcoinThe SHA-256 hash algorithm takes input blocks of 512 bits (i.e. 64 bytes), combines the data cryptographically, and generates a 256-bit (32 byte) output. The SHA-256 algorithm consists of a relatively simple round repeated 64 times. The diagram below shows one round, which takes eight 4-byte inputs—A through H—then performs a few operations, and generates new values of A through H.SHA-256 算法把输入为64bytes的区块整合成加密数据并产生了32byte的输出。SHA-256 算法包含了相对而言简单的64轮操作。下面的图展示了把8个4byte的输入从A到H,展开了一些运算以后产生了从A到H新的值。One round of the SHA-256 algorithm showing the 8 input blocks A-H, the processing steps, and the new blocks. Diagram created by kockmeyer, CC BY-SA 3.0.The blue boxes mix up the values in non-linear ways that are hard to analyze cryptographically. Since the algorithm uses several different functions, discovering an attack is harder. (If you could figure out a mathematical shortcut to generate successful hashes, you could take over Bitcoin mining.)右侧深蓝色的格子里面把输入的数值用非线性的方法进行整合,这样就很难进行分析。因为这种算法用到了数种方法,找到一条捷径就更难了。如果谁找出来了,他就能掌管比特币的开采。The Ma majority box looks at the bits of A, B, and C. For each position, if the majority of the bits are 0, it outputs 0. Otherwise it outputs 1. That is, for each position in A, B, and C, look at the number of 1 bits. If it is zero or one, output 0. If it is two or three, output 1.Ma这个运算主要关注与A,B和C的值。如果他们主要的值是0.那输出就是0.如果主要不是0,那输出就是1.比如说,A,B,C上都是0或者1,那么输出0,如果是2或3那么就输出1.The Σ0 box rotates the bits of A to form three rotated versions, and then sums them together modulo 2. In other words, if the number of 1 bits is odd, the sum is 1; otherwise, it is 0. The three values in the sum are A rotated right by 2 bits, 13 bits, and 22 bits.Σ0转换A的值并且相加,找出除以2的余数。如果1bits是偶数那么总和为偶,不然就为0.三个值加起来的总和是A向右移2bits,13bits和22bits。The Ch "choose" box chooses output bits based on the value of input E. If a bit of E is 1, the output bit is the corresponding bit of F. If a bit of E is 0, the output bit is the corresponding bit of G. In this way, the bits of F and G are shuffled together based on the value of E.Ch的值由E的输入来决定。如果E的bit为1,那么输出为F的bit。如果E为0,那么输出为G的bit。这样F 和 G 一定程度上有E决定。The next box Σ1 rotates and sums the bits of E, similar to Σ0 except the shifts are 6, 11, and 25 bits.Σ1与Σ0类似,只是向右移6,11,25bits.The red boxes perform 32-bit addition, generating new values for A and E. The input Wt is based on the input data, slightly processed. (This is where the input block gets fed into the algorithm.) The input Kt is a constant defined for each round.[2]红格子产生了新的A和E. 输入的Wt是由输入的数据决定的,经过稍微的处理。输入的Kt 是一个常数由每一轮运算定义。As can be seen from the diagram above, only A and E are changed in a round. The other values pass through unchanged, with the old A value becoming the new B value, the old B value becoming the new C value and so forth. Although each round of SHA-256 doesn't change the data much, after 64 rounds the input data will be completely scrambled. [3]每一轮只有A和E产生了变化。其他的值都没有变。旧的A变成了新的B.旧的B变成了新的C.尽管每一轮都没有太大的变化,但是六十四轮以后输入的值就会有翻天覆地的变化。Manual miningThe video below shows how the SHA-256 hashing steps described above can be performed with pencil and paper. I perform the first round of hashing to mine a block. Completing this round took me 16 minutes, 45 seconds.https://www.youtube.com/watch?time_continue=1&v=y3dqhixzGVo 这里有视频地址,需要翻墙才能看。To explain what's on the paper: I've written each block A through H in hex on a separate row and put the binary value below. The major peration appears below C, and the shifts and Σ0 appear above row A. Likewise, the choose operation appears below G, and the shifts and Σ1 above E. In the lower right, a bunch of terms are added together, corresponding to the first three red sum boxes. In the upper right, this sum is used to generate the new A value, and in the middle right, this sum is used to generate the new E value. These steps all correspond to the diagram and discussion above.解释一下我在纸上做了什么,我把从A到H分别在一行上面十六进制转换为二进制。主要的运算写在C下面。bits转换和Σ0展示在A行上面。同样的,choose运算在G下面,bits转换和Σ1在E的上方。在右下角,相对应于三个红格子的数值被加了上去。在右上方,总和被用于产生一个新的A值。在右中侧,总和被用于产生新的E值。I also manually performed another hash round, the last round to finish hashing the Bitcoin block. In the image below, the hash result is highlighted in yellow. The zeroes in this hash show that it is a successful hash. Note that the zeroes are at the end of the hash. The reason is that Bitcoin inconveniently reverses all the bytes generated by SHA-256. [4]What this means for mining hardwareEach step of SHA-256 is very easy to implement in digital logic—simple Boolean operations and 32-bit addition. (If you've studied electronics, you can probably visualize the circuits already.) For this reaon, custom ASIC chips can implement the SHA-256 algorithm very efficiently in hardware, putting hundreds of rounds on a chip in parallel. The image below shows a mining chip that runs at 2-3 billion hashes/second; Zeptobars has more photos.In contrast, Litecoin, Dogecoin, and similar altcoins use the scrypt hash algorithm, which is intentionally designed to be difficult to implement in hardware. It stores 1024 different hash values into memory, and then combines them in unpredictable ways to get the final result. As a result, much more circuitry and memory is required for scrypt than for SHA-256 hashes. You can see the impact by looking at mining hardware, which is thousands of times slower for scrypt (Litecoin, etc) than for SHA-256 (Bitcoin).ConclusionThe SHA-256 algorithm is surprisingly simple, easy enough to do by hand. (The elliptic curve algorithm for signing Bitcoin transactions would be very painful to do by hand since it has lots of multiplication of 32-byte integers.) Doing one round of SHA-256 by hand took me 16 minutes, 45 seconds. At this rate, hashing a full Bitcoin block (128 rounds) [3] would take 1.49 days, for a hash rate of 0.67 hashes per day (although I would probably get faster with practice). In comparison, current Bitcoin mining hardware does several terahashes per second, about a quintillion times faster than my manual hashing. Needless to say, manual Bitcoin mining is not at all practical.[5]SHA-256运算出奇的简单,简单到可以拿手算。做一轮要花我16分钟45秒,以这个速度得到一个完整的比特币区块(128轮)需要1.49天(不吃不喝一直做)每天的速度是0.67 hashes.目前挖矿机的效率是我的一百万的三次方倍数。所以说手算挖矿是不实际的。A Reddit reader asked about my energy consumption. There's not much physical exertion, so assuming a resting metabolic rate of 1500kcal/day, manual hashing works out to almost 10 megajoules/hash. A typical energy consumption for mining hardware is 1000 megahashes/joule. So I'm less energy efficient by a factor of 10^16, or 10 quadrillion. The next question is the energy cost. A cheap source of food energy is donuts at $0.23 for 200 kcalories. Electricity here is $0.15/kilowatt-hour, which is cheaper by a factor of 6.7 - closer than I expected. Thus my energy cost per hash is about 67 quadrillion times that of mining hardware. It's clear I'm not going to make my fortune off manual mining, and I haven't even included the cost of all the paper and pencils I'll need.有一个reddit网友问我关于能量消耗的事。其实并没有消耗我多少的体能。假设一个人一天啥也不干他的机体消耗是1500卡路里。手动挖矿找到一个哈希值大约消耗10兆焦耳。硬件挖矿通常消耗是100兆焦耳。所以我的能耗比机器要低的多得多的多。关于补充能量的事,一个甜甜圈能提供200卡路里需要23美分(1块5).电的价格是一千瓦时15美分(九毛八)。所以我的耗能是机器的百万的四次方倍,很明显靠笔算挖矿挣不了钱。而且我还没有考虑笔和纸的消耗。编辑于 2017-09-16 20:06赞同 6191196 条评论分享收藏喜欢收起酱紫君数学等 2 个话题下的优秀答主 关注我觉得高赞答案那个老外还少算了,他就算了下SHA256,事实上还有其他麻烦...不想看原理可以直接跳到最后一张图开始.比特币挖矿,说来也容易,其实就是找到如下不等式的一个解而已:\text{hash}(x)<\text{target}其中hash就是常说的哈希函数,target则决定了难度.哈希函数定义域为整数,值域则是某个范围的正整数.可以看出其实解有无数个,但是发现其中一个并不容易.你可能要说了,我能不能分析这个函数来求它的部分反函数?有些哈希函数可以,比如CRC校验函数,但是一类用作加密的哈希函数不可以.哈希加密函数,基本特点之一就是随机,以比特币使用的SHA256为例,画出前100个数字的哈希值:可以看出这个函数图像几乎就是 0\sim 2^{256} \approx 1.15792\times 10^{77} 中的一个随机数.也就是说随便说一个数,说中答案的概率只有 8.63616^{-78},宇宙原子总数才 10^{80} 左右...Target用来调节难度.Target越小,找到一个解的难度自然就越高.而唯一的求解方法就是穷举.SHA256是SHA-2的一种,SHA-2的第t个加密循环如图所示:图中的深蓝色方块是事先定义好的非线性函数.\begin{aligned} &\operatorname {Ch} (E,F,G)=(E\land F)\oplus (\neg E\land G)\\ &\operatorname {Ma} (A,B,C)=(A\land B)\oplus (A\land C)\oplus (B\land C)\\ &\Sigma _{0}(A)=(A\!\ggg \!2)\oplus (A\!\ggg \!13)\oplus (A\!\ggg \!22)\\ &\Sigma _{1}(E)=(E\!\ggg \!6)\oplus (E\!\ggg \!11)\oplus (E\!\ggg \!25)\\ \end{aligned}先把输入从16进制翻译成2进制,有256位哦.然后切片输入这个运算器.\operatorname {Ch} 关注E,F,G.如果E为1,那么输出为F。如果E为0,那么输出为G.\operatorname {Ma} 关注A,B,C.相互进行ADN然后相加取模二余数.\Sigma _{0}(A) ,取A分别右移动2Bits,13Bits和22Bits,等价于数学上的除以$2^2$ , $2^13$ , $2^22$,然后相加取模二余数.\Sigma _{1}(E) 与 \Sigma _{0}(E) 类似,只是右移6,11,25 Bits.遇到红框模 2^{32} ,也就是抹去前面192位.ABCDEFGH一开始分别是八个初始值,$K_t$是第t个密钥,$W_t$是本区块产生第t个word.原消息被切成固定长度的区块,对每一个区块,产生n个word,通过重复运作循环n次对ABCDEFGH这八个工作区块循环加密.最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串.比特币的方程(不等式)可以写成\text{SHA256}(\text{SHA256}(C+x)) < \text{TARGET},0 比特币挖矿究竟在计算一个什么问题?手动验证区块链给出答案 - 知乎首发于MIXLAB跨学科修炼指南切换模式写文章登录/注册比特币挖矿究竟在计算一个什么问题?手动验证区块链给出答案Tony互联网/产品设计本文对比特币挖矿的算法做了一次深入到数字细节的复现,使用了真实的区块链数据来展示实战挖矿中的计算过程。阅读目标为对计算机和编程有一定的基础,已经明白比特币的基本原理和使用方法,希望能够深入理解比特币核心算法的人群。比特币基本的科普写起来更难,因为受众更广,而且市面的文章千篇一律,内容相差无几,做成漫画的形式又耗时耗力,我只在另外一篇文章中做了笔记,等待修改。技术文章则简单得多,基于许多共识,不需要解释太多的基础知识。比特币挖矿的算法,可以简单地总结为对区块头做两次sha256哈希运算,得到的结果如果小于区块头中规定的难度目标,即挖矿成功。区块头的结构如下区块头的结构那么挖矿的算法可以表达为for nonce in range(0, 2**32): block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce if sha256(sha256(block_header)) < target_bits: break简单回顾下挖矿的流程,我们可以定义为四个阶段。验证和筛选交易计算Merkle root计算区块头穷举nonce计算hash验证和筛选交易挖矿节点首先对交易做验证,剔除有问题的,然后通过一套自定义的标准来选择哪些交易希望打包进区块,比如通过交易费与交易占用的字节大小的比值超过某个门槛来判断,这样的交易才被认为有利可图。当然,节点也可以特意选择要加入某条交易,或者故意忽略某些交易,每个挖矿节点有很大的自由裁度权力。如果是通过矿池挖矿的话,矿池的服务器会去筛选交易,然后分配给每个参与的矿机一个独立的任务。这个任务的难度小于总的挖矿难度,通过完成较小难度的计算,来确认自己参与的份额。每台不同的矿机计算的问题不会重复,当其中一台矿机成功挖矿时,所有矿机依据确认的工作量来分配收益。计算Merkle root一旦筛选好交易数据,按照时间排序,两两哈希,层层约减,通过这些交易就可以计算出一棵Merkle树,可以确定一个唯一的摘要,这就是Merkl树的根。Merkle树中,任何节点的变化,都会导致merkle root发生变化,通过这个值,可以用来验证区块中的交易数据是否被改动过。ABCDEEEE .......Merkle root / \ ABCD EEEE / \ / AB CD EE .......E与自己配对,奇数树叶时 / \ / \ / A B C D E .........交易计算区块头我们依次获取挖矿需要的每一项区块头信息。 区块头只有80个字节,挖矿只需要对区块头进行运算即可。区块头中的信息,在挖矿前大部分已经是固定的,或者是容易计算的。区块中的交易数据虽然很大,但是已经通过Merkle树固定了下来,不需要再包含进来。而所谓的区块链,其实也是通过区块头而链接在一起的。数据结构中的链表,每个节点保存了下个节点的内存地址,而区块链则保存了上个节点的地址。下面的示意图比较简单地解释了区块链和区块的构成。比特币区块链示意图我们接下来开始逐项准备需要的数字。版本号跟随比特币客户端而定,一段时间内不会改变。即使要改变,也会有比特币的核心开发人员来协调升级策略,这个可以理解为一个静态常数。前一区块摘要一次哈希即可。前一区块已经是打包好的。默克尔根刚才已经得到了结果,根据本次交易包含的交易列表得到。时间取打包时的时间。也不需要很精确,前后几秒,几十秒也都可以。难度目标参考上两周产生的区块的平均生成时间而定。两周内如果平均10分钟产生一个区块的话,两周会产生2016个区块,软件会计算最新的2016个区块生成的时间,然后做对比,随之调整难度,使得接下来产生的区块的预期时间保持在10分钟左右。因为最近的2016个区块已经确定,所以这个数字也是确定的。随机数nonce这个就是挖矿的目标了。这是一个32位的数字。随机数可以变化,而且要从0试到最大值2^32。直到最后出现的hash结果,其数字低于难度目标值。不过以现在的计算机算力,一台矿机用不了一秒就把全部的变化可能计算完了,所以还需要改变区块内部的创币交易中的附带消息,这样就让merkle root也发生了变化,从而有更多的可能去找到符合要求的nonce。挖矿中,第一笔交易是新发的比特币,接收方就是矿工指定的地址,这是挖矿中最大的奖励;另外一小部分来自交易手续费。这笔交易没有输入方,称为创币交易。创币交易可以附带一段文字消息,比如中本聪在挖出创世区块时植入的信息The Times 03/Jan/2009 Chancellor on brink of second bailout for banks就是这篇头条文章。The Times报纸2009-01-03期验证过程讲完了基本的原理,我们开始使用实际数据来验证这个算法。我们以区块277316为例,其信息来自网站http://blockchain.info选择这个区块的原因是为了与《Mastering Bitcoin》一书中的介绍做参考。此书中文社区译本和英文原版在介绍这部分内容时有出入,而且作者Antonopoulos并没有做完整的演算,也没有提到其中关键的字节顺序问题,相信很多人可能会踩这个坑。这里还原的细节可以帮助读者对书中介绍工作量证明的部分彻底理解。比特币区块277316的信息比特币区块277316的hash值请注意下面的每个步骤,每一个变化,这是比特币最核心的算法。第一步,准备数据2 (版本号的十进制) 0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569 (前一区块hash值的16进制) c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e (merkle root的16进制) 2013-12-27 23:11:54 (utc时间) 419668748 (难度目标的十进制) 924591752 (随机数的十进制)转换时间,记住,一定要转为utc的时间戳,此处遇到过坑,小心。算法本身不难,困难的是你需要把其中所有的数据都准备正确。>>> import datetime >>> from datetime import timezone >>> datetime.datetime.strptime('2013-12-27 23:11:54', '%Y-%m-%d %H:%M:%S').replace(tzinfo=timezone.utc).timestamp() 1388185914.0第二步,转换为16进制00000002 0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569 c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e 52be093a 1903a30c 371c2688第三步,从big-endian转化为little-endian这一步的发现异常艰辛,耗费了大量的查询和尝试,大坑,大坑,谨记!发明人中本聪可能为了让机器计算更快,而变为了更接近机器的编码方式little-endian.02000000 69054f28012b4474caa9e821102655cc74037c415ad2bba70200000000000000 2ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc9 3a09be52 0ca30319 88261c37再说一遍,算法不难,最难的地方就在于亲自验算的过程中,你要把所有的隐藏知识都挖掘出来。中文资料中,极少有人做过通篇验算,而一旦真正理解了验算的过程,你会发现比特币的算法真的不难。第四步,拼接字符串,开始验证import binascii from hashlib import sha256 as s k = '0200000069054f28012b4474caa9e821102655cc74037c415ad2bba702000000000000002ecfc74ceb512c5055bcff7e57735f7323c32f8bbb48f5e96307e5268c001cc93a09be520ca3031988261c37' hk = binascii.unhexlify(k) res = binascii.hexlify(s(s(hk).digest()).digest()[::-1])代码中为何要再转换一次顺序?又是因为字节顺序的问题,我们在平常使用和网站展示时,都使用大端顺序,所以需要转换过来。最终得到的结果就是 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc416进制下前面15个0,然后是1。 为了得到这个数字,需要花费我近一个星期的时间,先从椭圆曲线加密算法开始学起,再到各种原始资料的阅读,还下载了难懂的源代码,论坛也翻了个遍。看到前面有一堆0,感觉胜利的曙光快来了。不急,我们仍然要验证最后一步,是否满足难度目标。当然是满足的,因为我们是在验证结果嘛,但如果这是在挖矿计算的话,就需要验证了。难度目标对应的数字是0x03a30c*0x0100**(0x19-0x03) = 0000000000000003a30c0000000000000000000000000000000000000000000016进制下前面15个0,然后是3。计算结果小于难度目标,符合要求。那这个结果就一定是网站上公布的数字了。挖矿结果准确无误,验证了算法与数据的一致。正确的hash值需要再次说明的是,挖矿时nonce随机数是未知的,要从0试到2^32,但是这个数字其实不大,只有4294967296。以现在的一台矿机动辄14T每秒的算力,全部算完到上限也不需要一秒。上文提到在这种情况下,需要使用创币交易中的附带消息,额外的字符串成为extra nonce。区块头其实需要通过创币交易改变多次,才能最终挖矿成功。对这个结果我们解释下意味着什么,在2013年年底时,这个区块产生,这需要算力达到8T/s的设备,即每秒8*10^15次暴力验证,连续工作10分钟。这对于2018年的现在来说的确不算什么,一台矿机,不比两三块砖头大多少,就拥有14T/s的算力,只需要6,7分钟单独就可以挖到。但在当时,8T也是全网千分之一的算力了,需要当时最好的矿机上百台一起工作。而如果这个计算使用一台普通的桌面电脑,以拥有两个GPU为例,算力可以达到100M/s,需要26年。如果使用2018年最好的手机iphoneX的话,每秒可以做70次计算,那么将需要四百万年。至此我们完整地回顾了比特币区块链的工作量证明算法,如果各位完全理清了其中的思路,也就可以手动实现自己的挖矿程序,或者另外尝试设计一些新的区块链产品了。最艰深的技术,我们希望能够在底层去了解,然而拨开云雾,其实底层的逻辑并不难。不过比特币里面的技术远不止挖矿算法,还有加密算法、Script智能合约、各种协议、网络通信、交易的验证,每一个都充满了魔性,进出之间,不由得让人惊叹发明人的知识的深度与广度。无论比特币是什么,将会怎样,但是以比特币为第一个大规模应用的区块链技术,已经扩散了开来,整个系统的严密与逻辑的复杂,的确让人着迷。One more thing...创世区块也可以通过上面的方法来验证,有好奇的朋友可以尝试下。虽然创世区块后来硬编码在客户端,但仍然是挖出来的。提示:对于创世区块,版本号是1。前一区块的hash摘要,猜想会是什么呢?对于创世区块,是没有前一区块的。这里就人为规定了一串数字,不难猜到,也不难验证。难度目标是1,这是定义为一个sha256结果的前32位是0,也就是对应的16进制字符串要有8个0,那么难度bits此时是0x1d00ffff。这个数字的得出需要概率论的知识,同时也是中本聪的一个规定。然后再用上面的解法去求解随机数就可以了。编辑于 2018-01-25 09:51比特币 (Bitcoin)区块链(Blockchain)赞同 11615 条评论分享喜欢收藏申请转载文章被以下专栏收录MIXLAB跨学科修炼指南设计黑客跨界技能http://mixlab. 挖矿是如何产生比特币的? - 知乎首页知乎知学堂发现等你来答切换模式登录/注册虚拟货币货币比特币 (Bitcoin)挖矿是如何产生比特币的?最近翻译了中本聪先生发明比特币的论文,在这篇论文中他说比特币的产生由挖矿者计算最优散列值计算得到,第一个计算得到这一散列值的也就是block的第一人将…显示全部 关注者4,100被浏览5,795,466关注问题写回答邀请回答好问题 4010 条评论分享269 个回答默认排序aibifu区块链扫地僧 关注在这篇文章中我会给出一个虚拟的村庄叫“比特村”,整个文章会以讲故事的方式,逐步告诉大家比特币提出的动机、解决了什么问题以及一些关键组件的目标和设计方案。问题的提出我们先从比特币产生的动机开始。以物易物的比特村话说在这个世界上,有一个叫比特村的小村庄,村庄共有几百户人家。这个村庄几乎与世隔绝,过着自给自足的生活。由于没有大规模贸易,比特村村民一直 过着以物易物的生活,也就是说村民之间并没有使用统一的货币,互相间的贸易基本上就是老张家拿一袋面粉换老李家一只羊,王大嫂拿一筐野果换刘大婶两尺布。 村民们一直就这么纯朴的生活着。实物货币终于有一天,村民觉得一直这样以物易物实在太不方便了,于是村子全员开会,讨论如何解决这个问题。有人提议,以便于分割且稀有的东西,例如黄金,作 为一般等价物,把其它物品和黄金的对应关系编成一张表格,例如一克黄金对应一只羊,一克黄金对应一袋面粉等等,此时老张再也不用扛着一袋面粉气喘吁吁的去 老李家换羊了,他只要从家里摸出一克金子,就可以去老李家牵回一只羊,而老李拿着这一克黄金可以从任何愿意出让面粉的人那里换回一袋面粉,当然也可以换取 任何和一克黄金等值的物品。此时比特村进入了实物货币时代。符号货币好景不长,过了一段时间,实物货币的弊端也出现了。因为比特村附近金矿并不多,开采和冶炼金子太费时费力了。而随着使用,金子总是不断会因为磨损、 丢失或有人故意囤积而发生损耗。全村人又一次坐在了一起,开始商讨对策。此时有人说,其实大家也不必一定要真的用黄金啊,随便找张纸,写上“一克黄金”, 只要全村人都认同这张纸就等于一克黄金,问题不就解决了。其他人纷纷表示认同,但同时也有了新的问题:真实的黄金是需要开采和冶炼的,金矿有限,开采和冶 炼也需要成本,所以没有人可以短期凭空制造大量的黄金,可写字就不同了,只要我纸够笔够,随便像写多少写多少,那这就变成拼谁家里纸多了,搞不好到时一万 张纸才能换一只羊(实际上这就发生了经济学上的通货膨胀)。大家一想也是啊。不过此时又有人提出了解决方案:这个纸不是谁写都有效,我们只认村里德高望重的老村长写得,大家都认识老村长的字。老村长写一些 纸,同时按照各家黄金存量发给大家等量的纸,例如老张家有二百克黄金,老村长就发给老张二百张写着“一克黄金”的纸,同时将老张家的黄金拿走作为抵押。就 这样,老村长将村里所有黄金收归到自己的家里,并按各家上交的黄金数量发给等值的写有字的纸。此时村民就可以拿着这些纸当黄金进行贸易了,而且大家都认得 老村长的字,其他人伪造不出来。另外,如果谁的纸磨损太严重,也可拿到老村长那里兑换新的等值的纸,另外老村长承诺任何人如果想要换成真黄金,只要拿纸回 来,老村长就会把等值的黄金还给那人。因为老村长写得纸的黄金量和真实放在家里的黄金量是一样的,所以只要严格按照销毁多少纸新写多少纸的原则,每一张有 效的纸总能换回相应的真黄金。此时,比特村进入了符号货币(纸币)时代。而老村长就承担了政府和银行的角色。中央系统虚拟货币又过了几年,老村长由于每天都要核对大量的旧纸币,写新的纸币,还要把各种账目仔细做好记录。一来二去,老村长操劳过度不幸驾鹤西去了。比特村再次召开全体大会,讨论应该怎么办。此时老村长的儿子二狗子自告奋勇接过了父亲的笔,承担起货币发行的责任。这个年轻的村长二狗子很聪明,他 做了几天,发现好像也不用真的写那么多纸。完全可以这样:村民把纸币都交上来,销毁,但是二狗子会记录下每户上交的纸币数量。以后如果要进行付钱,例如老 张要拿一克金子向老李换一只羊,就一起给二狗子打个电话,说明要将老张名下的一克金子划归老李名下,二狗子拿出账本,看看老张名下是否有一克金子,如果有 就在老账的名下减掉一克,在老李的名下加上一克,这样就完成了支付,此时老李在电话中听到二狗子确认转账完成,就可以放心让老张把羊牵走了。此时比特村进入了中央系统虚拟货币时代。每个村民都不需要用实物支付,支付过程变成了二狗子那边维护的账本上数字的变更。分布式虚拟货币这新上任的二狗子是聪明,不过这人有时候是聪明反被聪明误。有一天二狗子盯着这账本,心想这全村各户谁有多少钱就是我说的算,那我岂不是……。于是他头脑一热,私自从老张帐下划了十克金子到自己名下。本以为天衣无缝,但没想到老张也有记账的习惯,有一天他正要付钱却被二狗子告知账户没钱了。老账核对了一下自己的账本,命名还有十克啊,于是拿着账本去找二狗子理论,这一核对发现了那笔未经老张同意的转账。东窗事发!比特村炸开锅了。二狗子被弹劾是不可避免了,不过通过这件事,大家发现了账本集中在一个人手里的弊端:这个体系完全依赖于账本持有人的个人信用,如果这个人不守规矩,随意篡改账本,那么整个货币系统就会崩溃如果这个人家里失火或者账本失窃,同样也会为整个体系带来毁灭性的打击正当人们不知所措时,村里一个叫中本聪的宅男科学家走上了台,告诉大家他已经设计了一套不依赖任何中央处理人的叫比特币的虚拟货币系统,可以解决上述问题。然后他缓缓讲述了自己的方案。下面我们就来看看中本聪同学是如何设计这套系统的。基础设施搭建账簿公开机制中本聪首先说明,要对现有账簿进行如下改造:账簿上不再记载每户村民的余额,而只记载每一笔交易。即记载每一笔交易的付款人、收款人和付款金额。只要账簿的初始状态确定,每一笔交易记录可靠并有时序,当前每个人持有多少钱是可以推算出来的。账簿由私有改为公开,只要任何村民需要,都可以获得当前完整的账簿,账簿上记录了从账簿创建开始到当前所有的交易记录。此言一出,下面立刻炸锅了。第一条还无所谓,但是第二条简直无法接受,因为账簿可是记录了所有村民的交易,这样大家的隐私不全暴露了吗。中本聪倒是不慌不忙,拿出了一对奇怪的东西。身份与签名机制(公钥加密系统)中本聪说,大家不要慌。在他的这套机制下,任何人都不使用真实身份交易,而是使用一个唯一的代号交易。他展示了手里神奇的东西,说这两件东西分别叫保密印章和印章扫描器。后面他会给村里每一户发一个保密印章和一个印章扫描器。两者的作用如下:保密印章可以在纸上盖一个章,每个印章盖出的章都隐含了一个全村唯一的一串字符,但是凭肉眼是看不出来的。也无法通过观察来制造出相应的印章印章扫描器可以扫描某个已经盖好的章,读出隐含的信息,并在液晶屏上显示出一串字符有了这两个神奇的东西,大家就可以在不暴露真实身份的情况下进行交易了,而印章隐含的那一串字符就是这户人家的代号。具体如何巧妙利用保密印章和印章扫描器进行交易,会在下文详述。成立虚拟矿工组织(挖矿群体)下一步,中本聪面向全村招募虚拟矿工,招募要求如下:矿工以组为单位,一组可以是单独的一户,也可以是几户联合为一组成为矿工不影响正常使用货币矿工每天要花费一定时间从事比特币“挖矿”活动,但是不同于挖金矿,虚拟矿工不需要拿着工具去野外作业,在家里就可以完成工作矿工有一定可能性获得报酬,在挖矿活动中付出的努力越多,获得报酬的可能性越大矿工可以随时退出,也可以随时有新的矿工加进来很快,大约有五分之一的村民加入比特币矿工组织,共分成了7个组。建立初始账簿(创世块)下面,中本聪宣布,先根据二狗子手里的账簿,把抵押的所有黄金按账簿记录的余额退还给每位村民,然后彻底销毁这本账簿。然后,中本聪拿出一本新账簿,在账簿的第一页上记录了一些交易记录,特别的是,这些记录的付款人一栏全都是“系统”,而收款人分别是每个印章对应的 隐含字符,代表初始时刻,系统为每一户默认分配了一定数量比特币,但是数量非常少,都只有几枚,甚至有些不幸的村户没有获得比特币。接着中本聪说,由于目前市面上比特币非常少,大家可以先回到用黄金做货币的时代,由于我不是村长,我也没有权利强迫大家一定要承认比特币,大家可以自行决定要不要接受比特币。不过随着比特币的流动和矿工的活动,比特币会慢慢多起来。支付与交易做了这么多铺垫,终于说到重点了,下面说一下在这样一个体系下如何完成支付。以老张付给老李10个比特币为例。付款人签署交易单为了支付10个比特币,老张首先要询问老李的标识字符串,例如是“ABCDEFG”,同时老张也有一个标识字符串例如是“HIJKLMN”,然后老 张写一张单子,内容为“HILKLMN支付10比特币给ABCDEFG”,然后用自己的保密印章改一个章,将这张单子交给老李。另外为了便于追溯这笔钱的 来源,还要在单子里注明这笔钱的来源记在哪一页,例如这个单子里,老张的10比特币来自建立账簿时系统的赠送,记录在账簿第一页。收款人确认单据签署人老李拿到这个单子后,需要确认这个单子确实是来自“HIJKLMN”这个人(也就是老张)签署的,这个并不困难。因为单子上必须有保密章,老李拿出 印章扫描器,扫一下章,如果液晶屏显示出的字符和付款人字符是一致的(这里是“HIJKLMN”),就可以确认单子确实是付款人签署的。这是因为根据保密 印章的机制,没有其他人可以伪造印章,任何一个人只要扫描一下印章,都可以确认单子的付款人和盖章人是否一致。收款人确认付款人余额这个系统到目前还是很有问题。通过保密印章,收款人虽然可以确认付款人确实签署了这份单子,但是无法自行确认付款人是否有足够的余额支付。之前的中 央虚拟货币系统中,二狗子负责检查付款人的余额,并通知收款人交易是否有效,现在把二狗子开了,谁来负责记账和确认每笔交易的有效性呢?之前说过,中本聪设计的这个系统是分布式货币系统,不依赖任何中央人物,所以不会有一个或少数几个人负责这件事,最终承担这份工作的是之前所提到的矿工组织。老张、老李和全村其他任何使用比特币进行交易的村民都依赖矿工组织的工作才能完成交易。矿工的工作矿工的工作是整个系统的核心,也是最复杂性最高的地方。下面逐步介绍矿工的工作内容和目的。矿工的工具俗话说,工欲善其事,必先利其器。比特币矿工虽然不用铁撅、铁锨和探照灯等工具,不过也要有一些必备的东西。初始账簿。每个组首先自己复制一份初始账簿,初始账簿只有一页,记录了系统的第一次赠送 空账簿纸。每个小组有若干账簿纸,每一页纸上仅有账簿结构,没有填内容,具体内容的书写规则后面讲述。下面是一张空账簿纸的样子,各个字段的意义后面会说到。编码生成器(哈希函数)。中本聪又向矿工组织的每个组分发了若干编码生成器,这个东西很神奇,将一页账簿填好内容的账簿纸放入这个机器,机器会在账簿纸的“本账单编号”一栏自动打印一串由“0”和“1”组成的编号,共256个。最神奇的是,编号生成器有如下功能:生成的编号仅与账簿纸上填入的内容有关,与填写人、字体、填写时间等因素均无关内容相同的账簿纸生成的编号总是相同,但是如果内容哪怕只改一个字符,编号就会面目全非编码生成器在打印编码时还需要将所有填入账簿纸的交易单放入,机器会扫描交易单和填入交易单的一致性,尤其是保密印章,如果发现保密印章和付款人不一致,会拒绝打印编码将一张已打印的账簿纸放入,机器会判定编号是否是有效的机器打印,并且判定编号和内容是否一致,这个编号无法伪造交易单收件箱。每个矿工小组需要在门口挂一个箱子用于收集交易单。 公告板。每个矿工小组同样需要一个公告板公示一些信息。有了上面的工具,矿工组织就可以开工了!收集交易单中本聪规定,每笔交易的发起人,不但要将交易单给到收款人,还要同时复制若干份一模一样的交易单投递到每个矿工小组的收件箱里。矿工小组的人定期到自己的收件箱里把收集到的交易单一并取出来。填写账簿此时小组的人拿出一张空的账簿纸,把这些交易填写到“交易清单”一栏,同时找到当前账簿最后一页,将最后一页的编号抄写到“上一张账单编号一栏”。 注意还有个“幸运数字”,可以随便填上一个数字,如12345。然后,将这样账簿纸放入编号生成器,打印好编号,一张账簿就算完成了。如果你以为矿工的工作就这么简单,那就大错特错了,中本聪有个变态的规定:只有编号的前10个数均为0,这页账簿纸才算有效。根据之前对编号生成器的描述,要修改编号,只能修改账簿纸的内容,而“交易清单”和“上一张账簿纸编号”是不能随便改的,那么只能改幸运数字了。于 是为了生成有效的账簿纸,小组里的矿工就不断抄写账簿纸,但每张纸的幸运数字都不同,然后不断的重复将纸放入编码器,如果生成的编号不符合规定,这张纸就 算废了,重复这个过程直到生成一串有效的编号。我们知道,如果编号的每一个数字都是随机的,那么平均写1000多张幸运数字不同的纸才能获得一个有效的编号。这就奇怪了,这些矿工为什么要拼命干这看似无意义的事情呢?还记得之前说过矿工有报酬吧,这就是矿工的动力了。中本聪规定:每一张账簿纸的交易清单 第一条交易为“系统给这个小组支付50个比特币”。也就是说,如果你生成了一张有意义的账簿纸,并且被所有挖矿小组接受了,那么就意味着这条交易也被接受 了,你的挖矿小组获得了50个比特币。这就是矿工被叫做矿工的原因,也是为什么之前说随着交易和矿工的活动,比特币的数量会不断增多。例如下面是一个挖矿过程,这个小组的公共比特币帐号为“UVWXYZ”。在幸运数字尝试到“533”时,系统生成了一页有效账簿。确认账簿当某挖矿小组幸运的生成了一张有意义的账簿,为了得到奖励,必须立刻请其它小组确认自己的工作。前面说过,当前村里有7个挖矿组,所以这个小组必须将有效账簿纸誊抄6份快马加鞭送到其他6个小组请求确认。中本聪规定,当某个小组接到其他小组送来的账簿纸时,必须立即停下手里的挖矿工作进行账簿确认。需要确认的信息有三个:账簿的编号有效账簿的前一页账簿有效交易清单有效首先看第一个,这个确认比较简单。只要将送来的账簿纸放入编码生成器进行验证,如果验证通过,则编号有效。第二部分需要将账簿页上的“上一页账簿纸编号”和这个小组目前保存的有效账簿最后一页编号比对,如果相同则确认,如果不同,需要顺着已有账簿向前比对,直到找到这个编号的页。如果没有找到指定的“上一页账簿纸编号”对应的页,这个小组会将此页丢掉。不予确认。注意,由上面的机制可以保证,如果各个小组手里的账簿纸是相同的,那么他们都能按同样的顺序装订成相同的账簿。因为后面一张纸的编号总是依赖前面的 纸的编号,编码生成器的机制保证了所有合法账簿纸的相对先后顺序在每个小组那里都是相同的(可能会有分支,但不会出现环,后面细讲)。最后是如何确认交易清单有效,其实也就是要确认当前每笔交易的付款人有足够的余额支付这笔钱。由于交易信息里包含这笔钱是如何来的,还包含了记录来 源交易的账单编号。例如,HIJKLMN要给ABCDEFG10个比特币,并注明了这10个比特币来自之前OPQRST支付给HIJKLMN的一笔交易, 确认时首先要确认之前这笔交易是否存在,同时还要检查HIJKLMN在这之前没有将这10个比特币支付给别人。这一切确认后,这笔交易有效性就被确认了。其中第一笔是系统奖励给生成这页账簿的小组的50个,这笔交易大家都默认承认,后面的只要按照上述方法追溯,就可以确认HIJKLMN是否当前真有10个比特币支付给ABCDEFG。如果完成了所有了上述验证并全部通过,这个小组就认可了上述账簿纸有效,然后将这张账簿纸并入小组的主账簿,舍弃目前正在进行的工作,后面的挖矿工作会基于这本更新后的主账本进行。账簿确认反馈对于挖矿小组来说,当账簿纸送出去后,如果后面有收到其他小组送来的账簿纸,其“上一页账簿纸编号”为自己之前送出去的账簿纸,那么就表示他们的工作成功被其他小组认可了,因为已经有小组基于他们的账簿纸继续工作了。此时,可以粗略的说可以认为已经得到了50个比特币。另外,任何一个小组当新生成有效账簿纸或确认了别的小组的账簿纸时,就将最新被这个小组承认的交易写到公告牌上,那么收款人只要发现相关交易被各个小组认可了,基本就可以认为这笔钱已经到了自己的账上,后面他就可以在付款时将钱的来源指向这笔交易了。以上就是整个比特币的支付体系。下面我们来分析一下,这个体系为什么可以工作下去,以及这个体系可能面临的风险。工作机制分析虽然上面阐述了比特币的基本运作规则,但是村民们还是有不少疑问。所以中本聪同学专门开了个答疑会,解答常见问题。下面总结一下村民最集中关心的问题。核心问题答疑如果同时收到两份合法的账簿页怎么办?注意在上面的运行机制中,各个挖矿小组是并行工作的,因此完全可能出现这样的情况:某小组收到两份不一样的账簿页,它们都基于当前这个小组的主账簿的最后一页,并且内容也都完全合法,怎么办?关于这个问题,中本聪同学说,小组不应该以线性方式组织账簿,而应该以树状组织账簿,任何时刻,都以当前最长分支作为主账簿,但是保留其它分支。举个例子,某小组同时收到A、B两份账簿页,经核算都是合法的,此时小组应该将两页以分叉的形式组织起来,如下图所示:黑色表示当前账簿主干。此时,可以随便选择一个页作为当前主分支,例如选择A:此时如果有一个新的账簿页是基于A的,那么这个主干就延续下去:如果这个主干一直这么延续下去,表示大家基本都以A为主干,B就会被遗忘。但是也有可能忽然B变成更长了:那么我们就需要将B分支作为当前主干,基于这个分支进行后续工作。从局部来看,虽然在某一时刻各个小组的账簿主干可能存在不一致,但大方向是一致的,那些偶尔由于不同步产生的小分支,会很快被淹没在历史中。如果挖矿小组有人伪造账簿怎么办关于这个问题,中本聪同学说,只要挖矿组织中大多数人是诚实的,这个系统就可靠,具体分几个方面给予答复。首先,基于保密印章机制,没有人能伪造他人身份进行付款,因为编码生成器在打印编码时会核对所有交易单的保密印章,印章和付款人不一致会拒绝打印。而且诚实的矿工也不会承认不合法的交易(如某笔交易付款方余额不够)。所以只有一种可能的攻击行为,即在收款人确认收款后,从另一条分支上建立另外的交易单,取消之前的付款,而将同一笔钱再次付款给另一个人(即所谓的double-spending问题)。下面同样用一个例子说明这个问题。先假设有一个攻击者拥有10个比特币,他准备将这笔钱同时支付给两名受害者A和B,并都得到承认。第一步,攻击者准备从受害者A手里买10比特币的黄金,他签署交易单给受害者A,转10个比特币给受害者A。第二步,这笔交易在最新的账簿页中被确认,并被各个挖矿小组公告出来。受害人A看到公告,确认比特币到账,给了攻击者10个比特币等值的黄金。第三步,攻击者找到账簿,从包含刚才交易的账簿页的前一页做出一个分支,生成更多的账单页,超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支,而包含受害者A得到钱的分支变成了旁支,因此挖矿组织不再承认刚才的转账,受害者A得到的10比特币被取消了。第四步,攻击者可以再次签署交易单,将同一笔钱支付给受害者B。受害者B确认钱到账后,支付给攻击者等值黄金。至此,攻击者将10个比特币花了两次,从两名受害者那里各购得等值黄金。攻击者还可以如法炮制,取消与受害者B的转账,将同一笔钱再支付给其他人。。。。。。关于这种攻击,中本聪给出的解决方案是,建议收款人不要在公告挂出时立即确认交易完成,而是应该再看一段时间,等待各个挖矿小组再挂出6张确认账簿,并且之前的账簿没有被取消,才确认钱已到账。中本聪解释道,之前设定变态的编号规则,正是为了防御这一点。根据前面所述,生成有效账簿页不是那么简单的,要花费大量的人力反复试不同的幸运数 字,而且过程完全是碰运气。如果某账簿页包含你收到钱的确认,并且在后面又延续了6个,那么攻击者想要在落后6页的情况下从另一个分支赶超当前主分支是非 常困难的,除非攻击者拥有非常多的人力,超过其他所有诚实矿工的人力之和。而且,如果攻击者有如此多人力,与其花这么大力气搞这种攻击,还不如做良民挖矿来的收益大。这就从动机上杜绝了攻击的形成。比特币会一直增加下去,岂不是会严重通货膨胀中本聪说,这一点我也想到了。前面忘了说了,我给矿工组织的操作细则手册会说明,刚开始我们协议每生成一页账簿,奖励小组50个比特币,后面,每当 账簿增加21,000页,奖励就减半,例如当达到210,000页后,每生成一页账簿奖励25个比特币,420,000页后,每生成一页奖励12.5个, 依次类推,等账簿达到6,930,000页后,新生成账簿页就没有奖励了。此时比特币全量约为21,000,000个,这就是比特币的总量,所以不会无限 增加下去。没有奖励后,就没人做矿工了,岂不是没人帮忙确认交易了到时,矿工的收益会由挖矿所得变为收取手续费。例如,你在转账时可以指定其中1%作为手续费支付给生成账簿页的小组,各个小组会挑选手续费高的交易单优先确认。矿工如果越来越多,比特币生成速度会变快吗不会。中本聪解释,虽然可以任意加入和退出矿工组织,导致矿工人数变化,每个矿工也会拿到一个编码生成器,不过我已经在编码生成器中加入了调控机制,当前工作的编码生成器越多,每个机器的效率就越低,保证新账簿页生成速率不变。虽然每个人的代号是匿名的,但如果泄露了某个人的代号,账簿又是公开的,岂不是他的所有账目都查出来了确实是这样的。例如你要和某人交易,必然要要到他的代号才能填写交易单。因为收款人一栏要填入那人的代号。不过中本聪说可以提供无限制的保密印章,建议每一次交易用不同的保密印章,这样查账簿就追查不到同一个人的所有账目了。答疑完毕。说明本文用通俗比喻的方式讲解了比特币的运行机制。有几点需要说明:为了便于理解,我做了很多简化,因此有些机制细节和实际的比特币可能不完全相同。但总体思想和关键原理是一致的。由于很多计算机世界的东西(如公钥体系、网络传输)在现实世界中并没有特别好的对等物,所以故事里难免有一些生硬和不合常理的细节。本文描述的是比特币网络本身的技术原理和运作机制,当在如Mtgox这种买卖市场中进行比特币交易时,市场做了中间代理,并不遵从上述机制。编辑于 2018-01-22 19:01赞同 2596157 条评论分享收藏喜欢收起Leaf 关注秒懂比特币挖矿: 1.我手上现在有一张面值100元的人名币。(比特币)2.谁关注公众号我就给谁。3.但是需要在评论里面猜出这张钱的编号才行。(挖矿,随机填充数值求解)自己想尽办法猜,猜中得100元全款——个人挖矿出钱召集一些人来一起猜——矿场召集认识不认识的人一起来猜,通过猜测的次数,按比例分配这100元——矿池以上是一个简单的类比例子,当然,你们关注并猜出了我兜里100块钱的编号,我保证给你。那么,比特币挖矿到底是怎么回事呢?回顾张三李四转账过程 找出问题在之前,我们用在一个偏僻的小村张三和李四转账的例子简单解释了什么是比特币。没看过的可以看下:【白话币圈】什么是比特币?这可能是最通俗易懂的答案了我们来简单回顾一下:当张三想要通过A账号转账1000元给李四的B账号时:① 张三大吼一声:大家注意啦,我用A账号给李四的B账号转1000块钱。② 张三附近的村民听了确实是张三的声音,并且检查张三的A账号是否有足够余额。③ 检查通过后,村民往自己的账本上写:A账号向B账号转账1000元,并修改余额:A账号余额=3000-1000=2000元,B账号余额=2000+1000=3000元。④ 张三附近的村民把转账告诉较远村民,一传十十传百,直到所有人都知道这笔转账,以此保证所有人账本的一致性。聪明如你一定发现了,在步骤② 如果张三吼了一声,附近村民假装没听到,都不去核实记账,那么这个系统不就停止工作了吗?为解决这个问题,村里商讨后决定,谁第一个确认是张三的声音的会获得500元。于是大家都竖起耳朵,时刻监听村里的每一个动静,真可谓草木皆兵。评论区有人问,这500元是哪儿来的?我这里也简答讲一下。1.比特币平均差不多每10分钟产生一个区块,这个区块能打包的交易数量是有限的,我们就算800笔吧。但是呢,旷工不会平白无故给你打包交易到并广播,所以需要收取手续费。而且,由于交易的人很多,先打包谁的交易也取决于手续费的高低。所以你可以看到,现在比特币火热了,手续费水涨船高。2.我们都知道比特币总量2100万个,发币机制是逐年递减。当旷工第一个成功打包这个区块并广播,并且是最长的链的话,那么他还会获得奖励,目前只有12.5个比特币。最开始是50个,已经衰减2次了。这里当然还有小问题,比如为什么要最长链,怎么确定是最长链,哪些链会被抛弃?如果大家有兴趣再深入说说。以上就是旷工的奖励。2017/12/8更新。在比特币的世界里,大约平均每10分钟会产生一个区块。所有的挖矿计算机都在尝试打包这个区块并提交,而第一个成功生成这个数据块的人,就可以得到一笔比特币报酬。最初,大约每10分钟就可以产生50个比特币的比特币报酬。但是该报酬每4年减半,现在每10分钟比特币网络就可以产生25个比特币。好了,接着上面的故事讲,张三这一吼,惊动了全村的人,大家都纷纷表示自己是第一个听到张三声音的人。这500块钱该给谁呢?于是村里又商讨出新的规定,需要有证据证明这是张三的声音。张三在喊的这一声里带有特定的声波数据,谁先破解出来就给谁。在比特币世界里,这是就是一个新的概念,共识机制。比特币是通过工作量证明的共识机制来决定记账权的,通俗来讲,谁证明了自己的工作量最大,谁就负责记账。工作量大小是通过计算符合某一个标准的比特币区块头的哈希散列值来体现的。区块头通常包含前一个区块的哈希散列值、Merkle根、时间戳、难度目标、以及一个填充的随机值。试图争夺记账权的节点称为挖矿节点,挖矿过程就是求出一个能够填充本区块头的随机值,让区块头的哈希散列值符合某一个标准。咱们接着故事讲,海归村民王二麻子凭借高超的计算能力,成功第一个匹配了张三的声波数据,然后他笑嘻嘻地向全村人广播自己破解成功。村民验证后,王二麻子如愿拿到了500元奖励金,李四也成功收到了张三的转账。网络上的每一个矿机接收并验证了一批交易,然后就开始进行挖矿,矿机需要反复的试验随机填充值来进行求解,一般采用产生随机数,尝试把产生的随机数填充到区块头,然后计算哈希。如果计算成功,则挖矿成功,向全网广播挖矿所得,全网节点验证后,把这个区块连接到区块的最上端,并且在全网达成一致。故事还在继续,王二麻子拿到这500元后就想:一个人的计算能力有限,我下次也非常可能不是第一个计算出来。若我改进算法,制造专门匹配这种声波数据的机器,然后卖机器岂不是能大赚一笔?于是就哼哧哼哧的专研去了,并在不久后面世。(专业矿机)村民蜡笔小明买了一台专业机器,觉得不错。于是大量采购,并找到一个电费低廉的场地,也请了专人人员来维护。于是,蜡笔小明便每天便看着一笔笔的500元进账。(矿场)村民张小凡也采购了一些机器,可是机器不多,能破解并拿到这500奖励的几率并不大。于是他创建了一个平台,所有有计算能力的人都可以参与进来。若得到奖励,则按每个人的计算力高低分配奖金。(矿池)好了,村民的故事差不多就到这里结束了,现在回过头来看文章开始的例子是不是特别形象?你们可以猜猜谁可能挖矿的最大算力。风险与受益其实,最初的时候,我们用电脑CPU就可以挖到比特币,比特币的创始人中本聪就是用他的电脑CPU挖出了世界上第一个创世区块。当然,现在也可以用家用电脑的CPU、GPU挖矿,只是收益非常低了。CPU挖矿的时代早已过去,GPU挖矿也早已不是主流,现在的比特币挖矿是ASIC挖矿和大规模集群挖矿的时代。回顾挖矿历史,比特币挖矿总共经历了以下五个时代:CPU挖矿→GPU挖矿→FPGA挖矿→ASIC挖矿→大规模集群挖矿 挖矿芯片更新换代的同时,带来的挖矿速度的变化是:CPU(20MHash/s)→GPU(400MHash/s)→FPGA(25GHash/s)→ASIC(3.5THash/s)→大规模集群挖矿(3.5THash/s*X)算力就是计算机每秒产生哈希碰撞的能力,算力越高,挖到比特币的概率越大,挖得比特币也就越多,回报越高。然而挖矿的受益并不是稳定且有保障的,电费将成为持续挖矿最大的成本之一,所以,有廉价电力的地方便成了旷工的最爱。挖矿的风险不仅于此,16年7月开始,比特币网络发行比特币数量就减半了,即每10分钟,每个区块只包含12.5个比特币,意味着相同算力挖出的比特币也会相应减少。但另一方面,币价也有上升可能。同时还伴随着断电、机器维护折旧等风险。最后,给大加介绍一种0风险赚钱的方法:猜出我兜里100元人民币的编号。哈哈。/逃跑...简单回答评论中 @诺pro 的一些疑问,估计也是很多人的疑问:1.目前比特币全部账本信息能很好的保存在一台普通的电脑上,这也是Core他们坚持不扩容的原因之一。另外根据摩尔定律,就算小扩容其实影响不大。2.仅仅降低交易费那么旷工没有动力,交易将更拥堵。当然这里有目前比较认可的取代方案POS。上面说的是挖矿是工作量证明即POW(Proof of Work),而POS的全称Proof of Stake,即股权证明。简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,有利于刺激全部用户参与,更去中心化。3.比特币等加密货币是匿名的,虽然你能看到纪录,但是你不知道是谁,同样你可以有多个匿名账户,中心化的你确定你能保密部分信息?4.不知道你这数据哪里来的,确实现在交易量少,原因很多,有支付场景弱,币价太高,大多数人持币待涨等多种因素。突然想到另一个因素,目前大量的币集中在交易所,很多交易所实际上是虚拟交易,当你要提币的时候才是真实交易,这样也大幅降低了真实交易量。2017/12/20更新公众号“对韭当割”,欢迎关注和交流。部分资料参考至@徐晓聪 @小龟 在本问题中的回答编辑于 2018-06-26 10:59赞同 1195378 条评论分享收藏喜欢 Bminer: 最快的挖矿程序 跳转至 Bminer 简介 键入以开始搜索 Bminer 简介 简介 目录 产品优势 开始挖矿 下载 性能 使用样例 常见问题 参考 群号:231258565 Bminer: When Crypto-mining Made Fast¶ Bminer是一款为NVIDIA和AMD GPU深度优化的挖矿软件。Bminer是目前最快的挖矿程序 -- 我们使用了多种技术以释放出硬件的潜力。Bminer支持包括Equihash, Ethash, Cuckoo-Style等各种算法,能挖ETH(以太坊),ZEC(零币),GRIN等币种。 Bminer不仅提供数据界面监测矿机温度,运行结果等数据,还提供应用程序编程接口(API)以便于大规模使用和部署大批量矿机。 Bminer支持Zhash/Equihash 144,5 算法的币种(比如,比特币黄金BitcoinGold,次世代比特币BitcoinZ),仅抽取2%作为开发者支持费用 Bminer挖Ethash币种(比如:以太坊ETH/以太经典ETC),仅抽取0.65%作为开发者支持费用。 Bminer支持双挖模式,同时挖Ethash币种(比如:以太坊ETH)和Blake14r的币种(比如:DCR)或,同时挖Ethash币种(比如:以太坊ETH)和Blake2s的币种(比如:Verge),仅抽取Ethash币种1.3%的算力作为开发者支持费用,同时挖的另一种币种将不被抽取任何算力。 Bminer支持Bytom比原币(BTM),仅抽取2%作为开发者支持费用。 Bminer支持Grin(GRIN),仅抽取1%作为开发者支持费用。 产品优势¶ 高效快速 Bminer是市场上最快的挖矿程序之一 安全稳定 SSL 支持 网络传输失败时可以自动恢复 在GPU挂起时可自动重启 操作简单 提供了应用程序编程接口(API)进行大规模生产部署 开始挖矿¶ 下载 Bminer并解压到文件夹 (例如 C:\bminer or /home/bminer) 根据您想获得的数字货币,找到对应的脚本。例如用Cuckaroo29算法挖GRIN时对应的脚本为mine_grin29.bat (Windows) 或 mine_grin29.sh (Linux) 把脚本的矿池、帐号替换为您的信息 运行脚本,开始挖矿 :-) 请访问参考和例子页面以了解Bminer更多高级用法, 比特币的工作原理 - 比特币 Bitcoin.org 是一个社区支持的社区,我们十分感谢任何捐助。这些捐助会用于改进网站。 捐助 Bitcoin.org 需要你的帮助! × 捐助Bitcoin.org 使用下方二维码或地址 3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd $5.00 (... BTC) $25.00 (... BTC) $50.00 (... BTC) 介绍 个人 商家 开发者 入门指南 工作原理 White paper 资源 资源 兑换 社区 词汇表 活动 比特币核心 创新 参与 支持比特币 购买比特币 开发 常见问题 简体中文 Bahasa Indonesia Català Dansk Deutsch English Español Français Italiano Magyar Nederlands Polski Português Brasil Română Slovenščina Srpski Svenska Türkçe Ελληνικά български Русский Українська Հայերեն العربية فارسی עברית हिन्दी 한국어 ខ្មែរ 日本語 简体中文 繁體中文 Bahasa Indonesia Català Dansk Deutsch English Español Français Italiano Magyar Nederlands Polski Português Brasil Română Slovenščina Srpski Svenska Türkçe Ελληνικά български Русский Українська Հայերեն العربية فارسی עברית हिन्दी 한국어 ខ្មែរ 日本語 简体中文 繁體中文 Language: zh_CN 比特币的工作原理 这是个经常引起混淆的问题,下面是个简明扼要的解释! 新用户所需了解的基本知识 作为新用户,你可以开始使用比特币,而不需要理解其中的技术细节。一旦你在电脑或手机上安装一个比特币钱包,它会生成你的第一个比特币地址,并且在你需要的任何时候都可以生成更多的地址。你可以将你的地址告诉你的朋友们,他们便能够通过这个地址向你支付比特币,反之亦然。事实上,这跟电子邮件的运作方式是非常相似的,除了一个比特币地址应该只被使用一次。 余额 - 区块链 比特币区块链是整个比特币网络所依赖的公共共享总帐。所有确认的交易均包含在区块链中。这样比特币钱包可以计算出可用余额,并核实新的交易中消费方花费的确实是自己的比特币。密码学确保了区块链的完整性和时间顺序。 交易 - 私钥 一笔交易是指包含在区块链里的比特币钱包之间的价值转移。 比特币钱包保存着一份称作私钥或种子的保密数据用来为交易签名,即提供数学证据证明这些交易来自钱包的拥有者。这个 签名也确保交易发生后不会被任何人修改。所有的交易在用户之间广播,通常在接下来的10-20分钟内通过一个称作 挖矿的处理过程开始被比特币网络所确认。 处理 - 挖矿 挖矿是个将待确认的交易数据包含到区块链中,从而完成对这些交易进行确认的分布式共识系统。通过挖矿,可以强制性保证块链中的数据按时间顺序存储,保持比特币网络的中立性,且允许比特币网络上不同的计算机对系统状态达成一致。交易要获得确认,必须要被打包到一个符合非常严格的密码学规则的区块中,并通过比特币网络进行验证。这些规则可以防止对已有块的修改,因为一旦有改动,之后所有的块都将失效。挖矿的难度和中彩票相当,没人可以轻易地、连续地将新块加入到块链中。因此,没有集体和个人可以控制块链中包含什么样的内容或者替换掉块链中的部分内容以达到撤销他们交易的目的。 深入探究 这只是一份比特币的概要。如果你需要更多的细节,你可以阅读描述了比特币设计的最初的论文,开发者文档,或者查看比特币百科。 支持Bitcoin.org: 捐助 3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd 介绍: 个人 商家 开发者 入门指南 工作原理 注意事项 White paper 资源: 资源 兑换 社区 词汇表 活动 比特币核心 参与: 支持比特币 开发 其他: 法律 Privacy Policy 新闻媒体 关于bitcoin.org Blog © Bitcoin Project 2009-2024 基于MIT协议授权发布 Network Status 简体中文 Bahasa Indonesia Català Dansk Deutsch English Español Français Italiano Magyar Nederlands Polski Português Brasil Română Slovenščina Srpski Svenska Türkçe Ελληνικά български Русский Українська Հայերեն العربية فارسی עברית हिन्दी 한국어 ខ្មែរ 日本語 简体中文 繁體中文 Bahasa Indonesia Català Dansk Deutsch English Español Français Italiano Magyar Nederlands Polski Português Brasil Română Slovenščina Srpski Svenska Türkçe Ελληνικά български Русский Українська Հայերեն العربية فارسی עברית हिन्दी 한국어 ខ្មែរ 日本語 简体中文 繁體中文 zh_CN比特币挖矿究竟在计算一个什么问题?手动验证区块链给出答案 - 知乎
挖矿是如何产生比特币的? - 知乎
Bminer: 最快的挖矿程序
比特币的工作原理 - 比特币