以太坊白皮书中文版

 以太坊白皮书中文版

以太坊的目的是基于脚本、竞争币和链上元协议(on-chain meta-protocol)概

  念进行整合和提高,使得开发者能够创建任意的基于共识的、可扩展的、标准化

  的、特性完备的、易于开发的和协同的应用。以太坊通过建立终极的抽象的基础

  层-内置有图灵完备编程语言的区块链-使得任何人都能够创建合约和去中心化

  应用,并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。域

  名币的主体框架只需要两行代码就可以实现, 诸如货币和信誉系统等其它协议只

  需要不到二十行代码就可以实现。智能合约-包含价值而且只有满足某些条件才

  能打开的加密箱子-也能在我们的平台上创建,并且因为图灵完备性、价值知晓 (value-awareness)、区块链知晓(blockchain-awareness)和多状态所增加的力量,而比比特币脚本所能提供的智能合约强大得多。

  以太坊账户

  在以太坊系统中,状态是由被称为"账户"(每个账户由一个 20 字节的地址)的

  对象和在两个账户之间转移价值和信息的状态转换构成的。 以太坊的账户包含四个部分:

  · 随机数,用于确定每笔交易只能被处理一次的计数器

  · 账户目前的以太币余额

  · 账户的合约代码,如果有的话

  · 账户的存储(默认为空)


  以太币(Ether)是以太坊内部的主要加密燃料,用于支付交易费用。一般而言,

  以太坊有两种类型的账户:外部所有的账户(由私钥控制的)和合约账户(由合

  约代码控制)。外部所有的账户没有代码,人们可以通过创建和签名一笔交易从 一个外部账户发送消息。每当合约账户收到一条消息,合约内部的代码就会被激

  活,允许它对内部存储进行读取和写入,和发送其它消息或者创建合约。

  消息和交易

  以太坊的消息在某种程度上类似于比特币的交易, 但是两者之间存在三点重要的

  不同。第一,以太坊的消息可以由外部实体或者合约创建,然而比特币的交易只 能从外部创建。第二,以太坊消息可以选择包含数据。第三,如果以太坊消息的 接受者是合约账户,可以选择进行回应,这意味着以太坊消息也包含函数概念。

  以太坊中"交易"是指存储从外部账户发出的消息的签名数据包。交易包含消息的

  接收者、用于确认发送者的签名、以太币账户余额、要发送的数据和两个被称为

  STARTGAS 和 GASPRICE 的数值。为了防止代码的指数型爆炸和无限循环,

  每笔交易需要对执行代码所引发的计算步骤-包括初始消息和所有执行中引发的 消息-做出限制。STARTGAS 就是限制,GASPRICE 是每一计算步骤需要支付 矿工的费用。如果执行交易的过程中,"用完了燃料",所有的状态改变恢复原状

  态,但是已经支付的交易费用不可收回了。如果执行交易中止时还剩余燃料,那

  么这些燃料将退还给发送者。创建合约有单独的交易类型和相应的消息类型;合

  约的地址是基于账号随机数和交易数据的哈希计算出来的。

  消息机制的一个重要后果是以太坊的"头等公民"财产-合约与外部账户拥有同样

  权利,包括发送消息和创建其它合约的权利。这使得合约可以同时充当多个不同

  的角色,例如,用户可以使去中心化组织(一个合约)的一个成员成为一个中介 账户(另一个合约),为一个偏执的使用定制的基于量子证明的兰波特签名(第 三个合约)的个人和一个自身使用由五个私钥保证安全的账户(第四个合约)的

  共同签名实体提供居间服务。 以太坊平台的强大之处在于去中心化的组织和代理

  合约不需要关心合约的每一参与方是什么类型的账户。

  以太坊状态转换函数

 


  以太坊的状态转换函数: APPLY(S,TX) -> S' ,可以定义如下:

  1. 检查交易的格式是否正确(即有正确数值)、签名是否有效和随机数是否与发送

  者账户的随机数匹配。如否,返回错误。

  2. 计算交易费用:fee=STARTGAS * GASPRICE,并从签名中确定发送者的地址。

  从发送者的账户中减去交易费用和增加发送者的随机数。如果账户余额不足,返

  回错误。

  3. 设定初值 GAS = STARTGAS,并根据交易中的字节数减去一定量的燃料值。

  4. 从发送者的账户转移价值到接收者账户。如果接收账户还不存在,创建此账户。

  如果接收账户是一个合约,运行合约的代码,直到代码运行结束或者燃料用完。

  5. 如果因为发送者账户没有足够的钱或者代码执行耗尽燃料导致价值转移失败, 恢

  复原来的状态,但是还需要支付交易费用,交易费用加至矿工账户。

  6. 否则, 将所有剩余的燃料归还给发送者, 消耗掉的燃料作为交易费用发送给矿工。

  例如,假设合约的代码如下:

  14 / 33

  

if !contract.storage[msg.data[0]]:


  contract.storage[msg.data[0]] = msg.data[1]

  需要注意的是,在现实中合约代码是用底层以太坊虚拟机(EVM)代码写成的。

  上面的合约是用我们的高级语言 Serpent 语言写成的,它可以被编译成 EVM 代 码。假设合约存储器开始时是空的,一个值为 10 以太,燃料为 2000,燃料价格 为 0.001 以太并且两个数据字段值为[ 2, „CHARLIE‟ ] [3]的交易发送后,状态转

  换函数的处理过程如下:

  1. 检查交易是否有效、格式是否正确。

  2. 检查交易发送者至少有 2000*0.001=2 个以太币。如果有,从发送者账户中减去

  2 个以太币。

  3. 初始设定 gas=2000,假设交易长为 170 字节,每字节的费用是 5,减去 850,所

  以还剩 1150。

  4. 从发送者账户减去 10 个以太币,为合约账户增加 10 个以太币。

  5. 运行代码。在这个合约中,运行代码很简单:它检查合约存储器索引为 2 处是否

  已使用,注意到它未被使用,然后将其值置为 CHARLIE。假设这消耗了 187 单

  位的燃料,于是剩余的燃料为 1150 - 187 = 963。

  6. 向发送者的账户增加 963*0.001=0.963 个以太币,返回最终状态。

  如果没有合约接收交易,那么所有的交易费用就等于 GASPRICE 乘以交易的字

  节长度,交易的数据就与交易费用无关了。另外,需要注意的是,合约发起的消

  息可以对它们产生的计算分配燃料限额,如果子计算的燃料用完了,它只恢复到 消息发出时的状态。因此,就像交易一样,合约也可以通过对它产生的子计算设

  置严格的限制,保护它们的计算资源。

  代码执行

  以太坊合约的代码使用低级的基于堆栈的字节码的语言写成的,被称为"以太坊

  虚拟机代码"或者"EVM 代码"。代码由一系列字节构成,每一个字节代表一种操

  作。一般而言,代码执行是无限循环,程序计数器每增加一(初始值为零)就执

  行一次操作,直到代码执行完毕或者遇到错误,STOP 或者 RETURN 指令。操

  作可以访问三种存储数据的空间:

  · 堆栈,一种后进先出的数据存储,32 字节的数值可以入栈,出栈。

  · 内存,可无限扩展的字节队列。

  · 合约的长期存储,一个秘钥/数值的存储,其中秘钥和数值都是 32 字节大小,与

  计算结束即重置的堆栈和内存不同,存储内容将长期保持。

  代码可以象访问区块头数据一样访问数值,发送者和接受到的消息中的数据,代

  码还可以返回数据的字节队列作为输出。

  EVM 代码的正式执行模型令人惊讶地简单。当以太坊虚拟机运行时,它的完整

  的计算状态可以由元组(block_state, transaction, message, code, memory,

  stack, pc, gas)来定义, 这里 block_state 是包含所有账户余额和存储的全局状态。

  每轮执行时,通过调出代码的第 pc(程序计数器)个字节,当前指令被找到, 每个指令都有定义自己如何影响元组。例如,ADD 将两个元素出栈并将它们的 和入栈,将 gas(燃料)减一并将 pc 加一,SSTORE 将顶部的两个元素出栈并 将第二个元素插入到由第一个元素定义的合约存储位置,同样减少最多 200 的 gas 值并将 pc 加一,虽然有许多方法通过即时编译去优化以太坊,但以太坊的

  基础性的实施可以用几百行代码实现。


玖壹区块链声明

加微信:469649885区块链培训教程
还可免费获取区块链培训班试学名额

分享:

扫一扫在手机阅读、分享本文

区块链评论

玖壹区块链培训

玖壹区块链培训学院简称(玖壹学院http://www.91xiubbs.com/)提供区块链技术培训资料、区块链开发培训视频教程等下载,不过网上自学区块链技术课程必然存在一些缺陷:遇到问题易卡壳、学习周期漫长、无针对性等。区块链培训机构现场面对面的讲授区块链培训课程可以让您和团队在最短时间内掌握正确、系统、高效的区块链实战技术。