区块链原理

Aster 理宅异闻录 Leave a Comment

比特币挖矿,说来也容易,其实就是找到如下方程的一个解而已:

$$\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<x<2^{32}$

其中C是个常数,根据环境而定

$$C = \text{version} + \text{prev_hash} + \text{merkle_root} + \text{ntime} + \text{nbits}$$

  • version = 版本号
  • prev_hash = 前一区块ID的字节反转
  • merkle_root = 本区块中所有交易的SHA256的墨克哈希树根的字节反转
  • ntime = 时间戳
  • nbits = 网络难度

Target根据之前上千个区块的平均求解速度调整,算法会将找到一个解的期望时间控制在10分钟左右.

解出来还要广播,其他终端会验证是否正确,如果正确就会被接受,然后大家一起去算下一个区块.

如果和别人几乎同时算出来,那么出现小分叉,然后继续挖,知道其中一个比较短被遗弃.

发表评论