注意:本课程为技术课程,不谈论也不涉及任何关于数字货币的炒作。
本次团队学习重点是以太坊、以太坊客户端、以太坊坚固性编程的基础知识,所以本教程重点是掌握以太坊的核心知识点,区块链的基础知识可以作为补充。请尽你所能。另外,如果学习者觉得本节内容太难,可以先对基础知识点有个大概了解,等学习完第二、三节的实战内容后再深入学习本节内容。
一、区块链1.1简介。区块链和区块链技术在阅读本教程之前,不太了解比特币原理的同学可以先看看这篇博客。在你对比特币有了简单的了解之后,你会对区块链有更好的了解。
区块链(Blockchain)是一种链式数据结构,通过密码学将记录(块)串联起来,并对其进行加密。区块链技术,通过P2P网络和区块链,实现去中心化、不可逆、防篡改的数据存储。比特币是建立在区块链技术基础上的典型应用。通过区块链技术,我们可以将信息(数据和程序)存储在块上,并访问到区块链,从而实现信息的分散存储、不可逆和不可篡改。区块链应用是指区块链科技开发的应用。
1.2.区块链的历史2008年,一个叫中本聪的人发表了一篇名为《比特币:一种点对点电子货币系统》的论文,其中首次提到了“区块链”的概念。2009年,中本聪建立了以区块链为底层技术的比特币网络,并开发了第一个区块,被称为“创造区块”。这个阶段被称为“区块链1.0”。
由于比特币是一种电子货币系统,其主要功能是记账。但后来人们发现,区块链技术作为比特币的底层技术,其功能远不止记账。通过区块链可以解决很多关于“未知信任”的问题,比如证书的电子存管、信息记录等。于是在比特币的基础上,诞生了一个带有智能合约的区块链系统,它允许开发者通过编写智能合约来实现特定的逻辑。这个阶段被称为“区块链2.0”。这个阶段的主要代表是以太坊。
随后,人们希望提高区块链应用的性能,于是出现了EOS、ArcBlock等系统,其特点是高性能、大吞吐量。但由于超级节点和云节点的引入,弱化了“去中心化”特征,备受争议。这个阶段被称为“区块链3.0”。
由于比特币是一种扩展性不高的电子货币,而所谓的“区块链3.0”目前争议较大,部分项目的底层算法与典型的区块链完全不同,所以在区块链2.0学习以太坊是目前学习区块链的最佳途径。
1.3.区块链基础技术和算法区块链技术不是单一的技术,而是由一系列技术组成的技术栈,具有以下特点:
存储在分布式存储器中的数据是不可逆的、防篡改的和可追踪的。数据的创建和维护由所有参与者共同参与。为了实现这些特性,维持区块链应用的稳定运行,区块链技术包括分布式存储技术、密码技术、共识机制和区块链2.0提出的智能合约。
1.3.1.区块链是由区块组成的。块非常类似于数据库中的记录。每次写入数据时,都会创建一个块。
在此插入图片说明。
每个区块包含两个部分。
块头:记录当前块的特征值。
正文:实际数据。
块头包含当前块的许多特征值。
上升时间
实际数据的散列(即块主体)
前一个块的哈希
.
1.3.2.分布式存储技术不同于传统的数据存储技术。在区块链技术中,数据不是集中存储在数据中心,也不是由权威机构或大多数节点存储,而是分散存储在区块链网络中的每个节点上。
在此插入图片说明。
节点和块的关系是什么?
可以简单的用共享文档来描述:所有可以访问共享文档的账户都叫做节点。当然,所有节点需要同步共享文档,也就是说,拥有所有数据块就是一个共享文档。每个人都更新了,每个人都可以查看最新的文档。
1.3.3.密码技术为了实现数据的不可逆、防篡改和可追溯性,区块链技术采用了一系列密码算法和技术,包括哈希算法、Merkle树和非对称加密算法。
哈希算法哈希算法是一种单向函数,可以将任意长度的输入数据转换成固定长度的输出数据(哈希值),哈希值是这个输入数据的唯一数值表示。因为在计算中不可能找到哈希值相同但输入值不同的字符串,所以两个数据可以因为哈希值相同而被认为是相同的,所以经常使用哈希算法来验证数据。
在区块链中,数据存储在块中。每个块都有一个块头,块头中存储了块中所有数据哈希得到的哈希值,同时每个块也存储了前一个块的哈希值,这样就形成了区块链。如果要篡改某个块中的数据,A的hash值会发生变化,后面的块B将无法通过hash值正确指向A,所以篡改者必须篡改B中的数据.也就是说,篡改者需要对被篡改的块及其后面的所有块进行篡改,这样所有节点才能接受篡改。
Merkle树Merkle树是一种树形结构。在区块链中,Merkle树的叶节点是块中数据的哈希值,非叶节点是其子节点组合的哈希值,这样叶节点开始逐层计算,最终形成Merkle根,记录在块的头部,从而保证每一笔交易都不能被篡改。
在此插入图片说明。
非对称加密技术非对称加密技术使用两种非对称密钥:公钥和私钥。公钥和私钥有两个特征:
一个密钥用于加密信息后,另一个密钥可用于解锁公钥。通常,私钥在区块链中是保密的。非对称加密技术主要用于信息加密、数字签名和登录认证。在信息加密场景下,信息发送方A用接收方B提供的公钥对信息进行加密,B收到后用自己的私钥对加密后的信息进行解密。在重数字签名场景中,发送方A通过自己的私钥对信息进行加密,其他人通过A提供的公钥对信息进行验证,证明信息确实是A发送的,在登录认证场景中,客户端用私钥对登录信息进行加密后发送,其他人用客户端的公钥对登录信息进行认证。
RSA算法RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中也离不开它。但是很多新同事不太了解,刚好看到一本书,作者用实例简化生动的描述,让深奥的数学理论变得浅显易懂。RSA是第一个完善的公钥算法,既可用于加密,也可用于数字签名。RSA是以它的三个发明者罗恩里维斯特、阿迪萨莫尔和伦纳德阿德曼的名字首字母命名的。这种算法经受住了多年深入的密码分析。虽然密码分析者既不能证明也不能否认RSA的安全性,但恰恰说明这种算法具有一定的可信度,它已经成为目前最流行的公钥算法。RSA的安全性是基于大数分解的困难性。它的公钥和私钥是一对大素数(100到200个十进制数字或更多)的函数。从公钥和密文恢复明文的难度相当于分解两个大素数的乘积(这是公认的数学问题)。关于ECC椭圆曲线算法的详细内容,请参考本文:ECC椭圆曲线加密算法:简介1.3.4。共识机制区块链系统是一个分布式系统,分布式系统首先要解决的问题是一致性,即如何让多个孤立的节点达成共识。在集中式系统中,实现一致性几乎没有问题,因为有一个像中央服务器这样的“领导者”来统一所有节点。但是在去中心化的场景下,由于各个节点相互独立,可能会出现很多不一致的问题。例如,由于网络条件等因素,一些节点可能会出现延迟、故障甚至停机,导致节点之间的通信不可靠,因此一致性问题在分布式系统中是一个非常令人头疼的问题。
由柳勇布鲁尔提出并由林奇等人证明的CAP定理为解决分布式系统中的一致性问题提供了一种思路。CAP定理的描述如下:在分布式系统中,一致性、可用性和分区容错不能兼得。这三个术语解释如下:
一致性:所有节点同时具有相同的值(相当于所有节点访问相同的最新数据副本的可用性):每个请求都可以在有限的时间内收到一个响应,以确定是否成功。分区容忍度:分区是指某些节点由于网络原因无法与其他节点达成一致。分区容错是指网络原因造成的系统分区不影响系统的正常运行。比如由于网络原因,系统分为A、B、C、D四个区域,A、B中的节点无法正常工作,但C、D组成的区域仍然可以提供正常服务。在某些场景下,当一致性、可用性和分区容错性要求不高时,可以考虑弱化这一特性,以保证整个系统的容错性。区块链共识机制的基本思想来源于CAP定理。一些区块链应用程序中使用的共识机制如下:
共识机制应用了PoW比特币、莱特币和以太坊PoS PeerCoin、NXT的前三个阶段和以太坊PBFT超账本Fabric的第四个阶段。
PoW(工作证明)机制一般过程如下:
向所有节点广播一个新事务和一个数学问题。解数学题的节点先将事务打包成块,广播到全网其他节点,验证广播块的节点是否解了数学题(完成了一定的工作)。如果验证通过,就会接受这个块,把这个块的hash值放到下一个块中,也就是承认这个块需要解决一个数学问题,也就是所谓的挖掘,因为它在PoW机制中。这往往会消耗大量的计算能力和功率,所以节点倾向于在最长的链的基础上添加块,因为如果节点要给自己的链添加新的块,就需要重新计算一个或多个这样的数学问题(每个块都需要计算)。所以比特币中最长的链被认为是合法链,所以节点之间形成了一套“共识”。
PoW机制的优点是完全去中心化,缺点是需要依赖数学运算,资源消耗会高于其他共识机制,监督较弱。同时每次达成共识都需要全网参与操作,性能较低。
PoS(Proof of of Stack)PoS改进了PoW的缺点。PoS要求参与者预先在区块链中投入一些钱,以换取“权益”,从而成为验证者,验证者有权生成区块。PoS机制会根据存款的金额和时间给验证者分配相应的利息,同时还引入了奖惩机制。包错块的验证者将失去他的权益——,即投入的钱和生成块的权利。PoS机制的一般流程如下:
所有加入PoS机制的人都是钱的持有者,PoS算法叫做验证者。根据验证者持有的货币数量,选择一个验证者并给予其生成块的权利。如果在一定时间内没有生成块,PoS将选择下一个验证者,并授予生成块的权利。如果验证者包装欺诈交易,PoS将剥夺他的权益。PoS的优势在于:
引入利息,让一个像比特币一样发行硬币总量有限的通货紧缩体系,在一定时期后不会“无钱发行”。奖惩机制的引入使节点的操作更加可控,更好地防止攻击。与PoW相比,它不需要消耗大量的电力和计算能力来生成新的区块,缩短了达成共识所需的时间。由于PoS机制,用户需要已经持有一定数量的钱。区块链应用创建初期没有办法处理数字货币,所以使用PoS机制的区块链应用在发布时会提前卖钱,或者在初期采用PoW,让矿工拿到钱再兑换成PoS。比如以太坊目前采用PoW机制,在宁静第四阶段会过渡到PoS。
拜占庭将军问题拜占庭将军问题是分布式网络中的一个通信容错问题,可以描述为:
一群拜占庭将军各自带队,共同围攻一座城市。每支军队的行动策略仅限于攻击或疏散。因为有的部队进攻,有的部队撤退可能会产生灾难性的后果,所以将军们决定通过竞价达成协议策略,即“共进退”。由于将军们位于城市的不同方向,他们只能通过信使相互联系。在投票过程中,每个将军通过信使通知所有其他将军他的选择(进攻或撤退),以便每个将军根据自己的投票和所有其他将军发送的信息知道联合投票的结果,然后采取行动。
在此插入图片说明。
拜占庭将军的问题是他们中可能有叛徒。假设三个将军中有一个叛徒,两个忠诚的将军投进攻,一个投撤退。这时候汉奸可能会故意投攻将,投退将。这导致了一个将军领导进攻,另一个将军领导撤退。
此外,由于将领通过信使沟通,即使所有将领都很忠诚,也不能排除信使被敌人拦截甚至信使叛逃的可能。
假设有哗变的将军或者信使问题,如果忠诚的将军仍然可以通过投票决定自己的策略,那么这个系统就被说成是实现了拜占庭容错。
拜占庭问题对应的是区块链,将军是节点,信使是网络等通信系统。要解决的问题是系统在存在恶意节点和网络错误的情况下的一致性。
pbft(practical Byzantine fault tolerance)是第一个广泛应用且高效的Byzantine容错算法,当节点数量不小于时,可以容忍Byzantine节点(恶意节点)。
二、以太坊的介绍首先我们要知道为什么要学习以太坊,主要有以下四个原因:
以太坊是区块链2.0的代表。学习以太坊可以了解到,区块链科技的所有知识都引入了智能合约,拓宽了区块链的应用场景,对开发者和用户都比较友好。编写简单的区块链应用程序很容易,学习起来也很有趣。坚实度语法接近Javascript、Go等语言,入门容易。2.1.以太坊简介区块链技术通常被认为是互联网诞生以来最具颠覆性的技术。然而,自比特币诞生以来,一直没有好的区块链。基于比特币开发区块链应用非常复杂,因为比特币只是一种加密的数字货币系统,不能用于实现更广泛的商业需求。以太坊是目前使用最广泛的共享区块链系统,支持完整的应用程序开发。
与比特币不同的是,比特币只适合加密数字货币场景,缺乏图灵完备性、保存实时状态的账户概念,以及PoW机制带来的效率和资源浪费问题。以太坊作为区块链2.0的代表,旨在扩展智能合约,构建去中心化的应用平台,具有图灵完备性,更高效的共识机制,支持智能合约等应用场景,让开发者可以在以太坊上轻松开发基于区块链的应用。
2.1.1.以太坊的发展2014年,Vitalik Buterin发表了文章《以太坊:一个下一代智能合约和去中心化应用平台》。同年,布特林在迈阿密比特币大会上宣布启动以太坊项目,并提出了多项创新的区块链技术。2015年,以太坊CCO Stephan Tual在官方博客上宣布以太坊系统诞生,主上线。
以太坊发展至今,经历了边疆、家园、大都市三个阶段。第四阶段“宁静”将是以太坊的最后一个阶段,目前还没有计划上映日期。
2.1.2.以太坊的特点以太坊团队和外界将以太坊描述为“世界计算机”,意思是它是一个开源的、全球去中心化的计算架构。它执行一个名为智能合约的程序,使用区块链来同步和存储系统状态,并使用一种名为以太坊的加密数字货币来衡量和约束操作的资源成本。同时,以太坊提供了一系列接口,使得开发者可以通过以太坊开发去中心化的Web应用DApps。
2.1.3.智能合约与比特币相比,以太坊最大的特点就是引入了智能合约。智能合约本质上是一个可以在特定条件下被触发并执行特定操作的书面程序。因为区块链是不可逆的,不可篡改的,所以智能合同与区块链结合后,就变成了“可执行”的合同。
以太坊可以作为去中心化的应用平台和“世界计算机”,其核心是智能合约。智能合约的引入使开发人员能够实现许多(理论上任何)业务逻辑。如果说比特币是通过区块链技术开发的特定计算器,那么引入智能合约的以太坊就是基于区块链技术的通用计算机。可以简单理解为:比特币的交易系统是一个写死的智能合约,而以太坊给了开发者智能合约的开发权限。
以太坊为智能合约提供了全面的支持,包括编写智能合约的编程语言Solidity和运行智能合约的以太坊虚拟机(EVM)。
2.1.4.ghost协议Ghost契约在英文中被称为“贪婪坟墓观察子树”(Ghost)协议。在介绍ghost协议之前,先介绍一下以太坊中的三级块、三级块奖励和三级块引用奖励这三个概念。
在此插入图片说明。
假设当前以太坊区块链中的块高(区块链上的块数)为6,现在发生了新的交易。矿工A首先将事务打包成块7,在矿工A向其他节点广播块7的时间内,矿工B和矿工C分别产生块8和块9。块7、块8和块9都指向块6,即块6是它们的父块。因为第一次产生块7,所以块7被认为是有效块,而块8和块9是第三级块(无效块)。
在此插入图片说明。
现在链上的块的高度是7,在此基础上产生新的事务,打包到块10中。在以太坊中,块10可以引用其父块7,也可以引用其第三级块块8和块9。而且8块和9块的矿工会得到一个奖励,叫做三级奖励。除了基本奖励,第10区块的矿工还会因为引用了第三区块而获得额外的第三引用奖励。
Ghost协议是以太坊的一大创新。因为比特币中的块释放时间设计为10分钟,以太坊中的块释放时间为了提高块释放速度设计为12秒(实际约14~15秒),这样的高速块释放意味着高速确认,会带来块的高失效率和低安全性。因为区块广播到全网需要一定的时间,如果矿工A挖出了一个区块,而矿工B恰好在A的区块传播到B之前挖出了另一个区块,那么矿工B的区块就无效了,对区块链的网络安全没有贡献。另外,这样的高速确认也会带来中心化的问题:如果A拥有全网30%的计算能力,B拥有10%,那么A会有70%的时间产生无效块,而B会有90%的时间产生无效块。这样B永远追不上A,后果就是A通过自己的计算力份额对挖掘过程拥有实际控制权,造成计算力垄断。
Ghost协议就是为了解决上述问题而引入的。该议定书的主要内容如下:
计算最长链时,不仅包括当前块的父块和祖先块,还包括祖先块的无效后代块(第三级块)。综合考虑它们来计算哪个块具有支持它的最大工作负载证书。这就解决了网络安全的问题。以太坊向有贡献的废块支付87.5%的奖励(三级块奖励),确认新块为“三级块”,将其纳入计算的“侄子块”将获得12.5%的奖励(三级块引用奖励)。这使得生产无效块的矿工可以参与区块链网络贡献并获得奖励,解决了集权倾向的问题。第三级区块可以被其父母的第二代到第七代后代区块引用到最深层。这样做是为了降低引用第三级块的计算复杂度。过多的三级块引用奖励会剥夺矿工在主链上挖矿的动力,使得矿工倾向于转向开放攻击者链进行挖矿(即开放攻击者可能会恶意产生大量无效块,无限制的引用会诱导矿工转移到攻击者链上。计算表明,有激励的五层ghost协议即使在阻塞时间为15s的情况下,也取得了95%以上的效率,而对于计算能力为25%的矿工来说,集中化带来的好处不到3%2.1.5。以太坊的组成部分在以太坊,包括P2P网络、共识机制、事务、状态机和客户端。
P2P网络:运行在以太网主网上,可以通过TCP端口30303访问,运行一个叫 vp2p的协议。共识机制:以太坊目前使用名为Ethash的POW算法,未来计划过渡到名为Casper的POS算法。事务:以太坊中的事务本质上是网络消息,包括发送方、接收方、值和数据载荷。状态机:以太坊的状态转换由以太坊虚拟机(EVM)处理,它可以将智能合约编译成机器码并执行。客户端:用户与以太坊交互的软件实现,最突出的有Go-Ethereum(Geth)和奇偶校验。2.1.6以太坊中的概念账户:以太坊中的账户类似于银行账户和应用账户,每个账户都有一个20字节的地址。账户分为普通账户(也称为外部自有账户,EOA)和合约账户。普通账户是以太坊用户创建的账户,包括地址、余额、随机数;合同帐户是在创建智能合同时建立的帐户,包含存储空间和合同代码状态。状态是一个地址,由账户与两个账户之间的价值转移和信息的状态转换组成。该地址是帐户ECDSA公钥的Keccak散列的右160位数字,通过它可以在以太坊上接收或发送交易。在以太网扫描上,可以通过地址查询一个账户的信息交易:以太广场的交易不仅包括发送和接收以太坊,还包括向合约账户发送交易调用合约代码和向空用户发送交易生成以交易信息为代码块的合约账户。Gas:Gas ether square中的一种机制,用作执行智能合约或交易操作的虚拟燃料。由于以太坊是图灵完全的,为了避免开发者无意或恶意编写无限循环浪费或滥用资源,以太坊的每一笔交易都需要支付一定的油费(燃油费),即需要支付一定数量的以太坊作为油费。气的量通常是交易发起者指定并支付的挖矿:与比特币类似,以太坊也是通过挖矿生成区块。在以太坊目前的PoW机制下,每当有交易发出并播出,就会吸引矿工将交易打包成块。每生成一个区块,都会有固定的奖励给矿工。目前固定奖励是3醚。同时,该区块所有作业所需的气体也将奖励给矿工。与比特币不同的是,在以太坊生成三级区块的矿工可能获得三级区块奖励,报价三级区块的矿工将获得三级区块引用奖励DApp(去中心化应用):通过智能合约,开发者可以设计想要的逻辑,相当于网站的后端。DApp相当于一个完整的网站(前端和后端),所以DApp=智能合约Web前端。以太坊提供了一个名为web3.js的Javascript库,通过web3.js可以实现Web与以太坊区块链的交互以及与智能合约的交互,方便开发者创建DApp2.2、以太坊基础2.2.1,以太坊中的货币称为以太坊,单位为以太,也称为ETH或符号。以太可以分为更小的单位,最小的单位是卫,1以太=卫。以太坊所有单元的名称及其关系如下:
在此插入图片说明。
2.2.2.以太坊钱包以太坊钱包是一个用于创建和广播交易的应用程序。常用的钱包有
MetaMask是一个基于浏览器扩展的钱包,可以很容易地添加到支持扩展的浏览器中,如Chrome,FireFox,Jaxx,跨平台和多币种钱包MyEtherWallet(MEW),以及基于web的钱包,可以在任何浏览器中运行Emerald Wallet。这款钱包专为经典的以太坊区块链设计,同时也兼容以太坊的其他区块链。MetaMask Foundation以Chrome为例,访问谷歌在线应用商店,搜索MetaMask并添加到Chrome中。
在此插入图片说明。
Chrome添加后会自动打开初始化页面。
在此插入图片说明。
第一次创建钱包
在此插入图片说明。
为钱包设置密码
在此插入图片说明。
创建密码后,MetaMask会生成一串密语,是12个随机的英文单词,防止密码被忘记。密码可以直接作为密码使用,需要妥善保管。
在此插入图片说明。
注册后可以点击Chrome地址栏右侧扩展栏的图标使用MetaMask。
在此插入图片说明。
获取测试乙醚
除了以太坊主网,以太坊还提供了几个公共测试网,如Ropsten、Kovan、Rinkeby、Goerli等,还支持局域网测试网和自建测试网。这里我们切换到Ropsten测试网络。
然后点击购买按钮,点击测试水管下的获取乙醚。
在此插入图片说明。
在打开的页面中单击“从水龙头请求1乙醚”以获取测试乙醚。当然,你可以多次点击它。
在此插入图片说明。
测试乙醚只用于测试,没有其他价值。检测结束后,剩余的乙醚可以送到水龙头账户,捐赠给水龙头,供他人检测。
2.3.以太坊交易的数据结构在以太坊网络中,交易执行属于一个交易。它具有原子性、一致性、隔离性和持久性的特点。
原子性:做或不做是不可分割的最小执行单位。一致性:同一笔交易的执行不可避免地会从一种一致性状态变为另一种与邰方账簿的一致性状态。隔离:事务在执行过程中不会受到其他事务的干扰。持久性:一旦交易被提交,对以太坊账簿的更改是永久的。后续操作不会对其产生任何影响。以太坊交易的本质是由外部拥有的账户发起的签名消息,通过以太坊网络传输,序列化后记录在以太坊区块链中。在EVM,交易是唯一可以触发状态变化或导致合同执行的东西。
2.3.1.交易的数据结构以太坊的数据结构可以分为四个部分:nonce、gas、交易目标和消息(主体部分)和交易签名。
在此插入图片说明。
开头是一个uint64类型的数,叫做随机数。用于取消交易、防止双花和修改以太坊账户的Nonce值。
第二部分是关于事务执行限制的设置,gas是以太坊虚拟机愿意运行的燃料上限。汽油价格是愿意支付的燃料的单位价格。GasPrcie * gas是愿意为此交易支付的最高手续费。
第三部分是交易发送方输入到以太坊虚拟机执行这个交易的初始信息:虚拟机操作对象(接收方To),交易发送方转移到操作对象的资产(值),虚拟机运行时输入。当To为空时,表示虚拟机没有可操作对象,此时虚拟机将使用输入的内容部署新的契约。
第四部分是交易发送方的签名结果,从交易内容和签名结果可以推导出签名人,即交易发送方的地址。以上总结如下:
Nonce:由发起方EOA发布的序列号,用于防止事务消息重放。气价:交易发起方愿意支付的气单价(卫)。启动气:交易发起人愿意支付的最大气价。To:以太坊的目的地址。Value:要发送到目的地的以太网数量。数据:可变长度二进制数据有效载荷。v,r,s:发起者EOA的ECDSA签名的三个组成部分。事务消息的结构使用递归长度前缀(RLP)编码方案进行序列化,该编码方案是专门为以太坊中精确和字节完美的数据序列化而创建的。2.3.2.在以太坊黄皮书中定义了交易中的nonce,nonce是一个标量值,它等于从这个地址发送的交易数,或者对于与code相关联的帐户,等于该帐户创建的合同数。因此,nonce具有以下特征:
在区块链中,Nonce不作为帐户状态的一部分显式存储。相反,它是通过计算发送地址上已确认的事务数来动态计算的。nonce值也用于防止帐户余额的误算。Nonce强制来自任何地址的事务按顺序处理,没有间隔,不管节点接收它们的顺序。使用nonce来确保所有节点计算相同的余额和正确的串行交易,这相当于一种防止比特币“双重支付”(“重放攻击”)的机制。但由于以太坊是跟踪账户余额的,并不单独跟踪UTXO,所以只有在账户余额计算错误的情况下才会发生“重复支付”。nonce机制可以防止这种情况发生。2.3.3.并发性和现时以太坊是一个允许操作(节点、客户端、DApps)并发的系统,但是强制执行单例状态。例如,当块被释放时,只有一个系统状态。如果我们有多个独立的钱包应用程序或客户端,如MetaMask和Geth,它们可以使用相同的地址生成交易。如果我们希望它们同时发送事务,我们如何设置事务的nonce?一般有两种方式:
使用服务器为每个应用分配nonce,先来先服务——可能会出现单点故障,失败的事务会阻塞后续的事务。生成事务后,不会为其分配nonce或签名,而是将其放入队列中等待。另一个节点跟踪随机数并对交易进行签名。还存在单点故障的可能,通过跟踪nonce和签名节点无法实现真正的并发。2.3.4交易中气体的中文翻译为:气体和汽油,代表一种可燃气体。这形象的比喻了以太坊的交易费计算模式,不同于比特币中直接支付比特币作为转账费用。以太坊被认为是一个分散的计算网络。当你在本街区发送令牌、执行合同、转移以太坊或者做其他事情时,计算机在处理这个事务时需要计算和消耗网络资源,所以你必须支付燃料费购买燃料,才能让计算机为你工作。最后的燃料费作为手续费支付给矿工。
注意:可以在Etherscan上查询气价和确认时间的关系,如下图。
在此插入图片说明。
因为手续费等于gasPrice * gasUsed,所以用户在转账时无法提前预测,尤其是在执行智能合约时。存在的风险是,当用户的交易涉及恶意智能合约时,合约的执行会消耗无限的燃料,从而导致交易方余额的全部消耗(恶意智能合约可能是程序Bug,比如合约执行陷入死循环)。
为了避免合同中的错误导致不可预测的油耗,用户需要在发送交易时设置允许油耗的上限,即gasLimit。这样一来,不管合约好不好,最坏的情况就是消耗gasLimit燃油。
但是,交易必须支付的燃料已按交易已执行的计算金额记录在块中。如果你不想花太多的油,故意把gasLimit设得太低帮助不大。你必须付出足够的燃料来支付这个交易所必须的计算资源。如果交易尚未完成,且燃料已用完,则会出现“汽油用完”错误。特别是,即使交易失败,也必须支付占用计算资源的手续费。举个例子,如果你通过契约投票给TFBOYS,设置gasPrice=2 gwei,gasLimit=40000(投票需要40001个燃料),你最终投票失败,仍然要支付40000 * 2 gwei=80000 gwei=0.00008 eth。
另外,如果最终gasUsed低于gasLimit,也就是燃油没有用完。然后交易完成后会将gasLimit-gasUsed返还给您。比如你给另一个账户B发1乙醚,设置气限为400000,那么400000-21000会返回给你。
注:21000用于标准转账交易。因此,对于标准转账交易,您可以将gasLimit设置为21000。
2.4.相比比特币的UTXO余额模型,以太坊采用的是“账户”余额模型。以太坊丰富了账户的内容,除了余额还可以存储任意数量的数据。并利用账户数据的可维护性建立智能合约账户。我们先对比一下比特币的UTXO余额模型和以太坊账户,来说明它们各自的优缺点和适用性。
2.4.1.比特币UTXO和以太坊的账户结构对比在目前的区块链项目中,记录的保存方式主要有两种,一种是账户/余额模型,另一种是UTXO模型。比特币采用UTXO模型,以太坊和EOS采用账户/余额模型。
2.4.2.比特币UTXOUTXO是未用交易输出的缩写,意思是* *未用输出,* *可以简单理解为未用收据。例如,韩梅梅收到了一枚她没有使用的比特币。这个比特币对她来说就是一个UTXO。关于UTXO的详细介绍,可以查看这篇文章。
**UTXO的核心设计思想是记录事务事件,但不记录最终状态。* *要计算一个用户有多少比特币,需要把他钱包里所有的UTXO加起来,结果就是他持有的币数。UTXO模型在转账的时候以UTXO为单位,也就是说在支付的时候,调用的是UTXO的整数倍,比如1个UTXO,3个UTXO,没有0.5个UTXO这种东西。
比特币在基于UTXO的结构中存储关于用户余额的数据。系统的整个状态是一组UTXOs。每个UTXO都有一个拥有者和一个面值(就像不同的硬币一样),交易会花费几个UTXO,根据规则会产生几个新的UTXO。每个引用的输入必须是有效的且尚未被消耗。对于交易,它必须包含每个输入的所有者匹配的签名,并且总输入必须大于或等于总输出值。所以系统中用户的余额就是带私钥的UTXO的总值。2.4.3.以太坊为什么不用UTXO做以太坊账号?显然,因为麻烦,以太坊的做法更直观。以太坊中的状态是系统中所有账户的列表,每个账户都包含一个余额和以太坊专门定义的数据(代码和内存)。如果发送账户有足够的余额支付,则交易有效。这种情况下,发送账户会先扣款,接收账户会记录这笔收入。如果承兑账户有相关代码,该代码将自动运行,其内部存储可能发生变化,或者该代码可能向其他账户发送附加消息,从而导致进一步的借贷资金关系。
2.4.4优缺点对比比特币UTXO的优点:
更高程度的隐私:如果用户在每次交易时都使用新的地址,通常很难将账户相互联系起来。这在很大程度上适用于currency,但并不适合任何dapp,因为dapp通常涉及复杂的状态跟踪和用户绑定,可能不存在currency这样简单的用户状态划分方案的潜在可扩展性:UTXO在理论上更符合可扩展性要求,因为我们只需要依靠拥有UTXO的人来维护基于Merkle树的所有权证书。即使包括主人在内的所有人都决定忘记数据,也只有主人会遭受相应UTXO的损失。在账户模式下,如果每个人都丢失了Merkle树中与账户对应的部分,就会使得与账户相关的消息完全无法处理,包括向其汇款。以太坊账户模式的优势:
可以节省大量空间:UTXOs不是单独存储,而是集成到一个账户中;每笔交易只需要一个输入和一个签名,并产生更好的输出可替代性:货币本质上是同质和可替代的;UTXO的设计从源头上把钱分为“可花”和“不可花”两类,在实际应用中很难把对应的模型变得更简单:更容易编码和理解,尤其是在设计复杂的脚本时,UTXO的脚本逻辑复杂时更令人费解,便于维护持久的轻节点:只要向特定方向扫描状态树,轻节点就可以很容易地随时访问与账户相关的所有数据。而且UTXO的每一个事务都会改变状态引用,这对于相应的节点长时间运行Dapp会有很大的压力。2.4.5.总结比特币以太坊对现金系统的设计和定位,应用平台数据去中心化,形成交易列表(账簿)交易和账户状态交易对象UTXO账户代码控制脚本智能合约。
2.5.以太坊账户类型作为一个智能合约运营平台,以太坊将账户分为两类:外部账户(EOAs)和合约账户,简单介绍如下:
在此插入图片说明。
2.5.1.对外账户(EOA)对外账户是由人控制的,也就是常规意义上的普通账户。外部账户包含以太坊的余额,主要功能是发送交易(是广义的交易,包括货币转账和触发合同码)。它由用户的私钥控制,没有关联的代码。以太坊中所有交易的发起者都是外部账户。
外部账户特征概述:
拥有以太平衡。可以发送交易,包括合同代码的转移和执行。由私钥控制。没有相关的可执行代码。2.5.2.合约账户(CA)合约账户有时也称为内部账户,有相应的以太余额和关联代码。它由代码控制,可以通过事务或来自其他契约的调用消息触发代码执行。执行代码时,可以操作自己的存储空间,也可以调用其他契约。
合同账户特征概述:
拥有以太平衡。有相关的可执行代码(合同代码)。交易或其他合同消息可以调用合同代码。当执行合同代码时,可以调用其他合同代码。当执行协定代码时,它可以执行复杂的操作,并永久地更改协定中的数据存储。如果对概念理解不深,可以尝试先学习后半部分。本教程内容有限。我推荐你有精力去读以下几本书:
区块链学习书籍区块链入门教程IBM教程参考自:
【比特币白皮书】https://www . 8 BTC . com/wiki/Bitcoin-a-peer-to-peer-electronic-cash-system)以太坊白皮书超级书白皮书闪电网白皮书注:本系列来自datawhale团队学习教程,根据最后同学的反馈进行了重新整理。作者:黄,浩波,尤尔克,唐。