首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

解构 Solidity 合约 #4: 函数

首先,我们理解了合约的创建时间和运行时字节码之间的区别;接下来,我们理解了来自任何调用或交易的执行入口是如何通过函数选择器被路由到特定的函数的;最后,我们看到了传入的交易数据是如何被解包给函数使用的,以及函数产生的数据是如何通过函数包装器为用户重新打包的...当一个函数体被执行时,函数参数应该安然无恙的在堆栈中(如果数据是动态的,则在内存中),等待被使用。让我们看看balanceOf(address)函数的实际应用。...这个函数应该接收一个 address,并返回这个地址相应的 uint256的余额。 让我们回到 Remix,像以前一样编译和部署合约,然后调用balanceOf函数,把部署合约时用的地址作为参数。...如果你看一下解构图[7],在包装器的蓝色部分,你应该看到balanceOf函数包装器将指令 175 处重定向到 251 的JUMPDEST指令。...秘密在于理解如何从映射中读取数值和写入映射。真的没有什么更多的东西了。 现在让我们回到大解构图: 图 3. 函数包装器之后的函数体。 正如我们之前所讨论的,函数体都集中在函数封装器之后。

78030
您找到你想要的搜索结果了吗?
是的
没有找到

解构 Solidity 合约 #3:函数包装器

这是解构系列另一篇。如果你没有读过前面的文章[4],请先看一下。我们正在解构一个简单的Solidity 合约[5]的EVM 字节码[6]。...代码执行的这部分是实际的函数体,其内部工作原理现在对我们并不重要。对于本文的范围来说,重要的是代码是如何到达和离开这个 "主体" 的,也就是说,它是如何环绕它的。它跳进了的函数体,又跳出了的函数体。...这个词是我们传入函数调用的参数,也就是我们在调用balanceOf时要检查其余额的地址。...因此,我们可以看到,函数包装器的工作不仅是重定向到函数体,并为用户包装从函数体返回来的任何东西,而且还要包装供函数主体使用参数。这样,函数包装器的本质就完全展现在我们面前了!...这种打包和解包是如何完成的,在以太坊的应用二进制接口规范[13]中有细致的定义,它规定了函数调用中传入和传出的参数如何编码的。 现在,让我们快速看看这 3 个函数包装器的整体情况: 图 11.

60320

解构函数与原型对象

中已新增了类class的功能,越来越严格,越来越像后端语言,Es6,Es7新增的诸多方法也越来越强大,但是我觉得理解构函数与原型对象还是有必要的,是js面向对象编程的基础,今天就我的学习和使用跟大家分享一下学习心得...// 函数可以作为参数传递,也可以作为返回值返回 var funD = function(funParm){ return funParm; } var runFunParmPassedToFunD...,使用这些数据去完成预定的操作 函数是一等公民,是对象,是值,可以存储在一个变量,数组或者对象中 函数可以传递给函数,并由函数返回,函数拥有属性 函数总有返回值(换句话说就是有return语句,当然构造器函数除外...为何内置构造函数无new也能工作 示例代码如下所示 var arr = Array; // 当没有参数时,构造函数后面的圆括号可以省略 var obj = Object({ name:"随笔川迹"...,功能上与内置的函数并没有多大的区别,构造函数首字母大写用来区分普通函数还是构造函数,构造函数中的this指向该实例化的构造函数,主要是创建多个共享特定属性和行为的对象,用于创建模板,作为饼干工具,而原型对象主要是改写构造函数

1.1K40

【JavaScript】函数 ② ( 函数参数 | 形式参数 | 实际参数 )

一、JavaScript 函数参数 在 JavaScript 语言中 , 参数 分为以下两种 : 形式参数 Parameter , 简称 " 形参 " , 是 在函数定义时列出的变量 , 用于预期函数将接收的输入值...; 实际参数 Argument , 简称 " 实参 " , 是 在函数调用时传递给函数的实际值 , 用于替换形参并执行函数 ; 形参 与 实参 是 函数参数 的两个重要概念 , 二者 用于 定义 函数如何处理...外部输入参数 ; 1、形式参数 形式参数 简称 形参 , 是在 函数声明 时 定义的 参数列表 ; 形参 表示的是 函数想要接受 的 输入参数 对应的 占位符 ; 在 函数调用 时 , 形参 会被 替换为...n 个 , 可以不设置 形参 , 也可以设置多个形参 ; 2、实际参数 实际参数 简称 " 实参 " , 实参 是 调用函数 时传递给函数的实际参数值 ; 传入的 实际参数值 会替换 函数声明时 的...形式参数 ; 函数调用 的 语法结构如下 , argument1, argument2, ...

11010

函数如何传参

一、说明 首次接触函数, 部署了一个函数, 却不知道如何访问, 如何传递参数, 下面写一个简单的例子, 然后通过 HTTP请求发送数据出发函数. 二、操作 1....创建函数 index.py # -*- coding: utf8 -*- import json def main_handler(event, context): return {...Content-Type': 'application/json'}, "body": json.dumps( event), # 这里将 event 作为结果返回, 我们就可以从中知道如何函数中获取我们发送的参数...API 网关触发, 请求方法 选择 ANY, ( 也可以指定具体方法, 这里为了测试) [image.png] 创建后点击 API服务名, 进入对应API网关, 选择编辑 [image.png] 在参数配置中配置两个参数...user={name: xiaoming} Accept: application/json event 的具体数据结构内容详细说明可见官方文档: [image.png] 三、参考文档 文档中心 > 函数

2.2K11

【Kotlin】函数 ① ( 函数头声明 | 函数参数 | 默认参数值 | 具名参数 )

文章目录 一、函数头声明 二、函数参数 1、默认参数值 2、具名参数 一、函数头声明 ---- 函数头声明 格式如下 : 可见性修饰符 函数声明关键字 函数名 (函数参数) : 函数返回值类型 函数头示例...: private fun hello(name:String, age:Int):String 可见性修饰符 : private 函数声明关键字 : fun 函数名 : hello 函数参数 : name...$age, type is ${if(name == "Tom") "Cat" else "Mouse"}" } 执行结果 : Name is Tom, age 18, type is Cat 二、函数参数...---- 1、默认参数值 默认参数值 : Kotlin 语言 中的 函数参数 , 可以 在定义时 指定参数默认值 ; 代码示例 : fun main() { val name = "Tom"...具名参数 : Kotlin 中的 函数参数顺序 必须按照定义的顺序传递 , 如果使用 具名参数 , 可以不必按照参数顺序传递参数 ; 代码示例 : 在下面的代码中 , 函数参数为 name: String

2.7K10

函数模板参数(函数参数在哪)

void fun(T const& a,T const& b);但是你调用时却是fun(250,250.4);那你就必须写成fun(250,250.4); 2)需要获得特定类型的返回值,而不管参数的类型如何...用typename和class类型声明的参数称为虚拟类型参数,而用《类型修饰》声明的参数称为常规参数 4)函数模板含有常规形参。...对于函数模板,数据类型本身成了它的参数,因而是一种参数化类型的函数。类的成员函数也可以声明为函数模板。...② 虚拟类型参数用做函数的返回值类型,而且函数需要返回特定类型的值,而不管函数实参的类型是什么。在这种情况下,需要用模板实参强制虚拟类型参数对应于特定类型。...因此,常规参数的信息无法从模板的“函数实参表”中获得,调用模板函数时必须显示给出对应于常规参数的模板实参。

3K30

解构 Solidity 合约 #2 - 函数选择器

如何与合约的运行时代码的特定部分交互将是本文的重点。 入口检查 我们要不要试一下?点击 Remix 的Run面板上的totalSupply按钮。你应该马上看到按钮下面有一个响应。...事实上,在这篇文章中,我们甚至不会去研究函数主体的执行。我们唯一关心的是 Solidity 生成的 EVM 代码如何引导进入的交易,我们将理解为合约的 "函数选择器 "的工作。...简单地说,它由一个 "函数 ID "组成,它是由函数的签名哈希值产生(截断到前四个字节)和打包的参数数据。...这是四个字节,正是通过对字符串 totalSupply()的函数签名应用 keccak256算法,并进行前四个字节截断而产生的。由于这个特殊的函数不需要参数,它只是:一个四字节的函数 ID。...看一下解构图[17],这就是我们刚刚解构的内容: 图 4. 函数选择器和合约的运行时代码主入口点。 下一篇,我们继续解构 函数包装器。

49930

Scalpel:解构API复杂参数Fuzz的「手术刀」

Scalpel简介Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点,让漏洞...《自动化API漏洞Fuzz实战》目前我们的Fuzz引擎端已打包为一个小工具,内置100+漏洞POC,供大家试用:https://github.com/StarCrossPortal/scalpel深度参数注入原理随着...Web应用复杂度的提升与API接口的广泛使用,在HTTP应用漏洞Fuzz过程中,传统的「Form表单明文传参的模式」已经逐渐变为「复杂、嵌套编码的参数传递」。...在此情况下,直接对参数内容进行注入或替换,无法深入底层的漏洞触发点。漏洞Fuzz过程中需要对这些「结构体、编码」进行抽离,找到真正的注入点位,方可进行自动化漏洞测试。...在原始参数结构解析之后,我们可以基于树结构来设定我们的测试向量注入方式:对节点的变异方式有:按数据类型注入payload注入通用型payload畸形数据替换类型转换对树结构的变异方式有:替换object

1K20

Python教程如何设置函数的默认参数

今天马哥教育要跟大家分享的文章是Python教程如何设置函数的默认参数?上一讲我们结束了用文件保存游戏的Python内容,这一讲我们来补充一个小技巧,关于设置函数默认参数的哦!...,我们都是用world来调用这个函数,少数情况才会去改参数。...那么,我们就可以给这个函数一个默认参数: def hello(name = 'world'): print 'hello ' + name 当你没有提供参数值时,这个参数就会使用默认值;如果你提供了,就用你给的...这样,在默认情况下,你只要调用 hello() 就可以输出 hello world 同样你也可以指定参数: hello('python') 输出 hello python 注意,当函数有多个参数时,如果你想给部分参数提供默认参数...以上就是马哥教育今天为大家分享的关于Python教程如何设置函数的默认参数的文章,希望本篇文章能够对正在 python学习 和从事python相关工作的小伙伴们有所帮助,想要了解更多相关知识记得关注马哥教育官网

1.9K10

C语言函数参数如何传递的?

我们再结合下面的图来理解: 值传递 首先图中方框中的上部分a和b代表了main函数中的a和b,即原始数据,而方框中的下部分a和b代表了函数参数a和b,即原始数据的“副本”。...为什么又有传值,又有传指针 看到这里,不知道你是否会疑惑,为什么给函数传递参数的时候,一会是传值,一会是传指针呢?为什么传指针就能改变参数的值呢?实际上,C语言里,参数传递都是值传递!...我们还是利用前面所知来分析,由于传递给getMemory函数参数都是一个副本,因此函数内的p也是外部p的一个副本,因此即便在函数内部,将p指向了一块新申请的内存,仍然不会改变外面p的值,即p还是指向NULL...、 如何修改呢?我们需要传入p的地址,即指向int类型指针的指针。...c语言1232_副本_副本.jpg 可配合下面的图进行理解: 总结 本文总结如下: 函数的形参都是原数据的“副本”,因此在函数内无法改变原数据 函数参数都是传值,传指针本质上也是传值 如果想要改变入参内容

4.1K11

解构 TOGAF-4-如何建设架构能力?

现在使用最多,影响力最大的就是 TOGAF 了,所以我打算就从这个有点重的块头开始,和庖丁解牛一样一点点拆解,所以这个小事有个标签:和坚解构。...1 预备阶段的目的 这篇文章会完整介绍一下 ADM 的预备阶段,按照《解构 TOGAF-3-用 ADM 如何打胜仗? 》的类比,如果企业架构规划和实施是企业的一场战争,预备阶段的目的就是战前动员。...这个步骤的主要输出: 架构工作请求书(要做什么,要什么角色,如何建立 EA 团队) 企业架构的组织模型(EA 的组织模型) 业务原则,业务目标和业务驱动因素 2.4 识别并建立架构原则 原则是讲述一个组织如何履行其使命的规则和指引...但对于一个企业(客户)来说,我们还需要通过这个预备阶段帮助企业意识到它需要哪些架构能力,以及应该如何建设这些架构能力。...所以不论是甲方还是乙方,在开始企业架构工作之前,都应该先动员实施企业架构的组织识别清楚需要什么架构能力,如何建设这些架构能力。

66330

JavaScript 函数参数

---- 函数显式参数(Parameters)与隐式参数(Arguments) 在先前的教程中,我们已经学习了函数的显式参数: functionName(parameter1, parameter2,...parameter3) { // 要执行的代码…… } 函数显式参数函数定义时列出。...函数隐式参数函数调用时传递给函数真正的值。 ---- 参数规则 JavaScript 函数定义显式参数时没有指定数据类型。 JavaScript 函数对隐式参数没有进行类型检测。...通过值传递参数函数中调用的参数函数的隐式参数。...JavaScript 隐式参数通过值来传递:函数仅仅只是获取值。 如果函数修改参数的值,不会修改显式参数的初始值(在函数外定义)。 隐式参数的改变在函数外是不可见的。

85920

如何向回调函数中传入其他参数

如何向回调函数中传参数 最近写JS经常会因为向回调函数中传参而头疼,今天总结一下向回调函数中传参的方法,以后的应用中就不用在到处去找了。 首先构建一个需要向回调函数中传入参数的典型应用。...通过使用Closure,我们通过匿名函数来重新包装返回的对象,同时将需要传入的参数做为新的属性传给回调函数。...第三种方法假设你需要为你的回调函数使用不同的签名,例如Ajax.Net的专家们允许你在回调中使用额外的参数,如果你想从一个换到另外一个并且保持兼容性的话,就要用到下面的写法: 第四种办法其实就是Closure...的一种变体,你不需要显示的声明一个回调函数,而是使用一个匿名函数直接进行你所需要的处理。...如何向回调函数中传参数 总结一下:向回调函数中传入参数的终极办法其实就是利用Closure,这个看来是唯一可行而且比较优雅的方法,下面将Closure的写法列在下面:      var callback

2.1K10
领券