主页 > 合法imtoken钱包下载 > 以太坊中的代码执行

以太坊中的代码执行

合法imtoken钱包下载 2023-03-07 07:44:28

以太坊合约的代码是用一种基于堆栈的低级字节码语言编写的,称为“以太坊虚拟机代码”或“EVM代码”。 该代码由一系列字节组成,每个字节代表一个操作。 一般来说,代码执行是一个死循环,程序计数器每加一(初始值为零)就执行一次操作,直到代码执行完或遇到错误、STOP或RETURN指令。 操作可以访问三种类型的空间来存储数据:

代码可以像访问区块头数据一样访问值、发送者和接收消息中的数据,代码也可以返回数据的字节队列作为输出。

EVM 代码的正式执行模型非常简单。 以太坊虚拟机在运行时,其完整的计算状态可以通过元组(block_state、transaction、message、code、memory、stack、pc、gas)来定义,其中block_state是一个全局状态,包括所有账户余额和存储。 在每一轮执行中,通过调用代码的 pc(程序计数器)字节找到当前指令,每条指令都有自己的定义,说明它如何影响元组。 例如,ADD 弹出两个元素并压入它们的总和,减少 gas 并增加 pc,SSTORE 弹出前两个元素并将第二个元素插入到每个元素定义的合约存储位置,同时减少 gas 值最多 200,并增加一台电脑。 虽然有很多方法可以通过即时编译来优化以太坊,但是以太坊的基本实现可以用几百行代码来实现。

以太坊经典和以太坊_以太坊最早是免费挖吗_以太坊是无限的

以太坊的目的是基于脚本、山寨币和链上元协议(on-chain meta-protocol)的概念进行整合和改进,让开发者可以创建任意的基于共识的、可扩展的、标准化的和特性化的。完整、易于开发和协作的应用程序。 通过建立最终的抽象基础层——内置图灵完备编程语言的区块链——以太坊使任何人都可以创建合约和去中心化应用程序,他们可以在其中自由定义所有权规则、交易方式和状态转换函数。 Namecoin 的主要框架仅需两行代码即可实现,而货币和信誉系统等其他协议仅需不到二十行代码即可实现。 智能合约——包含价值且只有满足特定条件才能打开的加密宝箱——也可以在我们的平台上创建,并且由于图灵完备性、价值意识、区块链意识和多状态的附加力量很多比 Bitcoin Script 可以提供的智能合约更强大。

以太坊消息传递与比特币交易有些相似,但两者之间存在三个重要区别:

以太坊消息可以由外部实体或合约创建,而比特币交易只能在外部创建。

以太坊消息可以选择包含数据。

如果以太坊消息的接收者是合约账户,它可以选择响应,这意味着以太坊消息也包含函数的概念。

以太坊中的“交易”是指存储从外部账户发送的消息的签名数据包。 一笔交易包含消息的接收者、确认发送者的签名、以太账户余额、要发送的数据和两个称为 STARTGAS 和 GASPRICE 的值。 为了防止代码的指数爆炸和无限循环,每个交易都需要对执行代码引起的计算步骤进行限制——包括初始消息和执行引起的所有消息。 STARTGAS是limit以太坊是无限的,GASPRICE是每一步计算需要支付给矿工的费用。 如果在交易执行过程中,“gas耗尽”,所有状态变化都会恢复到原来的状态,但已经支付的交易手续费无法收回。 如果在交易执行中止时还有剩余的气体,那么气体将被退还给发送者。 创建合约有单独的交易类型和对应的消息类型; 合约地址是根据账户随机数和交易数据的哈希值计算得出的。

消息机制的一个重要结果:它是以太坊的“一等公民”属性——合约拥有与外部账户相同的权利,包括发送消息和创建其他合约的权利。 这允许合约同时扮演多个不同的角色,例如,用户可以使用自定义的基于量子证明的蓝图,使去中心化组织的成员(一个合约)成为偏执用户的中介账户(另一个合约)。 签署 Porter(第三份合同)的个人和本身使用由五个私钥保护的帐户(第四份合同)的共同签署实体提供中介服务。 以太坊平台的优势在于去中心化组织和代理合约不需要关心每个合约参与者的账户类型。

以太坊最早是免费挖吗_以太坊经典和以太坊_以太坊是无限的

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

检查交易是否格式正确(即具有正确的值)、签名是否有效以及随机数是否与发送方帐户的随机数匹配。 如果不是,则返回错误。

计算交易费用:fee=STARTGAS * GASPRICE,由签名确定发送方地址。 从发送者的账户中减去交易费用并增加发送者的随机数。 如果账户余额不足,则返回错误。

设置初始值GAS = STARTGAS,根据交易字节数减去一定量的gas值。

将价值从发送者的账户转移到接收者的账户。 如果接收帐户尚不存在,请创建它。 如果收款账户是合约,则运行合约的代码,直到代码用完或者gas用完。

如果由于发送方账户资金不足或代码执行耗尽gas导致价值转移失败,将恢复原状,但仍需支付交易手续费,交易手续费将加到矿工账户中帐户。

否则,所有剩余的 gas 将返回给发送者,消耗的 gas 作为交易费用发送给矿工。 例如,假设合约的代码如下:

以太坊经典和以太坊_以太坊最早是免费挖吗_以太坊是无限的

应该注意的是,实际上合约代码是用底层的以太坊虚拟机 (EVM) 代码编写的。 上面的合约是用我们的高级语言Serpent写的,可以编译成EVM代码。 假设一开始合约内存是空的,a value 是 10 Ether,gas 是 2000,gas price 是 0.001 Ether 和 64 字节的数据,第一个 32 字节的块代表 number 2 的交易,第二个 CHARLIE 发送后,状态转移函数的处理过程如下:

检查交易是否有效且格式是否正确。

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

初始设置gas=2000,假设交易长度为170字节,每字节费用为5,减去850,所以还剩1150。

从发送者账户中减去 10 Ether,并向合约账户中添加 10 Ether。

运行代码。 在这个合约中,运行代码很简单:它检查合约内存索引 2 是否被使用以太坊是无限的,注意到它没有被使用,并将它的值设置为 CHARLIE。 假设这消耗了 187 个单位的 gas,则剩余的 gas 为 1150 - 187 = 963。

向发送方账户添加 963*0.001=0.963 ETH,返回最终状态。 如果没有合约收到交易,那么所有交易手续费等于GASPRICE乘以交易字节长度,交易数据与交易手续费无关。 此外,需要注意的是,合约发起的消息可以为它们生成的计算分配gas配额。 如果子计算的gas用完了,只会恢复到发送消息时的状态。 因此,就像交易一样,合约也可以通过对它们生成的子计算设置严格限制来保护它们的计算资源。