源地址(可能要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的方法。

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

【课程笔记】比特币和数字货币技术[Bitcoin and Cryptocurrency Technologies] week1的更多相关文章

  1. [转帖]央行推出数字货币DCEP:基于区块链技术、将取代现钞

    央行推出数字货币DCEP:基于区块链技术.将取代现钞 天天快报的内容. 密码财经 2019-10-29 18:15 关注   前不久的10月23日,Facebook的首席执行官扎克伯格在美国国会听证会 ...

  2. [转帖]都在说DCEP,央行数字货币究竟跟你有什么关系?

    都在说DCEP,央行数字货币究竟跟你有什么关系? https://kuaibao.qq.com/s/20191104A0G1D300?refer=spider   黄奇帆指出,DCEP 使得交易环节对 ...

  3. 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain

    AToken数字货币钱包 超容易上手支持五大主流币种   互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载     国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...

  4. 免费开源数字货币交易所——基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所

    本项目是基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎.本项目基于SpringCloud微服务开发,可用来搭建和二次开发数字货币 ...

  5. [币严区块链]数字货币交易所之比特币(BTC)钱包对接 | 自建节点JSON-RPC访问

    BTC钱包对接流程 一.   部署BTC钱包节点 二.   分析BTC钱包的API 三.   通过JSON-RPC访问BTC钱包API 四.   部署测试 一.部署钱包节点 交易平台对接BTC之前,要 ...

  6. [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)

    在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...

  7. 神经网络与数字货币量化交易系列(1)——LSTM预测比特币价格

    首发地址:https://www.fmz.com/digest-topic/4035 1.简单介绍 深度神经网络这些年越来越热门,在很多领域解决了过去无法解决的难题,体现了强大的能力.在时间序列的预测 ...

  8. 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网

    任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技 ...

  9. 数字货币比特币以太坊买卖五档行情数据API接口

    数字货币比特币以太坊买卖五档行情数据API接口       数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...

随机推荐

  1. 九度oj 题目1084:整数拆分 清华大学2010年机试题目

    题目描述: 一个整数总可以拆分为2的幂的和,例如:7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1总共有六种不 ...

  2. ssh 远程执行绝对路径命令mysqld_multi 报my_print_defaults不存在

    通过SSH直接执行远程命令(这种方式会使用Bash的non-interactive + non-login shell模式)找不到命令参考:http://ghoulich.xninja.org/201 ...

  3. 刷题总结——run(ssoj)

    题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...

  4. [转] Makefile 基础 (5) —— Makefile 使用变量

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  5. java集合四种遍历方式

    package conection; import java.util.Iterator;import java.util.LinkedList;import java.util.List; publ ...

  6. c++函数学习-关于c++函数的林林总总

    本文是我在学习c++过程中的一些思考和总结,主要是c++中关于函数的林林总总.欢迎大家批评和指正,共同学习. os version: ubuntu 12.04 LTS gcc version: gcc ...

  7. best corder MG loves gold

    MG loves gold  Accepts: 451  Submissions: 1382  Time Limit: 3000/1500 MS (Java/Others)  Memory Limit ...

  8. 15深入理解C指针之---内存释放

    一.手动申请的内存,必须及时进行内存释放,否则容易造成内存泄露.主要代码形式为: #include <stdio.h> #include <stdlib.h> int main ...

  9. 编译 Android 版本的 Opus 音频编解码库的方法

    Opus 音频编解码库是 Speex 音频编解码库的下一代版本,从编解码性能以及质量上来讲都有了长足的进步.Opus 的编译非常简单,但是官方并未给出详细的 Android 版本编译指南,查找了大量资 ...

  10. hdu3572 任务分配/最大流判断满流

    题意:将n个任务分配为m个机器,给每个任务需要的天数(无需每天连续),和可以在哪些天去做该任务,求是否存在方案. 典型的任务(X)----天(Y)二分最大流,(因为这里任务是与天的关系)处理器控制流量 ...