[TOC]
以太坊技术要点
密钥、地址、钱包账户
关系可以参考钱包技术的ETH地址生成
加密算法: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
参考:RLP
递归长度前缀,区块、交易、账户状态等数据的序列化格式;
EVM
以太坊协议和操作的核心是以太坊虚拟机,简称EVM。它负责处理智能合约的部署和执行,在较高的层次上,在以太坊区块链上运行的EVM可以被认为是包含数百万个可执行对象的全局分散计算机,每个可执行对象都有自己的永久数据存储。
EVM具有基于堆栈的体系结构,将所有内存中的值存储在堆栈中。具有多个可寻址的数据组件:
- 一个不可变的程序代码ROM,加载了要执行的智能合约的字节码
- 临时性存储器,每个位置都明确初始化为零
- 作为以太坊状态的一部分的永久存储器,也是零初始化的
EVM指令集提供了以下操作,包括:
- 算术和按位逻辑运算
- 执行上下文查询
- 堆栈,内存和存储访问
- 控制流程操作
- 记录,调用和其他操作
共识算法
参考:Consensus
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"
测试网络: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网络提供通用传输和接口。
节点发现协议
参考:节点发现协议
该规范定义了节点发现协议版本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
参考:Web3j
web3.js是一个库集合,允许使用HTTP或RPC连接与本地或远程以太坊节点进行交互。
网友评论