以太坊FAQ
什么是智能合约?
所谓智能合约其实就是一段EVM可执行的代码,可以将一个智能合约实例理解成一个对象。简单来说,用户编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。当用户将智能合约发布到以太坊网络时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数。
什么样的应用适用以太坊区块链?
- 时间戳和溯源:历史透明且可证
- 数字资产的流通和发行
- 跨组织的数据共享
如何生成一个外部账户地址?
- 设置账户的私钥
- 使用加密算法由私钥生成对应的公钥
- 根据公钥得出相应的账户地址
如何生成一个合约账户地址?
合约账户的地址是由合约创建时合约创建者的地址,以及该地址发出的交易共同计算得出的。合约代码会在参与到网络中的每一个节点上执行,并将执行结果作为新块验证的一部分。
什么是以太坊钱包?
一个外部账户通常由私钥文件来控制,拥有私钥的用户就可以拥有对应地址的账户里的以太币使用权。我们通常把管理这些数字密钥的软件称为“钱包”。在以太坊官方钱包Mist中,私钥和公钥将会以加密的方式保存为一份JSON文件(通常使用创建账户时设置的密码进行加密),这种存储私钥的方式称为Keystore&Password
以太坊中的MPT(Merkle Patricia Tree)
比特币中保存了一颗Merkle树,而以太坊针对三种对象设计了三颗Merkle Patricia树,分别是状态树,交易树和收据树,这三种树可以帮助以太坊客户端做一些简易的查询,如查询某个账户的余额,某笔交易是否被包含在区块中等。
Merkle Patricia其实是一颗同时具备了Merkle树和Patricia树性质的树,既能验证节点正确性,又能保存大量节点数据,而且还具备自平衡和避免全局更新的特性。
参考文章:
Merkle树和Patricia树概述
以太坊中Merkle Patricia树的实现方式
利用存储的三颗MPT树,客户端可以轻松地查询一下内容:
- 这笔交易是否被包含在特定的区块中了么?
- 告诉我这个地址在过去30天中,发出X类型事件的所有实例(例如,一个众筹合约完成了它的目标)
- 目前某个账户的余额是多少?
- 一个账户是否存在?
- 假如在某个合约中进行一笔交易,它的输出会是什么?
在状态树中,每个叶节点表示一个账户,账户的状态不是直接存储在每个区块中,需要从实际的区块链数据中计算出来。
在交易树中,键是交易编号(抽象地看),值是交易内容(同样抽象地看)。
在收据树中,键用来指引这条收据相关交易的位置,值是收据的内容。
以太坊的数据库支持——LevelDB
LevelDB是Google实现的一个非常高效的键值对数据库,其中键值都是二进制的,能够支持十亿级别的数据量,在这个数据量下还有非常高的性能。以太坊中共有三个LevelDB数据库,分别是BlockDB,StateDB和ExtrasDB,分别保存块的主体信息(块头和交易),账户的状态数据,收据信息和其他辅助信息。
以太坊的共识机制
PoW(Proof of Work,工作量证明)
在以太坊中,有一个专门设计的PoW算法——Ethash算法。之所以用Ethash算法来代替原有的PoW算法(比特币中的),是为了解决挖矿中心化问题——比特币这个以实现“去中心化”为目的的系统因为矿机资源的集中和ASIC的存在而有了中心。为了解决这一问题,以太坊基金会专门设计了一个能“抵制ASIC”,轻客户端可快速验证的PoW算法,希望减少中心化挖矿在以太坊获得的经济奖励,这就是Ethash算法。
Ethash算法的特点是挖矿的效率基本与CPU无关,而与内存大小,带宽正相关,目的是去除专用硬件的优势,抵抗ASIC。该算法的基本流程如下:
- 对于每一个区块,都能通过扫描区块头的方式计算出一个种子(seed),该种子只与当前区块有关。
- 使用种子产生一个16MB的伪随机缓存,轻客户端会存储缓存。
- 基于缓存再生成一个1GB的数据集,称其为DAG。数据集中的每一个元素依赖于缓存中的某几个元素,也就是说,只要有缓存,就可以快速计算出DAG中指定位置的元素。挖矿者存储数据集,数据集随时间线性增长。
- 挖矿可以概括为“矿工”从DAG中随机选择元素并对其进行散列的过程,DAG也可以理解为一个完整的搜索空间。
- 验证者只需要花费少量的内存存储缓存就可以了,因为验证者能基于缓存计算得到DAG中指定位置的元素,然后验证这些指定元素的散列值是否小于某个散列值即可。
对于PoW而言,如果矿不是你挖到的,那么也就意味着你先前所做的努力全部白费。很明显,像PoW这种依赖机器进行散列计算从而得到记账权的方式,其资源消耗比其他共识机制往往要高,性能效率相对较低。
为了防止中心化现象和电力资源的浪费,以太坊在项目成立之初就制定了PoS共识机制计划,即先用PoW临时替代,待到时机成熟则逐渐从PoW切换到PoS。
PoS(Proof of Stake,股权证明)
本质上,PoS和PoW都是基于一种随机选择下一个区块上传者的算法思想,只不过此处的随机不依赖于中心化控制,而是靠某种不可伪造的“证据”来实现这种随机化。在PoW中,这种证据的获得需要依靠计算能力,而在PoS中,则依赖于所拥有的财产多寡。
这里实际上存在一个细微的区别,即从PoW到PoS,数字货币的安全性转变为直接与使用者关联而不再需要矿工这个媒介。即PoS能够提高利益相关者在网络中的参与度。
在以太坊中,PoS算法可以这样描述:以太坊区块链由一组验证者决定,任何持有以太币的用户都能发起一笔特殊形式的交易,将他们的以太币锁定在一个存储中,从而使自己成为验证者,然后通过一个当前的验证者都能参与的共识算法,完成新区块的产生和验证过程。
有许多共识算法和方式对验证者进行奖励,以此激励用户支持PoS。从算法的角度来说,主要有两种类型:基于链的PoS和BFT(拜占庭容错)风格的PoS。
在基于区块链的权益证明中,共识算法在每个时段内伪随机地选择一个验证者(例如,每10秒钟为一个时间段),赋予该验证者出块的权力,新创造的区块必须跟在之前的某个区块(通常是位于最长链的末端的区块)后面。因此,随着时间的推移,大多数区块会填加到同一条区块链上,使之不断增长。
在BFT风格的PoS中,分配给验证者相对的权利,让他们有权提出块并且给被提出的块投票,从而决定哪个块是新块,并在每一轮选出一个新块加入区块链。在每一轮中,每个验证者都为某一特定的块进行“投票”,最后所有在线和诚实的验证者都将”商量“被给定的块是否可以添加到区块链中,并且意见不能改变。
在早期的PoS算法中,由于出块其实并不需要代价,所以可能出于利益考虑,很多验证者会尝试在所有的准主链上出块。因此需要一定的惩罚机制,以太坊PoS算法典型的带有惩罚机制的应用是Casper,此处暂且略过,容后再述。
数据编码与压缩(RLP)
RLP(Recursive Length Prefix)是一种编码算法,用于编码任意的具有嵌套结构的二进制数据,是以太坊数据序列化的主要方法。以太坊中的区块,交易等数据结构会先经过RLP编码处理,然后再存储到数据库中。RLP编码只处理两种类型的数据,即字符串和列表。在RLP格式中,对字典数据的编码有两种建议方式,一种是按照字典顺序用含key的二维数组表示,另一种是使用更高级的Patricia树来编码。
在以太坊中,当发送数据以及在MPT树中保存状态时,需要使用RLP编码。在用RLP编码处理的数据中,字符串一般指的是一串二进制数据,列表则是一个嵌套递归结构,列表元素可以使字符串或列表,通过这种方式可以实现数据的递归存储。若要对其他类型的数据进行处理,必须先将其转换成上述两种类型。
以太坊域名服务(ENS)
ENS(Ethereum Name Service,以太坊域名服务)是一个类似于DNS的建立在以太坊区块链上的分布式,开放的命名系统。用于将原本复杂的哈希地址”翻译“成一个容易记忆的地址。用户要是想执行合约或者账户转账,只要向ENS提供的”翻译“地址发起交易就可以了。