codecamp

以太坊 消息调用

合约可以通过消息调用的方式调用其他合约或向非合约账户发送以太币。消息调用类似于事务,因为它们具有源、目标、数据有效负载、以太币、gas 和返回数据。实际上,每个事务都包含一个顶级消息调用,而该调用又可以创建进一步的消息调用。

合约可以决定应该通过内部消息调用发送多少剩余的gas,以及它想要保留多少。如果在内部调用(或任何其他异常)中发生gas不足异常,则会通过放入堆栈的错误值发出信号。在这种情况下,只有与调用一起发送的 gas 被用完。在 Solidity 中,调用合约在这种情况下默认会导致手动异常,因此异常会“冒泡”调用堆栈。

如前所述,被调用的合约(可以与调用者相同)将收到一个新清除的内存实例,并可以访问调用有效负载 - 这将在一个名为calldata的单独区域中提供。完成执行后,它可以返回数据,这些数据将存储在调用者预先分配的调用者内存中的某个位置。所有此类调用都是完全同步的。

调用被限制在 1024 的深度,这意味着对于更复杂的操作,循环应该优先于递归调用。此外,在消息调用中只能转发 63/64 的gas,这导致实际深度限制略小于 1000。


以太坊 指令系统
以太坊 Delegatecall / Callcode 和库
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }