比特币挖矿算法是怎样的?——区块链技术知识

需要以下参数
block 的版本 version
上一个 block 的 hash 值: prev_hash
需要写入的交易记录的 hash 树的值: merkle_root
更新时间: ntime
当前难度: nbits

挖矿的过程就是找到 x 使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x)) < TARGET

上式的 x 的范围是 0~2^32, TARGET 可以根据当前难度求出的。除了 x 之外,你还可以尝试改动 merkle_root 和 ntime。由于 hash 的特性,找这样一个 x 只能暴力搜索。

一旦你找到了 x,你就可以广播一个新的 block,其他客户端会验证你的 block 是否合法。如果你的 block 被接受,由于每个 block 中的第一笔交易必须是将新产生 25 个比特币发送到某个地址,当然你会把这个地址设为你所拥有的地址来得到这 25 个比特币。


比特币从开始到现在的每一笔交易记录都保存在网络上,整个比特币网络维护的一个巨大的交易记录文件(现在大约 12G)。 这个文件的更新周期平均是 10 分钟,新加入的交易记录叫做一个 block,而这个硕大的文件由一串 block 组成,叫做 block chain.

为什么是 25 个比特币?
这是规定。最初是 50 个比特币,每产生剩下比特币的一半,这个所得就会减半,这样最终能产生的比特币总量趋近于 2100 万。如果你现在仍然声称挖到了 50 个比特币,这是不会被其他客户端接受的,这个 block 就算白挖了。

怎么保证更新周期平均是 10 分钟?
TARGET 越小,解出 x 的难度就越大,每产生 2016 个 block(约 14 天),网络会根据这段时间产生新 block 的平均间隔调整之后的 TARGET。

是不是计算速度最快的人总是先解出来?
不是。你总是想把挖矿所得据为己有,所以每个人在计算时,发送挖矿所得的地址是不一样的,这样 merkle_root 就不同,也就是说每个人是从不同的初始状态开始求解的。

同时解出来怎么办?
block chain 会出现分叉,部分客户端接受了 A,部分接受了 B,直到某个分支变得更长,所有人就会选择这个更长的分支。如果你挖出来的不幸没有被选中,你的挖矿所得就无效了。

既然选更长的分支,那我用很低的难度去求解怎么办?
客户端在众多分支中找到符合当前难度且最长的。

这些计算浪费了吗?
如果你要把一笔钱花两次,你需要这么做。挖到一个新的 block,但是藏着不广播,并继续挖矿。找到商家 A,支付比特币,让网络上的其他人挖到 block 并写入这笔交易记录。找到商家 B,支付比特币,写入自己挖的 block。如果你能抢先挖到两个 block 并广播出去,所有人会以你这个更长的分支为当前的 block chain,商家 A 收到的比特币就不被承认了。这样攻击成功的概率取决于你计算 hash 的速度。整个网络的计算力足够高的话,这样的攻击或者成功率极低,或者成本极大。