本文首发于赞比学堂原文链接#9.3小作业提交+课程笔记# 区块链相关的理论知识和技术基础
东极营 会发币的技术人才营
主讲人:Blue 老师:中国最早的区块链布道者之一;链圈资深开发大牛;曾与V神等共同探讨区块链研发;曾主管LV在日本东京的技术部门
个人感受:因为在《手把手玩转区块链》里,浸泡了一个月,Blue老师这节课,第二遍基本已经理解,内心是雀跃的,毕竟整理S老师的课程笔记是第N遍才整理得下来(N大于3);
Blue老师的课程全程干货满满,逻辑思维清晰严谨,课后学习群里全程陪伴解答问题,用Blue老师的话说要全部搞懂,自称纯粹“码农”的Blue老师,思维清晰、逻辑严谨、耐心细致,散发着迷人的光芒,Blue老师凭实力收获了一大批超级活跃的迷妹迷弟:lol。(此处应有花痴脸)。
纯理论和技术的内容,听起来很费力,但是一旦你沉下心、装进去听,听完后,理解明白了它的设计原理和逻辑,不仅是知识的获得,更是自己个人的思维逻辑训练,而这样的脑力训练是非常宝贵的体验。
这节课个人三点最大的收益:
1、默克尔根的来源与好处:底层的交易数据(叶子节点)经过哈希函数得出第一层哈希值,第一层哈希值互为(兄弟节点)两两配对生成第二层哈希值,不断两两运算,得到最后一个哈希值,即默克尔根。默克尔根放入区块头数据中,每个节点都保存有每一个区块头数据;
默克尔根的好处:
①一旦交易数据有任何篡改,默克尔根就会发生变化,而区块链网络上的每一个节点的默克尔根是相同的,一旦你的交易数据篡改后,默克尔根与其它节点的默克尔根不相同,就会发现你的这个节点的交易数据有篡改。
②得到的默克尔根放入区块头数据中,而占主要容量空间的交易数据在区块体中,其它节点可以只保存区块头的数据(含默克尔根),不保存占大容量的区块体,在节省存储空间的同时,仍能保证交易数据的正确性。
2、当前区块的头哈希值是下一区块的父哈希值,根据这个特点很容易知道每个区块的前一个区块和后一个区块,从而保证区块链中的区块按照前后顺序互相链接起来形成链。
这个机制的设定思路,叹为观止,通过这种巧妙的设计,保证正确的同时,并没有提高大家识别理解的门槛,从而使更多的人理解并认可他的设计机制,从而达成共识。
3、哈希函数:Hash 音译为哈希,实际意思是:随机散列函数;个人认为译成随机散列函数更好理解,哈希音译后,要解释清楚反而不容易;结合S老师的观点,我们学习内容,应该去学最原始最难啃的部分,最原始的内容,一旦你理解了,就是原滋原味的内容,不容易走偏;而帮助理解的类比,实际上容易让我们理解偏,往后再纠正回来反而不容易,正如课程中Blue老师提醒我们类比中重点在于理解原理和思路,不要纠结于类比例子中的细节。
第三次听课——Blue老师课程第一课内容整理 区块链相关的理论知识和技术基础1
一、区块链是什么?
官方解释:区块链:(Block Chain):是区块(Block)和链(Chain)的直译,每个区块存储规定时间内的交易数据,并通过密码学的方式形成一个不可篡改、全员共有的分布式账本。
区块链就是一个数据库或者说区块链就是用来存储数据的一个处理系统。
在数据库中记录交易等数据,又把数据库称为账本。(用来记账用的)
账本特殊之处:每个人都可以参与账本的记账过程;
当我们购买一台服务器,加入区块链的网络里,这台服务器就称为区块链网络里的一个节点,可以通过链接到其他人的点(节点),区块链网络中的所有节点,不存在特殊节点,享受同样的权力和义务,保存同样的数据,这些数据就是整个数据库里的全部数据。
可以在任何节点写入或读取数据,只要任何一个节点的数据发生改变,整个网络上所有节点的数据都会同步改变,就保证了所有节点的数据保持一致。
类比:班级
今天上什么课:班级里的所有人是相同,班级里所有人在同样的时间上的课相同;
假定班级里的每一位同学都会把课程表记录在一个本子上;每一位同学的本子:对应区块链上的一个节点;每一位同学的课程表都是一样的;
二、区块链里一条新的数据,如何同步到所有节点?
40个同学,某校1年级1班的学生,学校为了让大家的学习更有自由性和针对性,订了特别的规则,课程表一个月要更新一次,但是要求班里的同学要一起同时上课;
每个月的课程表如何排?
三个方案:
1、每个月最努力学习的人,就可以安排下个月的课程表
每一个同学想办法拼命努力学习,月底小明被公认为是最努力的学生,于是他按照自己的意思制定了新的课程表,由于大家都遵守了这样的规则,于是这个月度课程表得到大家的认可,每个同学的本子上都记录了同样的课程表数据;
月度课程表:区块
课程表里填写的语文、数学等科目内容:相当于区块链里的一笔交易,即交易数据;
所有月度课程表都产生以后,连在一起就形成了课程表链,每一张月度课程表称为一个区块,所有月度课程表连接起来:区块链
每一个学生的本子上都记录了每个月的课程表:区块链上的一个节点;
每一个节点记录的课程表都是一致的,每产生一张新的课程表:出块,产生了新的区块;
付出了刻苦努力,取得了课程表制定资格的同学,都会被班级给予一定的奖励作为他这个月的酬劳,他这个月辛勤付出的过程:挖矿;
此时我们每一个学生都是一个矿工,给他的奖励就是区块链里的币,比特币网络奖励的是比特币。
eg:比特币工作原理方案。
2、全员相互投票选举
一年级二班的玩法
每个人手上都有投票的券,每个人都可以给其他人投票,最后通过统计出谁的票最多,谁就有制定下个月课程表的资格。与第一种方法不同:选择制定课程表的人,规则不一样。共同的地方:每个学生都会按照课程表的意思把新的课程表追加到自己的笔记本里。
eg:以太坊改进方案;获得票数最多的人取得下个月课程表的制定资格。
PS:类比方便理解,去感受思路和原理。
3、 从班委中选举
大大减少选举的范围和时间,得票最多的班委取得下个月课程表的制定资格,班委可以改变,如果做的不好,班委可以换人,EOS方案
区块链:是一个分布式账本,一种通过去中心化去信任的方式集体维护一个可靠数据库的技术方案。
三、区块链技术的几个特征;
1、 开放、共识
课程表里例子里,班里的每一个人都可以参与到区块链里,而且每个学生的笔记本都作为区块链上的一个节点,每一个笔记本上都记录了区块链上的完整数据,这条区块链由月度课程表作为区块,因为每个月要出一个新的课程表,出块的类比;
每个月度课程表的产生都经历了类似上诉的三种方案的过程,来确定新的月度课程表的制定人,这样的方案:区块链里的共识机制
通过共识机制:区块链里的每个节点都会达成共识。
2、 去中心、去信任
课程表例子:方案一、二,任何人都可能成为下一个月课程表的制定人,任何都可以是中心,但任何人又都不是中心,方案三:班委也是可以变换;
信任:谁获得了下个月制作课程表的资格,大家就相信谁。
大家信任的是规则体系下产生的结果,而不是信任某一个人;
区块链世界:信任的是共识下的规则,而不是人
3、 交易透明,双方匿名
产生的每个月度课程表都是经过大家达成最后的共识才决定的,所以在例子中,大家都遵从了课程表制定人的意愿,形成了下个月的新课程表,所有的数据都是公开透明的,账本里的每一笔数据都没有任何的隐蔽,都是公开透明的,只有账本只在某一个人手中,才不是公开透明的(中心化的模式下)
双方匿名:课程表例子不太恰当,金融领域交易双方,第三方个人或其他机构:如果不仅知道交易双方的交易信息,还知道交易双方双方的个人的信息就非常糟糕,
不匿名的话,大家对每笔交易可以对应到现实中的个人,安全隐患非常大。
交易所:中心化管理,去中心化的交易所目前还没有
去中心化管理模式:可以在匿名的情况下,唯一确定你是谁,中心化的管理模式下,必然要管理账号、密码,就要求你进行实名认证,如果不绑定个人信息,就不能知道账号是谁的。
4、 不可篡改、可追溯
课程表例子:单个人可以修改自己的笔记本上的课程表,但是即便他修改了自己的笔记本课程表,仍然没有用,因为其他人依然按原来的课程表上课,要想让大家都按照他个人修改后的课程表上课,必须同时修改51%的学生的笔记本里的课程表,而要修改51%的学生的课程表,在区块链的世界里,非常困难,也没有必要(51%详细问题下节课在安全机制及51%攻击里会提到)
现实世界里,同时修改,每个人都会精心保管好自己的笔记本,每个人可能放在不同的地方,不同的安全密码,如何找到这些地方、如何破解这些密码,现实生活对于现实世界的人来说,要想同时完成是非常困难的。而区块链的世界难度会比现实世界里大很多,数以万计的节点,每一个节点都有完备的安全机制,要冲破这些障碍,难度达到了无限接近不可能,付出的代价本身要远远大于修改成功得到的利益。
整个这一段,Blue老师通过类比,通俗易懂的解说了什么是区块链、区块链的共识机制以及区块链的特征,可以结合S老师的课程一起理解,理解会更全面和透彻。《手把手玩转区块链》S老师—5天课程笔记锦集
四、区块链的基础架构模式
数据层→网络层→共识层→激励层→合约层→应用层
数据层 网络层 共识层是构建区块链应用的必要因素,否则就不能称为真正意义上的区块链,后三个要素不是每个区块链应用都必须要有的,部分区块链可以不完全包含这三种要素
1、数据层——“笔记本”
课程表例子:数据层—每个同学的笔记本
笔记本里记录了每个月度的课程表并把每个月度的课程表按先后顺序排列起来,串成链条式的一个体系,同时笔记本是按照时间来管理每个月度的课程表,月度课程表的记录时间很严格,这种机制在区块链里叫为时间戳,
我们的笔记本具备这样的能力,它可以把每个月度课程表生成的时间计算成一个特殊的数字,这个数字可以逆向的计算出课程表生成的时间,这种能力:算法,时间可以算出数字,同时数字可以逆向算出时间;
笔记本里有一个机关:哈希函数,主要作用是往机关里写入任何数据,通过一堆极度复杂的算法,丢进去通过算法,可以输出完全看不懂的字母组合:哈希值。
哈希:类比机关,小明手里有这样一个机关,还有一个哈希值,同时还有一篇文章,据说是祖传的秘方,但是现在谁都不能证明这个秘方是不是真的,小明手里的哈希值和机关(哈希函数)可以检验秘方的真伪,只要小明把秘方丢进机关(哈希函数)里一算,从机关里得到的字母组合(哈希值),如果与小明手里的哈希值一致,就能证明这个秘方是真的。
机关:哈希函数(S老师比喻为榨汁机)
区块链里验算过程:利用哈希函数把每两个课程作为一个输入,每两个课程丢进哈希函数里,得到一个哈希值,把得到的哈希值在两两经过哈希函数得出新的哈希值,重复这个过程,直到最后算出唯一的一个哈希值,最后这个唯一哈希值称为(Merkle默克尔根)
最底层的交易数据:课程表;又叫叶子节点
叶子节点(交易数据)先进行一次哈希计算,得到第一层哈希值,得到哈希值两两配对,进入第二轮,两个哈希值(互为兄弟节点)进行计算得到下一轮哈希值,重复两两哈希值计算,最后得到唯一的哈希值:默克尔根
默克尔根:最后得到的哈希值,任何人如果修改了任何一笔交易数据,通过哈希函数计算得到的默克尔根就会与原来的默克尔根不相同,就能轻易发现交易数据是否被篡改过。
数据层包含了区块链里最为重要的数据,数据层主要任务:管理组织数据,同时保证数据的安全。
2、网络层
每个节点互相连接,新的节点会与网络上的节点连接,节点之间互相传递信息的过程:P2P的自动组网的过程。
P2P:point to point 点对点,节点之间互相平等,
区块链的世界里每一个区块链的节点:每一台介入区块链网络里的电脑就是区块链的一个点:节点
节点是怎么彼此组成一个网络的?——如何彼此通信
一台电脑上安装了区块链的程序,这个程序根据自己的网络地址去寻找整个区块链网络里其它的与自己一样安装了同样程序的电脑,并根据自己的属性比如IP地址、国家信息等,找到邻近的节点,因为邻近的节点里安装了与自己相同的程序,这些程序之间可以相互链接,彼此之间发生关系,整个区块链网络上就多了一个新的节点,这个节点与整个网络相通,而不是孤立存在,依此类推,区块链的网络上的节点越来越多,整个过程是节点上的程序自动构建起来的通讯机制,这个过程:点对点自动组网过程,P2P自动组网。
回听:第五课 比特币网络是怎么组织起来的?可以回顾S老师的讲解的第五课帮助理解。
网络层里消息如何验证?
交易验证:后续课程
消息的传递过程,首先消息接受方要与消息发送方进行确认,确认无误后,消息接受方把消息往外扩散。区块链里有非常详细和严谨的算法来保证数据的正确性和安全性。
3、共识层
保证大家能对传递的消息达成最后的共识
共识机制 特殊节点 出块
消息传递可能有虚假消息或者发生错误,怎么保证所有节点都收到相同、正确的信息。
全网络的节点里,我们应该相信谁,如何让节点收到的消息大家达成共识。
所有类型的区块链的网络通过各种共识机制找出全网络里的独特的节点,让全网络的节点都相信这个节点的消息,这个独特的节点时通过规则选出来的,并且是一直在变化的。每个节点都根据规则选出来这个独特节点,把这个节点的消息记录在自己的区块链上(新的区块),这个过程称为:出块
五、比特币区块链的体系结构
区块头+区块体
交易数据以电子化形式永久存在,形成数据存储的单元:区块,里面存储了交易的数据。
区块头:每个区块自身的身份识别信息
区块头:头哈希值;当前区块的哈希值,下一个区块的父哈希值
父哈希值:上一区块的哈希值
这样的设计:通过后一个区块的父哈希值可以找到前一个区块,形成了前后定位的关系。
每一个区块都记录了自己的头哈希值和上一个区块的哈希值,由此来实现区块之间的串联,从而得到一条前后有序的区块链,通过区块链中的任一区块,都可以追溯这个区块的前一个区块和后一个区块。
版本号:标识软件及协议版本的相关信息;
哈希:散列,哈希算法单向加密,明文通过哈希算法加密为密文,密文不能发推明文。
时间戳:每个区块产生的时间,精确到秒
随机数:证明算力的结果
难度值:所有节点计算随机数的时间,控制难度在合适的范围。
区块体:区块的主体:包含交易数据
创世区块:第一个最早的区块,拥有唯一的ID标识号,没有前一个区块,所以只有一个ID
以后的区块都有两个ID,一个是区块自身的ID,另一个是前一个区块的ID
区块每隔一定时间生成一个新的区块
出块时间、安全、去中心化、效率之间需要平衡和取舍。
打包区块的人:矿工;运用矿机计算随机数的人
矿机:计算随机数的机器。
Tx_root 默克尔根:由区块主体所有的交易数据生成第一层哈希值,第一层哈希值经过两两计算,不断连续两两继续,直到算出的最后一个哈希值,用于验证交易是否在区块中存在。Top Hash
节点:接入比特币网络的任何一台电脑或者存储设备;
矿机具有的计算能力:算力
比特币网络里,每一个区块都生成了自己的默克尔树。
节点根据自身情况,决定是否保存整个默克尔树,整个数据容量非常大,可以选择只保存区块头的数据,区块体:容量最大,交易数据。
自己的账本:只保存默克尔根,
出现交易的节点只保存自身的交易信息相关的区块,其它人的交易保持区块头就好。
区块头:可以知道区块与其它区块的关系,链条的关系可以得到维持。
区块头里的默克尔根根本保证了交易数据不被篡改,同时极大降低了区块链的存储空间
轻钱包:节点,只同步与自己的相关的交易数据;
全钱包:保存全部数据的钱包
六、新区块产生的过程
1)把本地的交易信息记录到区块的主体里;
2)区块主体的交易数据通过连续的两两哈希计算得到默克尔根,保存在区块头中;
3)把上一个刚刚生成的区块的区块头数据(通过哈希算法生成的)哈希值加入这个区块头数据中(上一个区块的头哈希值;这个区块的父哈希值)
4)当前的时间保存在这个区块的时间戳里;
5)难度值字段:根据之前一段时间区块的平均生成时间进行调整,来应对整个网络不断变化的整体计算总量。
区块高度:区块链里区块的个数、类似编号
每个区块容量约1M,最多容纳4000个交易,每个被认可的区块平均生成时间为10分钟,计算下来比特币网络中,每秒中最多只能处理7笔交易
1M=1024k;1K=1024个字节;1M=1024×1024个字节约100万字节;一笔交易=250字节
1M/250字节=4000笔交易
每个区块里包含的交易笔数与每个交易包含的字节数、每笔交易的留言长度、碎币有关(UTXO)
目前每个区块包含1000—2000交易之间波动。
PS:①赞比学堂的同学,我的笔记内容可能有看不明白的地方,因为笔记是我个人的课程笔记,记录时有些个人理解的过程省略了,没有推导过程,只留下了结论,理解起来就难免会有盲点;
建议每个同学都记笔记,听的过程是吸收的过程,整理是回顾、复述、应用的过程(可见蚂蚁私塾《精进》一书里提到的学习方法);而且整理过程中,你会发现一些你认为听懂了,实际上并没有理解的地方,这个就需要反复听、反复琢磨,甚至提问理解。
②非赞比学堂的赞友们,大部分人估计都有看不明白的地方,因为我们各自的盲点不一样,最好的方法是加入我们一起学习噢。根据我个人的体验和同学的活跃程度和反馈,课程超值,老师们的付出和同学们营造的氛围,这样的学习经历是难以用金钱来衡量价值的。
此处应有广告:lol