干货 | Vitalik: 25分钟认识以太坊(下)

hongji   |     |   1351 次阅读

编者按:以下为Vitalik Buterin在Ethereum Devcon3上的演讲《Ethereum in 25 minutes, vision 2017》的下半部分。以下中文皆直接从视频中听写并译出,如有错失,请不吝赐教。
附: 干货 | Vitalik: 25分钟认识以太坊(上)

交易

以太坊上的交易有7个部分:

  • 交易nonce,基本上就是一种反交易重播措施,如果你正在发送交易,让我们假设如果我发送了10个以太币给Bob,它(nonce)防止Bob提取这一交易并在区块链上包含它100次,那样的话我就发送1000个了以太币给Bob。每一个交易都最多只能被包含一次。
  • Gas价格,就是你为你的交易所占用每一单位的gas付出的以太币数量,这就是给予矿工的交易费用。
  • Startgas,交易可以使用的gas最大数量限制,也就是该交易可以消耗的计算资源的最大数量。
  • To,就是目标。
  • 价值(Value),交易发送的以太币数量。
  • 数据,就是说,如果你的交易有一个合约目标,那么该合约就可以读取数据。所以,接着就是一种做比如明确函数争议这样的事情的方式。
  • V,R,S,就是一个ECDSA签名,这是为解密者设计的。V在这儿因为你需要额外的一个部分以从签名中还原公钥。所以,我们做的是公钥恢复,而非任何种类的验证,我们说那是比特币做事情的方式。

Log

Log是一种只可添加、而不可被合约所读取的库的形式。关于Log的重点是,让我们假设,现在有一个事件在合约运行过程中发生了,我们希望让人们搜索这些事件以及侦测这些已经发生的事件变得非常容易。所以一个Log可以长达4个“topic”(32 bytes),并且,这里有一个布隆过滤器(Bloom Fliter)所以你可以非常容易地搜寻topic。同时这也允许你存储任意数量的数据。这些Log被放进了一棵默克尔树,它允许非常高效的通往Log的轻客户端通道。如果你有一个轻客户端,你可以通过Log来搜索,你可以拿topic当作关键词,这也允许你非常容易地搜索到合约已经创建的一种特定类型的事件。这对于分散化应用(Dapp)编程来说是非常有用的。

以太坊虚拟机

以太坊虚拟机(Ethereum Virtual Machine,EVM)。一开始,你有一个堆栈,数字可以被加入(push)栈以及从栈中输出(pop)。你拥有内存,内存就是一个虚拟机可以进入的临时数据组。所以内存只能在我短暂地处于运行环境中的时候才能存在,一旦运行结束,内存也就停止存在了。(stortage),就像合约数据库一样,是永久的存储空间。环境变量,以太坊虚拟机上的合约可以获得像是区块数量或是时间戳这样的东西。而且你还有Log次级调用(sub-calling)所以合约有能力通过发送我们说的“内部交易”来调用其他合约。

大多数时候,你并不准备直接写作EVM代码,因为要直接写EVM代码是非常琐碎的。相反,你将用高级语言写作,然后编译成EVM代码。这里有一些这样的高级语言,你可以用Viper,Solidity,LLL,还有Bamboo。再一次地你可能注意到,Serpent不再被放在这个列表中了,如果你还在用Serpent,我建议你转换到Viper。

ABI

这就是函数调用得到被编译或说其代码被写到交易数据中的方式。所以如果你正在调用一个合约,那么实际上发生的事情就是它做了一个函数调用,以及,额,抱歉,如果你调用了一个函数,那么实际上发生的事情就是它创建了一个交易,并且该交易包含了在这一公式中被指定的数据。所以一开始有4byte是函数ID,然后32byte是一个要求,再来32byte是另一个要求。如果你试图请求一个合约中的一个函数,那么你的客户端将创建这个交易,广播这一交易到网路上,然后合约代码就可以读取交易数据,然后它将交易数据的初始4个byte解析为被调用的函数,而其它byte就是其他声明。所以,基本上这就是如何简单调用函数的。

默克尔树(Merkle tree)

(PPT上放着Ralph Merkle的照片)让我们都向Ralph Merkle(译者注:Merkle树的发明人。)鞠躬、祈祷! Ralph Merkle,他的Merkle树是唯一真正让轻客户端成为可能的东西,所以,这在技术上是非常重要的突破,它值得人们赋予崇高的敬意。

重点是,默克尔树允许一个交易被包含在一个区块中的证据成为可高效验证的,或者说,普遍性地允许任何特定的数据片段被包含在在一个非常大的数据块中的证据成为可高效验证的。所以,如果你拥有一大块的数据,你可以从你的数据中创建这个叫做“Merkle树”的数据结构,有了这棵默克尔树之后,你可以为任何在这棵树上的数据片段创建叫做“默克尔分支”的东西,也就是组成了默克尔树的这种哈希值。 加上所有这些中间层,通过把哈希值相互匹配,你就可以判断这段数据是不是真的在这棵树上,对吧?

所以,为了建立起这棵树,你可以拿来你的数据,把两个片段的数据放在一起哈希;为每两片数据做完哈希之后,再把得到的(两个)哈希值放在一起哈希;如是反复,最终将只剩下一个哈希值在顶端。要证明其中存在任何特定的数据,你只要得到这些哈希值的分支,然后让它们相互匹配。如果是否存在一个错误的话,(也就是说)如果你想证明一段数据并不在那里的话,那么至少其中一个哈希值将是无法匹配的。

在以太坊上,我们使用它以证明一些特定的交易是包含在区块中的,但也存在一些叫做“状态树(State Tree)”的东西。状态树就是整个以太坊状态的一棵默克尔树。所以,每一个账户、每一个合约,余额,Nonce,合约代码,合约库,以太坊上的所有数据的全部状态都被哈希在这棵树的结构中,而这棵树的根哈希值将成为区块头,这就是所谓的“状态根”。所以,从任何一个区块到下一个区块,总是会有一部分状态被修改,然后默克尔树就会改变。但我们有一种特定类型的树叫做“默克尔帕特里夏树(Merkle Patricia tree)”,意味着当状态发生改变的时候,默克尔树上必须做出的更新的数量实际上是非常小的。它是像对数那样变化的。有了这个,一个轻客户端就可以要求网络,“给我一个特定账户的默克尔分支”;而一些全节点可以用这一分支来回复;轻客户端自己就可以从头到尾检查该分支的哈希值。如果所有的哈希值都相互匹配,那么,太棒了!然后轻客户端就可以接受并且证实显示账户余额的特定数据、或者一些库的钥匙,是确实在默克尔树上的。

所以,在以太坊中,默克尔树是用在交易、状态和收据上的。帕特里夏树则允许高效的插入和删除操作。区块头则包含了这三种树。

拜占庭版本(Byzantium)中的更新

拜占庭是我们做的一个硬分叉,从10月16号开始运行,它引入了一系列新的很棒的隐私保护措施。拜占庭中有三种主要的、可能也是最让人感兴趣的特性。理论上来说,当然还有其他特性,但这三种让人感兴趣的东西是因为拜占庭中的新特性才成为可能的,对吧?这里包括我们叫做“预编译(pre-compile)”的东西,可以充分利用虚拟合约。虚拟合约的功能是做椭圆曲线编辑(eliptic curve edition)、椭圆曲线标量乘法(eliptic curve multiplication)、椭圆曲线配对(eliptic curve pairing)还有大数计算。这也允许你在以太坊上写合约来做一些事情,比如:验证环签名(Ring Signature),验证ZK-SNARKs,验证RSA签名(RSA signature),所以,这也可以被用来提升以太坊跟使用公钥、授权证书以及其他东西的现有系统的兼容性。接下来你还将听到这些东西。

除了这些,还有一系列很重要的特性,比如说:静态调用操作码(STATICCALL opcode),它允许你写作没有同等程度可变性的安全合约,以及在一些情况下重新进入(出现)问题(的地方),它同样允许你更容易去做纯粹功能性的变成。你拥有一个回返数据备份、恢复原状操作码(REVERT opcode),帮助你节约Gas,以及让EVM在某些情况下更高效的操作码,还有一系列更小的提升。但我会说,拜占庭硬分叉的主题是把这类强大的密码学加进去,以使强大的隐私保护应用成为可能。还有非常有有意思的的东西正在被建构到上面,比如说,你知道的, 建立在声誉系统上的ZK-SNARK(我昨天才听到这个东西)。这些都在非常快速地往前推进。

未来的方向

Casper,你们可以看Changwu的演讲,就在下一场。Vlad也准备展示他自己的Casper版本,称为“Casper CBC”。

分片(Sharding),可以看今天结束的时候我的演讲。虽然,我会说它不仅仅是关于分片的,它的主题在实际上比分片要广泛得多。它同样也是EVM更新的尾巴,一个小很多的协议升级。

现在,比起以太坊区块链核心技术的未来方向,可以被建设在以太坊上的第二层(second layer,数据链路层)架构、中间工具和系统有一个大得多的关于未来方向的列表。这包括可扩展性方案,比如Plasma;也包括可以被建设在环签名上的所有东西,你已经知道了,椭圆曲线乘法、匹配,ZK-SNARK;还包括多种其他多种隐私保护协议。还有状态通道(State Channel)系统。所有这些都是很棒的,也是非常重要的改进,我希望我们将听到更多关于它们的消息。

那么,谢谢你们。再一次,希望你能享受这次大会。


视频链接: https://www.youtube.com/watch?v=Yo9o5nDTAAQ&feature=youtu.be
作者: Vitalik Buterin
翻译&校对: 阿剑 & Elisa

 
0 人喜欢