我们把一种电子币定义成一条数字签名链。每一个所有者把币转给下一个人的时候,是通过将前一个交易的哈希和下一个所有者的公钥进行数字签名,并把这些追加在币的后面。收款人可以通过验证数字签名来确认链的所有者。
当然,问题是收款人无法验证其中的一个所有者是否同一个币花了两次(双花)。一个普遍的做法是引入一个信任的中央机关,或铸币厂,他们可以检查每一笔交易来防止双花问题。每次交易后,这个币必须返回到铸币厂,这样才能发行新币,只有直接从铸币厂发行的币才被相信是没有被双花的。这个方案的问题是,整个金钱系统的命运掌握在经营铸币厂的公司,每一笔交易都要经过他们,就像银行一样。
我们需要一种方法,这种方法让收款人知道上一个所有者没有签署任何以前的交易。我们的目的是,让最早的交易是可信的,我们不关心后面是不是有人企图进行双花。仅有的可以确认某一个交易存在的办法是要知道所有的交易。在基于铸币厂的模型中,铸币厂知道所有的交易,并且可以确定哪个交易先发生。为了在无信任第三方的情况下达到这个目的,交易必须要对公众进行通知,并且我们需要一个系统,这个系统的参与者要达成共识,这个共识就是认同同一个按收到的交易顺序排列的历史记录。收款人需要证据来说明在每一笔交易的时候,大多数节点一致认为这个交易是第一时间到达的。
时间戳服务器
我们提出的解决方案从一个时间戳服务器开始。这个服务器工作方式是,对条目所在的区块的哈希加盖时间戳,并且广泛的公布这些哈希,比如通过报纸或新闻组邮件。显然,为了能进入这个哈希序列,时间戳证明的数据在那个时间必须存在。每一个时间戳和以前的时间戳,形成一条链,每一个追加的时间戳都是对前一个时间戳进行加强。
工作量证明
为了基于点对点的基础实现一个分布式的时间戳服务器,我们将需要一个工作量证明的系统,这个系统和亚当·贝克的哈希现金类似,而不是报纸或新闻组邮件。这个工作量包含寻找一个哈希值,比如用哈希算法SHA-256,这个哈希值以若干0开头。平均工作量和开头的0的个数是指数关系,并且验证很简单,只需要执行一次单独的哈希计算。
在我们的时间戳网络里,是这样实现工作量证明的,就是不断增加区块里的一个临时的数值,直到找到一个值使得区块的哈希值满足开头0的个数的要求。一旦CPU花费算力计算满足了工作量证明的要求,这个区块链就无法修改,除非重新计算。随着后面的区块不断产生,想要改变这个区块,需要重做它后面所有区块的工作量。