比特大陆蚂蚁矿机S7

时间戳服务与存在证明

长铗 发布在 币头条,技术指南 2 23706

存在证明

存在证明就是向第三方证明某个物品/事件,在过去的某个时刻存在过。

这是一件很简单的事情,提供票据、通信记录之类的就可以办到。但这些并不严格,因为这些证据都是非常易伪造或销毁。要完成证明,必须依赖强有力的证据链,这个必须是任何人都无法伪造与销毁的,或者说伪造成本极其高昂近乎不可能。

回忆一下,电影里经常出现的绑匪镜头,他们为了证明在某个时间确实拥有人质,而不是事前拍摄的视频,通常会用当天的发行量很大的报纸来辅助证明。当香港媒体误报“成龙高楼坠亡”时,成龙也不得不拿报纸来证明自己的存在:

0f6c4fcc-fcdc-11e2-8770-b72819e92915

报纸之所以能够成为有效的时间证明系统是因为:

  1. 不可伪造性。新闻等信息是无法预测的,尤其是证券大盘数据,报纸上大量充满这样的信息,所以无人能够提前伪造。
  2. 公开且不可销毁。报纸通常拥有很大的发行数量,受众广泛,一旦发布出去就分散到各个角落,很难再次收集齐全并全部销毁。通常图书馆也会存档数十年期限的报纸。
  3. 具有时间特征。报纸具有很强时间特征,版面到处可见的是时间标记。

借助报纸可以完成某个时间之后的存在证明,但无法完成某个时间之前的。例如,你拿9月1号的报纸拍摄进照片,那么仅能证明其在9月1号之后拍摄,可能是9月1号,也可能是9月15号。

时间戳服务

比特币本质是构造了一个永不停息、无坚不摧的时间戳系统。

5281de94-fce1-11e2-83be-e80533cae1e9

然后该系统上添加若干特性后使得具有货币的功能。报纸从另一个角度讲也是一种时间戳服务。

比特币具有下列优良的特性可以更完美的用于存在证明:

  1. 不可预测/伪造。因block的计算是随机事件,其hash值是一个32字节的随机大数(2256)。想蒙对该数的概率实在是太低了。
  2. 不可销毁/修改。Block Chain拥有巨大的算力在维护与延续,对于N个确认的block,想篡改是不可能的。
  3. block具有天然时间特性。timestamp是block meta字段之一。
  4. 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 = 39693
87ac = 34732
8715 = 34581
18cf = 6351
d860 = 55392
1aa4 = 6820
56b5 = 22197
8fa7 = 36775
4c01 = 19457
194c = 6476
feb2 = 65202
5e7f = 24191
3eec = 16108
f437 = 62519
59d6 = 22998
ccb4 = 52404
将这16个数除以108,作为输出额度,构造交易:

555dc5de-0352-11e3-8cf9-c7d8de72adbe

交易被收录,证明完成。

方式二:数字摘要的Hash作地址输入

回顾一下地址的生成算法(下图是一个未压缩公钥生成地址的过程,公钥是否压缩对该证明过程没有影响):

47602d38-0356-11e3-8fa7-ba59e99eee85

我们用数字摘要的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)后:

30cc9c38-035a-11e3-98da-590a87880173

得到两把公钥,分别对应两个地址。证明时将币打入任何一个地址即可,建议使用未压缩公钥地址,因为并不是所有客户端都对压缩公钥支持良好。然后将该私钥导入任何一个客户端,再把该地址的钱转移到一个安全的地方。最后,公开私钥和对应收录地址的交易。

总结

方法二浪费,应避免使用。方法一繁琐,需要工具辅助转换。方法三相对容易,门槛低一些,大部分客户端都支持,私钥公钥地址的推导也有很多工具支持。

就这样比特币系统轻松的完成了存在证明,安全稳固,公信力远胜任何第三方、机构、政府。过程极其简单,使得任何一人都可以轻易地做出存在证明,其意义非常重大。可以预见,未来将比特币作为存在证明会得到广泛的应用。

Posted by kevin@bitfund.pe Aug 12th, 2013

版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。

评论:2

您需要登录后才可以回复 登录|注册