消息调用和合约创建合约

消息调用
合约可以通过消息调用的方式来调用其它合约或者发送以太币到非合约账户。消息调用和交
易非常类似,它们都有一个源,一个目标,数据负载,以太币,gas 和返回数据。事实上每
个交易都可以被认为是一个顶层消息调用,这个消息调用会依次产生更多的消息调用。
一个合约可以决定剩余 gas 的分配。比如内部消息调用时使用多少 gas,或者期望保留多
少 gas。如果在内部消息调用时发生了 out-of-gas 异常(或者其他异常),合约将会得到
通知,一个错误码被压在栈上。这种情况只是内部消息调用的 gas 耗尽。在 solidity 中,
这种情况下发起调用的合约默认会触发一个人工异常。这个异常会打印出调用栈。就像之前
说过的,被调用的合约(发起调用的合约也一样)会拥有崭新的主存并能够访问调用的负载。
调用负载被存储在一个单独的被称为 calldata 的区域。调用执行结束后,返回数据将被存
放在调用方预先分配好的一块内存中。
调用层数被限制为 1024,因此对于更加复杂的操作,我们应该使用循环而不是递归。

创建
合约甚至可以通过一个特殊的指令来创建其他合约(不是简单的向零地址发起调用)。

创建合约的调用跟普通的消息调用的区别在于,

1. 负载数据执行的结果被当作代码

2. 调用者/创建者在栈上得到新合约的地址

自毁
只有在某个地址上的合约执行自毁操作时,合约代码才会从区块链上移除。合约地址上剩余
的以太币会发送给指定的目标(谁来指定?指定给谁?合约地址上怎么还有剩余的以太币?以太币不都是在人类账户上吗?还有以太币存在合约上吗?如果有,谁给合约地址转的?或者说以太币的来源是什么?),然后其存储和代码被移除。

注意,即使一个合约的代码不包含自毁指令,依然可以通过代码调用(callcode)来执行这个
操作。

猜你喜欢

转载自blog.csdn.net/bjzhaoxiao/article/details/81202361