简单易懂的Memory-Hard Function

Function

SHA-256 函数是传统的hash 算法,但是应用在区块链系统时,有一个缺点。Bitcoin mining 算法,就是使用传统的SHA-256 函数,而SHA-256 的优点,也正好就是它的一个缺点。

SHA-256 的问题

为了提升SHA-256 的计算速度,工程师会利用行平行处理(parallelism)的技术。利用平行运算,大幅提升SHA-256 的运算速度,这样做不是很好吗?

然而,这就是一个问题了。简单来说,一个能平行化的算法,就能使用硬件来做加速,例如:使用GPU、FPGA 或是ASIC。这里就是「弊端」所在了。从Proof-of-Work 的观点来看,「大家必须公平地做计算」,意思是说,因为hash 值的运算是「decentralization」的架构,所以「大家的硬件最好一样」。

Decentralization of Trust

Proof-of-work 的主要工作是mining。此外,验证交易的「可信度」,也是proof-of-work 的一环。Proof-of-work 的工作不此于此,例如:miner 间的资料库同步,也是包含在内。总之,proof-of-work 很忙。

这些proof-of-work 的工作,是miners 一起进行的,而不是由一个中央伺服器(centralized)来统一运算,这就是decentralization of trust 的观念。

更简单来看,这就是所谓的decentralization(去中心化)架构。以mining 来说,每个人都可以参与hash 值的运算(大家都可以挖矿),所以,想「快一点」的人,就会使用ASIC 挖矿机。可是,有些人是用自已的电脑来挖矿。

到这里,问题就很清楚了:大家的硬件如果等级不同,挖矿就会「不公平」。当大家的运算速度都差不多,没有人可以「大幅加速」时,理论上就公平了。

Memory-Hard Function

为了解决这个问题,科学家就想出了一个方法。这个方法非常简单,首先,你不可能强制每个人都要买一样的电脑才能挖矿,所以解决方式就要回归算法的本质:parallelism。

于是,科学家提出一种称为memory-hard function 的hash 算法观念:一种不能或难以平行化的hash 算法。

这让我想过几年前的一个有趣故事。过去,多核心处理器开始后,开始有Android 手机的制造厂,以「多核心手机」做为市场宣传口号。这当然很好啊,「多核就是快」。但是,学软件的人都知道一个道理,就是「软件必须支持多核心」。如果你的软件设计,本身就不是多核心架构,那就会像这支手机一样:明明是4 核心,但是开机后,其实只用了1 个核心,另外3 个核心被关闭(省电考量)了。

有了memory-hard function 后,「挖矿」就理论上公平了,并且也能消除弊端。因为,就算有顶极的挖矿机,也会像这支多核心手机一样:再强的硬件也很难加速软件运算。

Memory Intensive

Memory-hard function 是怎么做到这点的呢?上述的「一种不能或难以平行化的hash 算法」,其实是利用这个原理:降低平行处理的优势。让平行处理难有发挥的空间,这样就能降低GFP、FPGA 或ASIC 挖矿机的优势了。

要消除平行处理的优势,只要让软件是memory intensive 即可。Memory intensive 是每天都会看到的现象:内存不足时、电脑变慢。

Memory-hard function 的原理就是这样,在hash 运算时,可以透过「乱塞一堆资料到内存」的方式,降低硬件的运算优势。这样的hash 算法,就称为memory-hard function。这堆要塞到内存的资料,称为data array(array of data)。

Argon2

Argon2 是属于 memory-hard function 的一种算法,Blockchain 开发者会知道它,是因为 Argon2 在 2015 年,从 24 个参赛者中,拿下 PHC 竞赛的优胜。

小结

Argon2 可以取代传统的SHA-256 函数。如果想要知道原因的话,一般的说法就是:Argon2 没办法用ASIC 挖矿机进行挖矿。

接下来,可以试著 fork 一份项目,导入 Argon2 算法,并试著比较 Argon2 与 SHA-256 的挖矿困难度。

本文链接地址:https://www.wwsww.cn/jishu/9462.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。