【课程笔记】比特币和数字货币技术[Bitcoin and Cryptocurrency Technologies] week1

源地址(可能要FQ):https://www.coursera.org/learn/cryptocurrency/home/welcome  

 

1.1 Cryptographic Hash Functions

Hash functions 就是输入一段数据(可以是字符串、文件等),输出一个定长的字符串。(64位、256位等)

Hash functions 三大安全属性(Security properties):1.collision-free(无冲突)2.hiding(隐蔽性,hash不可逆)3.puzzle-friendly

 

1.collision-free(无冲突): 如果 x != y,那么H(x) != H(y),或者说没有人能找到如果 x != y,使H(x) == H(y),(也可能是找到的代价太高太高)

2.Hiding:给你一个H(x),你无法得到x是多少。

这是因为hash函数是不可逆的,为什么不可逆,归根结底的原因是它不是一个单射函数。(不同的输出可能输出相同的结果,当这种情况发生了,称为Hash collision,这种情况是有可能的,但是你没办法找到,或者超级难找到)。 

 3.pulzzle-friendly:对于一个输出y,只要k在一个范围内非常均匀的被选取,那么就无法找到x,使得H(k|x) = y。

  

min-entropy(高阶最小熵):我查了相关概念,这里主要表达的意思,即使这个k是非常均匀的被选取的,比如在2的256次方这个数里,这么大的数,每个数字被选上的概率都是相等的。

然后如果k均匀地选取的,那么给你y,如果你想找到x,只要一个一个试x的值,看看H(k|x)等不等于y或者是落入一个集合Y,除此之外,没有更好的方法。

为什么k均匀的选取,x就只有一个一个试这样一个方法了,这里视频也没有讲清楚,但结论就是这样,记住就好了。

第三个属性和第二个属性好像有点类似,区别好像就在于第三条的Y可以是一个集合,是一个范围,一个hash results。

 1.1的最后又举了一个应用的实例,如下图,这里的Message很长,所有就先切分成n段,每一段都是512bits的长度,最后一段如果不够,可以添上zero bits让它够512bits。IV视频只说是一个从标准文档里得到的256bits的东西,这个东西加上512bits的Message块1,得到一个768bits的数据,这个数据进到c这个函数里,输出一个256bits的数据,这个数据再和后面的512bits的Message块2一起进到下一个函数,以此类推,一直到最后得到一个256bits的数据,这个就是整个Hash functions的最后的输出结果。

 

 

1.2 Hash Pointers and DataStructures

 

Hash Pointer 可以让我们retrieve the information, 还可以verify information hasn't changed。

用这样一个hash pointer去组建各种数据结构。比如说用它组成的类似链表的结构,我们叫他block chain

 hash pointer就可以帮助我们检测到是否有人试图篡改数据内容,比如下图

当有人想要修改图中左边第一个数据块中的内容时,它右边的那个数据块就可以检测到前面这个数据块hash的值和它之前存储的值不一样,所以入侵者如果想要不被发现,就必须顺带把第二个数据块的hash后的值修改,这就又影响了第二个数据块,所以第三个数据块又能检测到第二个数据块的hash后的内容和它之前存储的不同。所以入侵者又必须继续修改第三个数据块的hash值。这时候它就不得不暴露了,因为已经到头了,它没法篡改头指针的内容,这个头指针的内容是我们掌握的,一旦修改我们就会立刻发现有人篡改。[这就是为什么hash pointer 可以防篡改的原因,我只要掌握了头指针的内容就可以,而且还可以根据这些回溯到最开始被篡改的地方是在哪一块]

另外一个数据结构:Merkle tree

关于这个Merkle tree,网上的资料有很多。

它和上面那个结构一样,你只需要掌握root的hash值就可以保证整个数据没有被篡改,和上面的线性结构相比。它的最大好处是:因为是树形结构,可以用log(n)的时间去verify,或者用log(n)的时间去定位哪里发生了信息篡改。

 

总结:

普通指针 - 链表                    普通指针 - 二叉树

hash指针 - block chain       hash指针 - Merkle tree

 

 1.3Digital Signatures

数字签名, 和手写签名很像,只有你能签名,但是所有人都能验证。

 如何实现:

3个操作,

1生成密钥:密钥生成器生成一个sk(私钥)(你用来签名的)和一个pk(公钥)(其他人用来验证)、

2签名:你用sk和一些Message一起生成一个签名。

3验证:其他人用pk,Message和带验证的签名来验证,验证结果就是简单的yes or no

数字签名必须做到:1有效的验证,2不会被别人伪造你的签名

怎么保证前面不会被伪造呢?下面是一个测试你的签名是否具有不被伪造的特性的方法。

和可能的攻击者玩一个游戏,在这个游戏中,攻击者可以发任意多次message给挑战者(签名拥有者),让签名者给他签好的名,攻击者通过研究这些message和签名来试图掌握伪造签名的方法。最后攻击者发送一个message和一个他伪造的签名,让挑战者去验证,如果验证成功,说明攻击者成功的伪造了签名。

 

我们可以用Hash(message)而不是message因为Hash(message)只有256bits,但是message可能很大。

 

最后视频说比特币用的是叫ECDSA(Elliptic CurveDigitalSignatureAlogorithm)的数字签名scheme,讲课的老师说这东西依赖hairy math,他相信你不会去想知道其中的细节的:)不过你还是可以去看它的细节,如果你感兴趣

 

好的随机性是必须的,ECDSA就做到了这一点。如果做不到这一点,很有可能就会泄漏你的sk。

这里的随机性应该是只生成私钥和公钥时候用到的,签名的时候似乎也会用到这样的随机性。

 

 1.4 Public Keys as Identities

这一篇看得不是很懂,好像是说把pk(公钥)当作一个人,一个动作,或者一个系统的ID(identity)。

如果你用一个公钥验证了一个人的签名和信息(sign&message),你看成是:这个公钥说了这段信息。

如果你想要一个新的ID,你就生成一对新的公钥、私钥对。

视频说这就带来了一个idea,来decentralize(去中心化)。

每个人都一个在任何时间创造出任何多的identity,整个系统是去中心划的。

这种identities在比特币中的术语叫addresses.

address在比特币或者其他数字货币中的意思就是一个pk,或pk的哈希。

后面讨论了这种形式的private(私有性)

 

首先,它看起来是私密的,你可以在家里创造它,没人知道这个随机的pk和现实中的谁联系起来。

但是,如果你经常用这个identity做一系列的动作,别人就可能通过这个猜到你是谁。比如joe经常做这一系列动作,而这个identity也经常做这一系列动作,所以这个identity可能是joe?

这是一个数字货币(like比特币)都要面对的问题,视频说不想剧透,后面会说。。。

 

 1.5 A Simple Cryptocurrency

这一篇讨论了假设的两个非常简单的数字货币:GoofyCoin和ScroogeCoin

GoofyCoin

rule1:Goofy可以创造新的coin,多少都可以,他创造的coin都属于他

 rule2: 拥有coin的人可以通过签名把货币给别人,得到货币的人通过给他的人的签名证明它现在才是coin的拥有者。

现在问题来了

Alice从Goofy那里拿到coin后,她创造了两个数据结构,第一个显示她了Bob,第二个显示她给了Chuck,这两个数据结构上都有她的签名,Chuck不知道Alice已经给了Bob,所以Bob和Chuck都声称他们拥有这部分coin。这个叫做double-spending attack,像是一个人拿一份钱同时在京东和淘宝上都买了东西,显然这是不应该的,所以GoofyCoin是不安全的,它没有解决double-spending attack。

ScroogeCoin:

ScroogeCoin和GoofyCoin是类似的,只不过它是解决了double-spending attack的。

这就是之前说到的Block chain 数据结构,Scrooge拿到头指针并且签名,其他所有人都可以验证,每一个块会记录一笔交易的记录。视频里说到这里只是方便讲解,事实上每一块会记录多笔交易记录,比特币就是这样。

这样做的目的就是检测到double-spending,如果Alice打算把coin给Bob,然后Alice又打算造一个block上面显示她把钱给Chuck了,但是这时候Chuck就会发现不对劲,因为他可以看到交易记录里写的,他已经把coin给Bob了,事实上所有人都可以看到Alice把coin给Bob这个记录。所以当Alice这么做的时候,大家都能看到这是一个double-spending,就会拒绝这个操作。Scrooge也会拒绝。

在Scrooge中有两种transaction,第一个是CreateCoins,就和GoofyCoin一样,Scrooge创造新coin,这里稍微不同的是,Scrooge可以创造的币如下表格,第一列就是一个普通的序列,第二列代表这个新coin是标准币的几倍的价值,第三列代表这个币刚创造的时候谁会得到它。每个新coin都会有个ID,just like 73(0),

 下图就是第二种transaction,当满足右边红色的四条后,Scrooge就会认为它是有效的,然后把它写进Block chain 历史记录里,每个人都会看到。

最后,这些coin都是永久不变的,不会被分成小的,也不会组成大的。但是可以用一些方法做出这样的效果,比如消耗一部分value小的coin,然后再创造一个value大的coin,就相当于是combie了coin了。

  

ScroogeCoin解决了double-spending attack,但是问题是如果大家不信任Scrooge,或者Scrooge不尽职怎么办?

我们可以去掉Scrooge来完成这些吗?也就是说我们可以区中心化吗(Scrooge就是中心)?

问题的关键是如何做到Scrooge提供的那些保证,但是用一种decentralize的方法。

具体怎么做,视频说他后面的课程会说,他希望你继续看这门课程。

 

posted @ 2018-03-24 17:19  wmxl  阅读(528)  评论(0编辑  收藏  举报