以太坊笔记
以太坊有账户的概念,可以实时查看指定地址的账户情况和交易状态。
比特币没有账户的概念,只有UTXO。需要计算。
以太坊架构
智能合约部署在以太坊虚拟机上,通过虚拟机和RPC接口和底层区块链进行交互
核心理念是把区块链作为一个可编程的分布式信用基础设施,支撑智能合约应用。
账户设计
两种账户。外部所有账户EOA和合约账户。
以太坊的设计是将区块链作为一个通用的管理对象状态的去中心化平台,账户就是有状态的对象。
合约账户可以执行图灵完备的计算任务,也可在合约账户之间传递消息,合约编译成EVM字节码。并记录在区块链上。
区块链设计
Merkle Patricia树
PoW机制
Ethash工作量证明机制加入内存难度,使得它具有抵抗单凭哈希运算优化的ASIC挖矿机的属性。每30000个区块需要一个全新的DAG,有向无环图。
计算和图灵完备
EVM高级语言
以太坊P2P网络
节点间使用RLPx协议,Dapp间用Whisper协议
事件
合约是在区块验证的时候被交易触发。以太坊中的事件是一个以太坊日志和事件监测的协议的抽象。事件利用现有的ABI功能来解析日志记录。
以太坊技术
以太坊核心概念
EVM
由许多互联的计算机组成。程序按照EVM定义的方式运行在其上。任何人都可以为所有权、交易格式和状态转换函数创建商业逻辑
账户
两类账户,公用一个空间地址。
外部账户,被密钥对控制。外部账户没有代码。用户通过创建和签名一笔交易从一个外部账户发送信息。
合约账户,被存储在账户中的代码控制。每当合约账户收到一条消息,合约内部的代码就会被激活,允许它对内部存储进行读取、写入、发送其他消息和创建合约。
以太坊的账户包含四个部分
- 随机数,用于确定每笔交易只能被处理一次的计数器
- 账户目前的以太币余额
- 账户的合约代码(如果有的话)
- 账户的存储(默认为空)
消息
类似于比特币的交易,主要有3点不同:
- 以太坊的消息可以由外部实体或者合约创建,比特币的交易只能从外部创建
- 以太坊消息可以选择包含数据
- 如果消息的接受者是合约账户,可以选择进行回应,这意味着以太坊消息也包含函数概念
交易
指存储从外部账户发出的消息的签名数据包。
交易包含:
- 消息的接受者
- 用于确认发送者的签名
- 以太币账户余额
- 要发送的数据
- STARTGAS,通过需要支付的燃料来对计算步骤进行限制
- GASPRICE,每一计算步骤需要支付给矿工的燃料
Gas
每笔交易都会被收取一定数量的Gas,其目的是限制交易执行所需要的工作量,同时为交易的执行支付费用。
存储、主存和栈
每个账户都有一块永久内存区域,成为存储,key-value形式。存储的读写开销比主存和栈大。合约只能对自己的存储进行读写。
第二个内存区叫主存,合约执行每次消息调用时都有一块新的被清除过的主存。
EVM不是基于寄存器的,而是基于栈的虚拟机。因此所有的计算都在一个被称为栈的区域内执行。
指令集
EVM指令集被可以保持在最小规模,以尽可能的避免可能导致共识问题的而错误。所有的指令都是针对256位这个基本的数据单位进行的操作,具备常用的算术、位、逻辑和比较操作还有条件跳转和无条件跳转。
此外,合约可以访问当前区块的相关属性,比如它的编号和时间戳。
消息调用
合约通过消息调用的方式来调用其他合约,或者发送以太币到非合约账户。消息调用和交易非常类似,它们都有一个源,目标,数据负载,以太币,Gas和返回数据。
事实上每个交易都可以被认为是一个顶层消息调用,这个消息调用会一次产生更多的消息调用。
代码调用和库
callcode是一种特殊的消息调用。加载来自目标地址的代码将在发起调用的合约上下文中运行。用来实现库。
以太坊状态转换
一个交易发生时,从一个状态转换到下一个状态
以太坊客户端
go语言客户端Geth
客户端浏览器Mist
以太坊智能合约
智能合约
由尼克萨博提出,几乎与互联网同龄。但一直没有可信的执行环境,以太坊首先实现了区块链和智能合约的完整契合。
以太坊这方面的特性有:
- 图灵完备性
- 价值意识(value-awareness)
- 区块链意识(blockchain-awareness)
- 多状态
开发语言
以太坊有四种专用语言: - Serpent(Python)
- Solidity(Js)
- Mutan(Go)
- LLL(Lisp)
图灵完备,可以解决所有的计算问题。但是半图灵完备,因为通过对计算量设置上限来避免图灵完备语言的无法停机的问题。
代码执行
以太坊合约的代码是使用低级的基于堆栈的字节码的语言写成的。可以访问三种存储空间。
- 堆栈
- 内存,可无限扩展的字节队列
- 合约的长期存储,一个秘钥/数值的存储
堆栈与内存计算结束就重置,长期存储会保持。以太坊的去中心化应用
什么是Dapp
Dapp由智能合约和客户端代码构成。类似于后端和前端。智能合约跑在区块链上。
应用举例
文章标题:以太坊笔记
本文作者:Benny
发布时间:2020-06-08, 19:49:33
最后更新:2018-06-29, 18:07:34
原始链接:https://benny233.github.io/2020/06/08/以太坊/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。