主页 > imtoken钱包ios版 > 以太坊学习笔记
以太坊学习笔记
区块链是具有共享状态的加密安全交易的单一机器。 作为继比特币之后极具影响力的公链,以太坊本质上是一个基于交易的状态机。 与其他分布式系统不同,它的目的是让所有节点都具有相同的状态。
一、以太坊的主要特点
以太坊的目标是建立一个运行智能合约的去中心化平台(Platform for Smart Contract)。 平台上的应用程序根据程序设置运行,不存在停机、审查、欺诈或第三方人为干预的可能性。 为了搭建这个平台,以太坊提供了一个开放的区块链,并为智能合约开发了一套编程语言Solidity。 智能合约开发者可以使用官方提供的工具开发支持以太坊区块链协议的应用程序。 以太坊的主要特点包括:
关注与比特币的对比,感受差异。
2. 以太坊的核心概念
与比特币的 UTXO 不同,以太坊是基于账户的。 细节与比特币有很大不同。
帐户
以太坊中有两种类型的账户,它们共享相同的地址空间。
外部账户地址由公钥确定,合约账户地址由合约创建者的地址和合约创建时该地址发送的交易数量计算得出。 两种账户的唯一区别是外部账户没有代码,人们可以通过创建和签署交易从外部账户发送消息。 每当合约账户收到一条消息时,合约内部的代码就会被激活,允许它读取、写入内部存储、发送其他消息以及创建合约。
一个以太坊账户由 4 个部分组成:
①随机数,用于确定每笔交易只能处理一次的柜台;
②账户当前以太币余额;
③账户的合约代码(如有);
④ 账号存储(默认为空)。
/// Basic account type.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BasicAccount {
/// Nonce of the account.
pub nonce: U256,
/// Balance of the account.
pub balance: U256,
/// Storage root of the account.
pub storage_root: H256,
/// Code hash of the account.
pub code_hash: H256,
/// Code version of the account.
pub code_version: U256,
}
复制代码
信息
以太坊消息传递与比特币交易有些相似,但两者之间有 3 个重要区别:
1)以太坊消息可以由外部实体或合约创建,而比特币交易只能在外部创建。
2) 以太坊消息可以选择性地包含数据。
3)如果以太坊消息的接收者是合约账户,可以选择响应,也就是说以太坊消息也包含了函数的概念。
贸易
以太坊中的“交易”是指存储从外部账户发送的消息的签名数据包。 交易包含消息的接收者、确认发送者的签名、以太币账户余额、要发送的数据以及两个称为 STARTGAS 和 GASPRICE 的值。 为了防止代码中的指数爆炸和无限循环,每个交易都需要限制执行代码所需的计算步骤数。 STARTGAS是通过需要支付的燃料来限制计算步数,GASPRICE是每一步计算需要支付给矿工的燃料价格。
/// Signed transaction information without verified signature.
#[derive(Debug, Clone, Eq, PartialEq, MallocSizeOf)]
pub struct UnverifiedTransaction {
/// Plain Transaction.
unsigned: Transaction,
/// The V field of the signature; the LS bit described which half of the curve our point falls
/// in. The MS bits describe which chain this transaction is for. If 27/28, its for all chains.
v: u64,
/// The R field of the signature; helps describe the point on the curve.
r: U256,
/// The S field of the signature; helps describe the point on the curve.
s: U256,
/// Hash of the transaction
hash: H256,
}
/// A set of information describing an externally-originating message call
/// or contract creation operation.
#[derive(Default, Debug, Clone, PartialEq, Eq, MallocSizeOf)]
pub struct Transaction {
/// Nonce.
pub nonce: U256,
/// Gas price.
pub gas_price: U256,
/// Gas paid up front for transaction execution.
pub gas: U256,
/// Action, can be either call or contract create.
pub action: Action,
/// Transfered value.
pub value: U256,
/// Transaction data.
pub data: Bytes,
}
复制代码
气体
以太坊上的每笔交易都会收取一定数量的 Gas。 设置Gas的目的是为了限制交易执行所需的工作量,并为交易的执行付出代价。 当EVM执行一笔交易时,Gas会按照一定的规则逐渐消耗。 Gas价格由交易创建者设定,发送账户需要预付交易手续费=GASPRICE * Gas数量。 如果执行后还有Gas剩余,则将Gas返还给发送账户。 无论在哪里执行,一旦Gas耗尽,都会触发out-of-gas异常。 同时,将回滚当前调用框架所做的所有状态修改。
以太坊虚拟机
以太坊虚拟机 (EVM) 是智能合约的运行时环境。 它是一个完全独立的沙箱。 合约代码运行在EVM内部,与外界完全隔离。 即使是不同的合约也有有限的访问权限。 这是以太坊项目的重大创新。
存储、主存和栈
每个账户都有一个永久存储区,称为storage,以key-value的形式存在,key和value的长度都是256位。 在合约中,无法遍历账户的存储。 与主存和栈相比,storage的读操作开销比较大,storage的修改代价更大。 合约只能读写自己的存储。
第二个内存区域称为主内存。 每次调用消息时,合约执行都会有一个新的清除主内存。 主存可以按字节寻址,但读写的最小单位是32字节。 操作主存的开销随着主存的增长而变大。
EVM 不是基于寄存器的,而是基于堆栈的虚拟机。 因此,所有计算都在称为堆栈的区域内执行。 堆栈最多有 1024 个元素,每个元素有 256 位。 对栈的访问仅限于栈顶,允许将栈顶的 16 个元素之一复制到栈顶,或者交换栈顶的 16 个元素之一。 所有其他操作只能取最顶层的一个或几个元素并将结果压入栈顶。 当然,你可以把栈中的元素放入存储器或主存中。 但是不可能只访问栈中指定深度的元素。 在此之前,必须从堆栈中删除指定深度以上的所有元素。
指令系统
EVM 的指令集故意保持在最低限度,以避免可能导致共识问题的错误。 所有指令都对256位的基本数据单元进行操作,具有常用的算术、位、逻辑和比较运算,还可以进行条件跳转和无条件跳转。 此外,合约可以访问当前区块的相关属性,例如它的编号和时间戳。
留言电话
合约可以通过消息调用调用其他合约,或者发送以太币给非合约账户。 消息调用与交易非常相似,它们都有源、目的地、数据有效负载、以太币、gas 和返回数据。 实际上,每笔交易都可以看作是一次顶层的消息调用,进而产生更多的消息调用。
合约可以决定剩余 Gas 的分配。 比如内部消息调用使用了多少Gas,或者预留了多少Gas。 如果在内部消息调用过程中发生了 out-of-gas 异常或其他异常,将通知合约并将错误代码压入堆栈。 这种情况只是内部消息调用的gas耗尽。 在solidity中,这种情况下发起调用的合约默认会触发一个人为的异常,这个异常会打印出调用栈。
如前所述,被调用合约(以及调用合约)将拥有新的主内存并可以访问调用有效负载。 呼叫有效载荷存储在称为呼叫数据的单独区域中。 调用执行后,返回的数据会存放在调用者预先分配的一块内存中。 调用层数限制为1024。所以对于更复杂的操作,我们应该使用循环而不是递归。
代码调用和库
以太坊中存在一种特殊类型的消息调用,称为调用代码。 它与消息调用几乎完全相同,只是从目标地址加载的代码将在调用合约的上下文中运行。 这意味着合约可以在运行时从另一个地址动态加载代码。 存储、当前地址和余额都指向调用合约,只有代码是从被调用地址中获取的。 这允许 Solidity 实现“库”。 可复用的库代码可以应用于合约的存储,可以用来实现复杂的数据结构,让智能合约更加强大。
以太坊中的状态转换
以太坊的状态转换是指当一笔交易发生时,以太坊从一个正确的状态变为
过渡到下一个正确的状态
转换过程。
状态转移函数
S'" src="https://juejin.cn/equation?tex=APPLY(S%2CTX)-%3ES'" loading="lazy">的具体过程:
检查交易格式是否正确、签名是否有效以及随机数是否与发送方帐户的随机数匹配。 如果不是,则返回错误。计算交易费用
, 并从签名中确定发件人的地址。 从发送者的账户中减去交易费用并增加发送者的随机数。 如果账户余额不足,则返回错误。设置初始值
,并根据交易中的字节数减去一定量的gas值。 将价值从发送者的账户转移到接收者的账户。 如果接收帐户不存在,请创建此帐户。 如果收款账户是合约,则运行合约的代码,直到代码运行结束或者gas耗尽。 如果由于发送方账户没有足够的手续费或代码执行耗尽燃料导致价值转移失败,将恢复原状,但仍需支付交易费以太坊项目特点,交易费将添加到矿工账户中帐户。 如果代码执行成功以太坊项目特点,所有剩余的gas将返回给发送方,消耗的gas将作为交易费用发送给矿工。 3. 以太坊智能合约 智能合约
区块链可以为智能合约提供可信的执行环境,以太坊实现了区块链与智能合约的完全适配。 以太坊是一个内置了图灵完备编程语言的区块链。通过建立一个抽象的基础层,任何人都可以创建合约和去中心化应用程序,并设置他们自由定义的所有权规则、交易方式和状态转换函数。
开发语言
以太坊有 4 种专用语言:
代码执行
以太坊合约的代码是用一种称为“以太坊虚拟机代码”(“EVM 代码”)的基于堆栈的低级字节码语言编写的。
4. 以太坊架构
以太坊架构图如下:
快速描述:
参考文件:
以太坊白皮书 以太坊黄皮书
以太坊黄皮书中文译本
以太坊如何运作
以太坊设计与实现