时间戳服务与存在证明
存在证明
存在证明就是向第三方证明某个物品/事件,在过去的某个时刻存在过。
这是一件很简单的事情,提供票据、通信记录之类的就可以办到。但这些并不严格,因为这些证据都是非常易伪造或销毁。要完成证明,必须依赖强有力的证据链,这个必须是任何人都无法伪造与销毁的,或者说伪造成本极其高昂近乎不可能。
回忆一下,电影里经常出现的绑匪镜头,他们为了证明在某个时间确实拥有人质,而不是事前拍摄的视频,通常会用当天的发行量很大的报纸来辅助证明。当香港媒体误报“成龙高楼坠亡”时,成龙也不得不拿报纸来证明自己的存在:
报纸之所以能够成为有效的时间证明系统是因为:
不可伪造性。新闻等信息是无法预测的,尤其是证券大盘数据,报纸上大量充满这样的信息,所以无人能够提前伪造。
公开且不可销毁。报纸通常拥有很大的发行数量,受众广泛,一旦发布出去就分散到各个角落,很难再次收集齐全并全部销毁。通常图书馆也会存档数十年期限的报纸。
具有时间特征。报纸具有很强时间特征,版面到处可见的是时间标记。
借助报纸可以完成某个时间之后的存在证明,但无法完成某个时间之前的。例如,你拿9月1号的报纸拍摄进照片,那么仅能证明其在9月1号之后拍摄,可能是9月1号,也可能是9月15号。
时间戳服务
比特币本质是构造了一个永不停息、无坚不摧的时间戳系统。
然后该系统上添加若干特性后使得具有货币的功能。报纸从另一个角度讲也是一种时间戳服务。比特币具有下列优良的特性可以更完美的用于存在证明:
不可预测/伪造。因block的计算是随机事件,其hash值是一个32字节的随机大数(2256)。想蒙对该数的概率实在是太低了。
不可销毁/修改。Block Chain拥有巨大的算力在维护与延续,对于N个确认的block,想篡改是不可能的。
block具有天然时间特性。timestamp是block meta字段之一。
block可以存储信息。对于block meta信息,是无法控制的。但block会收录交易,而交易是可以”写入”自己的数据。
数字摘要
简单来说,对一串数据进行Hash运算,得到的Hash值称为数字摘要。除了Hash函数,还有其他方式,如密钥签名等也可以得到。Hash值通常是一个非常巨大的数,例如用SHA256时,Hash值区间非常大:1~2256。数字摘要的计算过程不可逆,那么可以认为:
欲证明你拥有某个文件,提供该文件的Hash值(及Hash函数)即可。第三方可以轻易验证文件的Hash值来判断之。
比特币做存在证明
时间点后向证明因为block hash的不可伪造性,能提供Block Hash即可证明存在于该Block时刻之后。例如,你在拍照的时候,拿着打印有block hash的纸即可证明:你在该block时刻之后进行的拍摄。
时间点前向证明前向证明需要精心构造一个包含数字摘要的交易,待该交易进入block中。便可以证明你在该block时刻之前拥有该数字摘要。前向证明的关键是能把信息写入时间戳服务载体。
时间区间证明有时候,仅仅证明时间点之前或之后是不够的,需要能够确认到某一个时刻。将上述方式综合即可完成:
将block A的hash值添入数据文件,并制作文件数字摘要。(时间点后向证明)
将摘要信息构造至交易中,广播之。(时间点前向证明)
当交易被block B收录进去,那么即可证明,该文件于block A与B的时间间隔中存在。
如果交易给了足够的矿工费(Transaction Fee),具有较高优先级的话,便很有可能被紧随其后的block收录。连续的block约10分钟,那么就在一个相对小的时间内作了证明,可以近似认为是时间点。
构造特殊交易
带有数字摘要的交易如何构造呢?下面以32字节的数字摘要为例,提出数个可行方法,其他长度的可变换得出。方式一:交易额承载信息
32字节可以分割为16个双字节,每个双字节的数值范围是:0~65535。比特币的现行单位可以分割至小数点后八位,那么我们可以利用最后的5位来存放一个数值,一共需要16个输出(Tx output)即可完成32字节的信息存储。中间涉及比特币最大数量为:.00065535 * 16 = .0104856 btc
需要的比特币数量很少,约0.01Btc,且输出依然发回给自己的地址,唯一的代价就是付出矿工费(Tx Fee)。任何人都可以使用之。
SatoshiDice种子文件时间证明
著名站点SatoshiDice就是采用这种方式为其服务端种子文件做时间前向证明的。下面演示一下步骤。服务端的种子文件为hash.keys,我们对其做SHA256运算,得到hash值,32个字节。
$ sha256sum hash.keys# hash of file "hash.keys", in hex:9b0d87ac871518cfd8601aa456b58fa74c01194cfeb25e7f3eecf43759d6ccb4 hash.keys将该hash转为16个10进制数值:9b0d = 3969387ac = 347328715 = 3458118cf = 6351d860 = 553921aa4 = 682056b5 = 221978fa7 = 367754c01 = 19457194c = 6476feb2 = 652025e7f = 241913eec = 16108f437 = 6251959d6 = 22998ccb4 = 52404将这16个数除以108,作为输出额度,构造交易:
交易被收录,证明完成。
方式二:数字摘要的Hash作地址输入回顾一下地址的生成算法(下图是一个未压缩公钥生成地址的过程,公钥是否压缩对该证明过程没有影响):
我们用数字摘要的Hash值代替图中红色框中的值,然后得到一个地址,我们把0.00000001 btc打入该地址,形成交易,收录后完成证明。验证时,需要首先得到数字摘要hash值,再生成对应的地址,核对地址是否一致即可。
这个方法有个缺点,打入该地址的币永远消失了,因为没有其对应的私钥。虽然可以只需1聪,目前价值几乎忽略不计,但毕竟浪费了。该方法可以进一步衍生一些类似的方法。曾有个网站使用之,后来该网站关闭了。
方式三:数字摘要的Hash作私钥大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间的数,都可以认为是一个合法的私钥,其大小为32字节。那么,可以把数字摘要的Hash作私钥,并推算出公钥和地址。将任意币值输出至该地址构成交易,交易收录后,通过私钥再转移走即可。这样便在block chain里留下了这个地址。验证时重复该过程,检查地址是否一致即可。
该方法不会像方法二那样形成浪费,也比较容易操作。我们依然SatoshiDice的种子文件为例,种子数字摘要的Hash为:9b0d87ac871518cfd8601aa456b58fa74c01194cfeb25e7f3eecf43759d6ccb4。
借助bitaddress.org,输入私钥(种子hash)后:
得到两把公钥,分别对应两个地址。证明时将币打入任何一个地址即可,建议使用未压缩公钥地址,因为并不是所有客户端都对压缩公钥支持良好。然后将该私钥导入任何一个客户端,再把该地址的钱转移到一个安全的地方。最后,公开私钥和对应收录地址的交易。
总结
方法二浪费,应避免使用。方法一繁琐,需要工具辅助转换。方法三相对容易,门槛低一些,大部分客户端都支持,私钥公钥地址的推导也有很多工具支持。
就这样比特币系统轻松的完成了存在证明,安全稳固,公信力远胜任何第三方、机构、政府。过程极其简单,使得任何一人都可以轻易地做出存在证明,其意义非常重大。可以预见,未来将比特币作为存在证明会得到广泛的应用。
作者:潘志彪kevin来自:http://www.btcbbs.com/forum.php?mod=viewthread&tid=1290
![btcfans公众号](/assets/image/ic_qrcode_accround_endpage.png)
Scan QR code with WeChat