比特币最近几年非常火爆。发明者中本聪设计了一个特定的算法用于生成(发行)比特币,让各位玩家(矿工)用自己的CPU、显卡,或者更加专业的矿机,通过无聊的并行计算算出比特币的特定密码(挖矿)。为了保证全网比特币按照特定的发行速度递增,并最终无限趋近于上限2100万枚,挖矿难度会根据全网算力进行动态调整。由于进场人数急剧增加,谁的算力大,谁挖到比特币的几率就高,因此这是一个类似于“军备竞赛”的过程。前期硬件投入,加上巨大的电力消耗,回本机会往往非常渺茫,更重要的是,全网如此巨大的计算力白白地消耗在毫无意义的运算中。从比特币衍生出的各类山寨币,其运作机制完全相同,同样在无畏地消耗着大量算力。
其中一个方案在最底层实现。由于各个矿机的平台不尽相同,使用者将自己要提交的代码,分解优化为一系列可重入的代码块(可以是函数),这些代码块之间除了数据传递,逻辑上是相互独立的,并且是有严格的先后线性顺序的,可并行安排。将这些代码按照某一平台进行编译,添加平台标记、顺序号,生成一系列代码段,并将这些binary提交到整个计算网络。相同平台的矿机(X86,ARM,SPARC,MOTO....)自动加载计算并返回结果给代码提交者。
显然,并行的计算,且每一个并行分支含有极高次迭代的循环结构,利用率是最好的。因此使用者设计代码时要尽量符合这样的标准。
从更高层次考虑,结构化程序理论表明,任何过程式语言都可以通过顺序、分支、循环三种基本结构进行组合。考虑将编程的基本单位,从语句提升为“算元”。经过精心挑选的基本算元(甚至可以是更高层的算法库)已安装在矿机中,使用者只需将运算过程(重复率很高的)按照一定的格式提交到全网,由网络自动分配算力,即可实现高效的利用。当然,这需要开发一种新的脚本语言。