zoukankan      html  css  js  c++  java
  • 区块链: 技术驱动金融

    来源:《区块链:技术驱动金融》[美]阿尔文德-纳拉亚南   纳什-贝努   爱德华-费尔顿   安德鲁-米勒   史蒂文-戈徳费德 著   林华  王勇  师初  蔡凯龙  许余洁 李耀光  高晓婧  洪浩 译

    后续章节笔记将省略该说明。

    1.1 密码学哈希函数

        一般性的哈希函数(hash function)具有以下三个特性:

    • 输入为任意大小的字符串。
    • 输出为固定大小的字符串。
    • 可进行有效计算,即输入n位字符串,哈希计算的时间复杂度为O(n)

        加密哈希函数除了具备上述基本特性之外,还需要具备以下三个密码学特性:

    • 碰撞阻力(collision-resistence)。对于不同的输入,几乎不可能得到相同的输出,换句话说,要想找到两个不同的输入使得映射后的输出相同,在计算上是不可能的。
    • 隐秘性(hiding)。给定哈希函数的输出,通过简单的随机选择来确定输入是不可行的。
    • 谜题友好(puzzle-friendliness)。给定哈希函数的输出,要找正确的输入,没有比穷举法更好的办法。

        在比特币及其他领域中,最常用的一个哈希函数是安全哈希算法(Secure Hash Algorithm 256,简称SHA-256)

    1.2 哈希指针及数据结构

        哈希指针是一个指向数据存储位置及其位置数据的哈希值的指针,如下图所示:

    哈希指针

    1.2.1 哈希指针

        可以利用哈希指针来构建两个重要的数据结构:区块链(Block Chain)默克尔树(Merkle Tree)。这两个数据结构是区块链技术的基础。

    区块链

        通过哈希指针构建的链表称为区块链,如图1.2.2。在区块链中,每一个区块包含两个基本部分:区块头(Block Header)区块主体(Block)

    • 区块头包含一些基本的元数据,其中一个就是上一个区块的哈希值(即哈希指针)。
    • 区块主体包含交易(transactions)数据。

    1.2.2 区块链示意图

        区块链的一个应用就是“防篡改日志”。要理解区块链如何防篡改,我们可以看一下攻击者要怎么进行篡改才能不被发现。

        假设攻击者修改区块k的数据,那么根据哈希函数的特性,区块k的新哈希值将和区块k+1中保存的哈希值不匹配。为了使区块k的新哈希值和区块k+1中保存的哈希值匹配,只好通过继续修改区块k-1k-2,……的数据。值得注意的是,继续重复修改区块k的数据是无法使得新哈希值与k+1中保存的哈希值匹配,因为哈希函数具有碰撞阻力。

        这样,有两个方面阻碍攻击者进行数据篡改:1. 只要妥善锁定区块链头部的数据,即第一个区块,也叫创世区块,那么攻击者就无法使得区块k的新哈希值与k+1中的匹配;2. 修改k-1k-2,……的数据使得区块k的新哈希值与k+1中的匹配,在计算上将是困难的。基于这两点,没有人会愿意进行数据修改。

    默克尔树

        使用哈希指针构造的二叉树称为默克尔树,如图1.2.3

    1.2.3 默克尔树示意图

        在默克尔树中,所有数据块都被两两分组,指向这些数据的哈希指针被保存在上一层的父节点中,而父节点再次被两两分组,指向这些父节点的哈希指针将继续往上保存,直到到达树根节点,这个树根节点被称为默克尔树根

        默克尔树在防篡改上表现很好。假设攻击者想要修改默克尔树中某个区块的数据,那么就会导致这个区块的父节点哈希值不匹配,为了使之匹配,攻击者就必须修改这个区块的子节点数据,以此类推。和前述的区块链结构一样,继续修改本区块数据是难以做到哈希值匹配的,因为哈希函数具有碰撞阻力,所以,无论攻击者再怎么修改本区块的数据,也难以得到一个和父节点哈希值匹配的新区块。本质上来说,攻击者需要找一颗以这个区块为根、高度相等的子树,来替换原默克尔树中的子树。而要寻找这样的子树,在计算上是困难的。因此,没有人愿意花费这样的计算力进行数据修改并保证不被发现。

    1.3 数字签名

        数字签名(digital signatures)应该具备两个基本特性:

    • 只有你可以制作你自己的签名,但任何看到它的人都可以验证其有效性。
    • 签名只与某一特定文件关联,因此该签名不能用于表明你同意或支持另一份不同的文件。即一份文件一个签名,一一对应。直观地说,就如同别人不能从你的手写签名文件上把签名剪下来,然后贴到另一份文件的末尾,这样的签名是无效的。

        下面是通用的签名方案,由三个算法构成:

    • (sk, pk) := generateKeys(keysize)    generateKeys方法输入keysize,生成一对私钥和公钥。私钥用于签名,公钥用于验证。
    • sig := sign(sk, message)    sign方法输入sk、message,生成签名。
    • isValid := verify(pk, message, sig)    verify方法输入公钥、消息、签名,输出为真,表明签名有效;输出为假,表明签名无效。

        对于上述签名方案,要求以下两个特性有效:

    • 有效签名可以通过验证,即verify(pk, message, sign(sk, message)) == true
    • 签名不可伪造。

        显然,第一个特性是对签名有效的最基本要求。

        对于签名不可伪造,说的是,尽管对手知道你的公钥,并且看到过一些你已经签名的消息,但是对手仍然无法伪造你在新消息上的签名,因为对手还没有看到你在新消息上的签名。也就是说,对手不能根据过去已知的签名,“学习”出一种“万能”的签名,能够对你未来的消息进行有效签名

    1.4 公钥即身份

        把公钥pk认为是参与者或系统的一方,他可以用这个公钥对应的私钥来进行签名,发布声明。

        将公钥视为身份的一个结果就是,你可以随时定制任意数量的新身份,即通过数字签名方案中的generateKeys方法来生成不同的公钥和私钥对,然后用公钥代表你的身份,用私钥对消息进行签名。

    去中心化身份管理

        公钥和私钥体系,帮助我们引入去中心化的身份管理。具体而言,你无需到中央机构进行用户注册,你只需要生成一对公钥和私钥,然后用公钥代表你的身份即可。在比特币语言中,这个身份表示地址,稍有不同的是,比特币或其他加密货币中,不是直接用公钥作为地址,而是用公钥的哈希值,因为公钥有可能太长了

        去中心化身份管理具有很好的匿名性,因为你所创建的身份(公钥)具有足够的随机性。当然,如果你长期用一个身份与其他人进行交流,那这个身份的行为可能会成为别人推断你真实身份的依据,比如“天,这个人的行为很像Joe,可能这个人就是Joe”。

    1.5 两种简单的加密货币

        略(参看原书)。

  • 相关阅读:
    【Qt开发】 V4L2_CAP_VIDEO_OVERLAY与V4L2_CAP_VIDEO_CAPTURE的区别
    【Qt开发】QThread 实用技巧、误区----但文档中没有提到
    【Qt开发】QThread 实用技巧、误区----但文档中没有提到
    【Qt开发】事件循环与线程 二
    【Qt开发】事件循环与线程 二
    【Qt开发】事件循环与线程 一
    【Qt开发】事件循环与线程 一
    【Qt开发】QThread介绍
    【Qt开发】QThread介绍
    【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
  • 原文地址:https://www.cnblogs.com/li-coder/p/10166782.html
Copyright © 2011-2022 走看看