以太坊是一个与比特币网络类似的分布式状态机。在这个状态机中,所有在网络上构建、交易或制作的东西都必须对网络状态达成一致。整个过程由经过修改的Merkle Patricia Tree(简称为“MPT”)数据管理方法完成。Merkle Patricia Tree(又称为Merkle Patricia Trie)是一种经过改良的、融合了默克尔树和前缀树两种树结构优点的数据结构,是以太坊中用来组织管理账户数据、生成交易集合哈希的重要数据结构。
它是Patricia Tree和Merkle Tree的组合,以太坊规范使用此方法来保存状态中发生的任何更改行为。Merkle Tree是一种数据结构,其中每个非叶节点(散列0和散列1)是其各自子节点(散列0-0、散列0-1)的散列。叶节点L1、L2、L3和L4是存储实际数据的最底层节点。从下图中可看到,顶部散列实际上是其子散列的组合。
Merkle Tree(Merkle Trie)允许以简洁方式表示大量数据,这一点非常适合区块链的各项应用。该过程接受任意数量的散列,并将其它们表示为单个散列,其中顶部散列用作整个数据集的状态展示。
而Patricia Tree(Patricia Trie)是一种数据结构,它允许共享相同前缀的节点以键为路径来共享相同路径。它的节点在树中的位置是由其键的内容所决定的,即其key值被编码在根节点到该节点的路径中。如下所示,t分支下面的所有内容都指向to或te;而te节点可以进一步分解为tea或 ted或ten。此外,特定路径中的组合键将创建地址。例如,非叶节点inn的键值为1159。
Merkle Patricia Tree以一种简化的方式将密钥和散列结合在一起。如下图所示,从上到下,给每个向左的路径加一个0,给每个向右的路径加一个1。也就是说,深蓝色的圆点对应键010,而淡蓝色的圆点对应11。由此可见,最上面的散列实际上是下面所有散列的总的表现形式。如果要验证深蓝色圆点,就必须合并其所有父节点的散列,直到顶部散列得到有效更新为止。
每个线段对应16个可以添加到键上的可能结果,并用十六进制表示。为了避免出现太多未使用的节点,MPT引入了特殊的节点类型。如果某些线段拥有公共的对应键,就用特殊节点来表示。
总而言之,以太坊的管理结构允许帐户轻松验证它们是否具有与状态根本身相同的状态。当执行任务时,状态根将被更新,此时挖矿器或验证器必须验证它们的散列在顶部是否相同。其中需要注意两种类型的帐户:合约帐户和外部帐户。
合约账户
合约账户(contract accounts),由智能合约的代码控制。每个合约帐户都有四个可以修改以太坊网络状态的属性:
1. 一个随机数:显示从该帐户发送的交易数量
2. 资产负债表:用于显示账户余额等。
3. 代码:写在以太坊虚拟机上的字节码
4. 存储:最多可携带256位值
前面的文章说过,智能合约其实是允许用户根据一组预先确定的规则进行交易的程序,因此不需要第三方参与执行。
因此,智能合约的所有权完全在合约代码中体现,因此需要合约创建者实施操作(如:销毁合约,取出所有以太币,阻止别人撤资等等)
若智能合约的安全性无法得到确保,则很容易被恶意攻击甚至完全失去合约控制权。
外部账户
外部合约包括公钥和私钥。这些账户有两个主要属性:临时账户和余额账户。因为这些合约帐户由私钥控制,没有关联的代码,所以代码和存储为空。
以太坊的加密方法与比特币类似,密钥通过椭圆曲线数字签名算法创建,私钥可以派生公钥,但公钥不能派生私钥。公钥就好比是银行帐号,私钥为密码,登录上帐户才能验证账户的所有者。
同时,外部账户可以转移或触发合约账户,或与其他外部账户直接进行交易。合约帐户也可以调用不同的函数,也就是跟踪函数。“跟踪”是指执行事务的一个步骤。
从理论上讲,通过使用跟踪函数,一个合约可以调用许多其他合约,但是过程中的计算量非常大。在一个共享和分散的平台上,用户如何能够在调用其他合约的同时保持资源的平衡?为什么不能写一个无限循环函数来摧毁整个系统?
答案就是:燃料。
燃料
Gas字面中译是:瓦斯、汽油,是一种燃料。智能合约中的每个操作码(也称为EVM和机器可读的指令)都有一个燃料价格(gasprice)。以太坊有独立的虚拟机处理交易,虚拟机执行是根据交易中确定的一个一个的操作指令进行逐个处理,而每个操作指令都有明文规定的Gas消耗量。以gwei定价的燃料用于分配以太坊虚拟机(EVM)的资源,以便诸如合约帐户之类的分散应用程序能够自主操作。使用单独的燃料单元可以区分事务的实际值和函数运行所需的计算成本。
为了避免合约中的错误引起不可预计的燃料消耗,用户需要在发送交易时设定允许消耗的燃料上限,即gasLimit。“gasLimit”指的是你愿意为某一笔交易支付的最高燃料金额。虽然有些操作对燃料的要求很少,比如push、swap和dupe,但也有一些操作需要大量的计算能力和大量的存储空间,因而价格更高。一般来说,更高的燃料限制意味着执行事务中步骤更多,这就导致了函数的开销很大。
举个例子,如果猫王想把100元转给比尔盖茨,他必须支付5元的手续费。虽然100元是转移的实际价值,但5元是执行交易的成本。那么,如果猫王把50个以太币转给比尔盖茨,燃料价格(以gwei计算)可能是1/100,000个以太币(等价)。
燃料的作用比单纯使用计算能发挥的作用更大,还能获取更多的存储空间。
这创造了一个真正的自由市场,因为发布者和矿工能够自行设定服务价格以及要不要提供服务。
这种价格设定当然是双向的:如果网上的矿工只接受高价的操作,就会导致没有人再使用网络。而如果矿工接受所有交易,则会因用户太多而导致网络超载。
因此,发送方不仅可以设定一般燃料限制,还有块的燃料限制。块的燃料限制设置了区块链句柄计算吞吐量的绝对上限。有了燃料,网络用户就不用再担心出现黑客无限循环合约和破坏网络的行为。
总体来说,以太坊是一个区块链(也称为分布式状态机),它包含存储在Merkle Patricia Tree中不同类型的帐户,其中一些账户是由操作码构成的合约。网络上的用户用燃料支付操作码所需金额,这个步骤是发送交易的必需条件。