主页 > imtoken钱包官网版最新 > 以太坊:基本概念和智能合约运行机制

以太坊:基本概念和智能合约运行机制

imtoken钱包官网版最新 2023-01-17 08:02:43

以太坊永续合约怎么玩_以太坊智能合约安全性_以太坊合约怎么玩

世界状况

世界状态是地址(160位标识符)和账户状态(序列化为RLP数据结构)之间的映射。 区块链并不直接存储世界状态,而是在区块头中存储相关 Merkle Patricia 树根节点的哈希值。 希腊价值。

帐户

以太坊引入了账户的概念来取代比特币的 UTXO 模型。 以太坊有两种账户以太坊合约怎么玩,外部账户和合约账户,这两种账户对EVM没有区别。 每个账户都有一个与之关联的账户状态和一个 20 字节的地址,两者都可以存储以太币。

外部账户:由私钥控制,不关联任何代码,地址由公钥确定。 私钥可用于签署交易主动发起交易(transaction)给其他账户进行消息传递,

合约账户:由合约代码控制,有与之关联的代码,其地址由合约创建者的地址和该地址发送的交易数量的随机数决定。 无法主动向其他账户发起交易,但可以“响应”其他账户的消息调用。

外部账户之间的消息传递是价值传递的过程。 外部账户到合约账户的交易,或者合约账户到合约账户的消息,都会激发合约账户代码的执行以太坊合约怎么玩,使其执行转账、写入内部存储、执行操作、创建合约等操作。

帐户状态

无论帐户类型如何,帐户状态都包含以下四个字段:

nonce:随机数,账户发出的交易数与创建的合约数之和。

以太坊合约怎么玩_以太坊智能合约安全性_以太坊永续合约怎么玩

Balance:余额,账户拥有的Ether数量,单位为Wei,1Ether=10^18Wei。

storageRoot:存储根节点,账户内容MerklePatricia树根节点的哈希码。

codeHash:code hash,账户关联的EVM代码的hash值,外部账户的codeHash为空字符串的hash,创建后不可更改。 所有代码片段哈希都包含在状态数据库中以供后续使用。

以太坊合约怎么玩_以太坊永续合约怎么玩_以太坊智能合约安全性

交易

外部账户向其他账户发送签名数据包。 每一笔交易都会改变以太坊的状态,被序列化,并被矿工验证和广播后记录在区块链中。 因此,交易是异步的,唯一能立即返回的值就是交易哈希。 交易可以分为创建合约和传递消息。 一笔交易的完成可能需要触发多条消息和消息调用。

交易包括:

∙ 交易接收方

∙签名可以识别交易发送方,证明这是一笔交易从发送方通过区块链发送给接收方

以太坊智能合约安全性_以太坊合约怎么玩_以太坊永续合约怎么玩

∙ VALUE,要转移的以太币数量(wei)

∙ Gas Limit(有时称为StartGas),交易执行时允许消耗的最大gas量

∙ Gas Price,交易发送方指定的单位gas价格(以以太坊计算)

信息

数据和价值(以太币)在两个账户之间传递。 它不一定会改变以太坊的状态。 仅存在于以太坊执行环境中的虚拟对象不会被序列化或记录在区块链中。 消息是同步的,可以立即获取返回值。

留言通话

从一个账户向另一个账户传递消息的行为类似于Transaction,但虚拟对象只存在于以太坊执行环境中,不会记录在区块链中,可以类比为函数调用。 如果目标账户是合约账户,则会触发合约账户的EVM代码执行。 如果两个账户都是合约账户,可以在调用中传递所有虚拟机的返回值。

该消息包含:

∙ 消息的发送者(隐含的)

以太坊永续合约怎么玩_以太坊智能合约安全性_以太坊合约怎么玩

∙消息的接收者

∙ VALUE,随消息传送到合约地址的以太币数量(wei)

∙ 可选数据字段,作为合同的输入

∙ STARTGAS,用于限制此消息触发的代码执行可消耗的最大gas量

消息调用和消息通常是同义词,不需要严格区分。

交易和消息不是包容关系,而是部分重叠关系:交易发送方直接将交易发送到以太坊指定地址,不经过合约创建合约,没有消息调用过程,只属于交易; 交易发送方调用合约从一个账户向另一个账户转账的操作既是交易又是消息调用; 合约账户由外部账户激活创建合约,只是消息调用,不是交易。

交易必须由外部账户发起。 一个事务可能会触发一系列的“消息调用”。 合约账户执行代码以响应来自其他账户的“消息调用”,然后触发新的“消息调用”。 因此,本质上所有的“消息调用”和以太坊状态的变化都是由外部账户触发的,也就是说,以太坊作为一个整体可以看作是一个基于交易的状态机:从一个创世状态开始,然后是执行状态transaction 逐渐变化,直到最终状态,也就是以太坊世界的权威版本。

燃料和付款(Gas)

以太坊交易需要考虑很多消耗因素,包括带宽消耗、存储消耗、计算消耗等。为了避免网络的滥用,避免图灵完备性带来的一些问题,所有在以太坊中的程序执行都需要收费。 各种运营成本以gas为单位计算。 任意程序片段(包括合约创建、信息调用、账户存储的使用和访问、虚拟机操作等)都可以按照规则计算消耗的gas量。

以太坊智能合约安全性_以太坊永续合约怎么玩_以太坊合约怎么玩

每笔交易都有一个气体限制(Gas Limit)。 交易发送方在发送交易时会指定gas limit和gas price GasPrice。 这些指定的 gas 费用将在交易执行前从交易发送方账户的余额中扣除。 扣减金额=GasLimit *GasPrice,交易完成后,剩余的gas将按购买时的价格返还至交易发送方的账户,未返还的费用将作为奖励矿工挖出包含此交易的区块。 如果在交易执行过程中发生OOG异常,交易将被视为无效交易,所消耗的gas将不予返还,仍将作为矿工贡献计算资源的奖励. gas价格相当于以太币与gas的兑换率,可以由交易者任意设定。 高昂的 gas 价格会使交易发送者花费更多的以太币,并用更多的以太币奖励矿工,因此这笔交易将接受更多的矿工选择。 通常,矿工会通知他们执行交易的最低 gas 价格,交易发送者会选择高于 gas 价格下限的价格,从而产生(加权)最低可接受 gas 价格的分布。

GasPrice 只能由交易中的原始交易发送者设置。 消息调用中没有 GasPrice 字段。 当一笔交易触发一系列“消息调用”时,原始交易发起者需要支付所有执行费用。 事务和消息调用都可以限制gas消耗,不同的是在调用消息时,如果消息发送者限制了子执行的gas消耗,出现OOG异常,只回滚子执行执行的操作,父执行不需要回滚。

以太坊合约怎么玩_以太坊永续合约怎么玩_以太坊智能合约安全性

合约创建

当外部账户主动发起交易(交易中可以包含二进制数据(payload)和以太坊),或者合约账户被外部账户触发进行消息调用,接收方为以太坊指定一个空集⌀,则合同被创建。 新合约账户的地址是根据合约创建者的地址和该地址发送的交易数量(称为随机数)计算得出的。 保存的合约代码体是执行附带的初始化EVM代码后得到的最终字节码(创建合约交易的payload作为EVM字节码执行,执行的输出作为合约代码永久保存)。 完整的交易通过矿工广播验证后,与新的世界状态一起存储在区块链中。 完成交易的发起者支付创建过程中消耗的gas,挖出包含交易的区块的矿工获得这些gas作为奖励。 如果由于 gas 耗尽、堆栈溢出、无效指令等原因导致合约创建期终止,所有操作将回滚,并恢复更改后的状态。 消耗的gas不会返还,仍将作为矿工贡献计算资源的奖励。

注意:合约账户也可以创建合约。 当合约账户被外部账户发起的交易触发调用消息创建合约时,合约账户为消息发送者(Solidity中记录为msg.sender,即当前函数的调用者),新的合约地址由本合约账户的地址和nonce决定,创建合约的费用由发起完整交易的外部账户支付。

合同调用

当外部账户主动发起交易,或合约账户被外部账户触发调用消息,且接收方为合约账户时,触发合约账户中的EVM代码在本地EVM中执行。 执行完成后,返回执行结果,完整的交易过程经过矿工广播和验证后,与新的世界状态一起存储在区块链中。 完成交易的发起者支付执行过程中消耗的gas,挖出包含交易的区块的矿工获得gas作为奖励。 如果在合约执行过程中抛出异常,所有操作将回滚,并恢复更改后的状态。 消耗的gas不会返还,仍将作为矿工贡献计算资源的奖励。

注意:合约账户不能自发检查外部条件是否满足预设情况,从而触发代码的自动执行。 只能通过外部账户发起的交易触发合约账户进行校验操作。 相反,可以在预定的时间段后调用以太坊闹钟合约间接执行合约执行条件检查。

以太坊合约怎么玩_以太坊智能合约安全性_以太坊永续合约怎么玩

参考:

[1] 以太坊黄皮书

[2] 以太坊白皮书

[3] 以太坊家园文档

[4] Solidity官方文档

[5] ethereum stackexchange,交易和调用有什么区别?

[6]ethereum stackexchange,合约如何在以后自行运行?

[7] ethereum stackexchange,acall消息调用和消息有什么区别?

[8] ethereum stackexchange,智能合约在什么时候执行?

[9] ethereum stackexchange,智能合约可以自己执行吗?

关于作者