区块链开发技术入门(区块链教程(二):基础知识介绍)
注:本教程为技术教程,不谈论且不涉及炒作任何数字货币
本次组队学习重点在于以太坊基础知识、以太坊客户端以及以太坊solidity编程,因此本节教程重点在于以太坊核心知识点的掌握,区块链部分的基础知识可以作为补充,请学习者量力而行。另外若学习者觉得本节内容难度太高,可以先对基本知识点有一个概览,在第二节以及第三节实战内容学习完成之后再深入学习本节内容。
一、区块链简介
1。1、区块链与区块链技术
在阅读本教程之前,大家对比特币原理不太了解同学可以先阅读下此博客~,大家对比特币有简单了解后对于区块链会有更好的认识。
区块链是将记录(区块)通过密码学串联并加密的链式数据结构。而区块链技术,是通过P2P网络和区块链来实现数据存储的去中心化、不可逆和不可篡改。比特币正是构建在区块链技术上的典型应用。通过区块链技术,我们可以将信息(数据、程序)保存在区块上并接入到区块链中,这样就实现了信息的去中心化存储、不可逆和不可篡改。区块链应用是指利用区块链技术开发的应用。
1。2、区块链历史
2008年,一个网名叫中本聪(Satoshi Nakamoto)的人发表了一篇名为《比特币:一种点对点电子货币系统》的论文,论文中首次提到了“区块链”这一概念。2009年,中本聪创立了以区块链为底层技术的比特币网络,开发出了第一个区块,被称为“创世区块”。该阶段被称为“区块链1。0”。
由于比特币是一个电子货币系统,所以主要功能就是记账。但随后人们发现,区块链技术作为比特币的底层技术,功能可以远远不止于记账,许多关于“未知的信任”的问题,都可以通过区块链来解决,例如电子存证、信息记录等。于是在比特币的基础上,诞生了带有智能合约的区块链系统,即允许开发者通过编写智能合约来实现特定的逻辑,这一阶段被称为“区块链2。0”。这一阶段的主要代表是以太坊。
随后,人们想要提升区块链应用的性能,于是出现了EOS、ArcBlock等系统,其特点是高性能、大吞吐量,但由于引入了超级节点、云节点等特性,弱化了“去中心化”这一特点,因此受到较大的争议。这一阶段被称为“区块链3。0”。
由于比特币是一款电子货币,可扩展性较低,而所谓的“区块链3。0”目前受到较大争议,且部分项目的底层算法完全不同于典型的区块链,因此学习区块链2。0中的以太坊是目前学习区块链的最佳方式。
1。3、区块链基础技术与算法
区块链技术不是单独的一项技术,而是一系列技术组成的技术栈,其具有以下的特点:
- 数据分布式存储
- 存储的数据不可逆、不可篡改、可回溯
- 数据的创建和维护由所有参与方共同参与
为了实现这些特点、维护区块链应用的稳定运行,区块链技术中包含了分布式存储技术、密码学技术、共识机制以及区块链2。0提出的智能合约。
1。3。1、区块
区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。
在这里插入图片描述
每个区块包含两个部分。
区块头(Head):记录当前区块的特征值
区块体(Body):实际数据
区块头包含了当前区块的多项特征值。
生成时间
实际数据(即区块体)的哈希
上一个区块的哈希
。。。
1。3。2、分布式存储技术
与传统的数据存储技术不同,在区块链技术中,数据并不是集中存放在某个数据中心上,也不是由某个权威机构或是大多数节点来存储,而是分散存储在区块链网络中的每一个节点上。
在这里插入图片描述
节点和区块的关系是什么?
可以用共享文档来简单描述:所有可以访问共享文档的账号就叫做节点,当然全节点需要同步共享文档,也就是拥有全部的区块数据区块就是共享文档。每个人更新了,所有人都可以查看最新的文档
1。3。3、密码学技术
为了实现数据的不可逆、不可篡改和可回溯,区块链技术采用了一系列密码学算法和技术,包括哈希算法、Merkle 树、非对称加密算法。
哈希算法
哈希算法是一个单向函数,可以将任意长度的输入数据转化为固定长度的输出数据(哈希值),哈希值就是这段输入数据唯一的数值表现。由于在计算上不可能找到哈希值相同而输入值不同的字符串,因此两段数据的哈希值相同,就可以认为这两段数据也是相同的,所以哈希算法常被用于对数据进行验证。
在区块链中,数据存储在区块里。每个区块都有一个区块头,区块头中存储了一个将该区块所有数据经过哈希算法得到的哈希值,同时,每个区块中还存储了前一个区块的哈希值,这样就形成了区块链。如果想要篡改某一个区块A中的数据,就会导致A的哈希值发生变化,后一个区块B就无法通过哈希值正确地指向A,这样篡改者又必须篡改B中的数据。。。。。。也就是说,篡改者需要篡改被篡改的区块以及后面的所有区块,才能让所有的节点都接受篡改。
Merkle树
Merkle树是一种树形结构,在区块链中,Merkle树的叶子节点是区块中数据的哈希值,非叶子节点是其子结点组合后的哈希值,这样由叶子节点开始逐层往上计算,最终形成一个Merkle根,记录在区块的头部,这样就可以保证每一笔交易都无法篡改。
在这里插入图片描述
非对称加密技术
非对称加密技术使用两个非对称密钥:公钥和私钥。比特币价格公钥和私钥具有两个特点:
- 通过其中一个密钥加密信息后,使用另一个密钥才能解开
- 公钥一般可以公开,私钥则保密
在区块链中,非对称加密技术主要用于信息加密、数字签名和登录认证。在信息加密场景中,信息发送者A使用接收者B提供的公钥对信息进行加密,B收到加密的信息后再通过自己的私钥进行解密。再数字签名场景中,发送者A通过自己的私钥对信息进行加密,其他人通过A提供的公钥来对信息进行验证,证明信息确实是由A发出。在登录认证场景中,客户端使用私钥加密登录信息后进行发送,其他人通过客户端公钥来认证登录信息。
- RSA 算法RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。 RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。 RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。
- ECC 椭圆曲线算法具体可以参见此文章:ECC椭圆曲线加密算法:介绍
1。3。4、共识机制
区块链系统是一个分布式系统,分布式系统要解决都首要问题就是一致性问题,也就是如何使多个孤立的节点达成共识。在中心化系统中,由于有一个中心服务器这样的“领导”来统一各个节点,因此达成一致性几乎没有问题。但在去中心化场景下,由于各个节点是相互独立的,就可能会出现许多不一致的问题,例如由于网络状况等因素部分节点可能会有延迟、故障甚至宕机,造成节点之间通信的不可靠,因此一致性问题是分布式系统中一个很令人头疼的问题。
由 Eirc Brewer 提出,Lynch 等人证明的 CAP 定理为解决分布式系统中的一致性问题提供了思路。CAP 定理的描述如下:在分布式系统中,一致性、可用性和分区容错性三者不可兼得。这三个术语的解释如下:
- 一致性(Consistency):所有节点在同一时刻拥有同样的值(等同于所有节点访问同一份最新的数据副本
- 可用性(Availability):每个请求都可以在有限时间内收到确定其是否成功的响应
- 分区容错性(Partition tolerance):分区是指部分节点因为网络原因无法与其他节点达成一致。分区容错性是指由网络原因导致的系统分区不影响系统的正常运行。例如,由于网络原因系统被分为 A, B, C, D 四个区,A, B 中的节点无法正常工作,但 C, D 组成的分区仍能提供正常服务。
在某些场景下,对一致性、可用性和分区容错性中的某一个特性要求不高时,就可以考虑弱化该特性,来保证整个系统的容错能力。区块链中常见的共识机制的基本思路正是来自 CAP 定理,部分区块链应用中用到的共识机制如下表:
共识机制应用 PoW 比特币、莱特币、以太坊的前三个阶段 PoS PeerCoin、NXT、以太坊的第四个阶段 PBFT Hyperledger Fabric
PoW(Proof of Work,工作量证明)
PoW 机制的大致流程如下:
- 向所有节点广播新交易和一个数学问题
- 最先解决了数学问题的节点将交易打包成区块,对全网广播
- 其他节点验证广播区块的节点是否解决了数学问题(完成了一定的工作量),验证通过则接受该区块,并将该区块的哈希值放入下一个区块中,表示承认该区块
由于在 PoW 机制中,区块的产生需要解决一个数学问题,也就是所谓的挖矿,这往往要消耗较大的算力和电力,因此节点们倾向于在最长的链的基础上添加区块,因为如果节点想在自己的链上添加新的区块,那么就需要重新计算 1 个或 个这样的数学问题(每添加一个区块就需要计算一个)。因此在比特币中最长的链被认为是合法的链,这样节点间就形成了一套“共识”。
PoW 机制的优点是完全去中心化,缺点是需要依赖数学运算,资源的消耗会比其他的共识机制高,可监管性弱,同时每次达成共识需要全网共同参与运算,性能较低。
PoS(Proof of Stack,股权证明)
PoS 针对 PoW 的缺点做出了改进。PoS 要求参与者预先放置一些货币在区块链上用于换取“股权”,从而成为验证者(Validator),验证者具有产生区块的权利。PoS 机制会按照存放货币的量和时间给验证者分配相应的利息,同时还引入了奖惩机制,打包错误区块的验证者将失去他的股权——即投入的货币以及产生区块的权利。PoS 机制的大致流程如下:
- 加入 PoS 机制的都是持币人,称为验证者
- PoS 算法根据验证者持币的多少在验证者中挑选出一个给予产生区块的权利
- 如果一定时间内没有产生区块,PoS 就挑选下一个验证者,给予产生区块的权利
- 如果某个验证者打包了一份欺诈性交易,PoS 将剥夺他的股权
PoS 的优点在于:
- 引入了利息,使得像比特币这样发币总数有限的通货紧缩系统在一定时间后不会“无币可发”
- 引入了奖惩机制使节点的运行更加可控,同时更好地防止攻击
- 与 PoW 相比,不需要为了生成新区块而消耗大量电力和算力
- 与 PoW 相比,缩短了达成共识所需的时间
由于 PoS 机制需要用户已经持有一定数量的货币,没有提供在区块链应用创立初始阶段处理数字货币的方法,因此使用 PoS 机制的区块链应用会在发布时预先出售货币,或在初期采用 PoW,让矿工获得货币后再转换成 PoS,例如以太坊现阶段采用的是 PoW 机制,在第四阶段“宁静”(Serenity)中将过渡到 PoS。
拜占庭将军问题(Byzantine Generals Problem)
拜占庭将军问题是分布式网络中的通信容错问题,可以描述为:
一组拜占庭将军各领一支队伍共同围困一座城市。各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻而部分军队撤离可能会造成灾难性的后果,因此各将军决定通过投标来达成一致策略,即“共进退”。因为各将军位于城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己的选择(进攻或撤退)通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同投票的结果,进而做出行动。
在这里插入图片描述
拜占庭将军的问题在于,将军中可能出现叛徒。假设3名将军中有1名叛徒,2名忠诚将军一人投进攻票,一人投撤退票,这时叛徒可能会故意给投进攻的将军投进攻票,而给投撤退的将军投撤退票。这就导致一名将军带队发起进攻,而另外一名将军带队撤退。
另外,由于将军之间通过信使进行通讯,即使所有将军都忠诚,也不能排除信使被敌人截杀,甚至信使叛变等情况。
假设存在叛变将军或信使出问题等情况,如果忠诚将军仍然能够通过投票来决定他们的战略,便称系统达到了拜占庭容错(Byzantine Fault Tolerance)。
拜占庭问题对应到区块链中,将军就是节点,信使就是网络等通信系统,要解决的是存在恶意节点、网络错误等情况下系统的一致性问题。
PBFT(Practical Byzantine Fault Tolerance) 是第一个得到广泛应用且比较高效的拜占庭容错算法,能够在节点数量不小于 的情况下容忍 个拜占庭节点(恶意节点)。
二、以太坊介绍
首先我们要知道我们为什么要学习以太坊,主要有以下四个原因:
- 以太坊是区块链2。0的代表,学习以太坊能了解到区块链技术的所有知识
- 引入了智能合约,拓宽了区块链的应用场景
- 对开发者友好、对用户友好,容易编写出简单的区块链应用,学习趣味性高
- Solidity 语法与 Javascript、Go 等语言接近,易上手
2。1、以太坊简介
区块链技术常常被认为是自互联网诞生以来最具颠覆性的技术,然而,自比特币诞生后一直没有很好的区块链应用开发平台。想要在比特币基础上开发区块链应用是非常复杂繁琐的,因为比特币仅仅是一个加密数字货币系统,无法用来实现更广阔的业务需求。以太坊是目前使用最广泛的支持完备应用开发的共有区块链系统。
和比特币不同,比特币只适合加密数字货币场景,不具备图灵完备性,也缺乏保存实时状态的账户概念,以及存在 PoW 机制带来的效率和资源浪费的问题,而以太坊作为区块链2。0的代表,目标是扩展智能合约和建立一个去中心化应用平台,具有图灵完备的特性、更高效的共识机制、支持智能合约等多种应用场景,使得开发者能够很方便地在以太坊上开发出基于区块链的应用。
2。1。1、以太坊的发展
2014年, Vitalik Buterin 发表了文章《以太坊:一个下一代智能合约和去中心化应用平台》。同年,Buterin 在迈阿密比特币会议中宣布启动以太坊项目,并提出了多项创新性的区块链技术。2015年,以太坊CCO Stephan Tual 在官方博客上宣布以太坊系统诞生,主网上线。
以太坊发展至今经历了“前沿”(Frontier)、“家园”(Homestead)以及现在所处的“大都会”(Metropolis)三个阶段。第四阶段“宁静”(Serenity)将作为以太坊的最后一个阶段,目前尚未有计划发布日期。
2。1。2、以太坊的特点
以太坊团队和外界对以太坊的描述都是“世界计算机”,这代表它是一个开源的、全球的去中心化计算架构。它执行称为智能合约的程序,并使用区块链来同步和存储系统状态,以及使用名为以太币的加密数字货币来计量和约束执行操作的资源成本。同时,以太坊提供了一系列的接口,使得开发者能够通过以太坊来开发去中心化 Web 应用DApps。
2。1。3、智能合约
相比比特币,以太坊最大的特点就是引入了智能合约。智能合约本质上就是一段编写好的程序,可以在特定的条件下被触发并执行特定的操作。由于区块链具有不可逆和不可篡改的特点,因此智能合约与区块链结合后,就成了一份“强制执行”的合约。
以太坊能够作为一个去中心化应用平台和”世界计算机”,其核心就是智能合约。智能合约的引入,使得开发者能够实现许多(理论上是任何)业务逻辑。如果说比特币是通过区块链技术开发的特定计算器,那么引入了智能合约的以太坊就是基于区块链技术的通用计算机。可以简单的理解成:比特币的交易系统就是一份写死的智能合约,而以太坊则将智能合约的开发权限交给开发者。
以太坊提供了对智能合约的全面支持,包括编写智能合约编程语言 Solidity 和运行智能合约的以太坊虚拟机(Ethereum Virtual Machine,EVM)。
2。1。4、幽灵协议
幽灵合约的英文是“Greedy Heaviest Observed Subtree"; (GHOST) protocol,在介绍幽灵协议之前,先介绍以太坊中的叔区块、叔块奖励和叔块引用奖励这三个概念。
在这里插入图片描述
假设目前以太坊区块链中的区块高度(区块链上的区块个数)为6,现在产生了一笔新的交易,矿工A先将该笔交易打包成了区块 Block 7,在矿工A将 Block 7 广播到其他节点的这段时间里,矿工B和矿工C又分别产生了 Block 8 和 Block 9。Block 7、Block 8、Block 9 都指向 Block 6,即 Block 6 是他们的父区块。由于 Block 7 是最先产生的,因此 Block 7 被认为是有效区块,Block 8 和 Block 9 就是叔区块(作废区块)。
在这里插入图片描述
现在链上的区块高度为7,在这基础上又产生了新的交易,并被打包成了 Block 10。在以太坊中,Block 10 除了可以引用它的父区块 Block 7 外,还可以引用叔区块 Block 8 和 Block 9。并且,Block 8 和 Block 9 的矿工会因此获得一笔奖励,称为叔块奖励,Block 10 的矿工除了基础奖励之外,由于引用了叔区块,还会获得一笔额外的叔块引用奖励。
幽灵协议是以太坊的一大创新。由于在比特币中的出块时间被设计为10分钟,而以太坊为了提高出块速度,将出块时间设计为12秒(实际14~15秒左右),这样的高速出块意味着高速确认,高速确认会带来区块的高作废率和低安全性。因为区块需要花一定的时间才能广播至全网,如果矿工 A 挖出了一个区块,而矿工 B 碰巧在 A 的区块扩散至 B 之前挖出了另一个区块,矿工 B 的区块就会作废并且没有对区块链的网络安全做出贡献。此外,这样的高速确认还会带来中心化的问题:如果 A 拥有全网 30% 的算力而 B 拥有 10% 的算力,那么 A 将会在 70% 的时间内都在产生作废区块,而 B 在 90% 的时间内都在产生作废区块,这样,B 永远追不上 A,后果是 A 通过其算力份额拥有对挖矿过程实际上的控制权,出现了算力垄断,弱化了去中心化。
幽灵协议正是为了解决上述问题而引入的,协议的主要内容如下:
- 计算最长链时,不仅包括当前区块的父区块和祖区块,还包括祖先块的作废的后代区块(叔区块),将它们综合考虑来计算哪一个区块拥有支持其的最大工作量证明。这解决了网络安全性的问题
- 以太坊付给以“叔区块”身份为新块确认作出贡献的废区块87。5%的奖励(叔块奖励),把它们纳入计算的“侄子区块”将获得奖励的12。5%(叔块引用奖励)。这就使得即使产生作废区块的矿工也能够参与区块链网络贡献并获得奖励,解决了中心化倾向的问题
- 叔区块最深可以被其父母的第二代至第七代后辈区块引用。这样做是为了: 降低引用叔区块的计算复杂性过多的叔块引用奖励会剥夺矿工在主链上挖矿的激励,使得矿工有转向公开攻击者链上挖矿的倾向(即公开攻击者可能会恶意产生大量作废区块,无限引用将会诱使矿工转移到攻击者的链上,从而抛弃合法的主链)计算表明带有激励的五层幽灵协议即使在出块时间为15s的情况下也实现了了95%以上的效率,而拥有25%算力的矿工从中心化得到的益处小于3%
2。1。5、以太坊的组成部分
在以太坊中,包括了 P2P 网络、共识机制、交易、状态机、客户端这几个组成部分。
- P2P 网络:在以太坊主网上运行,可通过TCP端口30303访问,并运行称为 ÐΞVp2p 的协议。
- 共识机制:以太坊目前使用名为 Ethash 的 POW 算法,计划在将来会过渡到称为 Casper 的 POS 算法。
- 交易:以太坊中的交易本质上是网络消息,包括发送者、接收者、值和数据载荷(payload)。
- 状态机:以太坊的状态转移由以太坊虚拟机(Ethereum Virtual Machine,EVM)处理,EVM 能够将智能合约编译成机器码并执行。
- 客户端:用于用户和以太坊进行交互操作的软件实现,最突出的是 Go-Ethereum(Geth) 和 Parity。
2。1。6、以太坊中的概念
- 账户:以太坊中的账户类似于银行账户、应用账户,每个账户有一个20字节的地址。账户又分为普通账户(又叫外部账户,External Owned Account, EOA)和合约账户(Contract)。普通账户是由以太坊使用者创建的账户,包含地址、余额和随机数;合约账户是创建智能合约时建立的账户,包含存储空间和合约代码
- 状态:状态是由账户和两个账户之间价值的转移以及信息的状态转换构成的
- 地址:地址是一个账户 ECDSA 公钥的 Keccak 散列最右边的160位,通过地址可以在以太坊上接收或发送交易。在 Etherscan 上,可以通过地址来查询一个账户的信息
- 交易:以太坊中的交易不仅包括发送和接收以太币,还包括向合约账户发送交易来调用合约代码、向空用户发送交易来生成以交易信息为代码块的合约账户
- Gas:Gas 是以太坊中的一种机制,用于执行智能合约或交易操作的虚拟燃料。由于以太坊是图灵完备的,为了避免开发者无意或恶意编写出死循环等浪费资源或滥用资源的情况,以太坊中的每一笔交易都需支付一定的 Gas (燃料费),即需支付一定的以太币作为 Gas。Gas 的金额通常是由交易的发起者指定并支付的
- 挖矿:和比特币类似,以太坊同样通过挖矿来产生区块。在以太坊目前的 PoW 机制下,每当一笔交易发出并广播,就会吸引矿工来将该交易打包成区块。每产生一个区块都会有一笔固定奖励给矿工,目前的固定奖励是3个以太。同时,区块中所有操作所需的 Gas 也会作为奖励给矿工。与比特币不同的是,以太坊中产生叔块的矿工可能会获得叔块奖励,引用叔块的矿工会获得叔块引用奖励
- DApp(去中心化应用):通过智能合约,开发者能够设计想要的逻辑,相当于是网站的后端。而 DApp 则相当于是一个完整的网站(前端+后端),因此 DApp = 智能合约 + Web 前端。以太坊提供了一个名为 web3。js 的 Javascript 库,通过 web3。js 可以实现 Web 与以太坊区块链的交互和与智能合约的交互,方便开发者创建 DApp
2。2、以太坊基础
2。2。1、以太坊中的货币
以太坊中的货币称为 以太币,单位为以太(Ether),也称 ETH 或符号 Ξ。以太可以被分割为更小的单位,最小的单位是 wei,1 以太 = wei。以太币各单位的名称及之间的关系如下表:
在这里插入图片描述
2。2。2、以太坊钱包
以太坊钱包是用于创建和广播交易的应用程序,常用的钱包有
- MetaMask,一款基于浏览器扩展的钱包,可以很方便地添加到 Chrome, FireFox 等支持扩展的浏览器中
- Jaxx,一款跨平台、多币种的钱包
- MyEtherWallet(MEW),一款基于 Web 的钱包,可以在任何浏览器中运行
- Emerald Wallet,一款被设计来用于以太坊经典区块链的钱包,但也与其他以太坊区块链兼容
MetaMask 基础
以 Chrome 为例,访问 Google 网上应用商店,搜索 MetaMask 并添加至 Chrome
在这里插入图片描述
添加完成后 Chrome 会自动打开初始化页面
在这里插入图片描述
初次使用创建钱包
在这里插入图片描述
为钱包设置密码
在这里插入图片描述
创建密码后,MetaMask 会生成一串密语,密语是12个随机的英文单词,用于防止密码忘记。密语可以直接当成密码使用,因此需要妥善保管
在这里插入图片描述
注册完毕后就可以在 Chrome 地址栏右边的扩展程序栏点击 图标使用 MetaMask 了
在这里插入图片描述
获取测试以太
除了以太坊主网以。
评论