5

1 小时理解比特币系统

 3 years ago
source link: https://learnblockchain.cn/article/2595
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

原文链接:

1 比特币是什么&三组关键概念

1.1 为什么从比特币开始

其实,这个是学习新知识体系的方法论——「追本溯源」。

例如,我们学习数学不会直接上来就学微积分,而是推荐先看《几何原本》;

我们学习操作系统原理,最好是找到最早版本的 Linux 去阅读它的源码;

同理,我们学习区块链知识体系,也应该找到世界上第一个区块链应用最原始的状态。

很幸运的,这个世界上第一个区块链应用在最开始的时候就天生配套了一本质量非常好,严谨也是很容易读懂的教材——比特币白皮书。

我的推荐是,所有人入门区块链都应该从比特币开始。然后,比特币的学习应该从阅读比特币白皮书开始。

1.2 比特币是什么

建立在区块链基础上的世界银行

一句话来讲,比特币的本质是什么?

一家世界银行,这个银行做了两件事情:发币、记账。

和传统银行不同,这个银行的发币和记账基于区块链的特性:公开透明,历史记录不可篡改。

为什么公开透明、历史记录不可篡改的记账是一种跨时代的技术?这个我们等下细聊。

比特币是这个世界上第一个被证明成功的区块链应用

这个应用已经体现了区块链的本质:

「分布式存储」与「分布式计算」。

什么是「分布式存储」?

也就是说我们原来在一台主机上存存一份数据,这个数据可以是账本,也可以是其它的。现在我们在所有机器上同时存储同样的数据。

这样做有什么好处?一个好处是避免了只存一份数据可能导致的存储丢失的问题;另一个好处是所有数据源互相验证。那么,即使一个数据源把数据篡改了,或者是数据出现了什么问题,大家可以通过互相验证来保证数据符合规则。

举个更具体点的例子:

有一笔记账:

小明转给小张6元。

A、B、C、D四个节点都把这条数据记下了,然后A节点偷偷把数据改了,把6改成了4。那么A、B、C、D一块比较下,就会发现B、C、D三个的数据是一致的。根据多数原则,我们就选择B、C、D的数据而不选择A的数据,这就是实现了数据的不可篡改。

是不是很容易理解?

什么是「分布式计算」?

这个也很简单,就是大家一块去计算一个东西。

区块链中,分布式计算主要有两种玩法:

第一种是「抢占式」,也就是谁算得快算谁的,区块链的挖矿就是这种玩法。谁先算出了结果,谁就有记账权,也也就能拿到奖励。这个「抢占式」的分布式计算我们也之后再细聊。

第二种是「核验式」,这个也就是我们耳熟能详的智能合约。大家都来计算同一件事情。

例如,我出一道题5+1等于几。

A回答一个数,然后B、C、D三个节点核验他说得对不对。

1.3 比特币理解地图

刚才我们理清楚了比特币是什么这个最基础的问题,比特币的本质就是有「发币」和「记账」两种功能的世界银行。我从这个原点出发,梳理出了一份可以让同学们在 1 小时以内就对比特币系统有一个基础理解的「比特币理解地图」。

这个地图分为两个Level。首先,我们先忘掉比特币的分布式特性,就把它当成只有一个单一节点的记账系统。然后理解这个记账系统里最核心的两组概念:私钥、公钥与地址是一组、账本或者说链式存储是一组。

pic1.png

在理解了这两组概念之后,基础的记账系统我们就已经掌握了。然后我们再往前走一步,给这个记账系统加上分布式特性——大白话说就是是如何实现任意多的人一块记账的。只要理解了这一点,那么我们的比特币入门之旅就结束了,我们就理解了比特币系统,理解了区块链知识网络的原点。

1.4 私钥、公钥与账户的概念

首先我们来看第一组概念——私钥、公钥与账户。

私钥的本质

私钥的本质就是一串数字,这串数字非常长,如果用16进制表示的话,有64位。

私钥的关键点在于,这个私钥要足够随机,这个原则对于任何区块链系统来说都是适用的。所以有时候有人说,区块链私钥被破解了,账户里的钱被盗了。这个事情跟区块链本身的安全性是没有任何关系的,除了私钥泄漏这种情况,私钥被盗很多时候是因为这个私钥产生的时候不够随机,例如:64位全都是1。这个就跟我们把登录网站的密码设置成了123456然后账号被破解是一样的道理,跟这个网站本身是否安全是没有关系的。

然后,所有私钥的总数是10的77次方,宇宙中原子的总数是10的80次方,所以我们如果完全随机的生成私钥,那么完全不可能和别人的私钥一样。如果生成了和别人的私钥一样,那么说明的是生成私钥的方法不够随机。

从私钥到公钥

现在我们有了一串随机的数字,那么基于这个数字,我们就能生成一个对应的数字,这个数字就是公钥。

公钥具有什么样的特性?我们所要知道的有以下几点:

•私钥可以推导出公钥,反之,公钥不能推导出私钥。

•我们用私钥对任意内容进行了签名。只要我们将公钥公开,那么任何人都可以通过拿着这个公钥,验证出这个签名是否是由掌握私钥的人签署的。

需要注意的是,这两个特性都是复杂的数学原理在支撑的。但是我们在入门的时候,没有必要去搞清楚这两个特性是如何实现的,我们只要知道,公钥具备这两个特性就够了。

在这两个重要特性的基础上,我们就能构建出一个很简洁的账户体系。

首先,我们有一个可以公开的数字,那么这个数字就可以变成我们的「银行账户」。我们可以把钱打到这个账户上。如图所示,现在有一笔交易α,交易α的内容就是:从小张的公钥转给小明的公钥5元。那么如果交易α被记录在账本里,那么就相当于小明的账户收到了5元。

然后,我们还有一个和账户相对应的密码,也就是私钥。

通过这个密码,我们发出去的任何交易都会带上我们用私钥进行的签名。

如图所示,现在有一条交易β,内容是:「从小明的公钥给小李的公钥转8元」。小明用他的私钥给这条交易进行了签名。

pic2.png

然后,包括记账系统在内的任何人都能通过我们所公开的公钥来检查这个签名是不是合法的,从而确保只有合法的交易才会被记录在我们的账本上,也就是说,确保别人不能花我们的钱,我们也不能花别人的钱。

从公钥到地址

然后,我们再在这个账户体系里面加上一个概念,叫地址。

事实上,只有私钥和公钥,也足够我们来构建与使用这个账户体系了,只是用户体验有一个不好的地方,就是公钥太长了,所以在实际的系统中,我们通过哈希算法对公钥进行了缩写,得到和公钥等价的地址,来作为实际收款的账户。

1.5 私钥、公钥与账户极速实践

注: 本实操基于 Python 语言。

1.5.1 Hash算法极速实践

# 试试自己生成 hash# -*- encoding: utf-8 -*-import hashlibimport random
payload = "shatoshi"
md5 = hashlib.md5()
md5.update(payload.encode())
print("hash value by md5: %s" % md5.hexdigest())# md5,常用摘要算法,不能用来做加密,容易被暴力破解
print("hash value by sha256: %s" % hashlib.sha256(payload.encode()).hexdigest())# sha256 算法,bitcoin所使用的哈希算法之一

1.5.2 比特币私钥、公钥与地址生成极速实践

需要安装的包:

base58==2.1.0ecdsa==0.16.1python-bitcoinlib==0.11.0six==1.15.0

保存为 requirements.txt 运行如下代码即可:

pip3 install -r requirements.txt

比特币私钥、公钥与地址生成代码:

# -*- encoding: utf-8 -*-
import binascii
from ecdsa import SigningKey
from ecdsa.curves import SECP256k1


# 生成签名钥(私钥)
signning_key = SigningKey.generate(curve=SECP256k1)
sk = binascii.hexlify(signning_key.to_string()).decode('utf-8')
# 此时的私钥是十六进制格式
# --------------------------
import hashlib, base58
# alias method
decode_hex = binascii.unhexlify

# wallet import format key - base58 encoded format
def gen_wif_key(private_key):
    # prepended mainnet version byte to private key
    mainnet_private_key = '80' + private_key

    # perform SHA-256 hash on the mainnet_private_key
    sha256 = hashlib.sha256()
    sha256.update( decode_hex(mainnet_private_key) )
    hash = sha256.hexdigest()

    # perform SHA-256 on the previous SHA-256 hash
    sha256 = hashlib.sha256()
    sha256.update( decode_hex(hash) )
    hash = sha256.hexdigest()

    # create a checksum using the first 4 bytes of the previous SHA-256 hash
    # append the 4 checksum bytes to the mainnet_private_key
    checksum = hash[:8]
    hash = mainnet_private_key + checksum

    # convert mainnet_private_key + checksum into base58 encoded string
    return base58.b58encode( decode_hex(hash) )

# 生成wif 格式私钥:
# 如'5JQnzf94d3Ys2vZxUp23XmzNVUBqiQxXDZMG9sW9dyVyuewu2q9'
wif_key = gen_wif_key(sk).decode()
# --------------------------
from bitcoin.wallet import CBitcoinSecret, P2PKHBitcoinAddress

secret = CBitcoinSecret(wif_key)
# 生成地址
address = P2PKHBitcoinAddress.from_pubkey(secret.pub) 

print("Privkey is {0}".format(wif_key)) # 打印私钥
print("Pubkey is {0}".format(secret.pub.hex())) # 打印公钥
print('Address is {0}'.format(address)) # 打印地址

1.5.3 公私钥签名验签极速实践

私钥签名,公钥验签:

from bitcoin.wallet import CBitcoinSecret, P2PKHBitcoinAddress
from bitcoin.signmessage import BitcoinMessage, VerifyMessage, SignMessage

key = '5JQnzf94d3Ys2vZxUp23XmzNVUBqiQxXDZMG9sW9dyVyuewu2q9'
msg = 'hello,shatoshi'
secret = CBitcoinSecret(key)
address = P2PKHBitcoinAddress.from_pubkey(secret.pub)
message = BitcoinMessage(msg)

# 生成签名
signature = SignMessage(secret, message)

print('Address: %s' % address)
print('Message: %s' % msg)
print('Signature: %s' % signature)

# 验证签名
print('Verified: %s' % VerifyMessage(address, message, signature))

2 账本与链式存储

2.1 账本与链式存储

接下来我们来讲第二个概念组,账本与链式存储,首先我们要明确一个重要的概念,就是比特币系统它里面是没有币的实体的,它只有账本,它不像现金一样,我们的,现金是每一个现金上面都有编号的,然而比特币只有账本,然后设计实际上是非常合理的,因为区块链它由于它的分布式特性,所以说它在这个节点上进行计算,它是非常消耗计算资源的,然后链上的资源是非常珍贵的,所以在链上我们只会记载最必要的数据进行最必要的计算。

pic3.png

所以说它链上只记载账本,甚至都不记载余额,然后我们每个人账户里有多少余额,实际上这个事情是链下来完成的。如这张PPT所示,左边就是链上记载的数据,是一笔一笔的交易,例如说第一个是小王收到区块奖励100元,我们现在先不用纠结说区块奖励100元是什么意思,这个之后再解释。我们接下来看就是小王转给小张5元,小王转给小李六元,小张转给小丁三元等等。然后有了这样一个交易的这么一个完整的记录,我们就能在链下把它的这一个每个人的余额给计算出来。

pic4.png

例如说小王他就是先收到100块,然后又转出去5元,又转出去6元,所以就100-5-6,就是它的余额就是89元。这个我们通过这个账本就可以计算出他们每个人的余额,但是这样简单的记账实际上是有弊病的,主要是两个弊病,第一个弊病容易篡改,第二个弊病追溯工作量大。

什么是容易篡改?假设说我们记账的账本的数据库里面,现在有1亿条交易记录对吧?然后记账系统他偷偷的去把里面的其中一条记录,比如说小王转给小李六元,把6改成了8,那么这个事情实际上是很难发现的。

就是说如果我们只是单纯的是这样记录交易的话,然后第二个是追溯的工作量大,例如说我要去查询一笔钱从它诞生之初到此刻的轨迹,如果只有左侧这样交易的记录的话,他也不是不可以,但是问题就是它的计算量会很大。

那么这两个问题是怎么解决的呢?我们通过一种叫做链式结构的数据结构来解决这两个问题。

pic8.png

但是在说链式结构之前,我们首先引入一个新的概念,这个概念叫哈希值,我们可以把它理解为任意数据的数据指纹,例如说我们用 Hello world字符串可以生成一个数据指纹,例如0x06113366。

然后,哈希函数,具有三个特性,第一个特性是希值它是定长的,也就是说我们不管原来的数据它有多长,可能有600个字节,可能有1 M,可能有1 G,但是它通过哈希函数后得到的哈希值它的长度都是固定的。

第二个特性是单向,单项这个事情实际上之前在讲私钥与公钥这个概念的时候,我们实际上已经包含了单项这个事情,但是当时是没有给这样一个事情下一个定义的,那么我们现在来给它一个明确的定义,什么是单向的?就是说我们可以通过左边这个数据,然后推导到右边的这样一个哈希值,但是不能说通过右边的哈希值来反推出原始的数据,这个就是单项。

第三个特性是原文稍作改动,哈希就会发生变化。例如说我们把这边的hello world感叹号改成了句号,那么它将会得到一个完全不一样的哈希。那么这个哈希值因为它的三个特性,所以它就具有了两个作用,第一个作用是校验,也就是说我们现在拿到了哈希值,然后后来我们又拿到了数据原文,那么我们就可以校验说这一个哈希值究竟是不是有这个数据原文产生的。第二个是索引,也就是说我们通过这个数据,然后产生了一个定长的希以后,希天然的适合用于做数据的索引,有了哈希函数与哈希值,我们就可以对上面的存在两个缺陷的交易记录方式进行升级,具体是怎么做的呢?

pic5.png

很简单,我们在每一笔交易中放入了上一笔交易的哈希,这样子我们就构造出了交易相互关联的交易链,这样子也就解决了上述的两个问题。

pic9.png

首先因为有了交易链,所以我们交易更容易追溯了,我们可以哈希为索引,追溯前的流向,直到这笔钱诞生的那一刻。

第二,我们也解决了容易篡改的问题。我们如果去修改某条,没有某条在交易链中的交易的话,那么它的哈希就会发生变化。所以当我们去追溯整个交易链条的时候,这条被篡改的交易就很容易的会被我们发现。例如说我们现在这边有三笔交易,然后他们通过我刚才所说的方式是联系在一起的。那么我们如果修改了左边的最左边的交易里面的某个数据的话,那么它所产生的希就不一样?当我们去追溯这个链条的时候,我们就很容易发现这一笔交易的内容和他所在下一笔交易中产生的希是对不上的,就可以很容易地判断出这笔交易是被篡改过的。

现在我们来更显示的看一下链式结构是如何将刚才所说的这种简单的交易记录方式来进行升级的。如图所示,我们把左边的这种简单的交易记录方式升级为右边,这种就是把这个事情纳入了我们的考量范围,从而就变成了右边的样子,然后它就具备了容易追溯和篡改难度增加这样两个特性。我们可以具体来看一下,首先我们给第一笔交易,也就是小王收到区块奖励100元,交易生成了一个数据指纹数

就是哈希A然后我们再接下来发生的这笔交易就是小王转给小张5元,因为它是和这一个小王收到区块奖励100元是有关联的。

所以说它在交易里面就有哈希a然后跟着哈希a还有交易原本的内容一起,它就生成了哈希b然后接下来小张又转给小丁三元,所以说这个时候他这笔交易的上一笔交易就是我们的哈希b所代表的交易,所以他把哈希b就放在他的这笔交易里面,然后最后去生成一个哈希c。

这样子的时候,如果说我们想追溯最后小丁的三元是怎么来的,我们就可以去看这个哈希d然后根据索引我们就会找到相应的这笔交易,对吧?然后我们去找会发现上一笔交易的希值,然后我们又根据哈希b去找到了这笔交易。

这笔交易之后,然后我们再看这笔交易的内容,从它的内容里面我们又找到哈希a,然后最后我们就找到了一个这笔交易源头,就相对于左边的这种的交易记录方式来说,右边的这种很显然是更容易的去追溯整条交易链的。

pic10.png

好了,现在我们已经把账本与链式存储讲完了,现在我们来回顾之前所说的这一个,比特币理解地图,我们可以看到我们已经过了一遍这么个基础三要素,首先讲了比特币是什么?最核心要把握的一点,它是只有发币记账两种职能的世界银行,然后之后我们先抛开 level2 分布式的概念,我们就把它当成一个只有单一节点的一个记账系统,我们去看记账系统中有哪些要素是我们必须要知道的,然后它既然是世界银行,那么首先我们要知道它的账户体系是怎么样的,所以我们就讲了这么一第一组的概念,也就是私钥公钥地址这三者所构成的一个非常简洁的一套账户体系。然后其次它作为世界银行,那么它的数据存储结构是怎么样的?所以说我们就介绍了账本与链式存储这个东西它的意义与它的是什么样子的?

2.2 传统单一节点的记账系统存在的问题

现在在我们已经构筑出的单一节点的记账系统的基础上,我们继续往前走,从单一节点的记账系统去进化到分布式记账系统。首先我们来看传统的单一节点的记账系统存在的问题。

第一是数据存在丢失的可能性。在术语上我们称其为单点故障,这个很好理解,比方说我们的网站它在一台服务器上对吧?然后这个服务器因为各种原因当机了或者硬盘被抹掉了,那么我们这个网站的数据也就丢失了。

第二点就是在技术上记账系统的数据,它是存在被篡改的可能性,因为它的数据是被单一主体所把控的,就好像我们能随便修改我们电脑硬盘上的数据一样,那么整个系统的维护人员,还有它的一些相应的运维人员,那么他也有权限去修改系统里的数据库里的数据,所以就在技术上存在被篡改的可能性。

第三个是整个记账系统它的生命周期受限于控制主体的生命周期。这个也很好理解,我们可以看到有些公司它推出了一个产品,这个产品在早期欣欣向荣,但是后来随着公司的衰落,产品也衰落下去了,所以一般来说这个产品它的生命周期是不会说超过这个公司的生命周期的,或者说是控制主体的生命周期的。

由于存在这些问题,所以我们提出了一种解决方案,解决方案就是一句话——

实现自由加入的节点,共同维护一个账本。

这句话的信息量很大,因为它拆解出来可以包括五大要素,第一个要素是目的,维护一个共同的账本,确保账本的唯一性。就不要看之后的内容多么复杂,实际上都是为唯一的目的服务的。也就是说大家要确保有一个账本,这个账本是大家所认同的。

然后第二个是激励,也就是说为什么我这些自由加入的节点要来参与账本的维护,他能得到什么样的好处?

第三点是公平,如何保证参加的节点的公平性,也就是说我付出了多少,可能我就有相应的回报,对吧?

第四点是共识,就是如何确保说这个节点必须遵守规则。因为说可能有的节点它是坏节点,它进来其实就是想破坏你整个系统的,然后如何就是设置一种机制,即使让这些坏节点进来作恶,然后他也无法得逞,他最后还是得遵守这个规则。第五点是可扩展性,就是如何确保记账系统的运行速度与节点无关。

运行速度这里它其实有两点,第一个就是它不能运行速度过慢,比方说我有两个节点,然后我必须速度是和100个节点是一样的,但是也不能运行速度过快,这一点其实是一个很反人性的东西,但是我等下会讲到,反人性的意思就是说有悖于我们呃的常识的东西,运行速度也不能过快,也就是说有1万个节点,但它的运行速度也会相当于这样有100个节点的运行速度,这一个在下一讲我会做一个更详细的讲解。

pic11.png

3 分布式记账系统

3.1 目的与区块结构

首先我们来讲这个目的,目的就是大家维护一个共同的账本,来确保账本的唯一性。这个图上显示的是真实的账本记录,就是说刚才我们给大家看的之前的这个记录它其实也是一个简化版,然后我们在理解了简化版的基础上再往前走一步,就可以去看真实的账本是如何在区块链数据库里被记载的,首先就有这样的一个概念叫做区块。

这个区块就是blockchain的block。

pic12.png

然后里面它会包含我们刚才所说的就是这样的一笔一笔的交易,然后除此之外,它交易不是说这样子简单的去放在里面了,它是有一种叫做Merkle Tree的组织形式的。不过对于入门课而言,这是比较细节的问题,所以我们就不提他了。

然后除此之外,它还有一个时间戳,也就是说这个区块是什么时候产生的?比如说是这一个2021年12月10日,然后几分几秒,它就是一个时间戳,然后除此之外还会包括上一个区块的哈希。

没错,它这一个跟交易链是一样的,就是说当前的这样一个区块会包含上一个区块的哈希,就像现在的交易会包含上一笔相关联的交易的哈希是一样的,然后除此之外还有一个概念叫做nounce难度值,这一个nounce的话它的具体是什么?我们会在下面的部分会给他讲到这个概念。然后整一个区块打包之后,它会生成一个哈希,然后同样是会包括在下一个区块里面,然后这样子区块一个一个连起来,然后他就是这样一个一个账本的这么一个结构。

然后所有的节点它都是要有这么一个目的,就是这个目的就是维护这一套完整的这样一个区块链。

然后它的过程里面当然是也有可能会出现说是我的当前区块,比方说是1000高度的区块对吧?然后我的1000高度和你的1000高度是不一样的,然后这个时候就会有一种机制说让最后我们虽然是现在会出现分歧,但是到最后肯定是会合二为一的,就是说我们最后还是会有一个这样一个大多数人都认同的这么一个唯一的账本的。

3.2 激励

pic13.png

说完了目的,接下来就该谈激励了。激励,也就是说为什么这些矿工要去参与账本的维护,或者说这个节点为什么要去参与账本的维护?他们维护账本有什么好处?在比特币系统里面我们维护账本是称之为出快,也就是说它这一个节点需要做这么一个事情,把它收到的交易,然后去打包进这么一个区块里,然后把这个区块去累加到这是这个节点之前的这么一个区块链上,比方说它现在有一个链,然后它现在链上的最后一个区块是这个区块对吧?

然后它会新建一个区块,然后把新的区块去累加到这个区块上面,出块,然后它出块需要得到相应的回报,比特币系统就用一种很简洁的方式来给予了就是出块的节点,它的相应的回报,就是在它出的块里面的第一个交易,不是像其他的交易一样自己写的是例如说小明做给小王五元对吧?他写的是像屏幕上这个图里面所示的一样是给打包了区块的小明,N个比特币作为奖励。

所以说如果他节点,他的区块是打包成功了,然后发给了其他节点,然后其他节点也认可了。它这个区块就是正式的加入到这一个区块链里面来了,他相当于他就收到了这样一个系统给他发的N个比特币,需要说明的是这个N不是说这一个节点它自己填的,就是而是有一套规则的,这个规则就是说是每4年递减,例如说这一个今年是8个比特币对吧?

然后他过4年那么就减半,然后他就会是4个比特币,然后又过4年又减半,然后就会变成2个比特币,所以它的这一个奖励是递减的。

这就是 coinbase交易,它就可以承担两个作用,一个作用是建立起激励制度,然后给打包的矿工就是他付出了劳动,付出了算力,然后去打包这个区块,所以说他就获得了一个相应的回报。

另外一个就是刚才所说的世界银行有两个职能,一个是转账对吧?之前我们一直说的是转账。

现在就说到二,第二个职能就是发币,然后他就通过这种方式把比特币给流通到比特币系统里面来,然后它这因为是一个递减的形式,所以说就是比特币它的总量确定的,这就是比特币说是一种总量确定的,货币是一种通缩的货币的一个由来,要注意的是区块奖励的数值是写在程序里面的,也就是说例如说我在现在这个时间点,我每出一个块是奖励两个比特币,然后我去改我的区块写成4个比特币,我照样是我是可以发给他人。但是其他人会检查到说我这个区块里面的写的数字是不对的,我是不合法的。因此说这一个区块一个区块到底有多少奖励,它是写在程序里面的一种共识。刚才我们首先是聊了这个目的,也就是说分布式系统,他的要干什么?

要干的事情很简单——就是维护一个公共的账本。

然后他的激励就是说我作为自由加入的节点,我去完成你这个目标到底会得到什么样的好处,它的好处就是简单来说就是会得到相应的一个代币的奖励。

3.3 公平

pic14.png

然后第三点要说的是公平,如何保证这些自由加入的节点,他参与具备公平性,然后解决方案说穿了也很简单,出一道算术题,然后算术题的特性就是它既简单单然后又公平,到底什么是公平的?公平就是指的是呃和客观的东西是挂钩的,在比特币里面客观的东西就是算力,计算能力,我们如何去衡量计算能力?这个就很简单粗暴,就是单位时间内我们去计算一个非常简单的题目,计算的次数越多,说明我们的算力越强。

pic15.png

对于比特币来说,简单的题目判断一个随机数加区块链中的其他数据,然后做一个希,然后它是否等于0x然后后面跟了m个0,然后再加上剩下的数字,最后得到的最后得到的区块的希,然后他就是以0x然后好多个0开头,然后剩下的是其他的一些数字,然后我们在专业术语里面就称为希碰撞。也就是说不断的去尝试去暴利的计算。

然后简单的题目它是没有办法作弊的,没有办法投机取巧的,我们只能使用穷举法,所以就确保了这个题目完全的仅和算力挂钩。

然后比特币节点它就去反复的不断的去做这个题目,最后终于算出一个符合要求的随机数。这个随机数它可以令这个随机数加上区块中的其他数据,然后进行一个希运算,最后等于前面已固定的零开头的这样一个这样一个希值,那么就说这个节点就打包出了一个合法的区块,他就会把这个区块发给其他的节点,其他节点验证说别人还没有打破过这个区块,而且这个区块是合法的,这些节点就会把它叠加到已有的区块上,自然实际的一个打包与广播的过程会更加复杂,我们在这里的描述的时候进行了简化。

好,现在让我们来看流程图,就是通过这个流程图来回顾一下整一个的一个过程。首先节点他收到了区块的其他的数据,对吧?包括交易上一个上一个区块的区块头,还有时间戳等等,然后它会随机生成一个数字,直接用到数字之后,他就会去计算这样一个值,看是否满足要求,然后他就会返回true或者false。

如果说不满足要求,那么他就返回上一步重新生产数字,然后这样不断的去暴力去做一个简单的算式,然后直到它符合要求为止,然后他就会把合法的区块打包出来,什么是合法的区块呢?就是指血管里面包括了这样一些其他数据,然后还包括了纳斯,然后最后求得的哈希值是满足我们要求的。

然后他们那个节点就会把合法的区块,然后去发送给其他的节点,其他节点说验证合法了,而且说之前也没有人发给我相同高度的区块,那么我就把这个区块去叠加到已有的区块上,然后再等上6个区块的确认,说明你区块就真的是加入到区块链里面去了。

3.4 共识

pic16.png

这个就是区块链系统它的公平性,然后接下来我们再提到下一个话题,就是共识。什么是共识?就是说确保这个节点它是遵守规则的,或者用一个时髦的词来说,它就是反脆弱的即使有一个恶意的节点去加入进来,然后他依然不会去破坏掉这个系统的正常运作。

那么确保节点遵守规则就是主要靠两点,第一点就是激励,如果节点要拿到收益,那么就需要按照需求去计算nonce,去进行区块的打包,然后激励它的过程也是非常的公平的,它是完全的和算力是挂钩的,不存在任何走后门的可能性啊。

然后第二个是作恶的难度极大。比特币系统中它有一个关键数字,6,一般我们会约定俗成的认为,如果1个区块它的后面有了6个区块了,比方说我这个区块它的高度是1700,对吧?然后它现在最新的区块的高度是1706,然后它这一个这呃1706,再往下数6个,然后的确是追溯过来是这个区块的话,那么这个区块可以被认为是mind的状态,也就是说这个区块里面的所有交易它都是确定有效的。

那么我们现在如果有一个节点是恶意的,他想去修改这个已经卖到了的交易,那么他就至少要去重新的打造6个区块。

经过数学计算,在算力不足的情况下,我们能追上6个区块的概率非常的小,只有当算力大于全网其他所有人的算力的时候,例如说假如全网算力有100%,作恶者的算力它已经达到了51%,那么它才可能实现对已经确认了的交易进行修改。所以节点遵循规则靠两方面的保证,一方面是节点遵循规则,他就会得到奖励。第二点是他作恶的难度非常大,这个就是共识。

3.5 可扩展性

pic17.png

接下来我们讲最后一个特性就是可扩展性,如何确保记账系统运行速度与节点数量无关?

这里其实就有一个很反直觉的地方,也就是说它记账速度要是恒定的,也就是说我们10分钟去固定的出一个块,其实不要让它太慢,例如说是一个小时才出一个块,这样是不好的对吧?然后也不能太快,因为这个太快其实是会造成过度分差的问题,啊不过具体造成的问题,我在这里就不细说了,大家只要记住就是说这一个比特币系统,它的目标是说恒定的10分钟出一个块,当然但是有时候这个东西也没办法完全控制,所以说也一个小时才出块,其实也是有可能的事情。

就是说它平均保证10分钟出一个块,那么他这个事情是如何去保障的呢?是关联到我们刚才那个题目上,这样一个题目它是否等于0差,然后00,然后这m个0加上剩下的数字对吧?M其实是可控的,就是整个比特币系统它会根据目前比特币系统里面挖矿节点的数量,然后来调整这一个m的大小,m的多少?因此就等于调整了这道题目的难度。

所以就是说节点多了,我们的题目难度就增大,然后竞争就更加的激烈,然后汇报,所以也是10分钟出一个块对吧?然后如果节点少了,我们的题目难度降低,然后竞争就变得更加不激烈,然后也保证10分钟能出一个块。这个就是:记账系统的运行速度与节点数量无关。

3.6 总结

pic18.png

最后我们进行一个总结,我们回到这张比特币的这个理解地图, level1 的层面,它这个基础三要素它是好理解的,就是比特币是什么?私钥公钥加地址,然后还有账本和链式存储。在这三个的基础上,我们可以构建出一个中心化的技能系统,然后中心化的这样一个记账系统,是好理解的。然后我们再把中心化的记账系统往前升级一步,然后就变成了一个分布式的去中心化的这么一个记账系统。

然后记账系统里面它就有几个关键点,就是如前所述,关键点是目的激励、公平共识与可扩展。然后 level2他就理解起来是有一定的难度的。可能就是听了我这节课,然后也是会懵懵懂懂,不是特别的理解,这个其实不是问题。Level2这个视频建议是和比特币的白皮书一起去看,一起去理解。而且话说回来,根据语言学习的理论,我们在学习的过程中,也不需要说是先把第一套知识点完全搞懂,才能进入下一阶段的学习。

所以我们现在即使对 level 2这部分内容,他的理解存在一些模糊,也没有关系。

然后level two的层面,其实我们只要把握住一个核心的要点,也就是说比特币系统他的目的是自由加入的多个节点来维护一套公共的账本就行了。我们可以先继续学习下面的课程,到我们深入的对区块链系统有更深入的理解之后,然后我们再回过头来重新来看比特币的系统。

pic19.png

最后我们还要再说一下的就是它比特币和区块链究竟有什么样的关系,我们可以把学习区块链看成是盖房子,那么比特币系统就是一个非常简洁的小房子,即使我们之后的目标是要盖起一栋摩天大楼,我们学习的开始也建议从学习盖一个小房子开始。

此外摩天大楼和小房子一样,它都会遵循相同的这样一个土木方面的原理。

同样的任何区块链系统也都是由分布式计算与分布式存储组成的,只是可能我们把共识算法换了,把智能合约的实现方式化等等,但是这一个抽象层面的模型都是一样的。然后从比特币系统我们会延伸出两条路线,一条路线是公链线路,也就是有币的线路。

另一条线路是联盟链线路,也就是无币的线路。

在难度上来讲,这一个联盟链线路它其实是会比公链线路要简单一些,所以说就是学完比特币系统,它固然是这两条线路都可以走。我建议是可以先走联盟链线路,如果之后对公链产生兴趣的话,再转也不迟。


slogan.jpeg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK