Bitcoin 所共享的数据就是一大堆 block,那么一个 block 里装有什么内容呢?见图1:

图5:一个Block的内容,以及Block链

一个block的主要内容是“最近的交易列表”和“上一个block的hash值”。交易列表记录着产生当前block这段时间内整个Bitcoin网络的所有交易记录,包括汇出地址、汇入地址、金额等。“上一个block的hash值”用于定位上一个block,有这个数据之后所有block就可以按顺序地形成一条链。一条完整的链记录着Bitcoin网络从诞生一刻开始直到未来所有的交易记录,这些记录会共享到每一个运行Bitcoin的节点。这里有个网站可以浏览每一个block和每一笔交易的具体内容:http://blockexplorer.com/ 。(题外话:在这个链当中的第一个block是比较特殊的,它是创始人Satoshi Nakamoto人为创造的,所以称为 Genesis Block)。

假如Bitcoin得到广泛应用,每个block中的交易列表会相当庞大,那么每个运行Bitcoin的节点会耗费大量的储存空间,到时可能更多人不再运行Bitcoin应用程序转而使用在线的Bitcoin银行网站。分析到这里不禁会想到:假设Bitcoin整个网络只剩下100万个节点,某个组织自己搭建一个200万个节点的“黑网络”,然后更改其中的数学公式,再连接到外面正常的Bitcoin网络,这样Bitcoin系统是不是会受到破坏呢?

每个block都会被计算出一个hash值(使用SHA256算法 ),以提供下一个block链接使用,而计算这个hash值的过程就是“挖矿(mining)”过程,第一个计算出hash值的人就能获得50BTC的奖励(以后每21万个blocks奖金减半)。一般来说,现在的计算机要计算一个hash值已经非常快,所以为了竞争,Bitcoin对hash过程提出了一个要求:原始数据中留一个空缺让你填写任意内容,使得计算出的hash值前面有指定个数的数字“0”,问题可以用如下的式子理解:

sha256(“hello” + N)= “000000xxxxxxx”,其中N是让你填写的任意内容,xxxx的内容不限。

这就是专门用来为难CPU的HashCash算法,目前已知的解决方法只能将N从0开始一直递增到9999999…..逐个尝试看看计算出来的hash值的前面是否恰好有若干个0。使用这种方法除了可以让计算机耗费大量时间来计算hash值之外,还能通过增加或减少前导0的数目来调节难度,比如要计算出前面有4个0的平均时间为1小时,那么要计算5个0的平均时间可能会多10多倍。现在Bitcoin的计算难度正以指数形式不断增加(见统计图 http://bitcoin.sipa.be/ ),所以已经不能单独个人挖矿了,只能通过矿场(mining pool)来挖取BTC。

讲到Mining Pool,Mining pool是用来集中散户力量共同挖矿,然后按工作量来分摊劳动所得的一种网站(比如 http://deepbit.net/ ),挖矿程序(Miner,比较常见的有 GUIMiner  和 DiabloMiner ,都是GPU挖矿程序)通过JSON-RPC 协议 向矿场请求工作,矿场会把一个挖矿任务分割成许多份小工作,然后分派给 miner,miner 计算完之后向矿场提交劳动结果,这样就完成Pooled mining过程了。具体过程如下:

miner 调用矿场的 getwork(null)方法,获取一个工作任务,传输内容大致如下:
请求 –>

{"method":"getwork",

"id":"1",

"params":null}
返回 <–

{"error":null,

"id":"1","result":

{"midstate":"bbdb4f3078cc……",

"data":"00000001106e6da2fdf……",

"hash1":"000000000000000000……",

"target":"fffffffffffff……"}}

Miner根据midstate,data,hash1,target再加上一个自己的递增的数字计算出符合要求的hash值,有结果之后再次调用矿场的getwork(data)方法以提交。具体的算法请参阅Bitcoin或者miner的源代码。矿场可能会因为这种工作方式而遭受类似DDos的攻击,假如有人写个恶意的miner不断获取工作而不真正干活,矿场有可能会减产。

以上参考:http://ivarptr.blogspot.com/2011/05/bitcoin_31.html

Bitcoin这种分配计算任务的方法也存在弊端,假如计算出的block越来越多,每个mining程序都会必须首先下载大量的block文件,然后才能开始计算;不过下载的这些数据主要用于校验计算的结果是否合法,出于作为一种pay system而做的安排,面对这种问题,对于专业的分布式计算而言,就会提供相对高成本但效果也好很多的解决方案——分布式文件系统,以及高速互连的网络;Bitcoin 各节点之间通过共同的协议通讯,官方的程序只是一种选择,各矿池及交易网站也是一个节点,只是用自己的方式(C、Java等各种语言)实现了Bitcoin的功能,并针对网站Web用户提供bitcoin接口,以及各种交易等的功能,比较灵活。

Bitcoin分布式计算的机制仅部分节点相对于大规模的并行计算&超级计算而言并没有什么优势,但是胜在要求低,即便是最大型的超计算机也扛不住海量富余计算能力的蚂蚁搬家式作战,非常灵活,已经有网站(bitcoinplus.com)实现利用网站访客来进行计算的方式,原理很简单,网站通过js的方式调用Java的applet进行计算,想法非常好,只是目前效率有待提高,基本可以接近100%利用CPU计算,但无法利用GPU,如果能对程序做改进,充分利用GPU,并且提供对计算资源额度调节的功能,使得既能利用访客的空余算力,同时不会对其正常浏览产生影响,也是一种很好的方式。

Bitcoin是作为一种未来电子货币的方式出现的,但由于种种原因,电子支付可能并不合适大规模推广,如果能将Bitcoin打造成为“一台计算能力非常大的超级计算机”,提供通用的任务接口,需要超高计算能力的一些项目,比如科技方面的,进行接入,然后各个矿池或者交易网站或者官方将任务进行分配,每个计算能力富余的用户都可以接领任务,获得与自身计算能力相应的收入,需要高计算能力的项目也可以在昂贵高门槛的超级计算机之外,拥有多一份的选择。