美文网首页
【以太坊白皮书解读】比特币和以太币对话七

【以太坊白皮书解读】比特币和以太币对话七

作者: NO抱怨姐 | 来源:发表于2018-08-03 15:38 被阅读0次

    以太币: 比特兄,今天继续来看更多的一些关于以太坊的信息。

    比特币: 好的,那就从信息和交换开始。

    以太币:在以太坊上的交易是一个签名的数据包,这个包储存了由外部账号发送的信息。交易包含:收到的信息,发送者的签名,发送者给接收者转的以太币数量,一个可选择的数据领域,一个“起始能量”价值(代表交易被允许执行的最大计算步骤),一个“能量价格价值”(代表发送者支付每笔计算步骤的费用)。

    比特币:前三个是任何加密货币都有的标准信息。数据区默认是没有任何功能的,但是虚拟机有一个可以让合同进入数据的操作码。如果一个合同正在作为区块链上的域名登记服务发生作用,它可能会希望去解释正在通过的数据,这时候就有一个作为域名登记和IP地址登记的两个数据领域。合约将会从信息数据里面读取这些价值,然后合适的在储存里面取代它。

    以太币:“起始能量”和“能量价值”对于以太坊的“反拒绝”服务模型是关键的。为了阻止偶然的和恶意的无限循环,或者一些在代码里面的计算浪费。每一笔交易都会有一个限定关于多少计算步骤能用。基本的运算单位是“能量”。通常,一个计算步骤会花费一个能量,但是有一些操作会花费更多的能量,因为他们计算起来更昂贵,或者增加了必须被储存为状态数据的价值。在交易数据里面,一个字节有5个“能量”的交易费用。交易费系统的目的就是要求一个攻击者为他们消耗,计算,带宽和储存的每一个资源合理的付费。因此,任何导致网络消耗大量资源的交易必须支付和增长同比例的交易费用。

    比特币:这是两个很好的设计。

    以太币:合约是能给其他合约发信息的。信息是从不会连载或者存在于以太坊执行环境中的虚拟物体。一个信息包含发送者的信息,接收者的信息,和信息一起交换的以太币信息,可选择的数据领域以及“起始能量”的价值。本质上,信息就像交易。除非它是被一个合约账户生成而不是一个外部账户。当合约执行操作代码的时候信息生成。就像交易,一个信息导致了接收账户运行它的代码。和外部账户一样,合约和合约之间是有关系的。

    比特币:可能要注意能量准许是由一个交易指定的或者合同会应用到交易或预执行所消耗的所有能量。比如:一个外部执行者A给B交易含1000个能量。B在发信息给C之前花掉了600个能量,返回之前在内部的执行时C花掉了300,在所有能量花完之前B就能花掉另外的100.

    以太币:是的,比特兄一听就明白了。现在我们说说以太坊的状态转移功能。以太坊的状态转移函数APPLY(S,TX) -> S’可以定义为6个步骤。第一就是看交易的格式是否正确(即有正确数值)。签名是有效的,随机数和发送者账号的随机数是匹配的,如果不是的话,就会返回一个错误。第二就是要计算交易费用:等于STARTGAS * GASPRICE。从签名里面决定发送的地址。从发送者账户的余额减去交易的费用,然后增加发送者的随机数。如果账户里面没有足够的余额可用,返回错误状态。

    比特币:这两步是关键的,没什么毛病。那后面的四步了?

    以太币:第三就是设定初值为GAS = STARTGAS,并根据交易中的字节数扣除一定量的gas。第四就是从发送者的账户转移价值给到接收者账户。接收者的账户如果不存在,就创建一个。如果接收者的账户是一个合约,运行合约的代码直到它完成或者所有能量消耗完。第五就是如果发送者没有足够的钱导致转移失败,或者代码的执行把能量耗光了。恢复原来的状态,但还是需要支付交易费,将交易费支付给矿工。第六就是否则所有剩余的能量要返回给发送者,消耗掉的燃料作为交易费用发送给矿工。

    比特币:嗯,非常不错也很清晰。但如果能举个例子别人就能更清楚啦。

    以太币:假设合约的代码如下if !self.storage[calldataload(0)]: self.storage[calldataload(0)]

    = calldataload(32),注意现实中合约代码是用底层以太坊虚拟机EVM代码写成的。这个例子是由我们的高级代码Serpent语言写成的,但这个是可以被编译成EVM代码的。假使合约的储存一开始是空的,一个值为10个以太,2000能量,能量价格是0.001以太,并且两个数据字段为2和charlie发生交易后,状态转换过程如下:

    比特币:嗯,会是怎样的了?

    以太币:第一就是检查交易是否有效,格式是否正确。第二就是看交易的发送者是否有至少2000*0.001=2以太币。如果有,要从发送者的账户中减掉2个以太币。第三就是初始化能量=2000,预估这个交易是170个字节(自己费用是5),扣除到850,就还有1150个剩下。第四就是扣除10个以太币从发送者的账户到合约账户。第五就是运行代码,这很简单,它会检查合约储存器索引为2处是否已经被使用,发现没有被使用的情况下,把它的值设为charlie。假使这个步骤要花掉187个能量,剩余的能量数就是1150-187=963个能量。第六就是给发送者的账户增加963 * 0.001 = 0.963以太币,然后返回最终状态。

    比特币:如果没有合约的交易又会是什么样子了?

    以太币:那么交易费用就等于提供的能量价格乘以交易的字节长度。交易的数据和交易就不相关了。需要注意的是,关于能量返回,如果一个信息的执行把能量耗完了,然后所有其他的执行都会被这个执行触发,然后返回。但是最一开始的执行不需要返回。这就意味着一个合约去叫另一个合约是安全的。就像A叫B有G个能量,那么A的执行要保证至少有消耗G个能量。最后要注意这里有一个操作代码,创建一个合约。他的执行机制一般和叫相似,唯一的例外就是执行的输出决定了新产生合约的代码。

    比特币:你的这个状态转移函数就比我的要麻烦多了啊。

    以太币:是啊。不知不觉聊了这么久了。明天我们继续说代码的执行。

    比特币:好的。

    参考阅读

    https://ethfans.org/posts/ethereum-whitepaper

    https://github.com/ethereum/wiki/wiki/White-Paper

    相关文章

      网友评论

          本文标题:【以太坊白皮书解读】比特币和以太币对话七

          本文链接:https://www.haomeiwen.com/subject/cazyvftx.html