Blockchain学习笔记——简单入门篇

0x01 Intro

区块链(blockchain)是一个不可篡改的,分布式,去中心化账本,没有谁是账本的主人,因为人人都是账本的主人,大家的账本写的东西都一模一样,记着大家所有人的资产信息。(这大概是我们对它的基本认知)

区块链里,每一个区块里放的是一堆交易记录(即账),记账时会把上一个区块中的信息(交易序号,记账(交易)时间,交易记录)作为原始信息,hash之后的值与本次的账页信息结合在一起,就成了一个区块(这个数据结构类似于链表——简单地说,既能够存储来自上一个节点的数据,也能够连接下一个节点)。

依此类推,下一个块记录了上一个块的hash信息,因此在链变得相当长的时候,想要对其进行篡改就变得十分困难。

可以认为,不可篡改性由hash值、链长度、全网算力所保证。

我们看一个区块的示例:
在这里插入图片描述从上到下的框分别为:

  • 本块的哈希值
  • 本块的出生时间
  • 高度(从创世以来第几个块)
  • 随机数
  • 打包这个块的奖励(6.25btc)

0x02 比特币运行概述

首先:货币具有:

  • 价值尺度(货币是表现价值的材料)
  • 流通手段(多少货币量合适?纸币作为货币符号的产生)
  • 贮藏手段(出售商品是为了用货币形式代替商品形式而非购买商品,货币硬化为储藏货币)
  • 支付手段
  • 世界货币

等等属性。

在货币由贝壳、贵金属向纸币演化的过程中,其仍然具有价值尺度和流通手段职能的原因是由政府强制发行,并且由政府信用背书。

银行的存在原因则是提供一个可信赖的记账(维护)机制。

然而,货币之所以成货币,主要是有人认可其价值尺度的职能,政府的背书和强制发行不过是为了做普遍推广,进而强化统治和管理。

这里,政府和银行相当于中心化的认证和维护组织。

而区块链-比特币不需要类似政府和银行的中央信任机构,就可以通过全球P2P网络进行发行和流通,这一点听上去有点不可思议,但比特币正是一种通过密码学理论建立的不可伪造的货币系统。

你可以通过它向世界上任何人汇款,而无需中央机构来发行帐户或处理付款。

比如传统的金融汇款需要双方使用同平台的账户,所有的交易由平台的系统来控制。e.g. 支付宝和微信支付。

比特币通过技术手段实现了去中心化,解决了现金电子化以后交易的清结算问题。

0x03 P2P

P2P一般被称为点对点网络或者对等网络。在P2P网络环境中,彼此连接的多台计算机之间都处于对等的地位,各台计算机有相同的功能,无主从之分,一台计算机既可作为服务器,也可以作为工作站。这和传统的Client/Server模式很不一样。

特点

  • 直接交互
    P2P就是直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。
  • 去中心化
    P2P另一个重要特点是改变互联网现在的以太网站为中心的状态、重返“非中心化”,并把权力交还给用户。
  • 性能拓展
    对等网络是对分布式概念的成功拓展,它将传统方式下的服务器负担分配到网络中的每一节点上,每一节点都将承担有限的存储与计算任务,加入到网络中的节点越多,节点贡献的资源也就越多,其服务质量也就越高。
  • 鲁棒性
    P2P架构天生具有耐攻击、高容错的优点。由于服务是分散在各个节点之间进行的,部分节点或网络遭到破坏对其它部分的影响很小。P2P网络一般在部分节点失效时能够自动调整整体拓扑(节点的排列方式),保持其它节点的连通性。P2P网络通常都是以自组织的方式建立起来的,并允许节点自由地加入和离开。
  • 隐私保护
    在P2P中,所有参与者都可以提供中继转发的功能,因而提高了匿名通讯的灵活性和可靠性,能够为用户提供更好的隐私保护。

0x04 数字签名

不对称加密、数字签名的技术原理可以从任何一本计算机网络教科书中找到。

这里我们只简述一下原理:

我如何证明一个文件是我写的:我先对文件算一个Hash值,然后用我的私钥加密这个哈希生成数字签名,然后别人用我的公钥解开之,再把原文件做一个哈希,两个哈希值相比对就知道这个文件是不是我写的了。

不对整个文件直接哈希的原因是不对称加密的开销太大了。

区块链的实际记录中,是用私钥对交易数据(transaction data)做数字签名,并且放在记录后面。

签名和交易必须匹配,不然会被拒绝。

0x05 块

每一笔交易都会经过P2P网络被广播给矿工们。

然后,矿工把这些交易打包,放入候选块(candidate block)中,接着把候选块添加到区块链中。

这个候选块中除了交易数据以外,还会有一些元数据,例如块头(block header),包括是版本、上一个区块的信息、交易数、时间戳、目标值。

元数据:我们如果把块当成windows里的一个文件的话,元数据就是这个文件的属性。

元数据包括:

  • version:协议类型
  • last block:上一个块的标识(哈希)
  • merkle root:对本块的哈希,确保它无法被更改
  • time:时间戳
  • target:目标值,和挖矿有关,根据全网算力进行调整
  • nonce:一个整数,后面会说

0x06 如何将候选块放到区块链中?

还记得我们的第一张图吗?那张图中的nonce也是一个元数据,矿工的目标是:改变这个nonce的值,确保整个区块的哈希值的前m个二进制位是0。这个m在不同的时间会有不同的选取方法。随着时间的发展,算力会不断提升,矿工会不断入场,m肯定会越来越大。调整m的目的在于使得区块产生的平均时长大约为10min。原因会在后文“最长链原则”相关内容中给出。

哈希函数是高度离散的函数,离散到我们可以认为它的结果的每一个二进制位都是服从0-1分布,即可以看作对随机输入产生随机输出。因此,前m位每一位为0的概率可以认为是近似独立的。

一旦找到满足条件的nonce,就可以近似地认为这个块打包完成,添加到区块链上了。

0x07 Nodes

节点是运行着比特币程序的计算机,它连接着其他运行着相同程序的计算机,形成网络(network)。所以在运行程序时,它将连接到其他节点并开始下载区块的完整副本(包含所有已验证交易的文件)。之后,程序将开始从其他节点接收交易并在网络上中继给其他节点。

这里的node说的不是用户,倒像是矿工,因为比特币用户似乎只负责写交易记录,而矿工会收集和广播交易…

节点的作用有三个:

  • 遵循规则
    只有交易的所有信息都正确无误时,交易才会被储存并中继到其他的块。(比如转账的人的账户的余额必须大于花费数才能被认证)
  • 传递信息
    包括两类:一,刚进入的未确认的交易。二、已确认的交易,信息公开可查
  • 确认并且保存交易的副本
    每个节点都有一个用于储存交易信息的副本,如果它是最新的,那么它就会被分享出去。每个节点会信息共享,让每个节点都有最新的数据。

因此,比特币网络被称为P2P网络。

0x08 挖矿

挖矿:把交易添加到区块链的过程

每个节点都会共享新的交易信息,它们会被暂时储存在交易池中。

挖矿的过程就是确认交易完成的过程。详见0x06。

对了,那个不停试错的过程叫做工作量证明。

那为什么挖矿的过程是必须的呢?

因为这是让之前的交易尘埃落定的手段,是数字货币用于防止欺诈的方法。

在这里插入图片描述
举例:张三投机取巧,在A区用10块钱买了啤酒,然后马上在B区用这个10块钱买披萨(double-spending).因为还没有完成记录和广播,所以这个钱似乎可以复用(x

为了防止这样的欺骗(fraud),张三必须先买啤酒,确认后再买披萨。否则由于节点确认的规则,二者都会被拒绝成立。

也就是说,区块链不允许一个用户同时存在没有被记到块里的两个记录。

0x09 交易(Transactions)

交易是区块链的核心概念之一。一条交易记录了钱数、发送者的公钥、接收者的公钥。

这里的公钥可以理解为地址address,是全局唯一的。

在这里插入图片描述交易的信息就像上图一样变成了一个字符串,然后被广播到矿工的P2P网络中。

0x0a 交易的过程

我们平时花钱和这个不一样,每次转账之后,余额都会立马减少。

比特币不一样,每笔交易分别存储,需要的时候再把它们整合。

在这里插入图片描述
但是如果凑不出这么巧的组合怎么办?

在这里插入图片描述
比特币的解决办法是让剩下的部分左手倒腾到右手

此外,为了真正确保这个交易由address1发起,由address2接收,钱数还是那么多,address1总共需要对信息做下列处理:

  • 生成一条交易记录
  • 对交易记录做哈希,然后对哈希值用自己的私钥做签名
  • 再用address2的公钥对哈希值做签名

原理如下:

  • address1用自己的私钥对交易签名加密得到i,确保信息是address1写的
  • 用address2的公钥再对交易签名加密得到j,确保钱是给address2的

这样一来,全网的任何人都可以解密i确定它的真实性,而只有address2可以通过解密j花这笔钱。

总的流程图大概如下:
在这里插入图片描述

0x0b 求解难度

网络的平均块时间是在n个块数后评估的,如果大于预期块时间,则工作证明算法的难度会降低,如果小于预期块时间,则难度会增加。比特币以10min为标准,并且每隔2016个区块(即大约每2周)重新评估一次难度级别。

我们记起始区块的难度为1。为了保持相对稳定,每次调整的范围在原来的1/4到4倍。

(到了20年7月的难度大约是17345亿…

0x0c 最长链原则

为了让区块链能拓展下去(挖矿),需要让刚产生的区块广播到网络中的其他节点,避免重复无用的挖矿造成资源浪费和标准混乱。

因此,如果生成区块难度太小的话,块的出现速度太高,就可能会出现两个人同时挖完的情况,即出现竞争链。此时,我们需要链重组。只有一条链能够保留,其余全部作废。重组之后,矿工就能集中算力来做有用功了。

最长链的判断标准是工作量。一般而言拥有更多的区块的链工作量越大,但是每一条链的工作量是这条链的每个区块计算难度的和。

由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。

如何保持最长链并剪去短链?

假设O后面接着A和B两个区块,则在时间线上下一个生成的区块C必然会接到A或者B上(这样的结果可能是后面有两群矿工在拼算力)。假设一群矿工算出来了C接在A上,则A-C就自动成为最长链

形成的区块最先建立在哪一个区块上,它就会被确认为最长链的一部分。例如下图中的绿色区块。下图中的蓝色区块则会被拆掉,交易记录被重新放在交易池中等待被重新记录上链。

在这里插入图片描述

由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。

区块确认
修改已经被确认的块有且仅有一个可能:从创世节点开始再造一条。而这样的做法就需要修改者拥有全网一半以上的算力,才能从头造块,追上此前的区块链并且取而代之。

采用最长链,会让每一个块变得不可代替,进而保护的一致的、真是的分布式账本。如果有人想覆盖某一个交易,那么他需要重新建立最长链,但是不仅区块的高度已经非常大了,而且还有非常多的矿工在延申最长链,单个算力是几乎不可能完成的。即使是巨大算力的攻击,也需要付出高昂的代价。

0x0d 奖励机制

在实际的交易中,每一笔交易会被扣除一些手续费,作为矿工奖励的一部分。

0x0e 参考文献传送门

https://www.liaoxuefeng.com/wiki/1207298049439968

https://learnblockchain.cn/

(本人小白,整理的内容难免有错误,还请捉到bug的dalao们在评论区批评指正

猜你喜欢

转载自blog.csdn.net/weixin_43466027/article/details/116052759