绿林网

《精通以太坊:开发智能合约和去中心化应用》读后感摘抄

《精通以太坊:开发智能合约和去中心化应用》读后感摘抄

《精通以太坊:开发智能合约和去中心化应用》是一本由[希] 安德烈亚斯·M. 安东波罗斯 / [英] 加文·伍德著作,机械工业出版社出版的平装图书,本书定价:129.00元,页数:359,特精心收集的读后感,希望对大家能有帮助。

《精通以太坊:开发智能合约和去中心化应用》读后感(一):以太坊行情分析

以太坊行情分析:

小时级别来看,昨日晚间大幅度下跌,最低跌至1700一线,日内跌幅较大,在触底后反弹力度也较为强势,拉升300点。布林带通道开口运行,K线价格在中上轨区间运行,目前白盘开始横盘,副图指标KDJ三线走平偏向下行的趋势,MACD快慢线金叉向上,但红色能量柱能量开始缩量,反弹力度逐渐衰弱,上行动能不足,空头趋势继续延续,个人建议操作上以高为做空为主。

操作建议:

2020~2050分批空单进场,目标看1950、1900、1800,风控2080

《精通以太坊:开发智能合约和去中心化应用》读后感(二):O'REILLY 本期动物世界

本书封面上的动物世界一群东方蜜蜂(apis cerana) 一种遍布亚洲东南部各国的物种。这种昆表现出高度复杂的行为,这些行为最终都以蜂巢的利益为目标。每只蜜蜂都在一套简单的规则下自由运作,并通过信息素(pheromone)和所谓的摇摆舞(waggle dance)传达重要的发现。这种摇摆舞带有宝贵的信息,如太阳的位置和从蜂房到蜂巢的相对地理坐标。通过这种舞蹈,蜜蜂可以传递信息或采取对应的行动,从而实现去中心化意志下的群体智能。

虽然蜜蜂形成了一个以层级为基础的社会,并且有一个生育后代的蜂王,但蜂巢中没有中央权威或领导者。成千上万的蜜蜂个体所表现出的高度智慧和复杂的行为是一种新兴的属性,它类似社交网络中个体的互动。

大自然表明,去中心化的系统可以具有权威性,可以产生意想不到的复杂性和令人难以置信的成熟度,这一切都无须中央权威、层级或其他复杂的部分。

《精通以太坊:开发智能合约和去中心化应用》读后感(三):专业度较深

读书档案

《精通以太坊》 【希】Andreas M. Antonopolulos 【英】Dr. Gavin Wood 【著】喻勇 杨镇 阿剑 任露露 Elisa Jiang 【译】

1、读本书的目的?

学习智能合约,为硕士毕业论文打下理论基础。

2、读后感受

4星。本书写的很专业,内容也很深,基本上把以太坊相关的内容全部梳理清楚。在似懂非懂的情况下,刷完全书,本书的部分内容可以作为论文的引文来用,尤其是工具性代币和权益性代币部分。全书从以太坊的基本概念入手,通过介绍客户端,加密技术,钱包,交易,共识协议以及编写智能合约的solidity和Vyper等语言,最后介绍了代币以及代币的安全性,虚拟机DAPP以及预言机,从而将以太坊的区块链的整个产生和运营过程讲述一遍。比较适合做深入学习。

3、接下来怎么做?

写论文时适当引入部分引文,再在引文时,大致浏览一遍。

4、3个月后达到什么结果?

写完小论文后,可以尝试书中的实例,实操一遍。

《精通以太坊:开发智能合约和去中心化应用》读后感(四):《精通以太坊》书评

断断续续看完,总结下来,这本书并不适合小白观看、不适合没有Web3项目经验的人观看、不适合产品经理观看,这纯粹是一本技术书籍,附上一大堆看不懂的智能合约各方面的代码,只能跳着看了

最开始接触Web3项目是国内的NFT,到后面国外的DID项目,一开始朋友让我去了解小狐狸,看了各种B站视频后才知道大概是个啥,到最后也只能通过实际上去接触才知道具体是个啥玩意儿。所以书上讲的很多项目,没有自己去接触,完全是了解不来的,这本书不适合新手

前段时间以太坊合并了,有些东西像共识机制相关的内容可能会跟着改变了,所以这书还不知道是不是最新最准确的

不过说实话,以太坊确实是个很伟大的项目,为一套完整的新互联网体系搭建了一套基础设施,大家可以在上面各种创新,很多东西现在看还很玄乎搞不懂,可真正搞懂的时候就已经太迟而错过窗口了

在这个基础上,衍生出一个叫“共识”的玩意儿,这个确实很牛逼,一大群或者一小群人能够基于某种特定的规则,形成共识去共同做某件事情,是很牛逼

不过倒是老感觉这些自己ICO各种币,到最后都是很快到天花板的,然后就是不断的套娃,套到最后把人给熬死,现在国内基本上都不支持也没有条件和环境做Web 3,所以未来会怎样,很难说

————

笔记总结:

1、每一笔以太坊交易(智能合约的执行)都需要支付手续费(gas),这些手续费支付给负责验证交易的矿工

2、代码越简单,实现的功能越少,那么它产生bug或非预期效果的可能性就越低

——————————————

精通以太坊:开发智能合约和去中心化应用 安德烈亚斯·M.安东波罗斯 32个笔记 ◆ 第1章 什么是以太坊? 以太坊就是公交车,人人都可以访问,但要开什么方向就是公交车的事了 >> 以太坊是一个具备确定性但实际上却没有边际的状态机。它有两个特点:具有一个全球范围可访问的单体状态;还有一个执行状态更改的虚拟机。 >> 以太坊的创始人都认为区块链不应该针对某个特定的目的,而是通过实现可编程性来支持更广泛的应用类型 >> 以太坊也是一个分布式状态机。但是不同于跟踪数字货币所有权的状态,以太坊跟踪的是一个通用目的的数据存储的状态转变。通用目的的意思是任何可以表示为键值元组的数据 >> DApp代表了更为广泛的“智能合约”。一个DApp只需要包括一个智能合约和一个Web用户界面 ◆ 第2章 以太坊基本概念 >> 以太坊是指这个区块链系统,而以太币才是这个系统之上的数字货币 >> 在进行大笔的数字资产转账之前(特别是转到新地址),首先做一笔小金额的测试转账(例如不到一美元),并且等待收据以确认交易成功。 >> 每一笔以太坊交易都需要支付手续费,这些手续费支付给负责验证交易的矿工。在以太坊中,这类手续费通过一种被称为gas的虚拟货币进行收取,你得使用以太币来支付gas,作为交易的一部分。 这书不适合从0开始的小白用户阅读,不懂技术也大多看不懂。像小狐狸钱包这种没有项目经历大概也看不懂,技术类的书还是跟着项目来才容易吸收 >> 。 ◆ 第3章 以太坊客户端 >> 尽管这些客户端是由不同的开发团队开发的,使用的编程语言也不尽相同,但是它们都遵从相同的协议和规则。因此,它们可以在相同的以太坊网络上实现操作和交互。 ◆ 第4章 以太坊背后的密码学 >> 所有通信和交易数据都不是加密的,因此所有人都必然可以读取。这也是为什么每个人都可以验证状态更新的正确性并达成共识 >> 实际上,账户地址直接由私钥推导而来:一个私钥会与唯一一个以太坊地址(也称为账户)挂钩 >> 在任何以公钥加密为基础的系统(比如以太坊)中,密钥是成对的,由私钥与公钥组成。我们可以把公钥想象成银行账户,而私钥则是账户密码,前者(公钥,银行账户)用于识别身份,后者(私钥,账户密码)提供对账户的控制权 >> 之所以称之为“一对”密钥,是因为公钥是通过私钥生成的。公钥和私钥一起表示一个以太坊账户,公钥用于可访问账户管理(也就是地址),而私钥用于控制账户内持有的以太币,并控制使用智能合约时所需的认证程序 >> 由于公钥可以直接由私钥计算得出,所以即使只保存了私钥也是没问题的。 ◆ 第6章 交易 >> gas就是以太坊的燃料。gas并不是以太币,它是一种独立的虚拟货币,跟以太币之间存在汇率关系 >> 以太坊中的数字签名起到了三个作用(如下所示)。第一,数字签名用来证明签名方是私钥的持有人,因此也就是对应以太坊账户的主人,用于授权以太坊的转账或合约的执行。第二,用于证明这个“授权”是不可否认的。第三,用于确保交易数据在经过签名之后没有也不能被任何人修改。 ◆ 第7章 智能合约与Solidity >> 智能合约永远不会“自动运行”,或者“在后台运行”。在没有交易触发(不论是直接触发,还是通过智能合约调用链)执行的情况下,合约永远处在等待调用的状态。 执行智能合约会消耗gas >> 调用其他合约,特别是那些gas消耗未知的合约,可能会产生高额的gas开销 ◆ 第9章 智能合约安全 >> 所有智能合约都是公开可见的,任何人都可以简单地构造一个交易来与它们进行交互 >> 代码越简单,实现的功能越少,那么它产生bug或非预期效果的可能性就越低 >> 而实际上,你应该去认真思考你的合约设计,去找到用更少的代码、更小的复杂度和更少的“特性”去实现同样的功能。如果有人告诉你他们的项目产出了“数千行代码”的合约,那么你完全可以去质疑这个项目的安全性。越简单,越安全。 >> 这是一个简单的代币(Token ◆ 第10章 代币 >> 工具型代币是指用来支付某个服务、应用或资源的代币。工具型代币的例子包括代表了资源的共享存储、访问例如社交媒体网络等服务,或者类似以太坊网络中使用以太币支付的gas。相比而言,权益型代币是指代表了一个初创公司股权的代币。 权益型代币可以被设定为没有投票权的,用来分红和分配利润的代币,也可以承载一个去中心化自治组织的投票权,这类组织的管理由持有代币的所有人共同投票决定。 >> 要在以太坊上创建新代币,你必须创建一个新的智能合约 ◆ 第11章 预言机 >> 预言机(oracle),它是可以为以太坊智能合约提供外部数据源的系统 >> 预言机为智能合约提供了至关重要的服务:它们将外部事实带入合约执行。当然,预言机也会带来很大的风险:如果它们是受信任的来源并且可能受到损害,可能导致它们提供的智能合约的执行受损。 ◆ 第12章 去中心化应用 >> 长远来看,真正的DApp不应该存在能进行特权访问的特权账户,因为这不是去中心化。 >> 人们没有办法在区块链上隐藏秘密 ◆ 第13章 以太坊虚拟机 >> 以太坊虚拟机(简称为EVM)是以太坊协议和具体操作的核心 >> EVM是以太坊协议的一部分,它用来处理智能合约的部署和执行 >> 如果一个系统或者编程语言能够解决你交给它的所有问题,它就是图灵完备的 ◆ 第14章 共识 >> 换句话说,共识的终极目的是打造一个严格按照规则来运行且没有统治者的系统

《精通以太坊:开发智能合约和去中心化应用》读后感(五):区块链系统2.0——以太坊 简要

我把这篇书评的题目称为“简要”,因为其实书中的不少内容作者都是点到为止——会给出最重要部分的讲解,但详情需要你自己去查看书中给出的网页链接。说白了,虽然书名带有”开发“,但它不会手把手教你如何开发,这不是一本单纯讲如何在ETH上进行开发的书。我想作者必定是认为开发是必须要在理解、了解这个平台后才能进行的。说实话,我也赞同这一点。不过,这本书也提到并演示了非常多开发中的注意事项,比如合约安全。

本书是由之前写出过比特币最畅销书籍的作家Andreas A.大神和以太坊早期灵魂人物、黄皮书作者、Solidity之父 Gavin Wood博士所著,Gavin博士也是现在著名项目Polkadot的联合创始人。这两位绝对都是区块链领域的专家。作为AA之前写的《精通比特币(Mastering Bitcoin)》的拥趸(书评https://book.douban.com/review/9448300/),我在豆瓣上搜到发现他出新书(本书)了也是非常的激动。正好我要学以太坊,于是就买了这本书准备看。不过我还是抱着非常理性的态度来评价这本书的。这本书确实没有像看到《MB》那样惊艳。客观而言,我应该会给出8.3-8.5的书评评分。

全书名称叫做:Mastering Ethereum: Building Smart Contracts and Dapps. 其副标题是开发智能合约和去中心化应用。所以全书其实主要是在讲以太坊的技术及如何开发。所以书中没有仔细介绍以太坊的非技术方面,比如社区,比如以太坊基金会及其运作方式。

我原来在EOS上写过一些DApp,对于DApp的全栈开发有少许的理解。现在因为项目的开发要求,我必须从区块链2.5代平台的EOS回过头来学习区块链2.0代的ETH平台。所以书评中还会稍微穿插一点ETH和EOS的对比。

本文的结构是按照书的目录结构来写的。不过,在最后的其他内容部分,我还添加了本书不曾提到的以太坊的区块结构。并考虑到本书写于2018年年中,于是在书评最后还附加了一些以太坊在2018年整年的总结,方便跟上最新的变化。因为在本书的附录中作者再次论述了一下Truffle和OpenZeppelin的相关开发内容,所以总结了一下附录及以太坊最佳开发实践。

账户 分为合约账户和外部账户(EOA)之别。账户其实就是一个地址(address)。前者(合约地址)在创建之后无法控制,后者由一对公私钥控制。

区块链 以太坊的区块和比特币相比没有大小限制。使用gas上限来调整区块大小。

ENS (Ethereum Nomin System) 以太坊域名服务。

Geth 以太坊客户端的Go语言实现。

Mist 以太坊基金会开发的首个支持以太坊的浏览器。

Nonce 在密码学中,nonce指的是一个在加密通信中只能使用一次的值。在比特币的中的区块链中,nonce是区块中的用于计算问题解来满足工作量证明的随机值。但在以太坊中它能还代表一个账户的交易次数,用于防止重放攻击(后面会提到)。

Truffle 最常用的以太坊开发框架

第1章 什么是以太坊 第2章 以太坊基本概念 第3章 以太坊客户端 第4章 以太坊背后的密码学 第5章 钱包 第6章 交易 第7章 智能合约与Solidity 第8章 智能合约与Vyper 第9章 智能合约安全 第10章 代币 第11章 预言机 第12章 去中心化应用 第13章 以太坊虚拟机 第14章 共识 其他内容(包括:1 以太坊的区块结构 2 以太坊2018整年的总结 3 本书附录及以太坊最佳开发实践 )

1.根据本书的说法,一个公共区块链通常包含以下组件:(我认为主要是这里面的前三者)

·一个P2P网络:传播交易和区块

·一组共识规则、一个共识算法

·一组串联在一起的区块:存储所有状态转化

·消息:形式为交易,代表状态的转移

·状态机:根据共识规则处理交易

·激励方案:在开放环境中经济地保护状态机

以及上述内容的一个或多个开源实现(客户端)。

一个客户端里包含了上述所有内容。以太坊的客户端都要遵循一个上述这些内容的标准——以太坊黄皮书。

2.以太坊的组件:P2P网络(以太坊主网);共识(PoW,最终向PoS转化);区块链(levelDB形式,其实这本书没根本就没讲清楚其以太坊的区块结构是怎么样的=_=);状态机(EVM,类似JVM,能执行字节码);客户端(Geth或Parity)

3.以太坊的白皮书于2013年12月被Vitalik Buterin提出。他把白皮书发给不少人以帮助他完善,本书的两位作者都收到了。其中Gavin之后成为了以太坊的联合创始人,并帮助V神实现了这个项目。

2015年7月30日,第一个以太坊区块被挖了出来。

4.图灵完备其实不一定是好事,因为灵活性会带来不安全因素。图灵完备差不多就是能计算一切可计算问题的意思,其中停机问题是不可计算的。以太坊是图灵完备的,所以无法计算停机问题。为应对这个问题,以太坊使用gas机制来防止智能合约过度使用资源。

智能合约编译成字节码,字节码类似于汇编语言,汇编语言中每个指令都有确定的运行机器时间和所需要的存储大小。于是智能合约也是。通过其运行所需要的资源(CPU + 存储)可以用gas来作为单位进行衡量(EOS中也有三类资源:RAM、CPU和NET,不过都是以抵押的形式来购买的,而不会非可逆消耗)。

每一笔交易都需要消耗EVM的资源,所以也需要gas。你可以在交易中设定gas上限来表明你愿意为这笔交易付出的最大gas。如果gas不够,交易会失败且不会退还...所以还是设的大一点好吧。gas需要用以太币购买,价格是浮动的。

5.以太坊上的智能合约一旦部署就不能改变,只能删除(EOS上可以多次重新部署)。编写合约简单,但是编写安全的合约难。

1.以太坊的货币单位:1 ether = 10^18 wei,wei是最小可拆分单元。

2.如果要更换钱包:直接导出私钥到新钱包。但是A神还推荐一种新的思路:直接更换一个以太坊账户,把原钱包中的账号直接转账到新钱包中的账号(这样似乎能防止万一原钱包的密钥传到了互联网上的问题。说实话,由于EOS中账户名是人类可读的,所以我不推荐在EOS中这样做)。

3.一般来说,一款钱包越流行,说明它越可靠。不过,还是应该将你的ETH放在多个钱包的多个账户里,分散风险。A神并没有推荐某款钱包,只是客观地罗列了一下常见的钱包:浏览器端的MetaMask和MyEtherWallet。

4.本书建议你不要随意使用自己觉得安全的方式来存储密钥,要使用久经考验的标准方法。

空气隔离(不通过任何方式与互联网连接)能通过最高安全级别的保障,但并非所有账户都需要达到这一级别。

请不要把密码保存在:数字文档、数字照片、截屏、在线网盘、加密的PDF里。

建议使用密码管理器(如1password)和笔纸。千万不要以数字信息的形式存储密钥,建议把这张小纸条锁在抽屉或保险箱里。

5.发送一笔普通的交易需要21 000 gas

6.ETH这种数字货币的这个功能只是以太坊作为去中心化智能合约平台这台世界计算机功能中的一小部分。设计以太币是用来支付智能合约的,智能合约是运行在EVM之上的计算机程序。以太坊网络的每个节点都运行着EVM的副本,用于验证合约的执行,以太坊区块链则记录了这台世界计算机在处理交易和智能合约时所发生的所有状态的更改。

7.在MetaMask中只能创建EOA(外部账户)。不过,合约账户也能进行ETH的收发。当交易目标是合约地址时,它会导致该交易在EVM中运行,使用交易和交易的数据作为其输入。除了以太币以外,交易还可以包含指示合约中要运行的特定函数以及要传递给该函数参数的数据。通过这种方式,可以调用合约里的函数。

8.Solidity中一个合约类的回退函数或叫默认函数为:function () public payable {} 其能在一些特殊的情况下被调用:调用合约的交易没有指定哪一个函数、合约本身没有任何函数、交易没有包含任何数据。

9.将合约部署到以太坊区块链上是靠构造一笔特殊的交易,将合约的字节码作为交易的数据,交易的地址是;0x00...000零地址

在这一章作者还介绍了一下如何使用 浏览器钱包 MetaMask 和 云端IDE Remix, 并且写了一个比较简单的合约进行了演示。

首先讲讲以太坊区块链系统和比特币区块链系统到底有什么区别。我这里用了“区块链系统”这个称谓,是沿袭了我在 https://book.douban.com/review/9448300/ 一文中的思想。我感觉最大的区别当然是多了一个EVM,这使得以太坊多了一个叫做"智能合约“特性,这也是区块链2.0的标志,这个大家都懂。

前面讲过了,区块链中的所谓“客户端”就是指实现了全部区块链组件的应用软件。由于区块链是去中心化、分布式的系统,在其意义下是没有服务器(Server)和客户端(Client)的区别的,是一体的。

我们讲“以太坊”(Ethereum)或英文缩写ETH,这个多义词多数情况下可以指代以下内容:1.由运行所有以太坊客户端组成的网络,即以太坊主网 2.一个以太坊客户端 3.整条以太坊区块链 4.以太坊的加密货币—以太币 Ether(事实上以太币的英文是Ether,和以太坊的英文Ethereum是不同的)

图1 以太坊与以太坊客户端的区别

我自己作了一张图(图1)来说明这四个概念。首先以太币其实只是以太坊区块链中的一种数据,可以看做是数据库中的一张表。而以太坊区块链类似于一个数据库,只是用来存储数据的。一个以太坊客户端(如果是一个全节点)内就包含全部的区块链区块数据。除此之外,一个客户端内还包含网络通信的模块(包括用于加密的功能)、共识模块、EVM状态机、其他功能模块等。世界上所有运行符合以太坊黄皮书标准的客户端共同构成了以太坊主网。如果这些客户端使用的区块链数据——账本,有所不同,那他们就处于不同的网络系统中,比如ETC和ETH的区别。除了以太坊主网、以太坊经典ETC的网络以外,还有一堆以太坊的测试网。

1.以太坊客户端主要有6种实现方式:Go——Geth;Rust——Parity;C++——cpp-ethereum;Python——pyethereum;Scala——Mantis;Java——Harmony. 不管哪一种实现方式,只要符合以太坊黄皮书标准,都能算在主网内。

其中最流行的自然是Geth了,其可以实现搭建私有链、挖矿、账户管理、部署智能合约、调用以太坊接口等常用功能。

2.轻客户端、钱包、远程客户端的区别。比特币系统中的节点种类见下图——图2。读过《精通比特币》的读者想必都知道全节点是什么——存放了完整的区块链的节点。具体来说它包含四部分内容:完整的区块链、钱包、路由功能、挖矿功能。以太坊的区块链系统中,全节点其实是指全客户端(包括EVM)。比特币中与全节点相对的是,轻节点或者叫做SPV(简单支付验证),其没有存储一条完整的区块链(只存了区块头),故只有验证区块头的功能。

图2 各种节点的区别(比特币网络中,图片来自《精通比特币》第6章)

以太坊的轻客户端类似于比特币中的轻节点(即SPV),其自身能”通过验证区块头和Merkle Proofs来验证交易是否存在于区块链中并确认这些交易的有效性“。

以太坊的远程客户端类似于钱包。但是比钱包多一个提供API的功能。

另外还有一种基于云平台的客户端,有一个叫做Infura的服务商提供这种服务。这个和远程客户端好像也不一样。

之所以要了解这种不同的客户端,是因为如果做开发,在自己电脑上运行一个全客户端需要的代价还是有点高的——至少需要上百G的存储空间。在这一点上,EOS真的是很好。因为EOS是DPoS共识,21个超级节点,区块链都存在它们上面,你做开发时可以在本地搭建开发环境(虚拟机)及0区块的链。大概也就几个G吧,然后实际的应用部署时再部署到EOS主网(一般也是现在EOS的一些测试网上测试运行后再部署到主网)。

以太坊其实也有类似的能在本地搭建单节点(私有链)的工具。作者称之为“区块链模拟器”,比如最流行的Ganache(即testrpc)。

作者接下去简单(2页)介绍和使用了Geth和Parity这两种客户端搭建了全节点,并演示了JSON-RPC接口。

作者也推荐了一些远程以太坊客户端:手机钱包Jaxx、Status、TrustWallet、CipherBrowser;浏览器钱包:MetaMask、Jaxx、MyEtherWallet、MyCrypto、Mist。

在这一章中,作者似乎搬运了很大一部分《精通比特币》中讲密码学的内容到这里。大部分情况下,私钥以加密形式保存在钱包软件所管理的文件中。

密钥如何产生、非对称加密为何可行这些基础问题这里不提了。

作者在这里比较重要的提到了椭圆曲线ECC。椭圆曲线加密就是依靠椭圆曲线来定制了一套新的加减乘除算法,我们不作深入解释,因为我本人暂时没有兴趣研究...

值得一提的以太坊的哈希函数不是SHA256而是Keccak-256(SHA3的原始版本).

以太坊地址是由公钥经Keccak-256计算后得出的后20位16进制。

一般来说,钱包有如下功能:1.管理公私钥及地址 2.跟踪账户的余额 3.创建并签名交易。有些钱包还具有 4.和智能合约交互 的功能,比如管理ERC20代币,甚至 5.DApp的入口(能解析前端 + 能和智能合约交互)。

在这一章中,作者还是搬运了很大一部分《精通比特币》中的内容到这里,比如确定性钱报和非确定钱包。

交易是以太坊作为“世界计算机”的唯一输入。

1. 在以太坊网络中传输的消息——交易的标准格式,其包含的内容有:nonce,gas price(自己设定),gas limit,receipt,value,data,v/r/s(椭圆曲线签名的三部分)。由vrs可以得到交易发起者私钥的数字签名,由此可以知道发起者的地址。nonce是交易发起者目前记录在链的交易次数,这个字段是为了防止重放攻击的。由这几个最基本的数据段可以计算得到更多的信息。

在网络中传递的交易数据包采用RLP(递归长度前缀)编码。使用偏移量来表示每个字段的长度。任何超过定义的长度,就自然属于结构中的下一个字段的内容了。

2. 为什么要有nonce?如果你在很短时间内发了多笔交易,虽然这些交易在你发出时是有先后顺序的,但是最终被记录到区块链上是可能顺序是会错的,这取决于整个网络谁先收到你的某个交易。通过增加一个Nonce就能让交易变得有序。

3. gas、gas price、gas limit,一笔普通交易(即以太币转账)所需要的gas数一般是能够确定下来的,因为之和这个笔交易要进行的操作复杂度有关,一笔外部账户之间的以太币转账的交易的gas就是21000。gas只是一个计量单位,其和以太币Ether的汇率是实时波动的。gas price字段就是你愿意支付的汇率,gas price越高,矿工处理你的交易优先级就越高。

之所以还要确定gas limit是因为交易也可能是和智能合约的交易。如果是这样那么需要的gas数量可以估计,但是很难精确算出。这是因为“ 合约可以根据不同的初始条件选择不同的执行路径,这样会导致不同的gas开销“,比如你的合约调用了别人的合约... gas limit可以设的稍微高点,来使得交易被全部执行完。否则如果gas耗尽,交易失败,所有状态回滚,你的gas是不会退款的。不过如果gas limit设的非常高,万一你的交易(对合约的调用)是有bug的,这个bug导致了无意义的消耗计算资源,那也会因为这个bug浪费gas,还不如及时交易失败停止运算呢。(当然gas limits字段能填的值也是有最大限制的)

钱包软件发起交易的第一步就是验证你钱包的Ether余额是否大于gas limit * gas price,但不立刻扣除。直到交易结束你才会被真正扣除这一笔钱。

你因为gas实际最终的手续费 = 实际消耗的gas X gas价格 = 矿工费

gas的计算是由编程成字节码后,数指令统计出来的,每个指令有确定的gas消耗,它是更具该指令需要的CPU时间+存储资源+网络传输资源消耗计算出来的。

为什么要有gas?这个问题和你为什么上网需要网费一样。是为了防止DOS攻击,如果没有成本,你可以尽情发送堵塞网络的垃圾信息直到网络瘫痪。当前我们接入互联网有两种计费方式:按流量 和 按带宽,再通俗通俗一点,前者就是4G——流量有限 网速不限(虽然也有无限流量,但是这个无线流量实质上是限制网速的,到了一定流量后会降速,这是必然的,不仅是因为运营商出于商业考虑,也是出于网络安全的考虑),后者是WiFi——网速(带宽)有限 流量不限。流量和带宽,必须限制一个,这样才不会出现无成本攻击网络的情况。个人觉得,以太坊的gas机制类似于按流量收费,而EOS的资源租赁模式类似于按带宽收费。

4. 以太坊本身在构建交易的模块中并没有进行验证receipt地址的合法性。也就是说你可以向一个不存在的地址发币,结果就是谁也得不到,你相当于销毁了这一笔Ether。这种地址是否存在的验证工作应该放到软件应用层,自己来写。(突然想到:如果先用一些密码学Lib计算出一个以太坊格式的地址及私钥,但是不广播这个账号,使得其暂时没有被主网接受;然后往这个主网还不存在的账户里打币,再直接使用之前算出来的私钥来提币(因为有余额的账户是没办法注册的吧?),不知道能不能实现)

5. value 和 data。

只有value的交易是 支付(转账)交易。有data的交易大多是 合约调用交易。既没有data也没有value的交易可能只是为了浪费gas。

支付交易也可以附加data数据,但是往往会被钱包软件忽略而不显示给用户。在这一点上并没有相关的标准。

对于向合约账户发送交易来说——交易receipt地址是合约地址,那么EVM会执行这个合约,并尝试调用在data字段里指定的函数 ==> 如果交易中的data字段是空的,那么EVM会指定目标合约的回退函数,如果是payable的,那么根据函数的代码来决定下一步的执行 ==> 如果没有回退函数,那么交易的效果就是增加合约的余额,如同向钱包支付一样。

6. 部署合约。在以太坊上部署合约的操作也是构建一个交易。此时交易的data必须是合约的字节码、交易的receipt地址必须是0x0。这里被叫做零地址的东西既不属于合约账户地址也属于外部账户地址。这个地址也不属于任何人,所以向其发币 = 销毁。

7.对交易的签名。这里作者又提到了对交易的签名。签名有三个作用:身份认证、不可否认、数据完整性。对某个交易签名其实是对交易的哈希进行签名。

交易的签名可以是离线的。通常交易的创建、签名、广播都是在一个操作中完成的。但是也可以分开,这是为了私钥的安全。用于广播的计算机必须连到互联网上,并且运行以太坊客户端。而用于签名的计算机必须保存账户的私钥。如果两个操作放在同一台计算机上,相当于把私钥放到了联网的计算机上,这相当危险。

用于离线签名的计算机,其安全等级也是可以分级的。最安全当然是空气隔离:创建交易==>U盘==>离线的签名计算机==>U盘==>广播交易的计算机。也可以使用防火墙,如一个防火墙之后的子网,只允许消息队列协议通过,比如ZeroMQ。

8. 交易的传播。平均而言,每个以太坊节点维护了至少13个与它直接相连的其他节点,称为邻居。节点可以对广播的消息进行过滤,但默认广播所有的验证数据。

9. 多重签名交易。以太坊的基本功能里没有提供多重签名的功能。但是可以通过智能合约来实现。如果想要在多重条件下保护你的以太币,请将以太币转移到多重签名合约。

1. 在本书中,”智能合约“指代那些不可改变的计算机程序,以确定性的方式运行在以太坊和其EVM上,也就是我们常说的以太坊去中心化计算机。

2. 相比于外部账户EOA,合约账户没有私钥,理论上不被任何外部账户控制。它是去中心化的,就算是合约的创建者,默认(在协议层)也是没有特权的。当然,因为合约是你写的,也是你部署的,所以你可以把自己的特权写到应用层(之后会举例)。

3. 部署了的合约永远不会自己执行。以太坊上的所有合约的执行归根结底都来自外部合约账户所创建的交易触发的。

4. 以太坊是单线程的,合约的里任何”并发执行“都是没有意义的。

5. 交易是原子性的,也就是说无论一个交易调用多少个合约,都是一个整体,一步出错就全部回滚。其中正确执行的步骤都会回滚取消。

6. 合约无法被重新部署,只能删除,由此可以清空合约实例的内部状态(很明显只是清空EVM的存储,而不会改变区块链上的交易历史记录)。要删除合约,需要执行SELFDESTRUCT的EVM字节码。这个操作会产生负的gas消耗——系统会提供gas退款,这激励人们通过删除存储状态的方式释放EVM 的资源。

要注意的是,只有自己在合约中写明了删除功能,SELFDESTRUCT字节码才会起作用。

7. 任何高级语言都能用来写智能合约,但是把它们如何编程成字节码就是一个苦差事了。最简单的解决办法是重新写一门语言。编程语言分成2类:声明式的(函数式)和指令式的(过程式)。还有混合式的,比如Lisp、Javascript、Python(事实上C++17也编程融入了函式编程的思想和语法)。当然,指令式的语言也可以来写声明式风格的代码,但是会产生一些不优雅的代码。反之不行。

事实上,因为指令式的语言很难编写那些严格按部就班执行的代码,所以声明式语言更适合智能合约。然而实际情况是大多数合约的语言都是指令式的(估计是函数式编程的受众实在是太小了吧)。比如LLL、Serpent、Solidity、Vyper(这是作者列举的)。事实上目前比较流行的项目,如Fabric(Go)、EOS(CPP)、Polkadot(Rust)、Cosmos(Golang)、Libra(使用Rust写的)都不是用这些语言的。感觉区块链领域中目前最火的两种语言就是Golang和Rust(截至2019-7-24)。还有很多致力于用Javascript、Typescript写合约的,他们觉得CPP这种语言太难了,而JS、TS的开发者众多。

不管怎么样,Solidity就是以太坊上最流行的开发语言。Solidity由Gavin Wood创建,Christian Reitiwessner开发(说实话我没搞懂两者对于Solidity的贡献到底是怎么样的),Gavin是本书作者之一。Solidity的编译器是solc。可以使用Remix这个网页IDE来方便的尝试一下Solidity在线编译。

8. 接下去作者介绍了Solidity这门语言基础编程。

数据类型:bool, int uint int8 .. int256 (默认是256位), fixedmxn ufixedmxn(固定小数点的浮点数), address, bytes1 ... bytes32(固定长度的字节数组), bytes string(可变长度的字节数组), enum, uint32[][5](数组), struct, mapping, seconds, minutes, hours, days, wei finney szabo ether.

预定义的全局变量和函数: 交易/消息的上下文 msg ,交易的上下文 tx ,区块的上下文 block,地址对象 address,内建函数 addmod、mulmod、keccak256、sha256、sha3、ripemd160、ecreover、selfdestruct、this,合约定义 interface、library

函数:function functionName( [ paras ] ) { public | private | internal | external } [ pure | view | payable] [modifies] [returns (returns type)] 解释:public:默认,可以被外部账户的交易、其他合约、本合约调用; external:不能在本合约内部被调用; internal:只能被本合约、本合约派生的后代合约调用;private:只能被本合约调用。view(constant):承诺不对任何状态进行修改,constant将被弃用;pure:这个函数不会对区块链有任何的读、写操作,只是一个工具函数;payable:未声明为payable的函数无法接收以太币(挖矿奖励和合约销毁退款除外)。

构造和销毁:构造函数:可以是与合约类同名的函数,也可以使用constructor(){}来定义。销毁函数:selfdestruct(address recipient)。可以在构造器中写明合约的拥有者,并且将合约的一部分高级权力赋予之,比如调用销毁合约函数的权力。

函数修饰符:本质上是一个短函数,用于执行函数正文前的验证、审计操作: modifier checkOwner{ require(msg,owner == owner); _;}

合约的继承:使用 is关键词。 contract Child is Parent1, Parent2 {}。 继承使得每一个合约都变得相对简单,能够聚焦在它所处理的具体问题上,这样我们就可以通过模块化的方式来管理所有细节。代码复用和模块化让我们的项目更加简洁、更易读,也更容易进行代码安全性审计。

错误处理:assert、require、revert。第一个和第二个有点相反的意味,一般来说,我们使用assert来判断(源自内部的)输出条件为真的情况,而用require来测试(来自外部的)输入条件。revert用于立即终止合约,并回滚所有状态,产生一个出错信息,会被存到交易的日志里。进行显式检查是一个好的编程习惯,虽然在区块链系统中这会导致额外的gas开销。

事件(event):当每一个交易完成后都会产生一个类似于发票的交易收据。交易收据包含完整的日志条目,记录了交易执行过程中发生的动作。事件用于生成这些日志,对于智能合约来说非常有用。事件对象可以把参数序列化并且记录在以太坊区块链的事件日志中。你可以在参数之前添加indexed关键字,这样可以把索引过后的值作为可以搜索或者过滤的哈希表:event Deposit(address indexed from, uint amout);。使用emit关键词把时间相关的数据写进日志:emit Deposit(msg.sender, msg.value)。如何查看日志:web3.js库提供了一个代表交易执行结果的数据结构。(但是我也完全不清楚,这个交易日志到底上不上链?书中并没有明确写出。)(现在我通过查阅Solidity文档中的Event部分内容确定了事件日志数据是上链的,如下引用)

调用其他合约(send、call、callcode、delegatecall):调用合约的方式可以是:自己部署要调用的合约,然后调用,使用new关键词。也可以是调用别人部署的合约:通过合约的地址——这时需要非常注意。调用别人的合约也有不少的方式,最安全是强制类型转换,假如你知道你要调用的这个合约名称(其实就是Solidity中的一个类),比如Faucet。也是你Faucet mine = Faucet(address)即可。除此之外,还有更底层的方法,比如使用address.call、address.delegatecall (callcode将被弃用)。其中call会把msg的上下文改变,而delegatecall则不会。

一些忠告:避免动态尺寸的数组,这有出发高额gas消耗的风险;尽量少调用其他合约;在js中使用fun.estimateGas(...)来估算fun的gas开销。最好把gas的开销评估作为开发合约的一个环节,这样可以避免合约部署到主网后发生高额gas开销这些之前没有想到的问题。

作者说Vyper是让开发者几乎不可能编写出误导性代码的智能合约开发语言,目前处于实验阶段。反正就是用它写的合约漏洞更少、更加安全。估计是以太坊爆出来的安全漏洞太多了吧。

Vyper相比Solidity更安全,是在牺牲Solidity的一些特性的基础之上的:Vyper无修饰符语法、不支持类继承、不支持函数重载、不支持隐式类型转换(只能用convert函数来显式转换)、使用装饰器代替{public/private/constant/payable}、每一个独立的Vyper合约只能包含一个Vyper文件。

总而言之,其牺牲了灵活性来实现”正确性“。

这一章是全书页数最多的一章,作者认为,安全性是编写智能合约时要考虑的最重要的因素之一。其实我之前在EOS上写DApp时从未仔细考虑过合约安全(虽然听过一些合约安全讲座,也看过信息安全原理的书籍),可能是我写的DApp都没有涉及资金吧。通过这一章,我真的对智能合约安全有了一个不错的了解。

1. 智能合约是所有人可见的,任何人都能简单地构造一个交易来与它们进行交互。因此任何漏洞都可能被利用,损失也往往无法挽回。

2. 安全设计原则:最小化/最简单:用最小的复杂度和最简单的代码来实现同样的功能——越简单,越安全;代码重用,Don't Repeat Yourself;代码质量,严格使用工程和软件开发方法论;可读性和可审计性,易于理解,易于审计;测试覆盖率,你应该测试所有的参数以确保它们都在你所期望的范围内具有正确的格式。

接下去作者详略有度地讲了17个安全漏洞,每个漏洞作者都讲了大致细节、防范技术,部分讲了真实案例,比如重入中的The DAO事件,详细的内容都提供了网上的原文链接:重入、算术溢出、意外的以太币、DelegateCall、默认的可见性、无序错觉、外部合约引用、短地址/参数攻击、未检查的调用返回值、竞争条件/预先交易、拒绝服务、区块时间操纵、小心使用构造函数、未初始化的存储指针、浮点数和精度、Tx.Origin验证、合约程序库。

代币到底是什么?我先给出自己的理解。因为最近在读金融学,又恰逢Libra大战美国国会,所以对货币的思考多了些。代币是Token,不是加密货币Crypto Currency,也不是数字货币Digital Currency。这三个词肯定是有区别的。有人说加密货币只有一种,那就是比特币Bitcoin,其他的(以太币、EOS等)都是Token,这种说法是因为今年2019年6-7月这波牛市的现象来说的(因为这波牛市将比特币带上了$1w,但是其他加密货币涨幅不大,投资机构的钱似乎只投到了比特币一种货币之中,投资ETH和EOS似乎都是散户)。这是说法偏主观。从技术的角度讲,Bitcoin、Ether、EOS都是Crypto Currency,而由某个区块链平台上的智能合约发行的币种都是Token,比如EOS上的eosio.token合约。

另外,我个人渐渐认为加密货币和数字货币开始有点不同了。这主要是源于Libra的负责人马库斯在国会听证会的时候的表述。国会议员问:你们发加密货币到底是...?马库斯回答:我们发数字货币是因为...类似的情况出现了好几次。所以我认为马库斯及Libra团队应该是认为 数字货币Digital Currency = 数字稳定货币,而加密货币Crypto Currency = Bitcoin、Ether、EOSd等价值波动较大、投机属性较强的。说实话,我也从来没听说过”加密稳定货币“这个称谓,只听说过“数字稳定货币”。

我个人觉得应该将代币分级,比如Ether、EOS这些为一级代币,然后在他们这些平台上发布的Token称为二级代币。接下去我把不管几级,都归称为代币。

接下来讲讲我对代币的理解。代币其实真的是一种综合了多种金融属性的东西。

1. EOS、Ether等和具体区块链项目直接挂钩的币,在ICO、STO、IEO展现了代币的金融能力,对应于现代金融中的股票(和债券)。

2. Libra、USDT展现了代币的 稳定币能力,对应于现代金融中的信用货币。

3. Bitcoin展现数字黄金的能力,对应于现代金融中的黄金(以前的金属货币)。

4. 一些依附于某个区块链平台(项目)的团队发布的Token,即二级以上的代币,可以作为使用应用的权益证明,类似于上了链的积分。

作者也认为代币有多种应用场景。他认为代币有可以作为:货币、资源、资产、访问权限、权益、投票权、收藏品、身份、证言、Utility。

代表着区块链内在资产的代币不会有额外的对手方风险。如果你持有一个以太币,没有第三方可以控制或者影响你的所有权。而现实中的区块链以外的资产带有额外属性的对手风险,因为他们被一些人持有,记录在额外的登记系统内,或由区块链之外的法律和法规进行控制。基于区块链代币的一个非常重要的未来,就是用区块链内的资产代替区块链外的资产,因此可以消除对手风险。

使用工具型代币还是权益型代币?在这里作者觉得代币主要可以分为2类。工具型代币是指用来支付某个服务、应用或资源的代币。而权益型代币是指代表了一个初创公司股权的代币。

作者认为,工具型代币的使用使得用户必须使用数字货币,才能使用这款应用(服务),因此用户需要先学会如何使用数字代币。这无疑太高了使用门槛,会限制市场的范围。不过如果你的服务使用了数字货币,也可以相应地会获得更多的关注。不管怎么做都有好处和坏处。作者建议,只有在你的应用必须使用工具型代币的时候才考虑发行。

不过,以太坊上的代币和以太币Ether本身还是不一样,前面我说过,我把以太币叫做一级代币,而借助以太坊这个平台发布的代币叫做二级代币。从技术本质上来说,以太币的转账操作是在协议级处理,而二级代币的交易在智能合约级处理。

— ERC20必须实现以下函数和事件:

totalSupply、balanceOf、transfer、transferForm、approve、allowance(配额)

Transfer(转账事件)、Approve(审批事件)

— ERC20可选函数:

name、symbol(代币符号)、decimals(代币可以细分的位数)

— ERC20数据结构:

mapping( address => uint256 ) balances; 记录余额

mapping (address => mapping (address => unit256 ) ) public allowed; 记录配额。一个代币的持有人可以将代币的分配权代理给某个发送方,允许发送方从持有人的账户中一次或多次转出指定数量的代币。

— ERC20工作流:其支持2种转账方式。第一种,单一转账,直接使用transfer。第二种,授权approve + transferFrom,代币的持有人授权其他地址操纵他们的代币,典型用例是通过智能合约来ICO,如图3

图3 ERC20 第二种代币转账方式

—ERC20实现:作者推荐了2个ERC20的实现:Consensys EIP20 和 OpenZeppelin StandardToken. 通过继承这些标准实现的sol文件中的contract类,可以加入自己想要的功能。作者接下去使用Truffle框架 + OpenZeppelin来演示了一下如何自己发币。

— ERC20问题:与以太币在使用上的微小差异:以太币是带有目标接收人地址的交易进行转账的。而代币的转账是通过代币合约内相关状态转换进行的,使用合约作为交易地址,将真正的接收人地址作为data中的一部分。在代币的转账中,并没有任何针对接收方地址的交易。接收方的地址被假如代币合约的映射表中。一个发送以太币的交易会改变接收人(在以太坊)的状态。一个发送代币的合约智慧改变合约内部的状态,而不是接受方地址的状态。

以太坊上发币的代币合约很多,但是很多币都是垃圾币。这些垃圾币就像垃圾邮件一样。只有你关注这些合约,你才能看到自己是否在这个合约里拥有这种代币的余额。

— ERC20改进:ERC223代币标准试图解决不慎把代币转入不支持代币的合约这个问题。ERC777代币标准使用了send来发送代币,方式类似以太币...

— ERC721 Non-Fungible Token NFT 非可替代代币。正好我接下去在我自己的开发团队内的工作就是和NFT有关的,所以这部分内容我本来是比较期待的,不过作者也只是点到为止。作者把NFT叫做契约代币。

NFT用于跟踪一个独特事物的所有权,比如一件特定的游戏道具,比如dota2里的至宝、不朽饰品。ERC721并没有对可以用契约跟踪的事物设定任何的限制,只要是可以唯一标识的,也就是可以用一个256位标识符表示的,都可以涵盖在这个标准之下。

ERC20将所有者作为映射的主键,跟踪每个所有者的余额。而ERC721将契约ID作为映射的主键,跟踪每个契约ID及其所有者。

— ERC只是一个标准,很多真正发行的代币要考虑的远不止标准内的东西,比如:持有人控制、销毁、铸币、众筹、硬顶、可恢复后门、白名单、黑名单。其实在OpenZeppelin中,实现了不少这些扩展。

预言机是什么?

在计算理论中,预言机是一个抽象计算机,用来研究决定型问题。可以被视为一个多了个黑盒子(预言者)的图灵机,这个黑盒子的功能是可以在单一运算之内解答待定问题。预言者可以解答的问题,可以是任何复杂度的问题,甚至是不可计算问题,如停机问题。

在区块链中,预言机是一个可以回答链外问题的系统。在理想情况下,预言机是无信任的系统,这意味着它们不需要被信任,因为它们是按照去中心化的原则运行的。说的通俗点,区块链预言机,其实就是外部世界的数据输入到区块链上需要的接口系统。EVM无法进行I/O操作,靠预言机完成。

1. 以太坊需要预言机有2个原因。 一是EVM内部都是确定的,因此无法产生真正的随机数,且外部数据只能作为交易的数据载荷引入。

2. 预言机的应用场景。预言机获取网络上的数据,比如足球比赛的数据、黄金的价格,输入给区块链。

3. 预言机的设计模式。预言机一般包括一些能力:从链外的数据源收集数据、使用签名消息在链上传输数据、将数据放入智能合约的存储空间。

设计预言机的三种方式:立即获取、发布与订阅、请求与响应。立即获取最简单,在要用到的时候去即时获取即可,比如查找和认证。大学可以为过去学生的证书设立一个预言机,不过不需要存储完整的证书信息,只需要存储哈希就行了。发布与订阅,要对预期改变的数据提供有效的服务,其要么由链上的智能合约轮询,要么由链外守护进程监视和更新,比如天气信息,价格馈送,交通数据等,有点类似推送服务。请求与响应最复杂,这是数据空间太大而无法存储在智能合约中的情况,并且用户每次只需要整个数据集的一小部分,这样的预言机可以实现为链上智能合约系统,以及用于监视请求和检索、返回数据的链外基础结构,最后的数据由预言机所有者签名,证明在给定时间内的数据有效性,然后返回给调用者(比如某个发起调用的DApp)。

请求与响应预言机的步骤总结为:1.接受来自DApp的查询;2.解析查询;3.检查是否提供了付款和数据访问权限;4.从链外数据源检索相关数据;5.使用包含的数据对事务进行签名;6.将事务广播到网络;7.安排任何进一步必要的交易,例如通知等。

4.预言机的数据认证:即便被DApp查询的数据源是权威和可信的,数据在传输过程中被篡改的可能性仍然存在。如何才能信任这个机制?两种常见的数据认证机制是真实性证明和可信执行环境(Trusted Execution Environment, TEE)。前者用类似于使用数字签名来保证数据完整性的方式保证结果可信,例子如 TLSNotary Proof,这里需要有一个机构来审计过程可信,所以这个机构也需要是可信的,比如Oraclize预言机,其审计机构是亚马逊网络AWS虚拟机。后者(TEE)使用的是过程可信,因为数据源是可信的,所以开始可信 + 过程可信 = 结果可信,例子有Town Crier,采用基于硬件的安全区来验证数据的完整性,其使用了英特尔的SGX来保证对HTTPS查询的响应可以被验证为可信的,因此我们需要相信英特尔的硬件可信。

5. 计算性的预言机。预言机可以是用来请求数据的,也可以是用来进行计算的,因为EVM的计算资源很宝贵,所以如果要进行大规模的计算,则最好用offchain的计算资源来补充。Oraclize是运行在AWX虚拟机中的,可以使用期来进行计算。类似的解决方案还有Cryptlet 和 TrueBit。

6. 去中心化预言机DO。前面所述的都是中心化的预言机系统,都需要依赖可信的权威。作者列出的DO有:ChainLInk,其由三个关键智能合约(声誉合约、订单匹配合约、数据汇总合约)以及数据提供者的链外注册表组成。通过声誉合约 + 订单匹配合约来确定提供某次服务的多个预言机,然后汇总合约汇总数据。这样的去中心化方案要面临的一个最大的挑战是:构建数据汇总函数。一般来说可以根据个体预言机声音和表现反馈来提供一个汇总权重。

7. Solidity中提供了Oraclize的预言机编程接口。

1. 一个DApp应该包括以下内容:后端(智能合约)、前端(Web网页,Javascript+CSS+HTML)、数据存储(去中心化地存储用户数据、网页前端文件)、消息通信(通过P2P网络)、名称解析(去中心化DNS)。

理论上,一个完全去中心化的应用应该由去中心化服务器(节点)来分发网页前端、通过P2P网络传输数据、通过去中心化存储来存储用户数据、通过区块链(智能合约)存储用户状态、使用去中心化的DNS来解析网页在网络中的地址。(我这里对用户状态和用户数据做了区分,这是考虑到状态都是由智能合约存储的,而数据是比较庞大的,甚至可能是需要用预言机来获取的)

事实上,只要你把用户数据存在了区块链里,就可以叫做DApp了。很难全方位地完整实现一个DApp。

2. 后端(智能合约):因为任何操作、存储都特别昂贵,所以应保持合约尽量小。确定一个应用哪些部分需要用到去中心化的功能尤其重要。而且合约要一定一定注意安全性,第9章已经讲过了。

3. 前端(Web界面):与一般的Web应用特别多的区别,都是用JS+CSS+HTML编写的。唯一的区别是在于用户管理上。DApp的用户登录都无法通过直接输入账户密码的方式进行,一般都是通过前端拉起钱包应用,然后在钱包里输入钱包的密码来授权的。这样你就不必把你的私钥交给DApp。

4. 数据存储。因为EVM的性能限制,大多数DApp利用链下数据存储服务。这种数据存储服务可以是中心化的,也可以是诸如IPFS、Swarm(Geth工具链的一部分)等去中心化的,这两个都是内容可寻址的。内容可寻址的意思是文件的每一小块都被哈希处理,通过这个哈希可以将文件取回。

5. 消息通信。Geth中包含Whisper这种P2P消息协议。

接下去作者用了一个拍卖的DApp 做了一下demo。其中详细介绍了Swarm怎么用——将前端放在Swarm上。然后再使用ENS(Ethereum Name Service)来通过维克里拍卖(Vickrey auction)获得一个域名,并链接到Swarm上。

1. EVM就是一个虚拟机,和Java的JVM,微软的.NET的虚拟机类似。在以太坊中,除了在EOA之间的简单转账交易以外,其他所有涉及状态更新的操作都是通过EVM来计算的。EVM是一个”准“图灵完备的状态机。因为有了gas机制,这样,停机故障就被解决了。和VirtualBox这样的虚拟机稍有不同,EVM运行在一个更局限的领域:它仅仅是一个计算引擎,仅提供对计算和存储的抽象。(或者说EVM就是一个沙盒,与外界隔离,智能合约代码在EVM里运行时无法进行网络操作、文件I/O或执行其他进程)

2. EVM包含以下部分:一个用来存储程序代码的ROM,加载要执行的智能合约;一个内容可变的RAM(又被称为Memory);一个永久的存储,它是作为以太坊状态的一部分存在的(叫做Storage)。其实还有一个部分,那就是栈(Stack)。Storage、Memory、Stack是EVM上存储数据的三块地方,Storage存储最重要的、读写最少的数据(我认为Storage就是实时和区块链统一的),Memory可以存储程序运行时的一些中间数据,Stack最多存1024个256位的数据。

(EVM从功能上又可以分为合约编译模块、Ledger模块和核心模块。因为EVM无法进行网络操作、文件I/O,所以其实通过添加区块内容,然后区块被P2P网络传输才能实现状态传输和全网统一的。再讲的简单点,EVM的输入一定是交易,输出其实也是交易。EVM不直接和网络中的其他counterpart(即其他节点中的EVM)打交道。)

3. 作者接下去介绍了EVM的指令系统,虽然我学过汇编考过试,知道基本指令及汇编程序的是什么样的,但是背诵这些指令是毫无意义的,所以这边就不列出来了。EVM的指令大概有以下几类:算术和位运算逻辑操作,执行上下文查询,栈、内存和存储访问,处理流程操作,日志、跳转和其他操作。

4. 以太坊的状态。以太坊的状态是基于交易的。我之前总结过,交易是EVM的唯一输入。在最高层级,有以太坊世界状态的概念,其是一个以太地址到账户数据的映射,如下图4所示。

图4 以太坊世界状态

智能合约是上链的,平时是存在区块链里的,属于账户数据的一部分。当你的交易触发了某个智能合约是,其被EVM从区块链加载到EVM的ROM。然后从调用的合约账户对应的Storage中加载一些存储的数据(状态),将Memory清零并将与区块和其他环境变量相关的信息设置好。如果gas耗尽,则交易失败,nonce还是会+1。

5. 被编译出来的合约字节码 ≠ 被部署的合约字节码(运行时字节码)。这是因为被编程出来的字节码中一部分代码是为了部署而有的,就像水果中果皮是保护果肉的。所以字节码是可以被反汇编的,但是部署到链上的字节码反汇编出来的代码和写好的Solidity代码还是有所不同的。

6. 尽管gas是有价格,但是它既不能被持有,也不能花费,gas仅仅是作为EVM内作为对计算工作量的计量而存在的。

7. 负gas消耗。EVM中有2个操作带有负的gas消耗。一个是前面说过的合约销毁——SELFDESTRUCT,会返还24 000gas。另一个是将一个非零的存储地址设为0(SSTORE[x]=0)会返回15 000 gas。为了避免通过返还机制牟利,交易的最大gas返还数量设定为交易中总共消耗的gas的一半。

8. 区块的gas上限。一个区块中的交易总共能消耗的最大gas数量,它也限定了一个区块能包含的交易。本书写作时(2018-09)以太坊主网的区块gas限制是800w,也就是可以包含380个基础交易。目前(2019-07)的区块gas限制也还是800w(https://ethstats.net)。区块链gas上限是有矿工投票决定的。

最后还有一句话值得所有人注意:区块链的核心功能是去中心化记录的保存及研制,EVM是辅助达到这一目标的。

共识一词是源于分布式系统中的普遍问题即状态同步相关。状态同步指的是分布式系统中的不同参与者全体对单个系统状态达成一致,这也被称为达成共识。在缺乏可信仲裁者的情况下,所有的争论、骗局以及不一致都要用数学、经济乃至社会技术来协调。而共识算法正是用于兼顾安全性和去中心化的机制。作者认为,因为共识算法比较底层,所以你不是非要理解共识的细节才能使用以太坊。

1. 以太坊的共识是PoW类的Ethash算法(与比特币的Hashcash PoW 有所不同),工作量证明的通俗说法就是”挖矿“。挖矿的真实目的不是铸币而是保证区块链安全,同时保证对系统的控制权是去中心化的,把新铸造的币作为奖励是激励人们为系统安全做贡献的措施。

2. 但从一开始,以太坊的创始者们就希望以太坊的共识算法最终能过渡到PoS(2019年的上半年PoS、Staking Economy一度是区块链领域最热门的话题,大量新项目都是用的PoS共识机制)。PoS就是Proof of Stake,中文译作权益证明。以太坊计划使用的PoS算法叫做”Casper“。

以太坊的PoS算法——Casper在2018年9月(本书英文版出版时间)仍处于活跃的研究和开发中(在2018年年底,我听到比较多的是以太坊升级的失败、推迟等负面新闻)。

3. 以太坊的开发有四个阶段:Frontier(2015-07)、Homestead(2016-03)、Metropolis(分为两个子阶段:拜占庭2017-07、君士坦丁堡2019-03)、Serenity(时间未定)。在进入Serenity之后,以太坊的共识变为PoS。

最后,什么样的共识是最好的?这个问题正是过去十年大部分分布式系统研究的核心。这完全取决于实际情况,在不同的环境下你需要不同的评价指标。简单来说,区块链系统有三个老生常谈的重要性能:去中心化、安全性、可拓展性。在目前为止,我们的技术还不能使得三者得兼(Algorand试图解决这一”不可能“三角)。所以选择什么共识,如何设计具体的算法有时是一个trader-off,是一种权衡。

其实我个人甚至觉得,这就是民主与效率的一种权衡。完全的去中心化 = 完全民主,中心化服务器 = 完全高效,我觉得完全民主有弊端,完全高效顾不得民主也有弊端。因此我个人其实很看好EOS,因为DPoS给人一种民主、效率取中间的感觉,是一个不错的平衡点。

本文由作者上传并发布(或网友转载),绿林网仅提供信息发布平台。文章仅代表作者个人观点,未经作者许可,不可转载。
点击查看全文
相关推荐
热门推荐