比特派钱包下载中文版|比特币挖矿程序是什么语言编写的
比特派钱包下载中文版|比特币挖矿程序是什么语言编写的
比特币挖矿的过程 - 知乎
比特币挖矿的过程 - 知乎首发于密码学货币切换模式写文章登录/注册比特币挖矿的过程闲话挖矿区块链爱好者,挖矿科普作者比特币挖矿科普专辑到这里就要收尾了,经过前两篇文章铺垫,相信读者朋友已经对比特币交易和区块产生的过程有一定的认识。那么它们跟“挖矿”有什么关系呢?我们知道,在比特币网络中,有很多挖矿节点和矿工参与创建比特币新区块。如果多个挖矿节点都创建了同一个高度的区块,该判定谁的区块更合法呢?比特币引入了PoW(Proof of Work)共识机制,通过挖矿的方式,来竞争新区块的记账权。谁拿到新区块的记账权,它创建的新区块就合法。挖矿的目的就是赢取记账权,确认新区块和交易。那么挖矿节点和矿工是如何配合工作,完成挖矿的呢?矿工破解挖矿任务挖矿节点创建好预备区块后,将预备区块的区块头数据发送给矿工。矿工收到挖矿任务后,会递增区块头中地随机数。每调整一次,就会按照比特币协议规定,用SHA256算法计算区块头的哈希值。如果区块头的哈希值大于目标哈希,就继续变更随机数,直到区块头的哈希值小于或者等于目标哈希为止(或者挖矿节点发现新区块已经由其他节点挖到,此时就会放弃原来挖矿任务,构造新的预备区块,重新开始挖矿)。挖矿节点验证区块,延长本地区块链当矿工找到可以使预备区块头哈希值小于目标哈希的随机数时,会立即向挖矿节点上报挖矿结果。挖矿节点接收到信息后,立刻按照矿工上报信息重组区块,并验证区块。验证无误后,挖矿节点将新区块保存到节点本地数据库,并添加到节点本地区块链上。区块的验证信息包括:区块头是否合法(区块头哈希≤TargetHash);区块头的MerkleRoot哈希跟区块中交易数据的MerkleRoot哈希是否一致(验证交易是否被篡改);交易数据中第一笔是否为Coinbase交易;区块中每一笔交易是否合法等等。向全网广播新区块挖矿节点将新区块在本地保存后,同步向比特币网络广播挖矿结果。由于整个区块的区块体积较大,一般会先广播新区块的区块头。其他节点在接到广播后,先验证区块头信息,验证通过后,节点会先在其本地的区块索引库中创建新区块的索引。在接收到新区块的全部信息后,节点验证交易信息和区块头的MerkleRoot哈希,验证通过后,节点将这些交易信息录入新区块,并延长本地区块链。至此,新区块的广播和验证完毕,挖矿节点开始下一个区块的挖矿工作。当前挖矿的一些特点集群挖矿-矿池:比特币挖矿这件事情,理论上任何人都可以自建比特币挖矿节点,参与挖矿,甚至可以通过手工验证区块头哈希,破解挖矿任务,竞争记账权。但博主在上一文中提到,按照当前的挖矿难度,即便使用现在的主流矿机,要找到一个符合比特币网络要求的新区块,理论上需要42年时间,而如果使用普通PC或者是手工计算,则需要上万年甚至上百万年。因此,普通矿工单独挖矿的经济效益太低,可能挖到机器报废,还挣不到一分钱。矿池就是在这种情况下应运而生的,大量矿工将自己的矿机接入矿池,从矿池的挖矿节点获取挖矿任务,集体挖矿。这样就可以在较短时间内挖到新区块,获得区块奖励,矿池按照挖矿过程中每个矿工的贡献情况,分配挖矿收益,所有矿工都可以实时获取挖矿收益,进行回本或者二次投资。矿机实际收到的挖矿任务中,TargetHash远大于比特币网络要求的TargetHash:矿池和矿工一起挖矿的流程,一样遵循上述过程。矿机通过网络跟矿池通讯,请求挖矿任务,矿池将挖矿任务(包含区块头等数据)发送给矿机,矿机变更区块头的随机数,并验证区块哈希。符合挖矿任务TargetHash要求的随机数,将按照挖矿协议的格式提交给矿池,矿池给矿机提交的挖矿结果计算收益。需要注意的是,如果给矿机下发的挖矿任务中,TargetHash是此时比特币网络的TargetHash,那么这个TargetHash太小,矿机基本不可能找到符合要求的随机数,提交挖矿结果,也就不可能获得挖矿收益。因此,矿池给矿机下发的挖矿任务中,有一个单独的信息:初始挖矿难度。这是一个远低于全网挖矿难度的数值,对应更大的TargetHash,在这个难度下,矿机可以在较短时间内找到符合要求的随机数,向矿池提交更多挖矿结果。矿池算力不同于矿机本地算力:谈及挖矿,总有一个绕不开的名词:算力。到底什么是算力呢?算力,其实就是矿工验证区块头哈希值的速度。矿机在获得挖矿任务后,会按照挖矿任务的信息,递增区块头的随机数,随机数每调整一次,就验证一次区块头的哈希值。可以看到,限制矿机挖矿快慢的唯一一个因素就是它验证区块头哈希值的快慢,因此有了“算力”这个指标。目前,常规比特币矿机的算力单位是TH/s,它的意思,每秒钟可以验证1T次哈希,1T=1×10^3G=1×10^6M=1×10^9K=1×10^12次。有过挖矿经历的朋友,都会发现,矿机本地显示的算力跟矿池显示的算力总是有差异。这是因为,矿机本地显示的算力,是矿机验证哈希的速度,它只跟矿机的性能有关,不管有没有找到符合挖矿任务要求的随机数,矿机本地算力都一直存在。而矿机在矿池显示的算力则不同,它是矿池按照矿机实际提交的挖矿结果计算出来的,如果矿机的运气较差,在较长时间内都没有找到符合挖矿任务要求的随机数,无法向矿池提交挖矿结果,矿机在矿池的算力就会降低。但时间拉长后,运气对矿机破解挖矿任务的影响会降低,矿机较长时间的矿池平均算力,跟矿机本地算力相差不大。以上是比特币挖矿的基础知识,如果能读懂这三篇文章,相信读者朋友对比特币挖矿会有一个初步的认识。如果想要跟博主交流探讨更多挖矿方面的问题,欢迎关注“闲话挖矿”微信公众号,同时也能更及时的了解博主更新的挖矿知识。文中涉及的几个知识点:区块高度:又叫Block Height,相当于区块的编号,它的值等于区块链中这个区块之前所有区块的数量。区块链的第一个区块是创世区块,区块高度为0,第二个区块的区块高度为1,第三个区块的区块高度为2,以此类推。区块链中区块的总数,即为最新区块的区块高度+1。PoW:全称为Proof of Work,中文名称为工作量证明。是比特币网络使用的一种用于解决比特币新区块确权问题的方法。在比特币网络中,人人都可以参与新区块的创建工作,PoW机制规定,谁能够在最短时间内找到一个区块头哈希值小于比特币网络指定的TargetHash的预备新区块,谁就拥有正式新区块的记账权。记账权:比特币的区块链,实质上是一个链式的大账本,链上的每一个区块,都是一本账,上边记录了发生在区块链上的比特币交易信息。因此,我们把创建新区块的过程看作记账的过程。记账权,顾名思义为记录交易账本的权利,也即在比特币区块链上创建正式新区块的权利。参考资料:编辑于 2020-07-12 20:45比特币 (Bitcoin)区块链(Blockchain)btc挖矿赞同 31 条评论分享喜欢收藏申请转载文章被以下专栏收录密码学货币区块链,比特币,挖矿,有啥聊啥,欢迎
挖矿原理 - 廖雪峰的官方网站
挖矿原理 - 廖雪峰的官方网站
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: 3281442
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
如何使用Go语言编写自己的区块链挖矿算法 - 知乎
如何使用Go语言编写自己的区块链挖矿算法 - 知乎首发于安全客切换模式写文章登录/注册如何使用Go语言编写自己的区块链挖矿算法小安有思想的安全新媒体译文声明本文是翻译文章,文章原作者Coral Health,文章来源:http://medium.com原文地址:https://medium.com/@mycoralhealth/code-your-own-blockchain-mining-algorithm-in-go-82c6a71aba1f一、前言随着近期比特币(Bitcoin)以及以太坊(Ethereum)挖矿热潮的兴起,人们很容易对此浮想联翩。对于刚进入该领域的新手而言,他们会听到各种故事,比如许多人将GPU堆满仓库来疯狂挖矿,每月能挖到价值数百万美元的加密货币(cryptocurrency)。那么就是什么是密币挖矿?挖矿的原理是什么?怎么样才能编写自己的挖矿算法?在本文中,我们会给大家一一解答这些问题,然后介绍如何编写自己的挖矿算法。我们将这种算法称为Proof of Work(工作量证明)算法,该算法是比特币及以太坊这两种最流行的加密货币的基础。无需担忧,我们会给大家介绍得明明白白。二、什么是密币挖矿物以稀为贵,对加密货币来说也是如此。如果任何人在任何时间都可以随意生产任意多的比特币,那么比特币作为一种货币则毫无价值可言(稍等,这不正是美联储常干的事吗……)。比特币算法每隔10分钟就会向比特币网络中的获胜成员颁发一次比特币,总量大约在122年内会达到最大值。这种颁发机制可以将通货膨胀率控制在一定范围内,因为算法并没有在一开始就给出所有密币,而是随着时间推移逐步产出。在这种算法下,为了获取比特币奖励,矿工们需要付出“劳动”,与其他矿工竞争。这个过程也称为“挖矿”,因为该过程类似于黄金矿工的采矿过程,为了找到一点黄金,工人们也需要付出时间及精力最终才能获取胜利果实(有时候也会竹篮打水一场空)。比特币算法会强制参与者(或节点)进行挖矿,同时相互竞争,确保比特币产出速度不至于太快。三、如何挖矿如果在Google上搜索“如何挖比特币?”,我们会看到大量结果,纷纷解释挖掘比特币需要节点(用户或者主机)来解决复杂的数学难题。虽然这种说法从技术角度来看没有问题,但简单称之为“数学”问题显然有点太过于僵硬,挖矿的过程其实非常有趣。我们要了解一些密码学知识以及哈希算法,才能理解挖矿的原理。密码学简介单向加密以人眼可读的数据作为输入(如“Hello world”),然后通过某个函数生成难以辨认的输出。这些函数(或者算法)在性质及复杂度上各不相同。算法越复杂,想逆向分析就越难。因此,加密算法在保护数据(如用户密码以及军事代码)方面至关重要。以非常流行的SHA-256算法为例,我们可以使用哈希生成网站来生成SHA-256哈希值。比如,我们可以输入“Hello world”,观察对应的哈希结果:我们可以重复计算“Hello world”的哈希值,每次都能得到相同的结果。在编程中,输入相同的情况下,如果每次都得到同样的输出,这个过程称之为“幂等性(idempotency)”。对于加密算法而言,我们很难通过逆向分析来推导原始输入,但很容易验证输出结果是否正确,这是加密算法的一个基本特性。比如前面那个例子,我们很容易就能验证“Hello world”的SHA-256哈希值是否正确,但很难通过给定的哈希值来推导原始输入为“Hello world”。这也是我们为何将这类加密方法称为单向加密的原因所在。比特币使用的是双重SHA-256算法(Double SHA-256),也就是说它会将“Hello world”的SHA-256哈希值作为输入,再计算一次SHA-256哈希。在本文中,为了方便起见,我们只计算一次SHA-256哈希。挖矿理解加密算法后,我们可以回到密币挖矿这个主题上。比特币需要找到一些方法,让希望获得比特币的参与者能通过加密算法来“挖矿”,以便控制比特币的产出速度。具体说来,比特币会让参与者计算一堆字母和数字的哈希值,直到他们算出的哈希值中“前导0”的位数超过一定长度为止。比如,回到前面那个哈希计算网站,输入“886”后我们可以得到前缀为3个0的哈希值。问题是我们如何才能知道“886”的哈希值开头包含3个零呢?这才是重点。在撰写本文之前,我们没有办法知道这一点。从理论上讲,我们必须尝试字母和数字的各种组合,对结果进行测试,直到获得满足要求的结果为止。这里我们事先给出了“886”的哈希结果以便大家理解。任何人都能很容易验证出“886”是否会生成3位前导零的哈希结果,这样就能证明我们的确做了大量测试、检查了大量字母和数字的组合,最终得到了这一结果。因此,如果我们是第一个获得这个结果的人,其他人可以快速验证“886”的正确性,这个工作量的证明过程可以让我赢得比特币。这也是为什么人们把比特币的一致性算法称之为Proof-of-Work(工作量证明)算法。但如果我的运气爆表,第一次尝试就生成了3个前导零结果呢?这种事情基本不可能发生,偶然的节点在首次尝试时就成功挖掘新块(向大家证明他们的确做了这项工作)的可能性微乎其微,相反其他数百万个节点需要付出大量工作才能找到所需的散列。你可以继续尝试一下,随便输入一些字母和数字的组合,我打赌你得不到3个前导零的结果。比特币的约束条件比这个例子更加复杂(要求得到更多位前导零!),并且它能动态调整难度,以确保工作量不会太轻或者太重。请记住,比特币算法的目标是每隔10分钟产出一枚比特币。因此,如果太多人参与挖矿,比特币需要加大工作量证明难度,实现难度的动态调整。从我们的角度来看,调整难度等同于增加更多位前导零。因此,大家可以明白比特币的一致性算法比单纯“解决数学难题”要有趣得多。四、开始编程背景知识已经介绍完毕,现在我们可以使用Proof-of-Work算法来构建自己的区块链(Blockchain)程序。我选择使用Go语言来实现,这是一门非常棒的语言。在继续之前,我建议你阅读我们之前的一篇博客:《用200行Go代码实现自己的区块链》。这不是硬性要求,但我们会快速掠过以下某些例子,如果你想了解更多细节,可以参考那篇文章。如果你已经了如指掌,可以直接跳到“Proof of Work”章节。整体架构如下:我们需要一台Go服务器,为了简单起见,我会将所有代码放在一个main.go文件中。这个文件提供了关于区块链逻辑的所有信息(包括Proof of Work),也包含所有REST API对应的处理程序。区块链数据是不可改变的,我们只需要GET以及POST请求即可。我们需要使用浏览器发起GET请求来查看数据,使用Postman来POST新的区块(也可以使用curl)。导入依赖首先我们需要导入一些库,请使用go get命令获取如下包:1、github.com/davecgh/go-spew/spew:帮助我们在终端中直接查看结构规整的区块链信息。2、github.com/gorilla/mux:用来搭建Web服务器的一个库,非常好用。3、github.com/joho/godotenv:可以从根目录中的.env文件中读取环境变量。首先我们可以在根目录中创建一个.env文件,用来存放后面需要的一个环境变量。.env文件只有一行:ADDR=8080。在根目录的main.go中,将依赖包以声明的方式导入:package main
import (
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strconv"
"strings"
"sync"
"time"
"github.com/davecgh/go-spew/spew"
"github.com/gorilla/mux"
"github.com/joho/godotenv"
)
type Block struct {
Index int
Timestamp string
BPM int
Hash string
PrevHash string
Difficulty int
Nonce string
}
var Blockchain []Block
type Message struct {
BPM int
}
var mutex = &sync.Mutex{}difficulty是一个常量,用来定义哈希值中需要的前导零位数。前导零位数越多,我们越难找到正确的哈希值。我们先从1位前导零开始。Block是每个区块的数据模型。不要担心Nonce字段,后面我们会介绍。Blockchain由多个Block组成,代表完整的区块链。我们会在REST API中,使用POST请求提交Message以生成新的Block。我们声明了一个互斥量mutex,后面我们会使用该变量避免出现数据竞争,确保多个区块不会同一时间生成。Web服务器让我们快速搭一个Web服务器。首先创建一个run函数,main函数随后会调用这个函数来运行服务器。我们在makeMuxRouter()中声明了相应的请求处理函数。请注意,我们需要通过GET请求获取区块链,通过POST请求添加新的区块。区块链无法更改,因此我们不需要实现编辑或删除功能。func run() error {
mux := makeMuxRouter()
httpAddr := os.Getenv("ADDR")
log.Println("Listening on ", os.Getenv("ADDR"))
s := &http.Server{
Addr: ":" + httpAddr,
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
if err := s.ListenAndServe(); err != nil {
return err
}
return nil
}
func makeMuxRouter() http.Handler {
muxRouter := mux.NewRouter()
muxRouter.HandleFunc("/", handleGetBlockchain).Methods("GET")
muxRouter.HandleFunc("/", handleWriteBlock).Methods("POST")
return muxRouter
}httpAddr := os.Getenv("ADDR")这行语句会从我们前面创建的.env文件中提取:8080这个信息。我们可以通过浏览器访问http://localhost:8080/这个地址来访问我们构建的应用。现在我们需要编写GET处理函数,在浏览器中显示区块链信息。我们还需要添加一个respondwithJSON函数,一旦API调用过程中出现错误就能以JSON格式返回错误信息。func handleGetBlockchain(w http.ResponseWriter, r *http.Request) {
bytes, err := json.MarshalIndent(Blockchain, "", " ")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
io.WriteString(w, string(bytes))
}
func respondWithJSON(w http.ResponseWriter, r *http.Request, code int, payload interface{}) {
w.Header().Set("Content-Type", "application/json")
response, err := json.MarshalIndent(payload, "", " ")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("HTTP 500: Internal Server Error"))
return
}
w.WriteHeader(code)
w.Write(response)
}请注意:如果觉得我们讲得太快,可以参考之前的文章,文章中详细解释了每个步骤。现在编写POST处理函数,这个函数可以实现新区块的添加过程。我们使用Postman来发起POST请求,向http://localhost:8080发送JSON数据(如{“BPM”:60}),其中包含前面你记录下的那个脉搏次数。func handleWriteBlock(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
var m Message
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&m); err != nil {
respondWithJSON(w, r, http.StatusBadRequest, r.Body)
return
}
defer r.Body.Close()
//ensure atomicity when creating new block
mutex.Lock()
newBlock := generateBlock(Blockchain[len(Blockchain)-1], m.BPM)
mutex.Unlock()
if isBlockValid(newBlock, Blockchain[len(Blockchain)-1]) {
Blockchain = append(Blockchain, newBlock)
spew.Dump(Blockchain)
}
respondWithJSON(w, r, http.StatusCreated, newBlock)
}请注意代码中mutex的lock以及unlock操作。在写入新的区块之前,我们需要锁定互斥量,不然多次写入就会造成数据竞争。细心的读者会注意到generateBlock函数,这是处理Proof of Work的关键函数,稍后我们会介绍。基本的区块链函数在介绍Proof of Work之前,先整理下基本的区块链函数。我们添加了一个isBlockValid函数,确保我们的索引能正确递增,并且当前区块的PrevHash与前一个区块的Hash相匹配。我们也添加了一个calculateHash函数,用来生成哈希值,以计算Hash以及PrevHash。我们将Index、Timestamp、BPM、PrevHash以及Nonce(稍后我们会介绍这个字段)串在一起,计算出一个SHA-256哈希。func isBlockValid(newBlock, oldBlock Block) bool {
if oldBlock.Index+1 != newBlock.Index {
return false
}
if oldBlock.Hash != newBlock.PrevHash {
return false
}
if calculateHash(newBlock) != newBlock.Hash {
return false
}
return true
}
func calculateHash(block Block) string {
record := strconv.Itoa(block.Index) + block.Timestamp + strconv.Itoa(block.BPM) + block.PrevHash + block.Nonce
h := sha256.New()
h.Write([]byte(record))
hashed := h.Sum(nil)
return hex.EncodeToString(hashed)
}五、Proof of Work现在来介绍挖矿算法,也就是Proof of Work。在新的Block加入blockchain之前,我们需要确保Proof of Work任务已经完成。我们先以一个简单的函数开始,该函数可以检查Proof of Work过程中生成的哈希是否满足我们设置的约束条件。我们的约束条件如下:1、Proof of Work生成的哈希必须具有特定位数的前导零。2、前导零的位数由程序刚开始定义的difficulty常量来决定(这里这个值为1).3、我们可以增加难度值来提高Proof of Work的难度。首先构造一个函数:isHashValid:func isHashValid(hash string, difficulty int) bool {
prefix := strings.Repeat("0", difficulty)
return strings.HasPrefix(hash, prefix)
}Go语言在strings包中提供了Repeat以及HasPrefix函数,使用起来非常方便。我们定义了一个prefix变量,用来表示前导零位数,然后检查哈希值的前导零位数是否满足要求,满足则返回True,不满足则返回False。接下来创建generateBlock函数。func generateBlock(oldBlock Block, BPM int) Block {
var newBlock Block
t := time.Now()
newBlock.Index = oldBlock.Index + 1
newBlock.Timestamp = t.String()
newBlock.BPM = BPM
newBlock.PrevHash = oldBlock.Hash
newBlock.Difficulty = difficulty
for i := 0; ; i++ {
hex := fmt.Sprintf("%x", i)
newBlock.Nonce = hex
if !isHashValid(calculateHash(newBlock), newBlock.Difficulty) {
fmt.Println(calculateHash(newBlock), " do more work!")
time.Sleep(time.Second)
continue
} else {
fmt.Println(calculateHash(newBlock), " work done!")
newBlock.Hash = calculateHash(newBlock)
break
}
}
return newBlock
}我们创建了一个newBlock变量,将前一个区块的哈希值保存到PrevHash字段中,确保区块链满足连续性要求。其他字段的含义应该比较明显:1、Index不断增加;2、Timestamp是当前时间的字符串表现形式;3、BPM是前面记录下的心率;4、Difficulty直接摘抄自最开头定义的那个常量。这个例子中我们不会使用这个字段,但如果我们想进一步验证,确保难度值与哈希结果一致(也就是说哈希结果的前导零位数为N,那么Difficulty的值应该也为N,否则区块链就会遭到破坏),那么这个字段就非常有用。这个函数中的for循环非常重要,我们详细介绍一下:1、获取i的十六进制形式,将该值赋给Nonce。我们需要一种方法来将动态变化的一个值加入哈希结果中,这样如果我们没有得到理想的哈希值,就可以通过calculateHash函数继续生成新的值。我们在calculateHash计算过程中添加的动态值就称为“Nonce”。2、在循环中,我们的i和Nonce值从0开始递增,判断生成的哈希结果中前导零位数是否与difficulty相等。如果不相等,我们进入新的迭代,增加Nonce,再次计算。3、我们加了1秒的休眠操作,模拟解决Proof of Work所需的时间。4、继续循环,直到计算结果中包含特定位数的前导零为止,此时我们成功完成了Proof of Work任务。只有在这种情况下,我们的Block才能通过handleWriteBlock处理函数添加到blockchain中。现在我们已经完成了所有函数,因此让我们完成main函数吧:func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
go func() {
t := time.Now()
genesisBlock := Block{}
genesisBlock = Block{0, t.String(), 0, calculateHash(genesisBlock), "", difficulty, ""}
spew.Dump(genesisBlock)
mutex.Lock()
Blockchain = append(Blockchain, genesisBlock)
mutex.Unlock()
}()
log.Fatal(run())
}使用godotenv.Load()语句我们可以完成环境变量(:8080端口)的加载,以便通过浏览器进行访问。区块链得有一个起点,所以我们使用一个go例程来创建创世区块。然后使用前面构造的run()函数启动Web服务器。六、大功告成大家可以访问Github获取完整版代码。来跑一下看看效果。首先使用go run main.go命令启动程序。然后在浏览器中访问http://localhost:8080:区块链中已经有一个创世区块。现在打开Postman,通过POST请求向服务器发送包含BPM字段(心率数据)的JSON数据。发送完请求后,我们可以在终端中观察操作结果。可以看到,我们的计算机会使用不断递增的Nonce值来创建新的哈希,直到计算出来的哈希满足前导零位数要求为止。完成Proof of Work任务后,我们可以看到一则提示消息:work done!。我们可以检验这个哈希值,发现它的确满足difficulty所设置的前导零位数要求。这意味着从理论上来讲,我们使用BPM = 60参数所生成的新区块现在应该已经添加到区块链中。刷新浏览器看一下结果:大功告成!我们的第二个区块已经添加到创世区块后面。也就是说,我们成功通过POST请求发送了区块,这个操作触发了挖矿过程,当且仅当Proof of Work得以解决时,新的区块才能添加到区块链中。七、下一步考虑非常好,前面学到的知识非常重要。Proof of Work是比特币、以太坊以及其他区块链平台的基础。我们前面的分析意义非凡,虽然这个例子使用的难度值并不大,但实际环境中Proof of Work区块链的工作原理就是把难度提高到较高水平而已。现在你已经深入了解了区块链技术的关键组成部分,后面的路需要你自己去走,我们建议你可以继续学习以下知识:1、学习区块链网络的工作原理,可以参考我们的网络教程。2、学习如何以分布式方式存储大型文件并与区块链交互,可以参考我们的IPFS教程。如果你还想继续深入学习,可以考虑了解一下Proof of Stake(权益证明)。尽管目前大多数区块链使用Proof of Work作为一致性算法,但公众越来越关注Proof of Stake。人们普遍认为,未来以太坊将从Proof of Work迁移至Proof of Stake。本文翻译自:medium.com如若转载,请注明出处:medium.com安全客 - 有思想的安全新媒体编辑于 2018-03-21 19:16挖矿Go 语言赞同 32添加评论分享喜欢收藏申请转载文章被以下专栏收录安全客安全客,致力于传播有思想的安 详解比特币挖矿— 应该是史上最通俗易懂的版本 - 知乎切换模式写文章登录/注册详解比特币挖矿— 应该是史上最通俗易懂的版本S-Maruko从入门到精通,看我就够了! 比特币挖矿就是矿工将一定数量的交易打包到同一个区块,然后共同去计算同一道数学题来决定以谁的区块链为准,并且决定谁赢得新发行的比特币和交易费。 相信很多人都听说过比特币挖矿的说法,不知道有多少人真正理解这个概念。在矿产领域,挖矿的概念其实很容易理解,就是从富含某种矿物质的矿石中提炼出矿物质的过程,而所谓的矿工就是那些头戴安全头盔,从事提炼矿物质的工人,他们的形象在我们的脑海中恐怕一点也不陌生。 比特币世界的挖矿和矿产领域的挖矿还是有很多相似之处的,都是在挖掘有价值的资产,都需要花费一定的代价,都能给挖矿的人带来一定的收益。矿产领域的挖矿可以得到相对稀缺的矿产资源,同时要付出体力和承担安全风险的代价;而比特币的挖矿可以得到比特币奖励,同时要付出计算机算力的代价。 矿产领域的矿工是靠大型的机械设备,而比特币世界里的矿工是靠专业的计算机设备,伴随着激烈竞争,比特币的挖矿设备从最开始的普通计算机,到现在的越来越专业的挖矿设备。 不过比特币世界的挖矿和矿产领域的挖矿也还是有很多不同的,比特币世界的挖矿还是发行新比特币的唯一方式,同时也是在去中心化的网络中保证民主和竞争的重要手段,但是它也不是一点坏处都没有,比如浪费了大量的计算机算力和电力。至于为什么会这么说,看完接下来的文字我想你就会明白了。 文章导读: 1.什么是挖矿 2.如何证明谁的工作量最多 3.什么是工作量证明(POW) 4.挖矿是一场接力赛 5.小结 1. 什么是挖矿 如果还不了解区块链的话,可以参考不懂技术?老司机带你轻松理解区块链知识,比特币的网络中传播着大量的交易信息,既然没有中心化的统一服务,那么谁来确认这些交易的合法性,以及达成统一的共识呢?我们可以想想中心化服务的支付宝是如何解决这两个问题的,支付宝其实是买卖双方的中间担保,它负责确认每一笔交易是否合法,并且等双方在线下的交易没有问题时,才将资金转给卖方,这就保证了不会出现某一方作弊或者不认账的问题。 但是比特币网络中没有像支付宝这样的担保角色,那么它是如何做到交易的正常进行的呢?其实答案也很简单,就是由网络中的所有全节点共同决定这份交易是否合法,通过共同维护同一份帐薄来确保交易不会违约和篡改。 这就如同有10个人共同见证了两个人的交易,并一起确认这笔交易的合法性,同时每个人都维护了一份账本,这笔交易会记录到每个人各自维护的同一套账本上,如果有人要违约或篡改交易数据,他需要同时改掉至少6个人的账本(少数服从多数)。否则如果只改自己的那一份账本,别人很容易就看出他的作弊行为,想想掩耳盗铃的故事应该就能明白了。 说回到比特币世界的挖矿,挖矿就是比特币世界里的矿工确认每一笔交易是否合法(关于如何确认交易合法,可以参考一文看懂比特币交易的全过程),并将合法的交易写入到统一的公共帐薄上,同时会获得一定的新比特币和交易费的奖励的过程。奖励是为了鼓励更多的矿工加入进来,确保不会出现某一个节点独断专权的情况,至于奖励给哪一个矿工,这就要看谁的工作量更多了,在比特币的世界里,是靠共同解决某一个数学问题来证明工作量的多少。 这就如同在竞争激励的市场经济中,每个公司都会拼尽全力提供更好的服务和产品才能生存下去,这样就不太容易产生垄断和腐败,而竞争的结果促进了资源的有效配置,社会的整体财富就会不断增长,最终所有人都会受益,当然受益最大的还是对社会贡献最大的企业家。 而在计划经济下,所有的生产安排和资源分配,都掌握在少数人手中,权力的过度集中必然会导致腐败,也不利于资源的合理配置,长远来看,只能是绝大大多数人普遍赤贫,而受益最大的往往是掌握更多资源的人。想想改革开放前后的中国,就能明白计划经济和市场经济的不同效果了。 总结一下,挖矿就是矿工为了得到新发行的比特币和交易费的奖励,主动去确认交易是否合法,并将合法的交易写入共同维护的帐薄中的过程。而奖励是为了确保矿工有更多的积极性,避免权力集中在少数人手中,同时奖励也是比特币发行的唯一方式。 2. 如何证明谁的工作量更多 刚才提到了挖矿的奖励会给工作量最多的那个人,那么如何证明谁的工作量最多呢。其实也很简单,就是大家共同去解同一道数学题,这道数学题需要一定的计算量才能做出来,而率先得到答案的矿工就是最终的胜出者,分享最终的奖励。 相信大家以前都玩过数独游戏(没玩过的同学请自行搜索游戏规则),简单来说就是每一行与每一列必须出现1~9的数字,每个小九宫格内也必须有1~9的数字,并且每个数字在每行、每列和每个小九宫格里出现且仅能出现一次。游戏刚开始只会给出有限的几个位置上的数字,其他的位置都需要计算分析才能得出来正确的数字。 由这张游戏图可以看出,想要计算分析出每一个位置上的数字,还是需要花费不少力气的,但是填完之后来验证是否正确就简单很多,看一下横排、竖排以及小九宫格是否没有重复的数字即可。 而比特币挖矿的数学题也有这样的特性,就是计算起来很费事,但是验证起来却很简单。当然了,挖矿的数学题不是求解一道数独题目,而是计算一道概率题。 先举一个简单的掷骰子游戏,假如说有两个骰子,如果我说掷出一个骰子之和小于等于12的组合,你肯定会说这还不简单,随便掷,任一个组合都肯定小于等于12,一点难度都没有。好,那假如我把条件设为小于等于8呢,可能就不是每次都能掷出来了,它的概率是0.72;如果我再把条件设小呢,如果是4呢,那么掷出来的可能性就会进一步减小,概率为0.11。(这里默认大家都会计算概率,如果不懂的话,只需要知道概率在不断减小就可以,想想现实的场景,这点应该不难理解)3. 什么是工作量证明(POW) 理解了掷骰子游戏,再来介绍挖矿的工作量证明(POW Proof-Of-Work)算法就很简单了,在之前一篇介绍区块链的文章不懂技术?老司机带你轻松理解区块链知识中,曾经提到过区块的数据结构,当时提到了两个数据是和挖矿相关的,当时没有详细说明,现在就可以拿出来分析了。 这里的难度目标和Nonce就是和挖矿相关的参数,我们都知道比特币网络平均每10分钟产生新的比特币,也就是说挖矿的平均时间为10分钟,也许你会问怎么确保刚好是10分钟呢。其实答案很简单,就是控制数学题目的难度,假如某个人的解题速度在不断提升,那么我只要提高题目难度,就可以保证他解答的时间大致衡定。 在比特币世界中,解题速度和计算机的算力有直接的关系,想想今天的一台计算机和20年前的一台计算机去解同一道复杂的数学题,谁先计算出来,我想你肯定也认同是今天的计算机率先求出答案。如果我告诉你,谁先解出答案,就给谁丰厚的奖励,大家肯定会拼命提高计算机的性能,这也是全球各个矿工在不断提高算力的原因,因为大家都想快速解出答案,以获得奖励。 说回到难度目标和Nonce两个参数,挖矿的题目是这样的,每一个区块头都有唯一的哈希值,我现在要求你在这个哈希值后面添加一个随机数字(一般是从零开始递增),然后再去计算这个结果的哈希值,直到求出来的哈希值小于某一个数字,而这个数字是由一个常数除以上面的难度目标得出来的。 如果你理解了上面的掷骰子游戏应该能看懂这道题目,其实就是通过不同的数字不断地计算哈希值,直到答案小于某一个目标数字,这个目标数字越小,难度就越大,跟上面的骰子一样,结果越小,掷出来的概率就越小。而这个目标数字是由难度目标决定的,难度目标数字越大,除出来得到的目标数字就越小。 Nonce计数器主要是统计总共计算了多少次,就如同掷骰子一样,虽然可以一把掷出要求的数字,但是多次平均下来,肯定是符合概率统计的,这样别的矿工就可以根据Nonce数字大小再一次印证这个矿工是否有作弊。 至此你应该已经明白工作量证明算法的大致逻辑了吧,本质上就是在求一个概率题,谁先算出来就算谁赢,奖励就归谁。难度随着答题的速度会动态调整,而这个难度就是由上面的难度目标值决定,这样就能保证平均每10分钟完成一次挖矿。 4. 挖矿是一场接力赛 一旦一个矿工成功挖矿,根据数独游戏的逻辑,其他矿工很快就能验证是否成功,一旦验证通过就会将区块放入自己维护的区块链中,并赶紧投入到下一次的挖矿,不带有一丝一毫的犹豫。如此激烈的竞争伴随的结果,就是每个矿工都不断提升自己的计算机性能,结果就是大家的挖矿设备都不断升级,以至于现在的矿场都是紧挨发电厂,用最先进的专用挖矿芯片。 这里其实还有一个问题,就是假如说有两个矿工同时计算出结果怎么办?这个时候就会出现分叉,也就是说区块链的末端区块存在分歧了,其实这只会临时出现,并不会长久存在。原因是一旦其他矿工确认了本次挖矿成功,就会投入到下一次挖矿,如果其他矿工又挖矿成功了,这条区块链路就会比另一条区块链路多出一个区块,区块链中的原则就是只认最长的链路,所以另一个挖矿成功的矿工很快就会舍弃之前的区块,以最长的区块链为准。 而奖励也是要得到大多数的矿工认可后才会有效,毕竟账本是所有的人一起维护的,只有大多数人的账本上认可你的挖矿结果才有效。所以临时的分叉并不会影响最终的奖励,其实10分钟的挖矿时间也是比特币之父“中本聪”对效率和共识的一种平衡。 看到这里也许你就会明白,为什么会说挖矿浪费了很多算力和电力,因为胜出者往往只有一个,其他的矿工就相当于白忙活了,但是他们的计算机已经投入计算了,这笔算力和与之相对应的电力也就此浪费了。 这恐怕就是为了维护民主化的代价,如果让中心化的节点去统一确认交易,并写入公共帐薄,那么很容易滋生出腐败,这也不符合中本聪一开始的去中心化的设计理念,但是靠挖矿决定输赢又会导致资源浪费,只能说任何事情都是有成本和代价的,只要收益大于成本,这件事就有做的价值,比特币现在的价格相比用于计算的电费还是划算得多。5. 小结 关于比特币的挖矿到此就全部介绍完了,不知道你有没有看明白。总结一下就是矿工将一定数量的交易打包到同一个区块,然后共同去计算同一道数学题来决定以谁的区块链为准,并且决定谁赢得新发行的比特币和交易费。这种靠竞争来解决交易共识的问题,避免了单一节点垄断整个网络的风险,让整个网络形成了良性竞争的局面。 当然随着全网算力的提高,篡改的难度就越来越大了,因为你要改至少51%的全节点的账本,这就要求你的算力至少是其他51%全节点的总和,这个难度现在已经大到无法想象的程度,而且即便能做到,为此付出的电费代价也会让篡改者掂量一下这么做是否划算。关于比特币的挖矿到此就全部介绍完了,不知道你有没有看明白。总结一下就是矿工将一定数量的交易打包到同一个区块,然后共同去计算同一道数学题来决定以谁的区块链为准,并且决定谁赢得新发行的比特币和交易费。这种靠竞争来解决交易共识的问题,避免了单一节点垄断整个网络的风险,让整个网络形成了良性竞争的局面。 ——The End——『声明:本文转载于公众号“扬帆沧海”』发布于 2021-05-13 13:48比特币 (Bitcoin)btc挖矿挖矿赞同 394 条评论分享喜欢收藏申请 探索 PyMiner: 深入挖掘比特币的潜力-CSDN博客 探索 PyMiner: 深入挖掘比特币的潜力 gitblog_00048 于 2024-03-15 09:48:50 发布 阅读量83 收藏 1 点赞数 3 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/gitblog_00048/article/details/136730636 版权 探索 PyMiner: 深入挖掘比特币的潜力 如果你对区块链技术和比特币感兴趣,并且希望通过编写代码深入了解其工作原理,那么 PyMiner 将是一个不错的选择。 什么是 PyMiner? PyMiner 是一个基于 Python 的比特币挖矿工具,由 Jeff Garzik 创作并开源。该项目旨在帮助开发者和研究人员更好地理解比特币的核心算法和数据结构。通过使用 PyMiner,你可以探索如何实现自己的挖矿软件或进行其他与比特币相关的实验。 https://gitcode.com/jgarzik/pyminer?utm_source=artical_gitcode 能用来做什么? PyMiner 可以用于: 学习比特币的工作原理:通过查看和运行项目的源代码,你可以深入了解比特币的共识机制、交易验证、区块生成等核心功能。开发自定义挖矿软件:PyMiner 提供了一些基本的挖矿模块,你可以在此基础上开发自己的挖矿程序。进行实验性研究:利用 PyMiner,你可以模拟不同的网络环境,测试新的区块链概念和技术。 特点 PyMiner 具有以下特点: 简洁易懂的代码:项目中的 Python 代码清晰明了,便于阅读和学习。支持多个比特币客户端:PyMiner 可以与其他 Bitcoin Core 客户端一起使用,包括 RPC API 集成。可扩展性:你可以根据需要添加新功能或修改现有模块,以满足特定需求。 如何开始使用? 要开始使用 PyMiner,首先确保你的系统上已安装了 Python 和 Git。然后,按照以下步骤克隆项目并将依赖项安装到虚拟环境中: $ git clone https://gitcode.com/jgarzik/pyminer.git $ cd pyminer $ python -m venv .venv $ source .venv/bin/activate $ pip install -r requirements.txt 接下来,你可以尝试运行示例脚本,如 mine.py 或 getwork.py,了解 PyMiner 的基本功能。 $ python mine.py $ python getwork.py 结论 PyMiner 是一个强大的工具,为那些希望深入研究比特币的人提供了宝贵的资源。无论你是想了解比特币的基本工作原理还是想要开发自定义的挖矿软件,都可以借助 PyMiner 实现目标。 https://gitcode.com/jgarzik/pyminer?utm_source=artical_gitcode 现在就开始探索 PyMiner,进一步了解比特币的魅力吧! 优惠劵 gitblog_00048 关注 关注 3 点赞 踩 1 收藏 觉得还不错? 一键收藏 打赏 知道了 0 评论 探索 PyMiner: 深入挖掘比特币的潜力 探索 PyMiner: 深入挖掘比特币的潜力如果你对区块链技术和比特币感兴趣,并且希望通过编写代码深入了解其工作原理,那么 PyMiner 将是一个不错的选择。什么是 PyMiner?PyMiner 是一个基于 Python 的比特币挖矿工具,由 Jeff Garzik 创作并开源。该项目旨在帮助开发者和研究人员更好地理解比特币的核心算法和数据结构。通过使用 PyMiner,你可以探索如何实... 复制链接 扫一扫 比特币白皮书:一种点对点的电子现金系统(中文版) 01-05 文件格式:Word 总页数:17 目录: 1. 简介 2. 交易(Transactions) 3. 时间戳服务器(Timestamp server) 4. 工作量证明(Proof-of-Work) 5. 网络 6. 激励 7. 回收硬盘空间 8. 简化的支付确认(Simplified Payment ... 基于requests爬取比特币信息并绘制价格走势图 01-12 本期内容:基于requests爬取比特币信息并绘制价格走势图 实验环境 - anaconda丨pycharm - python3.11.4 - requests 安装requests库的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests ... 参与评论 您还未登录,请先 登录 后发表或查看评论 MCM美国大学生数学建模竞赛题目与答案:比特币和黄金如何随时间上涨和下跌.pdf 08-21 比特币和黄金都是可替代的价值储存。除此之外,它们的不同。千百年来,人类一直使用黄金作为价值储存手段,而比特币(BTC)在 2010 年 5 月 22 日首次作为货币使用,当时拉斯洛-哈耶茨(Laszlo Hanyecz)用 10,000 ... 案例十 python 深度学习 RNN 预测比特币价格 08-11 【案例十】 python 深度学习 RNN 预测比特币价格 比特币0.9.2版编译中文手册.pdf 07-03 。。。 Matlab 实现比特币价格分析-1 08-04 分析2017年-2023年的交易数据 价格趋势、移动平均线、波动率和交易量分析 代码如下: % 1、数据读取 data = readtable('BTCUSDT.csv'); date = datetime(data.Date, 'InputFormat', 'yyyy/MM/dd');... 2021全球金融科技行业报告:区块链、比特币和数字金融-JP 摩根-2021218-86页.pdf 07-26 2021全球金融科技行业报告:区块链、比特币和数字金融-JP 摩根-2021218-86页.pdf 比特币价格预测系统的项目的源码和数据集 01-13 专栏《金融大模型实战》中(11-4)比特币价格预测系统的源码和数据集,专栏地址是:https://blog.csdn.net/asd343442/category_12531576.html?spm=1001.2014.3001.5482,欢迎大家观看,本专栏会持续更新,和大家共同... 比特币基于LSTM的多因子交易策略Python源码+文档说明 最新发布 02-12 比特币基于LSTM的多因子交易策略Python源码+文档说明 此策略会减少最大回撤,减少波动,比较稳健; 收益率与LSTM预测的准确率直接相关,应该加入更多因子,及设置更合适的超参 此模型同样的数据收益率存在随机性 ... 比特币白皮书:一种点对点的电子现金系统 05-22 比特币白皮书:一种点对点的电子现金系统 比特币白皮书:一种点对点的电子现金系统 比特币白皮书:一种点对点的电子现金系统 数据挖掘:使用ARMA模型工具对比特币的走势进行预测.zip 10-19 数据挖掘:使用ARMA模型工具对比特币的走势进行预测.zip 比特币背后的密码学原理 05-22 比特币背后的密码学原理 比特币背后的密码学原理 比特币背后的密码学原理 基于Paddle构建简单神经网络比特币价格预测python源码+详细注释(课程大作业) 01-12 基于Paddle构建简单神经网络比特币价格预测python源码+详细注释(课程大作业) - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分... 《跟我学习AI量化投资》通过chatgpt利用ccxt获取比特币行情数据 03-26 《跟我学习AI量化投资》通过chatgpt利用ccxt获取比特币行情数据 java创建比特币钱包 10-20 Java创建比特币钱包可以使用BitcoinJ这个库。BitcoinJ是一个Java实现的比特币协议库,可以用于创建比特币钱包、发送和接收比特币交易等。以下是创建比特币钱包的步骤: 1. 添加BitcoinJ依赖到项目中。 2. 创建一个NetworkParameters对象,用于指定比特币网络的参数。 3. 创建一个Wallet对象,用于存储比特币地址和私钥。 4. 生成一个新的比特币地址和私钥,并将其添加到钱包中。 5. 将钱包保存到本地文件中,以便下次使用。 以下是一个简单的Java代码示例,用于创建比特币钱包: ``` // 添加BitcoinJ依赖 // 创建NetworkParameters对象 NetworkParameters params = MainNetParams.get(); // 创建钱包 Wallet wallet = new Wallet(params); // 生成新的比特币地址和私钥 ECKey key = new ECKey(); Address address = key.toAddress(params); // 将地址和私钥添加到钱包中 wallet.importKey(key); // 将钱包保存到本地文件中 File file = new File("wallet.dat"); wallet.saveToFile(file); ``` “相关推荐”对你有帮助么? 非常没帮助 没帮助 一般 有帮助 非常有帮助 提交 gitblog_00048 博客等级 码龄23天 42 原创 155 点赞 194 收藏 157 粉丝 关注 私信 热门文章 TestFixtures: Python 测试的得力助手 523 推荐文章:SVHTTPRequest - 简单易用的网络请求库 446 Assetic - 提升你的 Web 应用程序的静态资源管理能力 408 MonsterWM是一个轻量级的X窗口管理器,它注重速度和可定制性。通过提供基本的窗口管理和工作区管理功能,MonsterWM可以让您在Linux或Unix系统上实现高效的桌面环境。... 288 RythmEngine: 高效、灵活的Java模板引擎 346 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 jQuery Rails 探索数据清洗的新方法: DataGristle AES-Python: Python实现的AES加密算法库 2024 03月 42篇 目录 目录 最新文章 jQuery Rails 探索数据清洗的新方法: DataGristle AES-Python: Python实现的AES加密算法库 2024 03月 42篇 目录 评论 被折叠的 条评论 为什么被折叠? 到【灌水乐园】发言 查看更多评论 添加红包 祝福语 请填写红包祝福语或标题 红包数量 个 红包个数最小为10个 红包总金额 元 红包金额最低5元 余额支付 当前余额3.43元 前往充值 > 需支付:10.00元 取消 确定 下一步 知道了 成就一亿技术人! 领取后你会自动成为博主和红包主的粉丝 规则 hope_wisdom 发出的红包 打赏作者 gitblog_00048 你的鼓励将是我创作的最大动力 ¥1 ¥2 ¥4 ¥6 ¥10 ¥20 扫码支付:¥1 获取中 扫码支付 您的余额不足,请更换扫码支付或充值 打赏作者 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 余额充值 Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance Error 403 Forbidden - This request is blocked. For security reasons you can't connect to the server for this app or website at this time. It maybe that you have too many requests or the illegal request payload is identified as an attack. Please try again later. Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance Error 403 Forbidden - This request is blocked. For security reasons you can't connect to the server for this app or website at this time. It maybe that you have too many requests or the illegal request payload is identified as an attack. Please try again later. 比特币挖矿指南 - 比特币挖矿入门 Start News Pool Cloud Software Hardware Price ... Global Vol. ... Diff. ... 比特币挖矿指南 - 比特币挖矿入门 你将了解(1)如何进行比特币挖矿,(2)如何开始挖比特币,(3)最好的比特币挖矿软件是什么,(4)最好的比特币挖矿硬件是什么,(5)哪里能找到最好的比特币采矿池和(6)如何优化你的比特币收益。 比特币挖矿很难做到有利可图,但如果你尝试的话,那么这个比特币挖矿机可能是一个很好的机会。 如何进行比特币挖矿 在开始比特币挖矿之前,了解比特币挖矿到底是什么意思非常有用。比特币挖矿是合法的,通过运行SHA256双向哈希验证流程来完成,以验证比特币交易并为比特币网络的公开帐本提供必要的安全性。你挖比特币的速度是以每秒哈希为单位测算的。 比特币网络通过向贡献所需计算能力的人员发放比特币来作为比特币矿工的工作报酬。这以新发行的比特币和挖比特币时已验证交易中包含的交易费用的形式进行。你贡献的计算能力越大,你所获得的奖励份额就越多。 步骤 1 - 获得最好的比特币挖矿硬件 购买比特币 - 某些情况下,你可能需要使用比特币来购买挖矿硬件。今天,您可以在Amazon上购买大部分硬件。你也可能想查看比特币图表。 如何开始比特币挖矿 要开始挖比特币,您需要获取比特币挖矿硬件。在比特币早期,可以使用电脑CPU或高速视频处理器卡来挖矿。但今天这种作法已经不可行了。定制的比特币 ASIC芯片的性能最多可达旧系统的100倍,现在已经占据了比特币挖矿的主导地位。 使用性能比这低的硬件来挖比特币,消耗的电力比可能会赚到的钱还要多。使用专门为此目的而制作的最好硬件来挖比特币至关重要。像Avalon这样的多家公司提供专门针对比特币挖矿而设计的优质系统。 最好的比特币云挖矿服务 另一个选择是购买比特币云挖矿合同。这大大简化了过程,但是由于你无法控制实际的硬件,因此会增加风险。 本节列出的并不是对这些服务的认可。已经发生过许多比特币云挖矿诈骗事件了。 Hashflare 评价:Hashflare提供SHA-256 挖矿合同,也可以挖更有利可图的SHA-256 比特币,同时仍使用比特币自动付款。客户必须至少购买10 GH/s。 Genesis Mining 评价:Genesis Mining 是最大的比特币云算力挖矿提供商。Genesis Mining提供三种比特币云挖矿计划,价格合理。另外也提供Zcash挖矿合同。 Hashing 24 评价:Hashing24自2012年以来就参与到比特币挖矿行业。他们在冰岛和格鲁吉亚有设施。他们使用BitFury的现代ASIC芯片,可以提供最佳的性能和效率。 Minex 评价:Minex是以经济模拟游戏格式呈现的区块链项目的创新聚合者。用户购买Cloudpack,然后可以使用它们为预先选定的云挖矿场、彩票、赌场、现实世界市场等建立索引。 Minergate 评价:提供比特币矿池以及合并的挖矿和云挖矿服务。 Hashnest 评价:Hashnest由比特币蚂蚁矿机的生产商Bitmain 运营。 HashNest目前有超过600台蚂蚁矿机 S7 供出租。你可以在Hashnest的网站上查看最新的价格和可租用的数量。在撰写本文时,一台蚂蚁矿机 S7的哈希率可以租$1200。 Bitcoin Cloud Mining 评价:当前 Bitcoin Cloud Mining 的合同已经售罄。 NiceHash 评价:NiceHash独一无二的原因在于,它使用订单来匹配采矿合同买家和卖家。查看其网站以了解最新价格。 Eobot 评价:刚开始时比特币云挖矿的价格可以低至$10。Eobot声称客户可以在14个月后实现盈亏平衡。 MineOnCloud 评价:MineOnCloud目前在云端有约35 TH/s的挖矿设备可供出租。另外还有一些挖矿机出租,其中包括蚂蚁矿机S4和S5。 步骤 2 - 下载免费的比特币挖矿软件 在收到比特币挖矿硬件后,你需要下载一个用于比特币挖矿的特殊程序。比特币挖矿可以使用很多程序,但两个最受欢迎的是CGminer和BFGminer,它们都是命令行程序。 如果你喜欢图形用户界面的易用性,你可能想试试EasyMiner,这是一个点击运行Windows / Linux / Android程序。 更多详细信息,请访问最佳比特币挖矿软件。 步骤 3 - 加入比特币矿池 在你准备好开始挖比特币时,我们建议你加入一个比特币矿池。比特币矿池是许多比特币挖矿机一起工作,共同解决一个数据块并分享其奖励。没有比特币矿池,你可能挖一年多也不会挖到任何比特币。与更大的比特币挖矿机群体一起工作并分享奖励,会让挖矿变得更为方便。这里有一些选择: 对于全分散控制矿池,我们强烈推荐p2pool。 以下矿池被认为目前正在使用比特币核心钱包 0.9.5或更高版本的有效数据块(由于DoS漏洞而推荐使用0.10.2或更高版本) BitMinter CK Pool Eligius Slush Pool 步骤 4 - 设置比特币钱包 挖比特币的下一步是设置一个比特币钱包,或使用现有的比特币钱包来接收你挖到的比特币。Copay是一个很棒的比特币钱包,并可在许多不同的操作系统上运行。也可以使用比特币硬件钱包。 比特币通过使用仅属于您的唯一地址发送到您的比特币钱包。设置比特币钱包最重要的一步是通过启用双因素身份验证或将其保存在无法访问互联网的离线电脑上,从而防止潜在的威胁。可以通过将软件客户端下载到电脑上来获得钱包。 有关选择比特币钱包的帮助,你可以从这里开始 您还需要能够购买和出售你的比特币。为此,我们建议: SpectroCoin - 同日 SEPA 的欧洲交易平台,可以使用信用卡购买 Kraken - 最大的欧洲交易平台,具有同日SEPA Buying Bitcoin Guide - 帮助你寻找你所在国家的比特币交易平台。 Local Bitcoins - 这个奇妙的服务可让你在你的社区寻找愿意直接出售给你比特币的人。不过要小心! 购买比特币时,Coinbase 是一个很好的开始之地。我们强烈建议你不要在其服务中保存任何比特币。 步骤 5 - 关注最新的比特币新闻 关注最新的比特币新闻对于比特币挖矿利润很重要。如果你想要了解一般的比特币新闻,那么我们推荐WeUseCoins news。 这是比特币挖矿新闻部分,这里有 5 篇最新的文章: [警告] - 1 August 2017 年 8 月 1 日将发生 BIP 148 UASF 。这可能会大大影响比特币挖掘机传统挖矿或挖BIP 148 区块链的收益。 要做好准备,我们建议阅读 UASF 指南。 Written by Bitcoin Mining on . Recommended posts Contribute Advertise FAQ About Us Español Deutsch Français Nederlands Pусский Português Bitcoin Mining™® © 2010-2022 Hesiod Services LLC | Terms | Privacy Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance Error 403 Forbidden - This request is blocked. For security reasons you can't connect to the server for this app or website at this time. It maybe that you have too many requests or the illegal request payload is identified as an attack. Please try again later. 详解比特币挖矿— 应该是史上最通俗易懂的版本 - 知乎
探索 PyMiner: 深入挖掘比特币的潜力-CSDN博客
>
Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance
挖矿过程 | 区块链技术指南
| 区块链技术指南区块链技术指南搜索Ctrl + K前言修订记录如何贡献区块链的诞生记账科技的千年演化分布式记账与区块链集大成者的比特币区块链的商业价值本章小结核心技术概览定义与原理技术的演化与分类关键问题和挑战趋势与展望认识上的误区本章小结典型应用场景应用场景概览金融服务征信管理权属管理与溯源资源共享物流与供应链物联网数字艺术品和 NFT其它场景本章小结分布式系统核心技术一致性问题共识算法FLP 不可能原理CAP 原理ACID 原则与多阶段提交Paxos 算法与 Raft 算法拜占庭问题与算法可靠性指标本章小结密码学与安全技术密码学简史Hash 算法与数字摘要加解密算法消息认证码与数字签名数字证书PKI 体系Merkle 树结构Bloom Filter 结构同态加密其它技术本章小结比特币 —— 初露锋芒的区块链比特币项目简介比特币诞生背景工作原理挖矿过程共识机制闪电网络侧链热门问题相关工具本章小结以太坊 —— 挣脱加密货币的枷锁以太坊项目简介核心概念主要设计相关工具安装客户端使用智能合约智能合约案例:投票本章小结超级账本 —— 面向企业的分布式账本超级账本项目简介社区组织结构顶级项目介绍开发必备工具贡献代码本章小结Fabric 安装与部署简介本地编译组件容器方式获取本地方式启动 Fabric 网络容器方式启动 Fabric 网络本章小结管理 Fabric 网络简介使用通道管理节点管理链上代码监听网络事件自动发现网络信息使用运维服务如何升级网络版本使用 SDK注意事项与最佳实践本章小结智能合约开发简介链码概念与结构示例一:信息公证示例二:交易资产示例三:数字货币发行与管理示例四:学历认证示例五:社区能源共享小结Fabric 架构与设计简介架构设计消息协议小结区块链服务平台设计简介IBM Bluemix 云区块链服务微软 Azure 云区块链服务使用超级账本 Cello 搭建区块链服务本章小结性能与评测简介Hyperledger Fabric v0.6小结附录术语常见问题Go 语言开发相关安装与配置 Golang 环境编辑器与 IDE高效开发工具依赖管理ProtoBuf 与 gRPC参考资源链接由 GitBook 提供支持挖矿过程基本原理比特币中最独特的一个概念就是“挖矿”。挖矿是指网络中的维护节点,通过协助生成和确认新区块来获取一定量新增比特币的过程。当用户向比特币网络中发布交易后,需要有人将交易进行记录和确认,形成新的区块,并串联到区块链中。在一个互相不信任的分布式系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。目前,每 10 分钟左右生成一个不超过 1 MB 大小的区块(记录了这 10 分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者可以得到系统 12.5 个比特币的奖励(该奖励作为区块内的第一个交易,一定区块数后才能使用),以及用户附加到交易上的支付服务费用。即便没有任何用户交易,矿工也可以自行产生合法的区块并获得奖励。每个区块的奖励最初是 50 个比特币,每隔 21 万个区块自动减半,即 4 年时间,最终比特币总量稳定在 2100 万个。因此,比特币是一种通缩的货币。挖矿过程挖矿的具体过程为:参与者综合上一个区块的 Hash 值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数 X,一起打包到一个候选新区块,让新区块的 Hash 值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了避免震荡,每次调整的最大幅度为 4 倍。历史上最快的出块时间小于 10s,最慢的出块时间超过 1 个小时。为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 Hash 计算为单位,记为 h/s。目前,比特币网络算力峰值已经达到了每秒数百亿亿次。汇丰银行分析师 Anton Tonev 和 Davy Jose 在 2016 年一份客户报告中曾表示,比特币区块链(通过挖矿)提供了一个局部的、迄今为止最优的解决方案:如何在分散的系统中验证信任。这就意味着,区块链本质上解决了传统依赖于第三方的问题,因为这个协议不只满足了中心化机构追踪交易的需求,还使得陌生人之间产生信任。区块链的技术和安全的过程使得陌生人之间在没有被信任的第三方时产生信任。如何看待挖矿2010 年以前,挖矿还是一个非常热门的盈利行业。但是随着相关技术和设备的发展,现在个人进行挖矿的收益已经降得很低。从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),一般的算力已经不可能挖到比特币。特别是利用虚拟机来挖矿的想法,已经基本不可能了。从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的 ASIC 矿机(2013 年年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池(知名矿池包括 F2Pool、BitFury 等)。短短数年间,比特币矿机的技术走完了过去几十年的集成电路的进化历程,甚至还颇有创新之处。高回报刺激了科技的飞速发展。目前,矿机主要集中在少数矿池手中,全网的算力已超过每秒 10^20 次 Hash 计算。如果简单认为一次 Hash 计算等同于一次浮点运算,那么比特币全网算力将等同于 500 台 Summit 超级计算机(目前最快的超级计算机,由 IBM 和 Nvidia 于 2018 年研制)。很自然地,读者可能会想到,如果有人掌握了强大的计算力,计算出所有的新区块,并且拒不承认他人的交易内容,那是不是就能破坏掉比特币网络。确实如此,基本上个体达到 1/3 的计算力,比特币网络就存在被破坏的风险了;达到 1/2 的算力,从概率上就掌控整个网络了。但是要实现这么大的算力,将需要付出巨大的经济成本。那么有没有办法防护呢?除了尽量避免计算力放到同一个组织手里,没太好的办法,这是目前 PoW 机制自身造成的。也有人认为为了共识区块的生成,大部分计算力(特别是最终未能算出区块的算力)其实都浪费了。有人提出用 PoS(Proof of Stake)和 DPoS 等协议,利用权益证明(例如持有货币的币龄)作为衡量指标进行投票,相对 PoW 可以节约大量的能耗。PoS 可能会带来囤积货币的问题。除此之外,还有活跃度证明(Proof of Activity,PoA)、消耗证明(Proof of Burn,PoB)、能力证明(Proof of Capacity, PoC)、消逝时间证明(Proof of Elapsed Time)、股权速率证明(Proof of Stake Velocity,PoSV)等,采用了不同的衡量指标。当然,无论哪种机制,都无法解决所有问题。一种可能的优化思路是引入随机代理人制度,通过算法在某段时间内确保只让部分节点参加共识的提案,并且要发放一部分“奖励”给所有在线贡献的节点。上一页工作原理下一页共识机制最后更新于2年前在本页基本原理挖矿过程如何看待挖矿这有帮助吗?在GitHub
Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance
比特币挖矿指南 - 比特币挖矿入门
Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance