以太坊技术要点
ethereum/wiki
ethereumbook
密钥、地址、钱包账户
参考:keys-addresses
加密算法:Keccak256、ECDSA、RIPEMD-160、PBKDF2
PBKDF2(Password-Based Key Derivation Function,基于密码的密钥推导函数2)是一个用来导出密钥的函数,常用于生成加密的密码。参考:PBKDF2
以太坊的账户地址是以Keccak-256散列法运算一个公钥而得出的。(源于SHA3算法)
RIPEMD-160是基于Merkle-Damgård构造的加密散列函数。它用于比特币标准。它是RIPEMD算法的增强版本,它产生128位散列摘要,而RIPEMD-160算法产生160位输出。压缩功能由80个阶段组成,每个阶段由5个块组成,每个块运行16次。该模式运行两次,结果在底部使用模32加法组合。参考:RIPEMD-160
ECDSA(椭圆曲线数字签名算法)。参考:Elliptic Curve Digital Signature Algorithm
HMAC(有时扩展为密钥散列消息认证码或基于散列的消息认证码)是涉及加密散列函数和秘密加密密钥的特定类型的消息认证码(MAC)。 参考:HMAC
交易
参考:transactions
交易结构
交易是包含以下数据的序列化二进制消息:
nonce:由发起人EOA发出的序列号,用于防止重播消息。
gas price:发起人愿意支付的gas价格(wei)。
start gas:发起人愿意支付的最大gas量。
to:目的地以太坊地址。
value:要发送到目的地的以太数量。
data:可变长度二进制数据负载。
v,r,s:发起人EOA的ECDSA签名的三个组成部分。
交易签名
以太坊中使用的数字签名算法是椭圆曲线数字签名算法,ECDSA。ECDSA是用于基于椭圆曲线私钥/公钥对的数字签名的算法。
为了产生有效的交易,发起者必须使用椭圆曲线数字签名算法对消息应用数字签名。实际上是指“签署RLP序列化交易数据的Keccak256哈希”。
步骤:
创建一个包含九个字段的交易数据结构:nonce,gasPrice,startGas,to,value,data,v,r,s
生成RLP编码的交易序列化消息
计算此序列化消息的Keccak256哈希值
计算ECDSA签名,使用发件人EOA的私钥对哈希进行签名
在交易中插入ECDSA签名的计算r和s值
数据结构:Merkle Patricia Tree(MPT)
Merkle Patricia tries提供一个密码认证的数据结构,可用于存储所有(key,value)绑定。
在以太坊上,从区块头开始有3个Root来自3个这样的trees:
stateRoot(State Tree)
transactionsRoot(Transactions Tree)
receiptsRoot(Receipts Tree)
而Storage Tree,是所有合约数据所在的地方。每个帐户都有一个单独的存储索引。
序列化:RLP
递归长度前缀,区块、交易、账户状态等数据的序列化格式;
EVM
以太坊协议和操作的核心是以太坊虚拟机,简称EVM。它负责处理智能合约的部署和执行,在较高的层次上,在以太坊区块链上运行的EVM可以被认为是包含数百万个可执行对象的全局分散计算机,每个可执行对象都有自己的永久数据存储。
EVM具有基于堆栈的体系结构,将所有内存中的值存储在堆栈中。具有多个可寻址的数据组件:
一个不可变的程序代码ROM,加载了要执行的智能合约的字节码
临时性存储器,每个位置都明确初始化为零
作为以太坊状态的一部分的永久存储器,也是零初始化的
EVM指令集提供了以下操作,包括:
算术和按位逻辑运算
执行上下文查询
堆栈,内存和存储访问
控制流程操作
记录,调用和其他操作
共识算法
POW:Ethash
Ethash是以太坊PoW算法。它使用了Dagger-Hashimoto算法的演化,该算法是Vitalik Buterin的Dagger算法和Thaddeus Dryja的Hashimoto算法的组合。Ethash依赖于大数据集的生成和分析,称为有向无环图(或更简单地说,“DAG”)。
DAG的目的是使Ethash PoW算法依赖于维护大型,频繁访问的数据结构。这反过来旨在使Ethash“ASIC抗性”,这意味着制造比快速图形处理单元(GPU)快几个数量级的专用集成电路(ASIC)采矿设备更加困难。以太坊的创始人希望避免在PoW挖矿中集中化,那里有专门的硅制造工厂和大预算的人可以主导采矿基础设施并破坏共识算法的安全性。
POS:Casper
Casper是以太坊PoS共识算法的拟议名称。它仍处于积极的研究和开发阶段。正在开发的有两个版本:
Casper FFG: “The Friendly Finality Gadget”
Casper CBC: “The Friendly GHOST/Correct-by-Construction”
参考:译文|以太坊之 Casper 协议
测试网络:Ropsten、Rinkeby、Kovan、Ganache
Swarm
参考:swarm-guide
一个分布式存储平台和内容分发服务,是以太坊web3堆栈的本机基础层服务。
主要目标是提供一个足够分散和冗余的以太坊公共数据库,特别是存储和分发dapp代码和数据以及区块链数据。
bzz协议
swap协议
Whisper
Dapp之间的通信协议;
用例:
需要向对方发布少量信息的DApps,并且需要大量的时间。例如,货币兑换商DApp可以使用它来记录在交易所以特定汇率出售某种货币的要约。在这种情况下,它可能会持续几十分钟到几天。这个提议不会有约束力,只是暗示有可能开始一笔潜在的交易。
DApp需要互相发信号,以便最终协作进行交易。例如,货币兑换商DApp可以在交易所创建一个(或两个,取决于交易所结构如何)交易之前使用它来协调报价。
需要在对方之间提供非实时提示或通用通信的DApps。例如一个小型聊天室应用程序。
那些需要提供黑暗(对完美的网络流量分析合理否定)的DApp通信给两个对彼此一无所知但只是散列的记者。这可能是一个告密者与一个已知的记者交换机沟通一些少量的可验证材料并在他们自己之间安排一些其他协议(可能是Swarm)来处理批量传输的DApp。
Devp2p
参考:devp2p
p2p网络框架;(基于DHT,Kademlia算法实现)
RLPx
参考:The RLPx Transport Protocol
一种加密的p2p网络和协议套件,为应用程序通过p2p网络提供通用传输和接口。
节点发现协议
参考:节点发现协议
discv4
该规范定义了节点发现协议版本4,这是一种类似Kademlia的DHT,用于存储有关以太坊节点的信息。选择Kademlia结构是因为它产生了低直径的拓扑结构。
以太坊正在进行的版本:discv5
Bencode编码
参考:Bencode编码
Plasma
参考:plasma
是以太坊的一种二层协议扩容方案。解决合约状态变化的扩容问题。
相当于权利下放。主链看做最高法,而所有下级法院从中获得权利。创建一个足够平衡的系统来最大化数据可用性、安全,同时减少成本。
Plasma由三个主要部分组成。
Plasma chain:实际交易发生的简单权威证明链。
Plasma contract:在根链上部署的智能合约,用于处理子链(Plasma链)的存款和取款。
Ethereum blockchain:只记录等离子链的区块头的根链。
雷电网络
参考:闪电网络和雷电网络详解
类似于比特币的闪电网络,提出一个状态通道的扩容解决方案。
通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它的哈希值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。
Cosmos & Tendermint
参考:深度解析Tendermint,快速融入Cosmos生态、跨越当前链的边界,Cosmos技术深扒
Oracle
可以为以太坊智能合约提供外部数据源的系统。
解决问题:
EVM和智能合约没有内在的随机性来源;
外部数据只能作为交易的数据有效载荷引入。
关键功能:
从离线源收集数据。
使用签名消息在链上传输数据。
将数据放入智能合约的存储空间,使数据可用。
一旦数据在智能合约的存储中可用,其他智能合约就可以通过调用oracle智能合约的“检索”功能的消息调用来访问它; 它也可以通过“查看”oracle的存储直接由以太坊节点或支持网络的客户端访问。
Smart Contract Dev
Solidity
参考: solidity
Solidity是一种面向合约的高级语言,其语法类似于JavaScript。
Solidity是静态类型的,支持继承,库和复杂的用户定义类型以及其他功能。
Truffle
参考:truffle docs
以太坊智能合约开发框架。
内置智能合约编译、链接、部署和二进制管理。
快速开发的智能合约测试。
可编写脚本的可扩展部署和迁移框架。
用于部署到任意数量的公共和专用网络的网络管理。
使用ERC190标准,使用EthPM和NPM进行包装管理。
交互式控制台,用于直接调用合约。
可配置的build渠道,支持持续集成。
在Truffle环境中执行脚本的外部脚本运行器。
Web3j
web3.js是一个库集合,允许使用HTTP或RPC连接与本地或远程以太坊节点进行交互。
(1)以太坊虚拟机
以太坊虚拟机(EVM)是以太坊中智能合约的运行环境。它是以太坊项目中的另一个主要立异。有人说EVM“坐落区块链之上”,实际上它是由许多互相连接的核算机组成的。任何人都能够上传程序,并让这些程序主动履行,一起确保现在和一切以前的每个程序的状况总是公共可见的。这些程序运行在区块链上,严格地依照EVM定义的方式继续履行。所以任何人都能够为一切权、买卖格局和状况转化函数创立商业逻辑。
(2)账户
以太坊中有两类账户,它们共用同一个地址空间。外部账户,该类账户被公钥-私钥对操控。合约账户,该类账户被存储在账户中的代码操控。外部账户的地址是由公钥决议的,合约账户的地址是在创立合约时由合约创立者的地址和该地址宣布过的买卖数量核算得到。两类账户的仅有区别是:外部账户没有代码,人们能够经过创立和签名一笔买卖从一个外部账户发送音讯。每逢合约账户收到一条音讯,合约内部的代码就会被激活,答应它对内部存储进行读取、写入、发送其他音讯和创立合约。
以太坊的账户包含4个部分:①随机数,用于承认每笔买卖只能被处理一次的计数器;②账户目前的以太币余额;③账户的合约代码(假如有的话);④账户的存储(默以为空)。
(3)音讯
以太坊的音讯在某种程度上相似于比特币的买卖,可是两者之间存在3点重要的不同。
1)以太坊的音讯能够由外部实体或许合约创立,可是比特币的买卖只能从外部创立。
2)以太坊音讯能够挑选包含数据。
3)假如以太坊音讯的接收者是合约账户,能够挑选进行回应,这意味着以太坊音讯也包含函数概念。
(4)买卖
以太坊中“买卖”是指存储从外部账户宣布的音讯的签名数据包。买卖包含音讯的接收者、用于承认发送者的签名、以太币账户余额、要发送的数据和被称为STARTGAS和GASPRICE的两个数值。为了防止代码呈现指数型爆破和无限循环,每笔买卖需求对履行代码所引发的核算过程做出约束。STARTGAS便是经过需求付出的燃料来对核算过程进行约束,GASPRICE是每一核算过程需求付出矿工的燃料的价格。
(5)Gas
以太坊上的每笔买卖都会被收取必定数量的燃料Gas,设置Gas的意图是约束买卖履行所需的工作量,一起为买卖的履行付出费用。当EVM履行买卖时,Gas将依照特定规则被逐步耗费。Gas价格由买卖创立者设置,发送账户需求预付的买卖费用=GASPRICE*Gas amount。假如履行完毕还有Gas剩下,这些Gas将被返还给发送账户。无论履行到什么方位,一旦Gas被耗尽就会触发一个out-of-gas反常。一起,当前调用帧所做的一切状况修改都将被回滚。
(6)存储、主存和栈
每个账户都有一块永久的内存区域,被称为存储,其形式为key-value,key和value的长度均为256位。在合约里,不能遍历账户的存储。相关于主存和栈,存储的读操作开支较大,修改存储甚至更多。一个合约只能对它自己的存储进行读写。
第二个内存区被称为主存。合约履行每次音讯调用时都有一块新的被清除过的主存。主存能够按字节寻址,可是读写的最小单位为32字节。操作主存的开支随着主存的增加而变大。
(7)指令集
EVM的指令集被故意保持在最小规划,以尽可能防止可能导致一致问题的过错。一切的指令都是针对256位这个根本的数据单位进行的操作,具备常用的算术、位、逻辑和比较操作,也能够进行条件和无条件跳转。此外,合约能够拜访当前区块的相关特点,比方它的编号和时间戳。
(8)音讯调用
合约能够经过音讯调用的方式来调用其他合约,或许发送以太币到非合约账户。音讯调用和买卖非常相似,它们都有一个源,一个目标,数据负载,以太币,Gas和回来数据。事实上每个买卖都能够被以为是一个顶层音讯调用,这个音讯调用会依次发作更多的音讯调用。
一个合约能够决议剩下Gas的分配。比方内部音讯调用时使用多少Gas,或许期望保存多少Gas。假如在内部音讯调用时发作了out-of-gas反常或许其他反常,合约将会得到通知,一个过错码被压入栈中。这种情况仅仅内部音讯调用的Gas耗尽。在solidity中,这种情况下建议调用的合约默许会触发一个人工反常,这个反常会打印出调用栈。
(9)代码调用和库
以太坊中存在一种特殊类型的音讯调用,被称为callcode。它跟音讯调用简直彻底相同,仅仅加载来自目标地址的代码将在建议调用的合约上下文中运行。这意味着一个合约能够在运行时从别的一个地址动态加载代码。存储,当前地址和余额都指向建议调用的合约,只有代码是从被调用地址获取的。这使得Solidity能够实现“库”。可复用的库代码能够应用在一个合约的存储上,能够用来实现杂乱的数据结构,从而使智能合约愈加的强壮。