了解以太坊
以太坊简介
和比特币不一样,以太坊是一个可编程的区块链平台。与比特币相比,两者都属于公有链,但是以太坊侧重于可编程的智能合同即分布式应用程序。
也就是说,以太坊可以理解为一个永不宕机的世界计算机。 可想而知,这样的系统需要满足很多条件:其中最重要的就是它不能受平台的限制,必须实现跨平台通用,如Linux, Windows, mac等。因此,实现这个要求的最佳方案就是虚拟机——和JVM一样,以太坊也有一个自己的虚拟机环境 EVM。
此外,这个系统如何控制软硬件对计算机资源的消耗?因为可能存在恶意的软件不断消耗以太坊平台的资源。答案很简单,就是引入代币机制,而以太坊中的代币就是以太币。也就是说,以太币仅仅是驱动智能合约执行所需燃料的加密令牌。
以太坊设计原则
- 简单性: 协议尽可能简单
- 普遍性: 没有“特征”
- 模块化:各个部分尽可能模块化和可分离
- 敏捷性:更改容易,允许通过硬分叉进行重大修改。硬分叉即不向前兼容,旧节点不能接收新的区块。通常在硬分叉之后,更新后的节点会得到一定的币的补偿,以激励节点更新到新的版本。
- 不歧视,不审查:
- 协议不会限制特定类别的使用
- 监管机制不会反对具体的不可取的应用
- 能运行无限循环的脚本
以太坊虚拟机
- 智能合约在不同的操作系统、硬件平台都应该具有确定性和一致性的结果
- 可以执行任意算法复杂性的代码
- 开发人员可以使用基于现有熟悉的变成创建在EVM上运行的应用程序
- 每个运行EVM的节点都是共识协议的一部分,独立验证交易序列、运行交易触发的代码。
以太坊系统特点
- 可以部署基于分布式的大规模并行化计算
- 为DApp(去中心化的应用程序)提供了极端水平的容错能力,确保零停机时间
- 数据不可更改和可追溯
所以说,对于一个DApp,我们在设计的时候只把关键的业务逻辑写到区块链上,多方面不需要共识的部分我们就放在链下。
以太坊应用领域
- 对等实体之间的直接交互或者跨网络的组织之间组织协调。
- 基于点对点的应用领域或复杂金融合约自动化运行领域。例如:复杂的金融交流或交换;信任、 安全和持久性都很重要的环境一. 例如资产登记、投票、治理和物联网。
以太坊的升级和分叉
以太坊框架
以太坊账户
账户是以太坊的核心角色,以太坊中的交易就是账户之间价值和信息的转换。
账户的结构如下:
账户也分为两类:外部账户和 合约账户
- 外部账户(EOAs) 由公钥-私钥对 控制,没有相关代码
- 合约账户由交易类型、消息类型进行创建,由代码控制
以太坊中,所有的交易发起者,只能是外部账户。但是,智能合约执行过程中,可以创建新的交易
以太币
以太币是以太坊中货币的名称,它被用来支付以太坊虚拟机(EVM)计算的费用。它不是被直接消耗掉而是间接的通过购买gas 来实现的。
以太坊最小的面额被称为Wei,1 Eth = 1e18 Wei
获得以太币有三种方式:成为以太坊矿工,通过挖矿获得以太币;通过第三方担保和持有以太币的人进行交易;使用用户友好Mist以太坊钱包,用客户端API购买以太币
交易
以太坊中“交易”是指存储从外部账户发出的消息的签名数据包,数据包中包含从一个外部账户发往一个账户的消息。
一笔交易的组成部分如下图所示:
value字段就是转账的金额,Startgas和Gasprice我们比较陌生,所依赖着重学习一下:
- Startgas 指该交易能消耗的最大的瓦斯使用量,如果交易完成还有得多,会将gas退回到账户
- Gasprice 指的是一个gas的单价,这个单价是可以变化的。
消息
消息可以理解为一种特殊的交易,是合约代码执行过程中对其他合约的功能调用(通过操作码“CALL”和“DELEGATECALL”)。
消息与交易都会导致接收者的合约账户执行合约代码,区别在于交易是外部账户创建的,而消息则由合约也只能通过合约创建。
比如说,我要给A转10个以太币,那么我可以只发起一个交易;但是我也可以把这个操作写到一个智能合约,我可以调用这个智能合约实现转账,这时候合约发起的是一个消息。
但是消息不一定只用于转账,也可以用做消息传递。
GAS
在以太坊中用瓦斯(GAS)作为合约代码执行成本基本单位。瓦斯由外部账户通过以太币从执行代码的矿工那里购买。矿工可以决定瓦斯价格,即设置最低价格的单价,低于该价格的交易会被矿工拒绝。
以太坊为每一个交易和合约的计算步骤设置费用,外部账号可以为交易设置以太币值、STARTGAS和GASPRICE等瓦斯限制,矿工也有权选择验证这个交易以获取费用或者拒绝。
在发送一个交易时根据预估交易费用设置相应的以太币是有必要的,其计算方法如下:
预估交易费用 = 瓦斯使用量 * 瓦斯价格
瓦斯使用量 = 交易瓦斯使用量 + 消息瓦斯使用量
瓦斯价格 = 默认值 = 0.05e18 wei (0.05个以太币)
轻客户端
以太坊中的轻客户端和比特币网络中的轻节点是类似的
- 轻客户端使用全节点作为中介,不需要直接与区块链交易
- 轻客户端只需要下载最新的区块头,速度快效率高
- 轻客户端能判断那些全节点是恶意全节点
- 轻客户端在分片技术中能够发挥重要作用。分片就是
- 轻客户端可以运行在移动设备上
轻节点查询特定账户余额的过程如下,这时候就不是UTXO模型了
- 用户连接到轻客户端,并发送查询特定账户余额的请求。
- 轻客户端调用连接的全节点转发账户查询请求
- 验证全节点给出的答案是否与它们所拥有的“签名”相匹配
- 轻客户端返回结果给用户。
全节点运行网络
全节点最上层是DApp,就是在以太坊平台的基础上由许多开发团队所开发的各类分布式应用项目,如和以太坊基金会是独立的Augur, Digix, Maker。DApp和以太坊的关系与操作系统和应用软件的关系相似。
第二层是RPC,即远程调用接口,包含两个模块:智能合约和共识模块
第三层是区块链本体,包含事件、交易、区块、状态
最下面一层是区块链的基础,分为网络模块和安全模块
智能合约
简介
以太坊中的智能合约是具有特定地址(合约账户)的代码(合约功能)和数据(合约状态)的集合。
以太坊中的智能合约通常使用Solidity等高级语言编写,编译成基于EVM的字节代码后上传到合约账户。
合约的代码以基于EVM的二进制字节码存储在账户中,当被交易或消息触发时在EVM中运行。
合约账户之间可以相互传递消息并实现图灵完备运算。
状态转换
现在我们来学习智能合约调用过程中的状态转换
- 首先检查交易的格式是否正确
- 计算交易费用
fee = STARTGAS * GASPRICE
, 从发送者账户减去交易费用 - 设定初值GAS =STARTGAS,根据交易中的字节数减去一定量的瓦斯值。
- 从发送者的账户转移价值到接收者账户。如果接收账户是一个合约,则运行合约的代码。
- 如果价值转移失败,则恢复原来的状态,但仍需要支付交易费用。
- 否则,将所有剩余的瓦斯归还给发送者。
我们 来看这样一个例子,假设交易中STARTGAS为2000 gas,GASPRICE为0.001以太币
- 检查交易是否有效、格式是否正确
检查交易发送者至少有2000*0.001=2个以太币。如果有,从发送者账户中减去2个以太币。- 先按预估瓦斯费用扣款,再返款
初始设定gas=2000,假设交易长为170字节,每字节的瓦斯使用量是减去850,所以还剩1150。
从发送者账户减去10个以太币,为合约账户增加10个以太币。10个以太币为转账金额
运行代码。在这个合约中,运行代码很简单:它检查合约存储器索引为2处是否已使用,注意到它未被使用,然后将其值置为CHARLIE。假设这消耗了187单位的瓦斯,于是剩余的瓦斯为1150 - 187 = 963。
- 智能合约运行瓦斯使用量
- 向发送者的账户增加963*0.001=0.963个以太币,这是剩下未使用的gas,因此返还给发送者,返回最终状态。