DAY 25- 区块链 Blockchain

「给我钱 !! ALL IN BITCOIN!!」


根据维基百科解释,「区块链是藉由密码学串接并保护内容的串连文字记录」。
首先,这里的保护内容可能要提出来多做解释。
所谓的保护内容,并不像我们先前进行加密的保护,
区块链是不做加密保护的,
(在计帐功能上,但如果你要说私钥变地址的话我们後天才会讲到)
所有资料都是公开透明大家的看的到、甚至大家都有储存的。
这里的保护是指:不可窜改。

串连文字纪录其实就是交易纪录。
所有的交易纪录会串连在一起,形成类似链的东西,
而新的交易就接在这过去所有交易的後面,
一直接续下去。

所以总结起来,
区块链是一个可以将交易内容公开串接在网路上,
且无法窜改的技术。

我们会说区块链是一个去中心化的技术,
所谓中心,就是资讯会经过他并由他处理的中介。
好比说今天你要转帐给一个人,那这笔资料就会经过银行,
银行处理好资料之後储存在他们自己的资料库里,
那麽银行就是一个中心。

换个方面来想,「你是否有将钱转入他人手里」的这件事实就完全掌握在银行手里,
他说有就有,没有就没有。
如果银行被骇,那这笔资料就有可能被改。

那麽这样一个不可窜改的去中心化技术是如何达成的呢?

矿工

首先你要先知道这个工作,
在我的认知里,只要有钱就会吸引人去做事,钱越多抢这个工作的人就越多。

而事实上矿工的薪资是以件计价,钱就蛮多的,
每打包一个区块可以获得 6.25 BTC 。
(如果是这几天的话,那可是新台币九百多万)
每四年这个数字就会减半,也就是说2024年时打包一个区块只会获得3.125 BTC,
那还是蛮多的,如果 BTC 继续涨的话,可能会比现在还多,但那不是我们要讨论的事情。

至於为什麽叫矿工,大概只是因为他们做的事情很像挖矿。
你不一定挖得到黄金,但是只要挖到就是很大一笔钱,有点像是在签乐透一样。

矿工的工作叫做打包(挖矿)。
我们前面说到区块链是一个串接文字纪录的技术,
而打包包括 在网路上抓取交易讯息、整理成区块、串接。
矿工要把上一个区块(交易堆)的资讯加上这个区块的资讯包起来接到链上。

上图解释打包是怎麽回事,只是其中的mining pool(矿池)就是一群矿工一起挖矿,再一起分配报酬而已。

为什麽说不一定挖得到矿,甚至说挖到矿的机率是极低的?
因为打包这件事情本身就是有难度的,而且难度极高。
每成功打包2016个区块,系统就会自行计算现在全世界有多少人在进行挖矿,进而调整打包的难度,
他(比特币系统)会将难度控制在大约每十分钟全世界可以打包一个区块。
以太币系统则是每15秒一个。

读者可以想想看,如果你是中本聪(区块链发表者,真实身分不明)的话,
你要怎麽出一道题目,让每十分钟只有一个人答对,而且还可以控制难度。

工作量证明 PoW

答案是杂凑函数,如果你忘记杂凑函数的话请复习DAY 17。
我们在提到杂凑函数的时後说到知道一个杂凑值,要回推杂凑前数值是困难的,
如果你有大致看过我在DAY18介绍的 SHA-256的话,
你就会知道杂凑结果是完全无法预测的。

Bitcoin 链所使用的正是SHA-256,
矿工若要把新的区块打包上链的话,
就必须将交易资讯接在一起成为一个数字,接着在这个数字中加入几个数字,
重复运算这个数字的杂凑值,直到杂凑值符合一个条件:
那就是小於某个数字(由系统运算难度决定),换个说法就是杂凑值的前几位数皆是0。

这件事情就叫做工作量证明(PoW, proof of work)。

从头复习一下,
区块链是串联交易纪录的去中心化技术,
所有交易纪录都会公开在链上,而矿工负责将後续的交易堆(区块)接上去,
他们需要进行SHA-256运算值到杂凑值符合开头够多的0。

只要有人成功,他就成功把区块接上,并且广播给其他节点,
其他节点收到资讯之後也要把此区块打包上他们自己记忆体的链上(但是不会有报酬),
接着就继续下一个区块的打包工作。

What's in a Block

一个区块里面包含上个区块的杂凑值、时间戳记、交易资料(Merkle root)、Nonce(number use only once)
矿工实际上做的事情就是不断更改Nonce,使得整个区块的杂凑值符合标准,
而这个符合标准的杂凑值就会被包进下个区块中。
至於我们怎麽把这麽多交易纪录放在一个区块中,就要使用Merkle Tree。

(怕我解释的不清楚:一个区块里面并不限於一个交易。)

Merkle tree 就是将每个交易(图片中最下排)先做杂凑之後,
两两接在一起(concatenate)做杂凑,再两两接在一起杂凑,
一直下去最後会有一个最终值,而这个值就称为Merkle Root。

Merkle Root 就会做为这些交易的代表值,
打包进区块中。

an EXAMPLE

我们可以到 这个网站 看到所有的区块资料。

随便找一个区块来看看
在我写这篇的前一阵子刚打包了一个区块,
我们就拿它来做介绍。

这段文字是由网站所整理,可以看到打包这个区块的矿工是AntPool,他因此获得6.25个BTC的打包费用、和0.061个BTC的小费。
在这个区块里面总共有将近 7207 BTC 的交易量。

在这个底下就是这个区块里所有资讯,
也可以看到此区块所算出的HASH值以及使用的NONCE。
在更底下可以看到所有在此区块里面的交易资讯。

有兴趣的读者可以自行去看。


今天大致上了解区块链的功能,知道矿工在做什麽。
但是矿工之间也是会出现分歧的,这时就会出现分叉。
我们明天就来看看分叉是怎麽回事。

图片来源:
https://www.reddit.com/r/memes/comments/nosoem/is_this_a_blockchain/
https://www.edureka.co/blog/blockchain-mining/
https://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png
https://changelly.com/blog/zh-hant/merkle-tree-explain/


<<:  Day 22:如何增加你 Hexo 的选单 Icon?

>>:  Day.28 「Promise 初体验~」 —— ES6 Promise

企划实现(27)

使用spinner并侦测 第一步:在values创建你要放在spinner的资料 第二步:在xml的...

[Day28] - Django-REST-Framework API 期末专案实作 (三)

上一篇我们编写了 Serializers, Views,以及修改了urls.py,完成了基本的菜单查...

有关版本控制

在开发的过程一定会面临各式的测试,以及功能的增减。对於文件的编写也会有相同的要求。一般来说,个人开发...

Day19-D3 的 RWD 图表

本篇大纲:window.resize、RWD 图表、轴线刻度数量随画面变化增减 前两篇看完比例尺跟...

HTTP Client

在 Android 开发如果要用到 HTTP client 的话基本上大家都预设用 OkHttp +...