美文网首页Nervos Fans
开放式时间戳:可扩展、信任最小的分布式比特币时间戳(上)

开放式时间戳:可扩展、信任最小的分布式比特币时间戳(上)

作者: 526ba0512193 | 来源:发表于2018-08-16 17:40 被阅读3次

每晚八点,我们在社区分享知识,等你。

NervosFans 微信公号:Nervosfans

入群请加乐乐微信:sensus113 美果大冰微信:xj73226

备注入群,谢谢!


过去几周我都趴在自己一个早先的项目上【1、2】,叫开放式时间戳(OpenTimestamps),目前已alpha版发布就绪。 开放式时间戳为时间戳基础设施,与已有相关方案相比具有三大优势:

信任:开放式时间戳使用去中心化、可公开审计的比特币区块链的同时,去除了对可信机构的需求;开放式时间戳的架构旨在支持未来多种交叉检查的公证方法。

成本:开放式时间戳可无限扩展,通过将无限数量的时间戳组合到一笔比特币交易中,实现时间戳免费创建。

便利性:开放式时间戳可在大约一秒钟内创建第三方可验证的时间戳;无需等待比特币确认。

目录

1. 时间戳证明的能与不能

1.1记录完整性

1.2签署软件及PGP

1.3证据真实性

1.4所有权

2. 创建并验证时间戳

3. 开放式时间戳原理

3.1s公证人及时间证明

3.2Merkle树

3.3提交操作

3.3.1 时间戳操作树

3.4聚合扩容

3.5公共日历

3.5.1 日历使用(可选)

3.5.2 时间戳升级

3.5.3 冗余

3.5.4 缓存及镜像

3.5.5 法律风险

4. 脚注

1 时间戳证明的能与不能

时间戳能证明某时间点之前某消息已存在,有时也被称为“存在证明”。 证明数据在某时间点之前已存还是非常有用的。 举些例子解释下为什么这么讲。

1.1 记录完整性

托管中心告知说,昨晚有人闯入后端服务器所在处;最后一次异地备份是一周前。 审计员想知道入侵者改变了哪些记录。该怎么做?

若知道具体入侵时间,且服务器上的所有记录都有可靠的时间戳,则可使用时间戳证明入侵前就已存在记录,帮助将入侵后审计和恢复工作集中在更小的数据集上。

但是,若不知道确切的入侵时间,时间戳基本没什么用,原因是入侵者完全可以在自己修改过的数据加时间戳。 不管怎么说,加了时间戳肯定是比不加要强。

1.2 签署软件及PGP

A要安装一个两年前发布的软件包来恢复旧记录,但开发者六个月前因笔记本电脑被盗撤销了自己的PGP密钥。 那么A如何知晓自己下载的软件为真?

PGP撤销是有日期的,若撤销时间在软件签名之后,且该签名有有效的时间戳,说明软件没问题的。这也是个时间戳很好的用例。

1.3 证据真实性

A在公共存档服务上找到了被告B的网站两年前的一张快照,如何证明照片为真?

网站快照上的时间戳并不一定能证明快照为真,但确极大地限制了可能篡改数据的人的范围。意思是,试想谁会预先知道未来会有诉讼,然后黑进存档服务改数据?

C运行了一个网站存档服务,但没钱聘请审计员或安全顾问。 那C如何能证明自己网站上的文件一直没有被修改?

还是那句话:有时间戳总比没有强。

我同事去年在一次IRC聊天中说过X,但项目失败后,他们就改口说自己当时说的是Y。我该如何证明他们撒谎?

时间戳只能证消息存在,证明不了内容。 好比去年的时候,这位仁兄又怎会知道后来项目会失败,别人会改口? 是要多神,才会给两个IRC日志都加上时间戳?

有个匿名的加密货币ByteCoin有点酷,技术不错,社区也发展了有两年。所以,ByteCoin 不可能是假的吧?

请恕时间戳无能为力:首先,ByteCoin的创建者不会加任何时间戳。 另外,即便加了,从头开始创建加密货币怎么着也得花两年时间,这期间有搞出像样产品加个时间戳还不是小事儿。

1.4 所有权

我想用时间戳在区块链上保存自己的土地证。

时间戳本身不能解决双重问题;况且比特币不只是时间戳服务。

话虽如此,时间戳可以提供所有权记录准确的证明;好比 Verisart客户端,就是主打艺术所有权这张牌的。 虽然艺术出处记录(如画廊销售收据)上的时间戳本身并不能证明该记录是有效的,却能排缩小欺诈范围,使得出处调查人员能有的放矢进行调查。

2. 创建并验证时间戳

首先,下载开放式时间戳客户端0.2.0版:

安装依赖包:

安装过程不涉及整个系统,所以创建时间戳比较快速和简单:

如图,已创建README.md.ots,但无法立即验证:

时间戳得到比特币区块链确认需要几个小时;不是每笔交易一个时间戳。

但是,客户端也附带了很多示例时间戳,可以尝试立即验证。 需要一个本地比特币核心节点(修剪节点也行),并在~/.bitcoin/bitcoin.conf中设置rpcuser 和rpcpassword选项,允许开放式时间戳客户端通过RPC接口连接到自己的节点。设置完成后,我们试着验证下examples/hello-world.txt:

Okay了。

3. 开放式时间戳原理

已经熟悉比特币和哈希函数的人可以直接跳到提交操作章节。

时间戳啥原理呢?我们先来添加verbose标志然后再验证一下:

3.1公证人及时间证明

每个比特币区块头都有个叫nTime的字段。 比特币协议规定,区块想被网络认可,需要将该字段设置为区块创建时的大约时间。 但是具体该字段需要精确到什么程度,区块才算有效,却是个比较复杂问题。简单起见,认为这个精确度在两三个小时内即可。

那么,比特币可以算作公证人,比特币区块头可作为时间证明:我们信任的公证人证明某些数据存在于某个时间点这一事实的证明。 这意味着若比特币正常工作,这80字节,也就是第358391个块的区块头,始于2015年5月28日:

3.2 Merkle树

当然,“Hello World!”这个消息不在这80字节中,交易也不在。 那么比特币是如何将区块中交易链接到区块头的?看下图中粗体显示的Merkle根,用的就是她:

Merkle根值是先获取区块中的全部交易,然后创建个Merkle树后计算得出的。如下图所示:

Merkle 树(来源:精通比特币)  

每个箭头都表示一个加密哈希函数,可将任意长度的消息转换为固定长度的摘要(哈希值)。安全的哈希函数有个非常重要的属性是:两条不同消息摘要相同的可能性几乎为零。不过确实存在“碰撞”的情形,意思是说一对信息还真有相同的哈希值,但涉及的数字就非常庞大了,从物理学角度来看是不可能的:

这些数字与设备技术无关;而是热力学允许的最大值。对256位密钥的强力攻击不可行,除非计算机由物质之外的东西构成,且占据的是空间之外的东西。

-Bruce Schneier,应用密码学

这也意味着若更改树底部的任何交易,修改交易上方的每个摘要也会发生变化,最终导致树顶端的Merkle根发生变化。比方说,假设把第358391区块中最后一笔交易的最后一个字节从0x00改成0x01,则Merkle根变成:

最后,哈希消息Hello World!\n,得到:

这个摘要正好在比特币交易

7e9f0f7d9daa2d9e51b2e22f4abe814c3f90539afa778a9bef88dc64627cb2ec4中,因此若更改此消息,则摘要变化、交易变化、Merkle树变化,最终导致区块头发生变化。 由于改变消息必然引起区块头的变化,因此证明消息在区块头创建前已经存在,这就是传说中的时间戳证明。

3.3 提交操作

还可以这么形容存在证明:区块头提交Merkle树,Merkle树提交交易,交易由区块头提交,原因是更改交易并将导致区块头变更。或者,还可以说加密哈希函数属于提交操作,原因是操作的输入变化必将导致结果发生变化。

还有种更简单的提交操作,是append操作:

append操作为何被称为提交操其实非常好理解:若改变输入,结果必改变,因为结果包含输入嘛。

开放式时间戳中的时间戳证明就是按顺序应用于消息的一系列提交操作。 想要验证证明,重放操作并检查最终结果是否在某个时间点已知存在的消息即可。有鉴于输入不同的提交操作结果必不同,因此更改加了时间戳的信息必改变结果,进而使得时间戳无效。

看下面的时间戳例子:

$ ./ots info examples/hello-world.txt.ots

File sha256 hash: 03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340

Timestamp:

ripemd160

prepend 0100000001e482f9d32ecc3ba657b69d898010857b54457a90497982ff56f97c4ec58e6f98010000006b483045022100b253add1d1cf90844338a475a04ff13fc9e7bd242b07762dea07f5608b2de367022000b268ca9c3342b3769cdd062891317cdcef87aac310b6855e9d93898ebbe8ec0121020d8e4d107d2b339b0050efdd4b4a09245aa056048f125396374ea6a2ab0709c6ffffffff026533e605000000001976a9140bf057d40fbba6744862515f5b55a2310de5772f88aca0860100000000001976a914

append 88ac00000000

sha256

sha256

prepend a987f716c533913c314c78e35d35884cac943fa42cac49d2b2c69f4003f85f88

sha256

sha256

prepend dec55b3487e1e3f722a49b55a7783215862785f4a3acb392846019f71dc64a9d

sha256

sha256

prepend b2ca18f485e080478e025dab3d464b416c0e1ecb6629c9aefce8c8214d042432

sha256

sha256

append 11b0e90661196ff4b0813c3eda141bab5e91604837bdf7a0c9df37db0e3a1198

sha256

sha256

append c34bc1a4a1093ffd148c016b1e664742914e939efabe4d3d356515914b26d9e2

sha256

sha256

append c3e6e7c38c69f6af24c2be34ebac48257ede61ec0a21b9535e4443277be30646

sha256

sha256

prepend 0798bf8606e00024e5d5d54bf0c960f629dfb9dad69157455b6f2652c0e8de81

sha256

sha256

append 3f9ada6d60baa244006bb0aad51448ad2fafb9d4b6487a0999cff26b91f0f536

sha256

sha256

prepend c703019e959a8dd3faef7489bb328ba485574758e7091f01464eb65872c975c8

sha256

sha256

append cbfefff513ff84b915e3fed6f9d799676630f8364ea2a6c7557fad94a5b5d788

sha256

sha256

prepend 0be23709859913babd4460bbddf8ed213e7c8773a4b1face30f8acfdf093b705

sha256

sha256

verify BitcoinBlockHeaderAttestation(358391)

用这种方式表示时间戳的一大优点是:不管时间戳是怎么创建的,只要能提出开放式时间戳协议支持的有效提交操作列表,就可以创建与开放式时间戳兼容的任意验证程序均可验证的时间戳。

3.3.1 时间戳操作树

另外,时间戳不仅仅是线性的操作列表,还可以是树形的一系列操作。树根为消息本身,树杈是提交操作,树叶是证明。后边讨论日历时,会用到这种操作树的功能概念。未来,操作树将允许单个消息加上多个公证人的时间戳。 好比,可以同时使用比特币和Litecoin等多条工作量证明的区块链,或者同时使用传统的RFC-3161时间戳和证书透明度服务器等提供不同信任模型和准确性保障系统。

未完待续。

https://petertodd.org/2016/opentimestamps-announcement

相关文章

网友评论

    本文标题:开放式时间戳:可扩展、信任最小的分布式比特币时间戳(上)

    本文链接:https://www.haomeiwen.com/subject/nxwubftx.html