gitbook/深入浅出区块链/docs/6519.md
2022-09-03 22:05:03 +08:00

137 lines
12 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第18讲 | 智能合约与以太坊
在前面的文章里,我们介绍了区块链的核心技术,也穿插介绍了一些项目。然而每个区块链都有自己的特色,接下来我们将针对每个项目进行详细讲解。今天我们就来讲讲智能合约和以太坊项目。
今天我们从智能合约这个概念入手,聊聊什么是以太坊项目以及它的发展历史。最后还会介绍几款钱包给你,希望通过今天文章的讲解,你也可以尝试在以太坊上编写简单的智能合约。
## 智能合约的概念
不同于法律意义上的合约概念,区块链领域的合约表达的是可以“自治自理”的 计算机协议,这套协议具有自我执行、自我验证的属性。
如果完全从技术角度来看,智能合约等价于一段事先就被规定好逻辑和条款的计算机代码被激活运行的状态,同时,智能合约也提供了通用的用户接口,用户可以通过接口与用户交互。
智能合约这一概念早在20世纪90年代就有人提出这个人是从事智能合约和数字货币研究的尼克萨博Nick Szabo博士尼克1996年在《Extopy》期刊上发表了对智能合约的描述他认为智能合约是一个由数字表单指定的承诺这个承诺包含关系到多方执行的一组协议。
从定义中我们可以得知,智能合约由多个协议组成,这些协议包含了用户接口,能表达用户的承诺,它可以安全有效地确定公共网络上的关系。
换句话说,智能合约是一个由计算机处理、可执行合约条款的交易协议,其总体目标是满足协议既定的条件,例如支付、抵押、保密协议。这可以降低合约欺诈造成的损失,降低仲裁和强制执行所产生的成本以及其他的交易成本。
我们举个实际的例子解释一下今年4月9日上海某建设银行支行开放了“无人银行”银行中充斥了众多机器和显示屏智慧柜员机、VTM机、外汇兑换机、VR设备和两台机器人代替了传统的柜台。
这里的智慧柜员机、外汇兑换机器人众多电子设备都可以认为是智能合约的一种表现形式,用户在办理银行业务时,如办理大额汇兑业务,业务流程和逻辑依据已经定在程序中,用户只需要按照操作一步一步进行,办理完成后即可获得单据。
这里“既定的业务流程、机器人模样的人机交互界面、双方同意承诺”组成了智能合约的概念,它甚至具有一定的法律效力。
萨博提出的是智能合约的概念以及我们举的例子都是广义的智能合约概念。智能合约具有多种实践形式而在区块领域所说的智能合约概念我们其实是指Blockchain-based这种形式。
在萨博的智能合约概念中提到了开放式网络,而我们知道开放式网络的基本要求就是拜占庭容错,通过前面文章的讲解我们知道,区块链天然具有拜占庭容错特性。所以如果在区块链上实践智能合约这个概念,两者会非常契合,天造地设。
首先实践了智能合约这一概念的是比特币比特币脚本bitcoin script包含了5种标准交易脚本这些脚本的功能不仅仅提供了普通单人支付的情况它还提供了多方共同签名支付的脚本叫做多重签名支付多重签名支付可以看成是萨博语义下的智能合约。
除了比特币,发扬光大智能合约这个概念的区块链项目就是以太坊了,下面,我重点来介绍一下以太坊项目。
## 以太坊及其发展历史
以太坊Ethereum项目的目标是打造一个去中心化的新一代互联网应用平台这个平台称作Dapp平台。
这些Dapp基于以太坊智能合约虚拟机开发、编译、部署并且可以自定义业务逻辑部署后全网可见且自动执行理想情况下不存在宕机、审查、欺诈、第三方干预的情况。
* 2013年底以太坊的创始人Vitalik在比特币开发者社区提出了可以运行图灵完备Turing-complete形式的应用但这一思想并没有得到比特币社区的支持。
* 2014年Vitalik带着自己的想法宣布以太坊项目正式成立2014年上半年开始筹集资金聚拢一些早期开发者同年7月份进行了为期42天的ICO共筹集了超过1800万美元的比特币。
* 2015年7月第一个版本的以太坊发布主网正式上线这一阶段Bug和设计缺陷较多多是开发者在使用。
* 2016年以太坊发布第二个大版本Homestead用户逐渐多了起来同期也吸纳了不少Dapp开发者。
* 2016年6月以太坊上发生了著名的黑天鹅事件——TheDAO事件这打开了ICO市场同时也造成了以太坊社区分叉形成了以太坊和以太坊经典两个代币。
* 2017年4月ICO风靡中国ERC20提供了低成本方便高效的资金募集方式为ICO提供了极大的便利趁着数字货币牛市以太坊的价格涨幅达十多倍2018年1月以太坊价格突破1000美元。
## 以太坊的核心概念
以太坊核心概念包括智能合约虚拟机EVM和Solidity编程语言、账户模型、以太币和Gas交易和消息。
### 1.智能合约虚拟机EVM和Solidity编程语言
以太坊的核心概念首先是智能合约。
智能合约包含两部分一部分是开发语言主要以Solidity为主Solidity与Javascript语言在使用上十分接近这极大地降低了Dapp开发人员的学习成本。
Dapp开发者编写好代码以后使用Solidity编译成十六进制字节码然后部署到EVM上也就是把合约广播到全网等矿工打包后就形成了常年运行的Dapp了。
另一部分就是EVM。 EVM是以太坊智能合约虚拟机我们可以等价理解它为Javascript、Python等脚本语言的执行引擎。
它是一个轻量级的虚拟机隔离环境它并不提供访问本地网络、进程、文件系统的功能它更像是一个封闭的容器这个容器里面装了一个正在运行Dapp可以看成是无法和外界交互的Docker Container。
Dapp在运行过程中可以被请求或其他事件触发然后执行相应的逻辑,这些请求和事件是由以太坊上的交易产生的,不是来自本地操作系统的事件。
Dapp运行过程中每次状态发生变化则意味着全网同步更新大家的计算结果都是一致的这有两个特性
1. 所有Dapp的计算结果经过全网共识一旦确认过几乎无法被伪造和篡改
2. 由于必须经过全网共识,所以这限制了整个网络的容量。
### 2.账户模型
以太坊并没有采用UTXO模型也不同于银行账户它是由以太坊开发者设计了自己的账户模型。
以太坊上的账户有两种类型第一类叫做合约账户CAContracts Accounts)第二类叫做外部账户EOAExternally Owned Accounts
简单理解就是CA是智能合约代码用的账户EOA是人用的账户所以CA可以存储并执行智能合约代码它的智能被EOA激活它也不保存和存储私钥合约账户可以调用其他合约。
EOA则是人们直接控制的账户可以存储以太币可以发送交易到合约账户触发既定的逻辑。EOA账户由公钥标识由对应的私钥控制。
当合约账户被调用时存储其中的智能合约可以在矿工处的虚拟机中自动执行并消耗Gas如果Gas不足则会触发“Out of Gas”异常被终止执行。
无论是CA还是EOA在以太坊内部都被看做状态对象state objects意思就是说这些账户都有自己的状态EOA具有以太币余额的状态而CA除了余额还多了合约存储状态。
### 3.以太币和Gas
Gas是执行智能合约操作的燃料智能合约的每一个步骤都会消耗GasGas是由以太坊的平台代币以太币转化而来最小单位是wei1ETH 相当于 10的18次方 wei。
以太币可以通过PoW挖矿而产生目前以太坊主要通过GPU挖矿。挖出一个块可以换得5个以太币并且还有一定的交易费、以及叔伯块的奖励。今年4月6日爆出著名矿机芯片厂商比特大陆已经开发出针对以太坊的ASIC专业矿机相比GPU的效率提升2.5倍。
### 4.交易和消息
以太坊上的交易与比特币中的UTXO交易不同它是指EOA账户将一个经过签名的数据包发送到另外一个账户的过程这个过程产生的账户状态变化将被存储到以太坊区块链上。
以太坊上除了交易还有消息这个概念,消息指一个合约账户调用其他合约账户的过程,可以类比函数调用过程。
所以以太坊上的Dapp如果被触发有两种可能第一种是交易触发第二种是消息触发。
这两种的区别在于前者是EOA发起的后者只能是其他合约账户发起的。
状态对象的状态变化被以太坊共识机制的记录下来,交易和消息驱动着状态的变化,于是,在一个开放式的网络中构建一个全球共享的Dapp变得十分方便。
以太坊上智能合约具有全网准实时同步、准确执行、去中心化运行、较低的人为干预风险等特性EVM和Solidity为全球开发者提供了较低的进入门槛。
## 与比特币的主要区别
以太坊项目又被称作区块链2.0项目这里2.0就是指智能合约。那么以太坊与比特币相比,到底智能在那里呢?我们具体来看看。
与比特币相比以太坊首先不是一个单纯的数字货币项目它可以提供全世界无差别的区块链智能合约应用平台这个平台基于我们前面文章所介绍的区块链四大核心技术要素即P2P网络、共识机制、账户模型、加密模块。
除了以上的四个技术要素以太坊还推出了EVM——以太坊智能合约虚拟机并且它还推出了自己的智能合约语言Solidity。
于是区块链的开发者因为智能合约的出现开始分为两类。第一类是公链底层开发者主要是以C++和Go语言为主的全节点开发者他们需要对区块链各个技术模块有很深的理解。
第二类是智能合约开发者也就是应用开发者这类开发者对区块链的运行原理不需要理解很深只需要会编写Solidity了解规范即可。
除了以太坊智能合约这个概念以外,它还设计了下面的内容。
1. 研究并实现了自己的PoW挖矿算法——ETHASH这是一个内存困难型的挖矿算法。
2. 叔伯块激励机制,降低了挖矿中心化的趋势。 取消了UTXO模型采用了账户模型和世界状态提供了数据结构的可塑性。
3. 设计了Gas机制避免程序死循环消耗全网资源的情况出现。 研究并实现了自己的PoS共识算法——Casper可防止Nothing-at-Stake攻击。
4. 以太坊提供了在区块链自由编程的能力智能合约让所有人得以开发属于自己的Dapp这是与比特币作为单纯的数字货币所不具有的能力。
## 总结
本篇我们介绍了智能合约的概念以及以太坊项目,并且讲解了与比特币的主要区别,以太坊上的一些核心概念,下一篇我们将结合实际案例讲解智能合约,带领你认识一些智能合约模板,并顺便介绍一下其他区块链智能合约平台。
亲爱的读者快来构想一下属于自己的智能合约Dapp吧。你可以给我留言我们一起讨论。
参考链接:
[https://en.wikipedia.org/wiki/Smart\_contract](https://en.wikipedia.org/wiki/Smart_contract) [http://tech.ifeng.com/a/20180413/44947993\_0.shtml](http://tech.ifeng.com/a/20180413/44947993_0.shtml)