注:本教程为技术教程,不谈论、不炒作任何数字货币。
本次团队学习重点是以太坊的基础知识,以太坊的客户端,以太坊的坚固性编程。所以本教程重点在于掌握以太坊的核心知识点,区块链的基础知识可以作为补充。请尽力而为。另外,如果学习者觉得本节内容太难,可以先对基础知识点有一个大概的了解,等第二、三节实战内容完成后再深入学习本节内容。
一、区块链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中的数据,会导致A的hash值发生变化,后面的块B将无法通过hash值正确指向A,这样篡改者就必须篡改B中的数据……………
Merkle树Merkle树是一种树形结构。在区块链,Merkle树的叶节点是块中数据的哈希值,非叶节点是其子节点的哈希值。这样叶子节点开始一层一层往上工作,最后形成一个Merkle根,记录在块头,这样就保证了每一个事务都不能被篡改。
在此插入图片描述。
非对称加密技术非对称加密技术使用两种非对称密钥:公钥和私钥。公钥和私钥有两个特征:
一个密钥加密信息后,另一个密钥可以用来解锁。通常,公钥可以公开,而私钥在区块链中是保密的。非对称加密技术主要用于信息加密、数字签名和登录认证。在信息加密场景下,信息发送方A用接收方B提供的公钥对信息进行加密,B收到后用自己的私钥对加密后的信息进行解密。数字签名场景下,发送方A用自己的私钥加密信息,其他人用A提供的公钥验证信息,证明信息确实是A发送的,登录认证场景下,客户端用私钥加密登录信息发送,其他人用客户端的公钥认证登录信息。
算法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(工作证明)机制一般过程如下:
向所有节点广播一个新事务和一个数学问题。最先解决数学问题的节点将事务打包成块,向全网广播的其他节点验证广播块的节点是否解决了数学问题(完成了一定的工作量)。如果验证通过,该块将被接受,该块的哈希值将被放入下一个块,这意味着该块需要解决一个数学问题,因为PoW机制,这就是所谓的挖掘。这往往会消耗大量的计算能力和功率,因此节点倾向于在最长的链的基础上添加块,因为如果节点想要在自己的链上添加新的块,就需要重新计算一个或多个这样的数学问题(每添加一个块就要重新计算一次)。因此,比特币中最长的链被认为是合法链,从而在节点间形成一组“共识”。
PoW机制的优点是完全去中心化,缺点是依赖于数学运算,因此资源消耗高于其他共识机制,监督较弱。同时,每次达成共识都需要全网参与操作,因此性能较低。
PoS(Proof of of Stack)PoS改进了PoW的缺点。PoS参与者需要在区块链上预先放置一些钱作为“股本”,从而成为有权生成块的验证者。PoS机制会根据存款的金额和时间给验证者分配相应的利息。同时还引入了奖惩机制。装错块的验证者将失去他——的权益,也就是投入的钱和生成块的权利。PoS机制的一般流程如下:
加入PoS机制的都是钱的持有者,称为验证者。PoS算法根据验证者持有的货币量,选择其中一个验证者给予生成区块的权限。如果在一定时间内没有生成块,PoS将选择下一个验证者来授予生成块的权利。如果验证者包装欺诈交易,PoS将剥夺他的权益。PoS的优势在于:
引入利息,让比特币这种硬币数量有限的通缩体系,在一定时间后不会“硬币用完”。引入奖惩机制,使节点的操作更可控,同时更好地防止攻击。与PoW相比,它不需要消耗大量的电力和计算能力来生成新的块。与PoW相比,它缩短了达成共识所需的时间。因为PoS机制要求用户已经持有一定数量的货币,在区块链应用创建初期没有办法处理数字货币,所以使用PoS机制的区块链应用在发布时会提前卖钱,或者在初期采用PoW,让矿工拿到钱再转换成PoS。比如以太坊现阶段采用PoW机制,宁静第四阶段会过渡到PoS。
拜占庭将军问题拜占庭将军问题是分布式网络中的一个通信容错问题,可以描述为:
一群拜占庭将军各自带领一队人围攻一座城市。每支军队的行动策略仅限于进攻或撤退。因为有的部队进攻,有的部队撤退,可能会造成灾难性的后果,于是将军们决定通过竞价达成协议策略,即“共进退”。由于将军们位于城市的不同方向,他们只能通过信使相互交流。在投票过程中,每个将军通过信使通知所有其他将军他的选择(进攻或撤退),以便每个将军根据自己的投票和所有其他将军发送的信息知道共同投票的结果,然后采取行动。
在此插入图片描述。
拜占庭将军的问题是他们中可能有叛徒。假设三个将军中有一个叛徒,一个忠诚的将军投进攻,一个投撤退。这时候汉奸可能会故意投攻,投退的将军投退。这导致一名将军进攻,另一名将军撤退。
此外,由于将军之间通过信使相互沟通,即使所有将军都很忠诚,也不能排除信使被敌人拦截,甚至信使叛变。
假设出现哗变将军或信使问题等情况,如果忠诚的将军仍能通过投票决定自己的策略,则该系统称为拜占庭容错。
拜占庭问题对应区块链,将军是节点,信使是网络等通信系统。需要解决恶意节点和网络错误存在下的系统一致性问题。
PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错)是第一个广泛使用且高效的拜占庭容错算法,当节点数量不小于时,可以容忍拜占庭节点(恶意节点)。
二。以太坊简介首先我们要知道为什么要学习以太坊,主要有以下四个原因:
以太坊是区块链2.0的代表。学习以太坊可以学到区块链科技的所有知识,智能合约的引入,拓宽了区块链的应用场景。它对开发人员和用户友好,并且很容易编写简单的区块链应用程序。学习Solidity语法很有趣,接近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 contract在英文中是“贪婪最重观察子树”(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%。以太坊的组成部分在以太坊,包括P2P网络、共识机制、事务、状态机和客户端。
P2P网络:运行在以太坊主网上,可以通过TCP端口30303访问,运行一个叫 VP2P的协议。共识机制:以太坊目前使用的是名为Ethash的POW算法,未来计划过渡到名为Casper的POS算法。事务:以太坊中的事务本质上是网络消息,包括发送方、接收方、值和数据载荷。状态机:以太坊的状态转换由以太坊虚拟机(EVM)处理,它可以将智能合约编译成机器码并执行。客户端:用户与以太坊交互的软件实现,最突出的是Go-Ethereum(Geth)和奇偶校验。2.1.6以太坊中的概念账户:以太坊中的账户类似于银行账户和应用账户,每个账户都有一个20字节的地址。账户分为普通账户(也称为外部自有账户,EOA)和合约账户。普通账户是以太坊用户创建的账户,包括地址、余额、随机数;合同账户是创建智能合同时建立的账户,包含存储空间和合同代码状态:状态是由账户与两个账户之间的价值转移和信息状态转换组成的地址;该地址是帐户ECDSA公钥的Keccak散列的最右边的160位,通过它可以在以太坊上接收或发送交易。在以太扫描上,可以通过地址查询一个账户的信息交易:以太坊的交易不仅包括发送和接收以太坊的交易,还包括向合约账户发送交易调用合约代码,向空用户发送交易生成以交易信息为代码块的合约账户。Gas: Gas是以太坊中的一种机制,用于执行智能合约或交易操作的虚拟燃料。由于以太坊是Turing complete,为了避免开发者无意或恶意编写的无限循环等资源的浪费或滥用,以太坊的每一笔交易都要支付一定的燃气(燃油费),即一定数量的以太坊作为燃气。气的量通常是交易发起者指定并支付的挖矿:与比特币类似,以太坊也是通过挖矿生成区块。在以太坊目前的PoW机制下,每当一个交易发出并广播,就会吸引矿工将交易打包成块。每生产一块都会有矿工固定奖励,目前的固定奖励是3醚。同时,该区块所有作业所需的天然气也将奖励给矿工。与比特币不同的是,在以太坊生成三级区块的矿工可能获得三级区块奖励,报价三级区块的矿工将获得三级区块引用奖励DApp(去中心化应用):通过智能合约,开发者可以设计出想要的逻辑,相当于网站的后端。DApp相当于一个完整的网站(前端和后端),所以DApp=智能合约web前端。以太坊提供了一个名为web3.js的Javascript库,通过这个库可以实现web和以太坊区块链的交互和智能合约,方便开发者创建DApp2.2,以太坊基础2.2.1,以太坊中的货币,单位为ETH,也叫ETH或symbol 。以太可以分为更小的单位,最小的单位是卫,1以太=卫。以太坊单位的名称及其关系如下:
在此插入图片描述。
2.2.2,以太坊钱包以太坊钱包是一个创建和广播交易的应用。常用的钱包有
MetaMask是一个基于浏览器扩展的钱包,可以很容易地添加到Chrome、FireFox和其他支持扩展的浏览器中。Jaxx,跨平台多币种钱包MyEtherWallet(MEW),一个基于网络的钱包,可以在任何浏览器中运行Emerald Wallet。一款为以太坊经典区块链设计的钱包,同时也兼容其他以太坊区块链。MetaMask基金会。以Chrome为例,访问谷歌在线应用商店,搜索MetaMask并添加到Chrome中。
在此插入图片描述。
Chrome添加后会自动打开初始化页面。
在此插入图片描述。
首次使用创建钱包
在此插入图片描述。
为钱包设置密码
在此插入图片描述。
密码创建后,MetaMask会生成一串密语,是12个随机的英文单词,防止密码被忘记。密语可以直接作为密码,需要妥善保管。
在此插入图片描述。
注册后可以点击Chrome地址栏右侧扩展栏的图标使用MetaMask。
在此插入图片描述。
获取测试乙醚
除了以太坊的主网,以太坊还提供了Ropsten、Kovan、Rinkeby、Goerli等几个公共测试网络,还支持局域网测试网络和自建测试网络。这里我们切换到Ropsten测试网络。
然后点击购买按钮,点击测试水管下方的获取乙醚。
在此插入图片描述。
单击打开页面中的“从水龙头请求1乙醚”以获取1份测试乙醚。当然可以多次点击。
在此插入图片描述。
测试乙醚仅用于测试,没有其他数值。检测后剩余的乙醚可以送到水龙头账户,捐赠给水龙头让别人检测。
2.3.以太坊交易的数据结构在以太坊网络中,交易执行属于一个交易。它的特点是原子性、一致性、孤立性和持久性。
原子性:是不可分割的最小执行单位,要么做,要么不做。一致性:当执行同一笔交易时,必须与邰方账簿从一种一致性状态变为另一种一致性状态。隔离:事务在执行过程中不会受到其他事务的干扰。持久性:一旦交易被提交,对以太坊账簿的修改是永久的。后续操作不会对其产生任何影响。以太坊交易的本质是由外部拥有的账户发起,通过以太坊网络传输,序列化后记录在以太坊区块链上的签名消息。交易是唯一可以触发状态变化或导致合同在EVM执行的事情。
2.3.1.交易数据结构以太坊的数据结构可以分为四个部分:nonce、gas、交易目标和消息(主体部分)和交易签名。
在此插入图片描述。
开头是一个uint64类型的数字,称为随机数。用于取消交易、防止双花和修改以太坊账户的Nonce值。
第二部分是关于交易执行限制的设置。气是以太坊虚拟机愿意用的燃料上限。汽油是人们愿意支付的单位汽油价格。GasPrcie * gas是愿意为此交易支付的最高手续费。
第三部分是交易发送方输入以太坊虚拟机执行这个交易的初始信息:虚拟机操作对象(receiver to),从交易发送方转移到操作对象的资产(Value),虚拟机运行时输入。当To为空时,意味着虚拟机没有操作对象。此时,虚拟机将使用输入内容部署新合同。
第四部分是交易发送者的签名结果,可以用来推断签名者的地址。以上内容总结如下:
Nonce:由发起方EOA发布的序列号,用于防止事务消息被重播。气价:交易发起方愿意支付的气单价(卫)。启动气:交易发起人愿意支付的最大气价。收件人:目的地以太坊地址。值:要发送到目的地的醚的数量。数据:可变长度二进制数据有效载荷。v、r、s:赞助商EOA ECD sa签名的三个组成部分。使用递归长度前缀(RLP)编码方案对事务的结构进行序列化,这是专门为以太坊中精确和字节完美的数据序列化而创建的。2.3.2.根据以太坊黄皮书的定义,交易中的nonce是一个标量值,等于从这个地址发出的交易数,或者对于与code关联的账户,等于这个账户创建的合约数。因此,nonce具有以下特征:
在区块链中,Nonce不作为帐户状态的一部分显式存储。而是通过计算发送地址的确认交易数来动态计算。nonce值也用于防止帐户余额的误算。Nonce强制来自任何地址的事务按顺序处理,没有间隔,不管节点接收它们的顺序。使用nonce来确保所有节点计算相同的余额和正确的串行交易,这相当于用于防止比特币“双重支付”(“重放攻击”)的机制。但由于以太坊是跟踪账户余额,并不单独跟踪UTXO,所以只有在账户余额计算错误的情况下才会发生“重复支付”。Nonce机制可以防止这种情况发生。2.3.3、并发性和nonce以太坊是一个允许操作(节点、客户端、DApps)并发的系统,但是强制执行singleton状态。例如,当块被释放时,只有一个系统状态。如果我们有多个独立的钱包应用程序或客户端,如MetaMask和Geth,它们可以使用相同的地址来生成交易。如果我们希望它们同时发送事务,我们如何设置事务的nonce?一般来说,有以下两种做法:
使用服务器为每个应用程序分配随机数,先到先服务——可能会出现单点故障,并且失败的事务将阻塞后续事务。生成事务后,nonce不会被分配和签名,而是被放入队列中等待。另一个节点跟踪nonce并对事务进行签名。还有可能出现单点故障,跟踪nonce和signature的节点无法实现真正的并发。2.3.4.交易中gasGas的中文翻译是:气体和汽油,代表一种可燃气体。这形象地比喻了以太坊的交易费计算模式,不同于比特币中直接支付比特币作为转账费用。以太坊被认为是一个分散的计算网络。当你在这个街区上发送Token、执行合约、转移以太坊或者做其他事情的时候,计算机在处理这个交易的时候需要进行计算来消耗网络资源,所以你要支付燃料来让计算机为你工作。最后的燃料费作为手续费支付给矿工。
注意:可以在Etherscan上查询气价和确认时间的关系,如下图。
在此插入图片描述。
因为手续费等于gasPrice * gasUsed,所以gasUsed无法提前预测用户何时转账,尤其是执行智能合约时。存在这样的风险,当用户的交易涉及恶意智能合约时,合约的执行会消耗无限的燃料,从而导致交易对手余额的全部消耗(恶意智能合约可能是程序Bug,比如合约执行陷入死循环)。
为了避免合同中的错误导致不可预测的油耗,用户需要在发送交易时设置允许油耗的上限,即gasLimit。不管合同好不好,最坏的情况是消耗有限的汽油量。
但是,交易所必须支付的燃料已通过交易已执行的计算金额记录在块中。如果你不想花太多的燃料,故意设置太低的汽油限制不会有多大帮助。你必须付出足够的燃料来支付这个交易所必须的计算资源。如果交易尚未完成,且燃料已用完,则会出现“汽油用完”错误。特别是,即使交易失败,你也要为占用的计算资源支付手续费。举个例子,你通过一个合约给TFBOYS投票,设定gasPrice=2 gwei,gasLimit=40000(实现投票需要40001的油费),最后你投票失败,仍然要支付40000 * 2 GWEI=80000 GWEI=0.0008 ETH。
此外,如果最终使用的气体低于气体极限,燃料不会用尽。剩余的燃料(gasLimit-gasUsed)将在交易后返还给您。比如你给另一个账户B发1乙醚,把气限设为40万,就有40万-21000返给你。
注:21000用于标准转账交易。因此,对于标准转账交易,您可以将gasLimit设置为21000。
2.4.对比以太坊的账户和比特币的UTXO余额模型,以太坊使用的是“账户”余额模型。以太坊丰富了账户内容,除余额外,可以自行存储任意数量的数据。并利用账户数据的可维护性建立智能合约账户。我们先来对比一下比特币和以太坊账户的UTXO余额模型,说明各自的优缺点和适用性。
2.4.1.比特币UTXO和以太坊的账户结构对比。在当前的区块链项目中,有两种主要的记录方式,一种是账户/余额模型,另一种是UTXO模型。比特币采用UTXO模型,以太坊和EOS采用账户/余额模型。
2.4.2.比特币UTXOUTXO是Unspent Transaction Output的缩写,意思是* *未使用的输出,* *可以简单理解为没有用完的收藏。例如,韩梅梅收到了一枚比特币,但她没有使用它。这个比特币对她来说就是个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的优点:
更高程度的隐私:如果用户在每次交易时都使用新的地址,通常很难将账户相互联系起来。这在很大程度上适用于money,但不适用于任何dapp,因为dapp通常涉及复杂的状态跟踪和用户绑定,可能没有money那么简单的用户状态划分方案潜在的可扩展性:UTXO在理论上更符合可扩展性要求,因为我们只需要依靠拥有UTXO的人来维护基于Merkle树的所有权证书。即使包括主人在内的所有人都决定忘记数据,那么也只有主人会遭受相应UTXO的损失。“在账户模式下,如果每个人都丢失了Merkle树中与账户对应的部分,就会使与账户相关的消息完全无法处理,包括向其汇款。以太坊账户模式的优势:
可以节省很多空间:UTXOs不是单独存放,而是合并到一个账号中;每个交易只需要一个输入,一个签名和一个输出。更好的可替代性:货币具有同质性和可替代性;UTXO的设计从源头上将钱分为“可花”和“不可花”两类,这使得实际应用中很难有更简单的对应模型:更容易编码和理解,尤其是在设计复杂的脚本时。当UTXO的脚本逻辑比较复杂的时候,维护持久化的light节点就更令人费解了:只要向特定方向扫描状态树,light节点就可以随时轻松访问所有与账户相关的数据。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的团队学习教程,根据同学反馈在最后进行了重新整理。作者:黄,郝波,尤尔克,唐