区块链到底是什么?

区块链学习笔记

所有的所有开始于2008年一个陌生人发布的白皮书,名为“比特币:一个点对点的电子现金系统”,这奠定了区块链的基础。

1. 什么是双重花费?

比如说小明要支付给小王1元,

如果是物理现金交易,那么在交易完成后,小明就不会再拥有那一块钱;

如果是数字货币交易,那么问题就会变得复杂,数字货币是以数字形式存在的,并且可以被轻易复制。举例,如果小明给小王发送价值1元的数字文件,小王不确定小明是否删除了文件副本。如果小明还保留着价值1元的数字文件,那么小明可以选择把相同的文件发送给小红。这个问题称为双重花费。

解决双重花费问题,

一种方法是,在小明、小王以及网络上其他参与者之间,设置一个第三方的信任机构(比如银行)。这个第三方负责管理一个总账,跟踪并验证网络中的所有交易。这个解决方法的缺点是,要想系统正常工作,必须要有一个第三方作为中心。

2. 比特币:解决双重花费问题的一种去中心化的方案

为了解决双重花费问题,假设一个公共账本,比特币的区块链记录网络上所有的的交易信息。比特币的区块链有以下特点:

  • 分布式:账本被复制到许多计算机上,而不是存储在中心服务器上。任何可以上网的电脑都可以下载完整的区块链。
  • 加密:加密技术用于保证发送者拥有她想发送的比特币,并决定如何将交易添加到区块链上。
  • 不可变:区块链仅以追加方式更改。换句话说,交易只能被添加到区块链上,无法被删除或更改。
  • 使用工作证明(PoW):网络中有一种特殊类型的参与者,称为“矿工”(miners),他们在搜索一个密码谜题的答案时展开竞争,这个谜题将允许他们向比特币的区块链中添加一块交易。这个过程称为工作证明,它允许系统是安全的(后面会详细介绍)。

发送比特币过程如下:

  • 步骤1:创建一个比特币钱包。对于一个人想发送或收取比特币,她需要创建一个比特币钱包。一个比特币钱包包含两条信息:一个公钥和一个私钥。私钥是一串加密数字,私钥允许所有者可以发送比特币到其他账户,或者在接受比特币作为交易方式的服务上花费比特币。公钥是接收比特币所需的一串数字。公钥也被称为比特币地址(不完全准确,但是为了简化,假设公钥和比特币地址是一样的)。注意一点,钱包本身不存储比特币。比特币余额的信息都被存储在比特币区块链上。
  • 步骤2:创建一个比特币交易。如果小明要发送给小王1元,小明需要使用私钥连接到他的比特币钱包,创建一个交易,交易包含他想发送的比特币数量和他想发送到的地址(这里是小王的地址)。
  • 步骤3:通过比特币网络传播交易信息。一旦小明创建了比特币交易,他需要通过整个比特币网络传播交易信息。
  • 步骤4:确认交易。一名矿工监听比特币网络,使用小明的公钥对交易进行验证,确认小明的账户中是否有足够的比特币,并且添加一个新的记录(包含交易的细节)到比特币区块链。
  • 步骤5:向所有矿工广播区块链的更改。一旦交易被确认,矿工应该向所有矿工广播区块链的更改,以确保他们的区块链副本都是同步的。
3. 公钥加密

公钥加密,或非对称加密,是使用成对密钥的任一加密系统:公钥可以被广泛传播,私钥只能被拥有者知道。这实现了两个共能:身份验证,公钥验证私钥持有者发送信息的地方,加密,只有配对的私钥持有者可以解密公钥的加密信息。

RSA和椭圆曲线数字签名(ECDSA)是目前最流行的公钥密码算法。

就比特币而言,ECDSA算法用于生成比特币钱包。比特币使用多种密钥和地址,但是为了简单起见,我们将在这篇博客文章中假设每个比特币钱包都有一对私有/公共密钥,并且比特币地址是钱包的公共密钥。

为了发送或收到比特币,用户首先生成一个钱包,钱包包含一对私钥和密钥。如果小明要向给小王发送一些比特币,小明创建一个交易,输入他和小王的公钥,以及想要发送的比特币数量。接下来,小明使用他的密钥签名交易。区块链上的计算机使用小明的公钥验证交易的真实性,并将交易信息添加到一个块中,这个块稍后会添加到区块链上。

4. 哈希函数和挖矿

所有的比特币交易都在一个名为块的文件中。每十分钟,比特币添加一个新的交易块。一旦一个新块添加到区块链上,那么就称为不可变的,不能被删除或修改。一群名为矿工的参与者负责创建新的交易块。一个矿工必须使用发送方的公钥验证每一个交易,确保对于请求的交易发送方有足够的余额,并将交易信息添加到块。矿工们可以完全自由地选择在区块中包含哪些交易,因此发送者需要包含一笔交易费,以激励矿工们将交易加到区块中。

对于一个被区块链接受的块,它需要被挖掘。为了挖掘块,矿工需要找到一个非常罕见的解决方案解决加密的难题。如果一个被挖掘的块被区块链接受,矿工会收到比特币奖励,这些比特币是交易费用的额外激励。挖矿过程也被称为工作量证明(PoW),它是保证使区块链不可靠或者安全的主要机制。

5. 哈希和区块链加密难题

要想理解区块链的加密难题,我们需要从哈希函数开始。

哈希函数是一个可以将任意大小的数据映射为固定大小的数据的函数。哈希函数返回的值称为哈希值。哈希函数通常用来通过检测重复的记录来加速数据库的查找,也在密码学中也有广泛应用。

一个密码散列函数可以很容易的验证某些输入数据映射到给定的散列值,但是如果输入数据未知,通过知道存储的散列值来重构它是非常困难的。

比特币使用一种名为SHA-256的加密散列函数。SHA-256应用于区块数据(比特币交易)和一个名为nonce的数字的组合。通过改变块数据或nonce,我们得到了完全不同的hash值。要使块被认为是有效的或已挖掘的,块的哈希值和nonce需要满足一定的条件。例如,hash的四位前导数字需要等于“0000“。我们可以通过制定更复杂的条件来增加挖矿的复杂性,例如我们可以增加hash值前导数字0的个数。

矿工们需要解决的加密难题是找到一个nonce值,这个值使得哈希值满足挖矿的条件。可以使用下面的应用模仿块挖掘。当你键入”data“框或者改变nonce的值时,你可以注意到哈希值的改变。当点击挖矿的按钮时,程序以nonce=0开始,计算哈希值,检查哈希值的前四位是否为”0000“。如果前四位不是”0000“,它将nonce增加1,并重复整个过程,直到找到一个nonce值满足条件。如果块被认为是开采的,背景颜色变成绿色。

6. 从区块到区块链

如上所述,交易信息被分到块,块被附加到区块链上。为了创建区块链,每一个新块使用前一个块的hash值作为它的数据的一部分。要创建一个新块,矿工选择一组交易信息,添加到之前的块的hash值,并以前一个块相似的方式挖掘该块。

任何区块的任何数据变动都会影响到其后所有块的hash值,并且这些hash值将会变得无效。这赋予了区块链不可变的特性。

你可以使用下面的程序来模拟三个块的区块链,当你键入”data“框或者改变nonce的值,你可以注意到hash值和”Prev“值的改变。你可以通过点击每个个体的Mine按钮,来模拟挖矿过程。在挖掘了三个块之后,尝试改变块1或块2的数据,你可以注意到其后所有的块变得无效。

7. 将块添加到区块链上

在比特币网络上的所有矿工相互竞争,找到一个有效的区块,该区块将被添加到区块链,并从网络获得奖励。找到一个nonce来验证一个块是很少见的,但是由于矿工的数量,网络中矿工验证一个块的概率是非常高的。第一个提交有效块的矿工将把他的块添加到区块链中,并获得比特币奖励。但是如果同一时间由两个或多个提交他们的块会发生什么问题呢?

解决冲突

如果2个矿商几乎同时解决一个块,那么我们将在网络中有2个不同的块链,我们需要等待下一个块来解决冲突。一些矿商将决定在区块链1上采矿,而另一些矿商将在区块链2上采矿。第一个找到新块的矿工解决了冲突。如果在区块链1新的块被开采,区块链2变得无效,区块链1的矿工将会得到前一个块的奖励,属于区块链2的且没有添加到区块链的交易,会回到交易池,并添加到下一个块中。

简而言之,如果区块链上有冲突,那么最长的链就是赢家。

8. 区块链和双重交易

在本节中,我们将介绍对区块链执行双重花费攻击的最流行的方法,以及用户应该采取哪些措施来防止这些攻击造成的损害。

种族攻击

攻击者将同一枚硬币快速连续地发送到两个不同的地址。为了防止这种攻击,建议在接受付款之前至少等待1个块确认。

Finney攻击

攻击者利用交易信息预先挖掘一个块,并在释放该块之前在第二个交易中使用相同的硬币。在此场景中,将不验证第二个事务。为了防止这种攻击,建议在接受付款之前至少等待6个块确认。

51%攻击

在这次攻击中,攻击者拥有网络计算能力的51%。攻击者首先进行一个交易,这个交易被广播到整个网络,然后挖掘一个私有区块链,在这个私有区块链中,他重复使用前一个交易的硬币。由于攻击者拥有大部分计算能力,因此可以保证他在某个时候拥有比“诚实”网络更长的链。他可以发布他的更长的区块链来代替“诚实的”区块链,并取消原来的交易。这种攻击是非常不可能的,因为它在像比特币这样的区块链网络中非常昂贵。

9. 用python实现区块链

在这一部分,我们将用python实现基本的区块链和一个区块链客户端。我们的区块将会有以下特点:

  • 可向区块链添加多个节点
  • 工作量证明(PoW)
  • 简单解决节点之间冲突
  • RAS加密交易

我们的区块链客户端将有以下特点:

  • 基于公钥/私钥加密生成钱包(基于RAS算法)
  • 使用RSA加密生成交易

我们也将实现两个面板:

  • 矿工的区块链前端
  • 区块链客户端,面上用户的,可以生成钱包,发送硬币

注意,本实现只是起教育的目的,不应该用于生产,因为没有足够的安全性,没有很好的弹性,缺乏很多重要的特性。

9.1 区块链客户端的实现

使用的是flask框架,8080端口。

顶部导航栏有三个标签:

  • Wallet Generator:使用RAS加密算法生成钱包
  • Make Transaction:生成交易,并将其发送到每个节点
  • View Transactions:查看区块链上的所有交易

为了进行交易或者查看交易,需要最少有一个区块链节点运行。

下面对block_client.py中最重要的部分进行解释。

我们定义了一个名为 Transaction 的python类,有四个参数sender_addresssender_private_keyrecipient_addressvalue

这是发送者想创建一个交易所需要的四个信息。

to_dict()方法返回的是python字典类型的交易信息(不包含私钥)。

sign_transaction() 方法,获取交易信息,并使用发送方的私钥对其签名。

class Transaction:

    def __init__(self, sender_address, sender_private_key, recipient_address, value):
        self.sender_address = sender_address
        self.sender_private_key = sender_private_key
        self.recipient_address = recipient_address
        self.value = value

    def __getattr__(self, attr):
        return self.data[attr]

    def to_dict(self):
        return OrderedDict({
   'sender_address': self.sender_address,
                            'recipient_address': self.recipient_address,
                            'value': self.value})

    def sign_transaction(self):
        """
        Sign transaction with private key
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值