# 以太坊学习笔记

By [moonly](https://paragraph.com/@moonly) · 2022-05-07

---

以太坊账户
-----

在以太坊系统中，状态是由被称为“账户”（每个账户由一个20字节的地址）的对象和在两个账户之间转移价值和信息的状态转换构成的。以太坊的账户包含四个部分：

*   随机数，用于确定每笔交易只能被处理一次的计数器
    
*   账户目前的以太币余额
    
*   账户的合约代码，如果有的话
    
*   账户的存储（默认为空）
    

以太坊有两种类型的账户：外部所有的账户（由私钥控制的）和合约账户（由合约代码控制）。

消息和交易
-----

以太坊中“交易”是指存储从外部账户发出的消息的签名数据包。交易包含消息的接收者、用于确认发送者的签名、以太币账户余额、要发送的数据和两个被称为STARTGAS和GASPRICE的数值。

STARTGAS:是用来限制合约执行步骤的，每一步都需要消耗GAS，GAS消耗完交易未完成则强制失败，如果执行交易中止时还剩余瓦斯，那么这些瓦斯将退还给发送者。

GASPRICE是每一计算步骤需要支付矿工的费用

**以太坊状态转换函数**
-------------

![https://raw.githubusercontent.com/ethereumbuilders/GitBook/master/en/vitalik-diagrams/ethertransition.png](https://storage.googleapis.com/papyrus_images/bab54b09132fe57459e2b350e5e622a094cb9e97ce5ff0c9e3cc9f46a2972e4a.png)

https://raw.githubusercontent.com/ethereumbuilders/GitBook/master/en/vitalik-diagrams/ethertransition.png

以太坊的状态转换函数：`APPLY(S,TX) -> S'`，可以定义如下：

1.  检查交易的格式是否正确（即有正确数值）、签名是否有效和随机数是否与发送者账户的随机数匹配。如否，返回错误。
    
2.  计算交易费用:`fee=STARTGAS * GASPRICE`，并从签名中确定发送者的地址。从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足，返回错误。
    
3.  设定初值`GAS = STARTGAS`，并根据交易中的字节数减去一定量的瓦斯值。
    
4.  从发送者的账户转移价值到接收者账户。如果接收账户还不存在，创建此账户。如果接收账户是一个合约，运行合约的代码，直到代码运行结束或者瓦斯用完。
    
5.  如果因为发送者账户没有足够的钱或者代码执行耗尽瓦斯导致价值转移失败，恢复原来的状态，但是还需要支付交易费用，交易费用加至矿工账户。
    
6.  否则，将所有剩余的瓦斯归还给发送者，消耗掉的瓦斯作为交易费用发送给矿工。
    

**代码执行**
--------

EVM代码由一系列字节构成，每一个字节代表一种操作。代码执行是无限循环，程序计数器每增加一（初始值为零）就执行一次操作，直到代码执行完毕或者遇到错误，`STOP`或者`RETURN`指令。

操作可以访问三种存储数据的空间：

*   **堆栈**，一种后进先出的数据存储，32字节的数值可以入栈，出栈。
    
*   **内存**，可无限扩展的字节队列。
    
*   **合约的长期存储**，一个秘钥/数值的存储，其中秘钥和数值都是32字节大小，与计算结束即重置的堆栈和内存不同，存储内容将长期保持。
    

区块链三难困境
-------

1.  去中心化：创建一个不依赖中央控制点的区块链系统
    
2.  可扩展性：区块链系统处理越来越多的交易的能力
    
3.  安全：区块链系统按预期运行、保护自己免受攻击、错误和其他不可预见问题的能力

---

*Originally published on [moonly](https://paragraph.com/@moonly/l4PQHe2dWdO6isOO6V4W)*
