区块链学习(五、以太坊)

时间:2024-03-13 13:41:32

    上一篇中我们了解来比特币,那么这一篇我们来了解以太坊,首先,我们要知道以太坊是什么,在之前的文章我介绍过以太坊是属于区块链2.0的代表应用,它与1.0的区别在于

区块链1.0:可编程货币---->区块链2.0:可编程金融

他们之间最直接的区别在于:智能合约

比特币经常被称之为“全球账簿”,尽管这个账簿记录的仅仅是一种货币——比特币的全部账单。

以太坊可以被看作一台“全球计算机”:一个任何人都可以上传和执行应用程序,并且程序的有效执行能得到保证的地方,这种保证依赖的正是以太坊系统中鲁棒性极强,去中心化的,由全球成千上万的计算机组成的共识网络

那么如何来概括以太坊呢?

以太坊(Ethereum)是将比特币中的一些技术和概念运用于计算领域的一项创新。比特币被认为是一个系统,该系统维护了一个安全地记录了所有比特币账单的共享的账簿。以太坊利用了很多跟比特币类似的机制(比如区块链技术和 P2P 网络),来维护一个共享的计算平台,这个平台可以灵活且安全地运行用户想要的任何程序(当然也包括类似比特币的区块链程序)。


经过上面的一些定义之后,感觉还是不够直观,我们知道了他是个什么,但是总感觉对他的应用场景还是不是那么认识清晰,那么我们就得换个角度,比如,以太坊是为了解决什么问题而诞生的

以太坊诞生的原因

比特币构造了一个完美的货币传输体系,然而比特币并不完美,其中协议的扩展性是一项不足,例如比特币网络里只有一种符号——比特币,用户无法自定义另外的符号,这些符号可以是代表公司的股票,或者是债务凭证等,这就损失了一些功能另外,比特币协议里使用了一套基于堆栈的脚本语言,这语言虽然具有一定灵活性,使得像多重签名这样的功能得以实现,然而却不足以构建更高级的应用,例如去中心化交易所等。


而以太坊从设计上就是为了解决比特币扩展性不足的问题。


那么接下来先开始介绍与比特币不同的最需要提到的一点,智能合约

1、智能合约

智能合约只是一些运行在电脑(或其他节点)的区块链加密货币网络的特定代码

下面的介绍我就用别人文章的介绍来用了,因为感觉说的很不错(http://www.figurefinance.com/news/shownews.php?lang=cn&id=4827)

智能合约概念可以概括为: 一段代码 (智能合约),被部署在分享的、复制的账本上,它可以维持自己的状态,控制自己的资产和对接收到的外界信息或者资产进行回应。或者可以这样简单的概括:它是运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。

智能合约程序不仅仅只是一个可以自动执行的计算机程序,它更像是一个系统的参与者,可以把它想象成一个绝对可信的人,他负责临时保管你的资产,并且严格按照事先商定好的规则执行操作。

智能合约解决什么问题?

智能合约是一种可以自动化执行的简单交易。在日常生活中跟我们有什么联系呢?举一个简单的例子,我跟你打一个赌,如果明天下雨,算我赢,如果明天没下雨,就是你赢了。然后我们在打赌的时候就把钱放进一个智能合约控制的账户内,第二天过去了,**的结果出来了以后,智能合约就可以根据收到的指令自动判断输赢,并进行转账。这个过程是高效,透明的执行过程,不需要公正等第三方介入。也就是说,有了智能合约以后,打赌就不能赖账啦。当然这只是个简单的例子,方便大家理解,智能合约还有很多应用的地方

智能合约的工作原理

基于区块链的智能合约包括事务处理和保存的机制,以及一个完备的状态机,用于接受和处理各种智能合约;并且事务的保存和状态处理都在区块链上完成。

智能合约的触发需要满足时间描述信息中的触发条件,当条件满足以后,从智能合约自动发出预设的数据资源。智能合约系统的核心在于进入智能合约的是一组事务和事件,经过智能合约处理后,出来的也是一组事务和事件。它的存在只是为了让一组复杂的、带有触发条件的数字化承诺能够按照参与者的意志,正确执行。

智能合约的构建及执行步骤

基于区块链的智能合约的构建及执行分为如下步骤:

1、智能合约的构建:由区块链内的多个用户共同参与制定一份智能合约;

2、智能合约的存储:智能合约通过P2P网络扩散到每个节点,并存入区块链;

3、智能合约的执行:智能合约定期进行自动机状态检查,将满足条件的事务进行验证,达成共识后自动执行并通知用户。

智能合约的两个系统

目前,智能合约系统主要有两个,一个是我们比较熟悉的以太坊(Ethereum),另一个是Symbiont

以太坊是一个开源的区块链底层系统,就像安卓一样,提供了非常丰富的API和接口,让许多人在上面能够快速开发出各种区块链应用。目前已经有超过200多个应用在以太坊上开发。

以太坊主要是使用Solidity编写智能合约,并在微软云服务上提供了智能合约工具箱,运行在以太坊区块链上,其平台因多功能性和智能合约执行能力成为银行业和互联网金融行业的首选,纳斯达克、摩根大通、VISA和高盛等多家金融机构均使用以太坊的智能合约系统。

Symbiont起源于Counterparty(合约币)项目,旨在建立第一个用于发行区块链智能证券和交易智能证券的平台。它是由Overstock.com公司旗下Medici项目的前成员创立的,这家智能证券交易平台已完成了一轮700万美元的融资,其公司的估值已达到了7000万美元。Symbiont并不赞同以太坊的智能合约系统,因此正在建立一个匿名的、拥有更加安全代码库的智能合约系统,这个系统不需要打破并重建金融网络体系,能够最大限度地保证电子货币的流通性。目前,数字安全巨头金雅拓与Symbiont达成合作协议,让金融机构更安全地在以区块链为基础的平台上执行交易和智能合约。


2、自定义代币、去中心化交易

一、自定义代币

其实这一块就涉及到以太坊的技术细节了,细节方面我暂时还没有涉及到,所以先放着

二、去中心化交易

这一块的话,主要有两个阶段

第一阶段

EtherDelta

EtherDelta 是基于以太坊的以太币与ERC20代币互换的开源去中心交易平台(智能合约github地址)。

区块链学习(五、以太坊)

上图是EtherDelta的技术实现概览。

它主要由两部分组成,一个是EtherDelta网站,另一个是etherdelta智能合约。

EtherDelta网站是提供给用户操作的界面接口。用户可以在网站上充值,体现,挂单交易。

etherdelta智能合约是部署于以太坊上的特定版本地址智能合约。合约中主要实现了用户资产托管登记簿和订单簿。订单簿中以代币为维度维护了所有当前所有成交挂单和未成交挂单。用户资产登记簿主要是维护了用户的代币资产和支持成交挂单的资产清算。

由于EtherDelta是交易驱动的模式,所以用户的所有操作都需要普通的以太坊交易来触发。因此,用户需要依赖以太坊钱包工具来执行交易指令,譬如MetaMask钱包。一个正常的流程可能是这样的:

  1. 充值。用户通过钱包工具向以太坊etherdelta合约发起充值函数调用。该交易会将代币资产转账至合约,etherdelta合约会对该笔转让资产进行接收和登记托管于资产簿中。
  2. 挂单交易。用户在网站挂单列表中相中一笔挂单符合成交预期,则在网站上取得该挂单相关信息,组成交易指令,并通过钱包工具对交易指令进行签名,并通过网站向以太坊网络广播。以太坊etherdelta合约执行交易指令,对相关代币比例进行计算和交易费用计算,如果订单正常成交,则会进行买卖双方的订单清算,并更新到用户资产登记薄中。
  3. 提现。用户通过钱包工具向以太坊etherdelta合约发起提现函数调用。该交易会将代币资产从合约转账至用户个人账户地址,etherdelta合约会对该笔转让资产更新至资产簿中。

如果用户挂单需要取消,则和挂单交易一样的步骤,需要通过钱包工具组装取消交易指令来调用etherdelta合约更新其上的订单簿。这种情况下,对于没有成交的挂单,则发出了两次以太坊交易,浪费了交易费用。因此这里有个简单的优化,既是在EtherDelta网站存在一个链下订单簿缓存服务,对于并未成交的订单缓存于链下,只有真正成交了才将交易广播到以太坊网络中,如果没有成交,就可以随时在链下无成本取消。

另外需要注意的是,对一个以太坊账户而言,它所发出的交易的顺序递增特性是很重要的 ,它必须是顺序增长。因此,这个特性对EtherDelta的操作来说特别重要,一旦乱序,交易指令就会无法正常执行。


EtherDelta技术实现的核心主要有两点,其一是智能合约的资产托管,它保障了去中心化去信任化的资产安全交易,用户资产只会在用户私有账户和托管合约中转移,并且只能由用户自己发起。然而安全也不是绝对的,由于用户侧安全操作方面依然有可能给攻击者提供机会(去中心化交易所以德(EtherDelta)被盗--我们如何从中吸取教训。其二是交易驱动的模式,对普通用户而言,有较高的操作门槛。任何的资产操作和交易操作都是通过以太坊交易来驱动,也因此导致了交易速度慢,交易深度不够,交易费用高,交易列表更新不及时,交易序号无效,交易重复,交易不能合并成交等等很多广泛被用户诟病的问题。

第二阶段

雷电网络

关于雷电网络的说明可以看我的上一篇博文http://blog.csdn.net/YANGDAHUAN/article/details/79338684


3、分叉

我们首先来理解一下分叉是什么

分叉的概念:比特币网络正常运行依赖于节点按一致的规则检验和收录区块,这种情况下即便偶尔同时有多个相同高度的正确的区块产生,分支博弈也会导致全网迅速归集到同一链上。但当涉及规则改变时,即网络中存在遵守不同的规则的旧节点和新节点时,就会存在区块链分叉且不能迅速回归同一链的可能,按具体情况又分为硬分叉和软分叉:

这里提到一个概念:

分支

我们知道比特币系统的网络上会存在多个矿工同时进行挖矿,如果在某一时刻有两个/多个矿工同时挖到了矿(因为分布式网络里消息广播是需要时间的,所以这里的同时并不是同一时刻,而是两个/多个矿工挖到矿后向网络节点广播消息,各自互相被听到的时间,因为矿工只有在接收到别的矿工已经挖到矿的消息后才会停止挖矿,所以肯定存在一种可能:系统会存在多个矿工都挖到了矿),并且他们各自收集到的区块里的交易信息都是合法的,那么这两个矿工会把各自认为正确的区块加入到区块链当中去,此时系统里的区块链就会有两个分支。那么最终系统会采纳哪一个分支呢?答案是:这两个分支都会被保留,此后两个分支会交替增加,系统会优先选择较长的分支作为主干,而短的分支会被遗弃(短的分支里的区块被成为Orphan Block),里面的交易信息会被重新加入到交易确认队列池(pool of queued transactions)里面等待验证。如图所示:

区块链学习(五、以太坊)


理解了区块链的分支概念,双重支付问题就很好理解了。比如说:我们有两笔交易:

transaction1:从A地址转1个比特币到B地址;transaction2:从A地址转1个比特币到C地址;

而A地址的账户上总共只有一个比特币,很明显这就是一个Double Spending Problem。我们假设A地址向网络节点同时广播这两条交易信息,并且恰好这两个交易分别被两个矿工加入到了各自的区块链中,并且各自验证都是正确的(因为各自区块之前的区块里都没有这条交易记录 )。B地址在得到了交易transaction1成功的确认后就发货给了A。但是过了几个区块之后,transaction2所在的区块链却是最长的,于是系统采用了transaction2所在的区块链。而transaction1所在的区块变成了Orphan Block,那么此时再把transaction1放到交易队列里验证时发现账余额不足(因为这个块肯定是接在transaction2所在区块的后面),于是交易被取消,也就是说A并没有向B成功转账,而B却给A发了货,这就是比特币里存在的双重支付问题。那么如何避免呢?答案很简单:收到交易确认后不着急发货,而是再等6个区块的确认消息,如果交易不取消的话就发货。


而对于矿工来说,当一个区块包含无效交易,该区块将被网络忽略,发现这个区块的矿工就会失去区块奖励。因此通常矿工只想挖到有效区块,并加入最长的链。


我们在上面可以看到关于分支一个关键的前提:

注意,能够让区块链保证数据唯一性的前提是:所有矿工都遵从同样的机制。

那么如果没有按照一致的规则检验和收录区块呢?这时就是所谓的分叉


那么,分支我们可以理解,毕竟用户多,范围广,总归会发生的,但是分叉是如何发生的呢?

分叉

就是矿工不遵从同样的机制,那么也会出现分叉。这种分叉又有两种情况:一是由于整个区块链系统软件的升级,一部分矿工没有来得及升级,出现了遵从不同机制产生的分叉。当这部分矿工升级系统后,这个分叉就会消失,我们称这种分叉为软分叉二是由于矿工之间出现分歧,一部分矿工决定采用不同的机制,产生出来的分叉是不会消失的。我们一般把这种分叉称为硬分叉

详细一点说的话

软分叉

当整个区块链网络中,系统版本或协议升级后,且和老版本协议不兼容,那么升级后的新节点就无法接受老节点挖出来的全部或者部分区块,因为新节点的算力较大,所以老的节点挖出来的区块没有机会得到认可,老节点产生的区块最终会被认为是短链而被放弃,新老节点始终还是在同一条链上工作,这种情况称作软分叉。新节点要求比老节点严格多。 

硬分叉

当整个区块链网络中,系统版本或协议升级后,且和老版本协议不兼容,未升级的老节点无法接受新节点挖出的全部或者部分区块,导致出现了两条链,假设新节点的算力较大,新节点们在维护一条链,老节点也始终在维护一条他认可的链,如果这时候大多数的节点都开始升级为新版本,那么老节点维护的链能不能存活就看算力有多少了,这就称作硬分叉。 

最粗浅的理解就是软分叉还是一条链,硬分叉就会分成两条链。 

总结一下特性的话,就是

软分叉:向后兼容,没升级的节点会继续将新交易视为有效的。然而未升级节点继续挖出的区块将被升级节点拒绝(因为新节点的算力较大,所以老的节点挖出来的区块没有机会得到认可,老节点产生的区块最终会被认为是短链而被放弃)。

硬分叉:不兼容旧软件,旧版软件的节点将发现新交易是无效的,挖矿也无效

软硬分叉的优缺点

从上面的定义可以看出软硬分叉有各自的优缺点,首先软分叉和硬分叉相比拥有下面的优点:

  1. 软分叉总是只有一条链,没有分成两条链的风险;
  2. 软分叉不要求所有节点同一时间升级,允许逐步升级,且并不影响软分叉过程中的系统稳定性和有效性;

但软分叉也有缺点:

  1. 软分叉的前提是老的节点总是能够接受新节点的区块,这就要求把系统设计成向前兼容(forward compatible);
  2. 软分叉总是建立在对老节点进行欺骗的基础上,它让老节点没有察觉实际上已经发生的变化,某种程度上违背了单点完整验证的原则;

以太坊(ETH)和以太坊经典(ETC)

上面说到了软硬分叉的问题,那么,比特币是采用软分叉的方式来进行升级的,而以太坊则因为‘盗窃’事件之后,进行了硬分叉而导致区分出了以太坊和以太坊经典,那么我们首先要该清楚两者的区别

ETC是Ethereum Classic的简称,中文名称是以太坊经典,俗称二姨太。以太坊在第1920000区块高度上硬分叉出来两条链,分别称为ETH chain和ETH Classic chain,上面的代币分别称为ETH和ETC

那么这两者之间有什么区别呢


关于区块链的可变性

ETH——假如大部分人同意修改链条(也就是可变性),那么就可以修改区块链记录和合约

ETC——区块链记录和合约不可修改(也就是不可篡改性)

下面是关于两种方法的利弊

可变性的好处是人们可以适时地改变以做出正确的决定。因此,修改规范比找漏洞更实用。

不可修改性是人们不管当时有多聪明,但也不可能会不出错。因此,应对此方案出现问题的时候,最好是通过现有的法律框架来寻找和解决漏洞。

关于发展的不同

ETH——不管是有意安排或者从诞生就如此,区块链核心决策都是在社区的参与下由以太坊基金会制定并大部分由它开发。

ETC——区块链的决策主要是通过三个松散的、有协作关系的团队在社区参与下得到反馈而决定的。

在任何情况下,任何人都可以为两种区块链提出改进建议。这正是开源之好处,也是很常见的。你会发现,这两条链的开发人员通过Github和Reddit来相互沟通。我希望为了实现共同目标,提高沟通和交流的频率。

关于兼容性

目前,这两种区块链都相互兼容。ETH写的合约(或应用程序)可以在ETC上应用,反之亦然。

ETH——专注于eWASM,致力于为越来越多的开发者提供平台。而对于合约安全性的问题是次要的(例如:Viper)

ETC——专注于让开发者创造出更安全的合约(例如:Viper,IOHK研究),代价是消耗潜在的开发者人数。

很明显,这两条链都可以互相接纳。不管它们的意愿是否相同。我的看法是,开发人员的数量并不一定与产品的质量挂钩。

关于交易速度

ETH——平均25秒。升级之后会缩短。

ETC——平均14秒。升级之后维持在10-14秒(根据ECIP-1010 和 ECIP-1036协议)

关于区块容量

ETH——随着ETH日交易量逐渐达到5百万,区块容量日渐饱和,这种情况跟最近比特币的交易费用问题类似,这个问题可以通过对区块扩容得到解决(通过增加默认的燃料限制)

ETC——目前区块容量还有很大空间。随着越来越多的人接受ETC,区块容量也会随着增加,跟ETH一样。

关于货币政策

ETH——计划供应稳步增长,导致ETH区块链在生命周期里平均有3%的通货膨胀。

ETC——2025年之前,通货膨胀达到3%,届时总供应量将达到2亿ETC。之后会通货紧缩。

关于证券

ETH——目前投资者没有交易证券的选择权。最近ETH的一个ETF(交易型开放式指数基金)产品被监管层否定了。

ETC——拥有ETC交易信托基金,该基金允许投资者拥有ETC,而不用拥有这个资产本身。