《区块链原理与技术》学习笔记(四) ——以太坊的基本架构、账户模型和智能合约

《区块链原理与技术》学习笔记 第四部分

三、以太坊

1. 以太坊简介

以太坊在比特币原有的性能和应用场景基础上进行了拓展,是第一个支持智能合约的区块链系统,让区块链的应用场景从单一的加密数字货币交易,延伸到灵活多样
的自定义应用设计。

1.1 以太坊发展的阶段

  • Frontier(前沿)阶段:仅供开发者测试使用
  • Homestead(家园)阶段:提供图形界面,提示安全性和平稳性
  • Metripolis(大都会)阶段:在智能合约执行性能、以太坊经济政策等方面进行了优化。
  • Serenity(宁静)阶段:共识机制从PoW转向PoS,采用更多先进技术。

1.2 以太坊与比特币对比

技术方面
以太坊提供了对智能合约的支持,在交易上采用了账户模型,使账户的状态可以实时保存在账户里。另外,燃料费(Gas)的设置让以太坊对合约指令执行进行限制,降低被攻击的风险。

性能方面
在奖励机制上,以太坊增加了叔块奖励,并将出块时间减少到15s左右;

在共识机制上,以太坊采用了PoW的Ethash变种算法,对内存要求较高,限制了强算力矿机的优势。后来以太坊使用了PoS,使持币者也能有一定决定权。

社区方面
以太坊社区比比特币社区更活跃。

2. 以太坊的基本架构及原理

2.1 基本概念

状态:所有的账户、余额、智能合约代码、智能合约状态等统称状态。
智能合约:作用于状态转换的代码
以太坊虚拟机:执行状态转换代码的虚拟机
区块链数据:包括以太坊数据链的数据,和状态数据、收据数据等
节点:保存区块链数据的节点。

2.2 状态转移

已知区块N执行前的状态为S,执行后的状态为S’,S’由S经过N中的交易进行状态转换后得到,转换过程由EVM执行。

由于变换规则固定,因此只要S确定,得出的S’就一定是确定的。

若以太坊区块发生了分叉,我们可以通过区块头的状态根(state root)快速回滚到分叉前的状态。

2.3 基本架构

  • 每个节点独立地维护区块链数据
  • 当有新的交易产生时,节点独立各自从区块链数据读取信息并执行。
  • EVM将执行结果写回区块链数据
  • 节点之间通过共识机制达成共识,维护全网状态一致。

在这里插入图片描述

3. 账户模型与转账

3.1 账户模型

以太坊对于用户账户的记录由所有以太坊节点上,整个系统来确定记录用户的行为,是去中心化的。

账户的公钥和私钥由椭圆曲线计算得到,对公钥使用KECCAK256哈希算法,再取最后40位即为以太坊账户的地址。

以太坊的账户结构记录了这个地址的余额(Balance),最小单位为Wei,和地址发起交易次数的计数器(Nonce),可以检验交易合法性以及账户发起交易的顺序。

只有交易的Nonce和账户的Nonce对应,交易才是合法的。

以太坊的账户模型是为了参与者有稳定的身份,从而能支持智能合约,用智能合约可以实现一些金融衍生品,有利于参与者投资。

4. 智能合约

智能合约利用提前规定好的代码来管理和变化存储在以太坊上的状态变量,并且依靠区块链系统在参与者间实现对执行的一致认可。

4.1 合约账户与数据存储

表示合约的账户称为合约账户,在记录了账户的余额和累计交易次数以外,把合约的计算机代码通过机器码的形式保存在"合约机器码"的字段中,而合约的状态(变量)保存在一个存储的映射表中,存储表的哈希值会存储在账户的"合约存储"字段中。

在这里插入图片描述

合约地址有两种生成方法:

  • 通过合约创建者的地址和Nonce计算得到;
  • 通过合约创建者地址、指定的初始化值和合约代码的哈希值计算得到

当出现合约创建合约的情况时,创建合约的合约账户的Nonce值需要改变。

4.2 驱动智能合约

4.2.1 调用合约

  • 交易的接收方为智能合约所在地址
  • 交易的data字段指定调用的函数和函数的参数。使用了函数名的哈希值作为调用过程函数的索引,哈希值后附上经序列化编码的参数。

4.2.2 创建合约

  • 因为没有合约账户地址,交易中的接收方地址为0
  • data存储合约的代码和初始化代码

4.2.3 停机问题与Gas
以太坊智能合约运行的每一个操作都规定了需要消耗的Gas的数值,并要求交易的发起者预先支付Gas额度,若运行合约代码时,Gas额度被消耗殆尽,则程序终止,解决了智能合约永不停机的问题。

4.2.4 以太坊虚拟机
以太坊运行智能合约使用统一的虚拟机EVM,这是一个256位的栈虚拟机,所有指令都是对栈顶的操作。