【课程笔记】比特币和数字货币技术[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的方法。
具体怎么做,视频说他后面的课程会说,他希望你继续看这门课程。
【课程笔记】比特币和数字货币技术[Bitcoin and Cryptocurrency Technologies] week1的更多相关文章
- [转帖]央行推出数字货币DCEP:基于区块链技术、将取代现钞
央行推出数字货币DCEP:基于区块链技术.将取代现钞 天天快报的内容. 密码财经 2019-10-29 18:15 关注 前不久的10月23日,Facebook的首席执行官扎克伯格在美国国会听证会 ...
- [转帖]都在说DCEP,央行数字货币究竟跟你有什么关系?
都在说DCEP,央行数字货币究竟跟你有什么关系? https://kuaibao.qq.com/s/20191104A0G1D300?refer=spider 黄奇帆指出,DCEP 使得交易环节对 ...
- 五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain
AToken数字货币钱包 超容易上手支持五大主流币种 互联网 | 编辑: 王静涛 2017-12-28 09:58:33转载 国家监管部门已叫停数字货币交易,包括火币网.比特币中国.OKC ...
- 免费开源数字货币交易所——基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所
本项目是基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎.本项目基于SpringCloud微服务开发,可用来搭建和二次开发数字货币 ...
- [币严区块链]数字货币交易所之比特币(BTC)钱包对接 | 自建节点JSON-RPC访问
BTC钱包对接流程 一. 部署BTC钱包节点 二. 分析BTC钱包的API 三. 通过JSON-RPC访问BTC钱包API 四. 部署测试 一.部署钱包节点 交易平台对接BTC之前,要 ...
- [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)
在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...
- 神经网络与数字货币量化交易系列(1)——LSTM预测比特币价格
首发地址:https://www.fmz.com/digest-topic/4035 1.简单介绍 深度神经网络这些年越来越热门,在很多领域解决了过去无法解决的难题,体现了强大的能力.在时间序列的预测 ...
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技 ...
- 数字货币比特币以太坊买卖五档行情数据API接口
数字货币比特币以太坊买卖五档行情数据API接口 数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...
随机推荐
- failed to allocate for range 0: no IP addresses available in range set: 172.20.xx.1-172.20.xx.254
今天遇到一个机器上的Pod 在创建以后一直处于Init 0/1的状态,进到这个节点查看其kubelet的状态,发现果然有问题 systemctl status kubelet .go:] Contai ...
- [转]Visual Studio调试之符号文件
http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html 前面在不能设置断点的检查步骤和Visual Studio调试之断点进阶 ...
- HDU-2448 Mining Station on the Sea
先根据不同的起点跑最短路,记录距离,从而建立二分图求最小匹配. 一开始我求最短路的时候我把港口直接加到图中,然后发现进了港口就不能出来了,所以连接港口的边就要从双向边改成单向边…………这也搞得我n和m ...
- [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)
Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...
- django获取前端有multiple属性的select的多选项
author_list = request.POST.getlist('author_list') ###
- 添加gitlab远程账号 使用注意事项
gitlab上面使用的密钥有两种,一种是Deploy keys 这种密钥是只读的,添加了之后,相应设备只拥有clone的权限,不被允许进行push操作.(在相应的库里面的设置里面添加) 还有一种是 S ...
- Codeforces Gym101502 F.Building Numbers-前缀和
F. Building Numbers time limit per test 3.0 s memory limit per test 256 MB input standard input ou ...
- SPOJ LIS2 - Another Longest Increasing Subsequence Problem(CDQ分治优化DP)
题目链接 LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #i ...
- bzero和memset
一. bzero和memset函数 1. bzero已不建议使用 原型:extern void bzero(void *s, int n); 2.memset void *memset(void *s ...
- Codeforces Gym 100203H Highways 最小生成树
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 给你平面上若干点,生成一颗完全图,让 ...