Solidity
Solidity
FLy_鹏程万里
国内网络安全研究员,专注于Web渗透、移动安全、代码审计、应急响应、内网渗透、区块链安全、云安全等研究方向,擅长渗透测试、红蓝对抗、内网渗透、云安全、区块链安全。
展开
-
Solidity语言学习笔记————10、布尔型、整型
值类型(Value Type)之所以被称为“值类型”,是因为该类型的在传值的时候总是值传递。比如在函数传递参数的时候,或变量进行赋值的时候。值类型包括以下几种:布尔(Booleans)整型(Integer)地址(Address)定长字节数组(Fixed byte arrays)有理数和整型(Rational and Integer Literals,String Listerals)枚举类型(En...原创 2018-06-21 10:37:13 · 925 阅读 · 0 评论 -
Solidity语言学习笔记————17、源文件映射
源文件映射(Source Mappings)作为AST输出的一部分,编译器会提供AST某个节点以应的源代码的范围。这可以被用来做基于AST的静态代码错误分析,可以高亮本地变量,和他们对应使用的调试工具。此外,编译器也可以生成字节码到生成指令源代码的范围映射。这对静态分析工具来说非常重要,它们在字节码级别分析,可以来在调试工具内显示对应代码位置,或支持断点操作。这两种源映射都使用整数标识符来引用源文...转载 2018-06-22 08:59:10 · 286 阅读 · 0 评论 -
Solidity语言学习笔记————41、内存布局
内存布局(Layout in Memory)Solidity预留了4个32字节大小的槽位:0x00 - 0x3f: 哈希方法的暂存空间(scratch space)0x40 - 0x5f: 前已分配内存大小,也称空闲内存指针(free memory pointer)0x60 - 0x7f: 零槽(zero slot)暂存空间可在语句之间使用(如在内联编译时使用)。零槽用作动态内存数组的初始值,不应...翻译 2018-07-08 00:08:59 · 450 阅读 · 0 评论 -
Solidity语言学习笔记————40、存储中状态变量的布局
存储中状态变量的布局(Layout of State Variables in Storage)静态尺寸大小的变量(除了映射和动态尺寸大小的数组类型(的其他类型变量))在存储中,是从位置0连续存储。如果可能的话,不足32个字节的多个条目被紧凑排列在一个单一的存储块,参见以下规则:在存储块中的第一项是存储低阶对齐的。基本类型只使用了正好存储它们的字节数。如果一个基本类型不适合存储块的剩余部分,则移动...翻译 2018-07-08 00:08:54 · 368 阅读 · 0 评论 -
Solidity语言学习笔记————39、独立汇编
独立汇编(Standalone Assembly)上面介绍的在Solidity中嵌入的内联汇编语言也可以单独使用。实际上,它是被计划用来作为编译器的一种中间语言。在这个目的下,它尝试达到下述的目标:使用它编写的代码要可读,即使代码是从Solidity编译得到的。从汇编语言转为字节码应该尽可能的少坑。控制流应该容易检测来帮助进行形式验证与优化。为了达到第一条和最后一条的目标,Solidity汇编语言...翻译 2018-07-08 00:08:49 · 311 阅读 · 0 评论 -
Solidity语言学习笔记————37、Using for
指令using A for B;用来附着库里定义的函数(从库A)到任意类型B。这些函数将会默认接收调用函数对象的实例作为第一个参数。语法类似,python中的self变量一样。using A for *的效果是,库A中的函数被附着在做任意的类型上。在这两种情形中,所有函数,即使那些第一个参数的类型与调用函数的对象类型不匹配的,也被附着上了。类型检查是在函数被真正调用时,函数重载检查也会执行。usi...翻译 2018-07-08 00:08:33 · 403 阅读 · 0 评论 -
Solidity语言学习笔记————36、 库
库(Libraries)库与合约类似,但它的目的是在一个指定的地址,且仅部署一次,然后通过EVM的特性DELEGATECALL(Homestead之前是用CALLCODE)来复用代码。这意味着库函数调用时,它的代码是在调用合约的上下文中执行。使用this将会指向到调用合约,而且可以访问调用合约的storage。因为一个合约是一个独立的代码块,它仅可以访问调用合约明确提供的状态变量,否则除此之外,没...翻译 2018-07-08 00:08:28 · 267 阅读 · 0 评论 -
Solidity语言学习笔记————35、抽象合约和接口
抽象合约(Abstract Contracts)合约函数可以缺少实现(请注意,函数声明头被;终止),见下面的例子:pragma solidity ^0.4.0;contract Feline { function utterance() public returns (bytes32);}这样的合约不能被编译(即使它们同时包含具体函数和抽象函数),但它们可以用作父合约:pragma ...翻译 2018-07-08 00:08:19 · 447 阅读 · 0 评论 -
Solidity语言学习笔记————34、继承
继承Solidity通过复制包括多态性的代码来支持多重继承。 除非合约是显式给出的,所有的函数调用都是虚拟的,绝大多数派生函数可被调用。 当一个合约继承自多个合约时,只会在区块链上创建单个合约,并将所有父合约中的代码复制到创建的合约中。 Solidity的继承与Python非常相似,特别是多继承。 以下是个例子:pragma solidity ^0.4.16;contract owned {...翻译 2018-07-03 22:05:36 · 331 阅读 · 0 评论 -
Solidity语言学习笔记————33、事件(Events)
事件(Events)事件是使用EVM日志内置功能的方便工具,在dapp的接口中,它可以反过来调用Javascript的监听事件的回调。事件在合约中可被继承。当被调用时,会使参数存储到交易的日志中——一种区块链上的特殊数据结构。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在。日志和事件在合约内不可直接被访问,即使是创建日志的合约。日志的简单支付验证(SPV)是可能的,如果一个...翻译 2018-07-08 00:08:13 · 623 阅读 · 0 评论 -
Solidity语言学习笔记————42、提示和技巧
提示和技巧在数组中使用delete,就是删除数组中的所有元素。使用较短的类型和结构元素,短类型分组在一起进行排序。SSTORE操作可能合并成一个单一的SSTORE,这可以降低gas的成本(sstore消耗5000或20000 gas,所以这是你必须优化的原因)。使用天gas的价格估算功能(优化器 enable)进行检查!让你的状态变量为public-编译器会自动创建 getters 。如果你结束了...翻译 2018-07-08 00:09:04 · 396 阅读 · 0 评论 -
Solidity语言学习笔记————8、运算符优先顺序
运算符优先顺序(Order of Precedence of Operators)以下是按evaluation顺序列出的运算符优先顺序。优先级描述运算符1Postfix increment and decrement++, --1New expressionnew <typename>1Array subscripting<array>[<index>]1Mem...转载 2018-06-22 08:56:50 · 489 阅读 · 0 评论 -
Solidity语言学习笔记————31、智能合约的基本文件结构概述
Solidity智能合约文件结构版本声明:pragma solidity ^0.4.0;说明:pragma是一个版本杂注的编译命令,它告知编译器如何处理源代码的指令,这里告诉编译器源码使用的是不低于solidity04.0的但不高于0.5.0版本的编译器编写的。引用其他源文件全局引入import “filename”;自定义命名空间引入import * as symbolName from “f...原创 2018-06-19 14:34:27 · 614 阅读 · 0 评论 -
Solidity语言学习笔记————1、初识Solidity语言
什么是Solidity语言?Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)上。Solidity与其他语言相关的特点?它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address的类型。用于定位用户,定位合约,定位合约的代码(...原创 2018-06-19 13:43:15 · 1692 阅读 · 0 评论 -
Solidity语言学习笔记————6、全局变量风格指南
风格指南概述本指南旨在约定 solidity 代码的编码规范。本指南是不断变化演进的,旧的、过时的编码规范会被淘汰, 而新的、有用的规范会被添加进来。许多项目会实施他们自己的编码风格指南。如遇冲突,应优先使用具体项目的风格指南。本风格指南中的结构和许多建议是取自 python 的 pep8 style guide 。本指南并 不是 以指导正确或最佳的 solidity 编码方式为目的。本指南的目的...转载 2018-06-22 08:56:41 · 544 阅读 · 0 评论 -
Solidity语言学习笔记————45、应用二进制接口(ABI)说明
应用二进制接口(ABI) 说明基本设计在以太坊生态系统中, 应用二进制接口Application Binary Interface(ABI) 是从区块链外部与合约进行交互以及合约与合约间进行交互的一种标准方式。 数据会根据其类型按照这份手册中说明的方法进行编码。这种编码并不是可以自描述的,而是需要一种特定的概要(schema)来进行解码。我们假定合约函数的接口都是强类型的,且在编译时是可知的和静态...翻译 2018-07-11 22:30:29 · 592 阅读 · 0 评论 -
Solidity语言学习笔记————44、合约的元数据
合约的元数据Solidity编译器自动生成JSON文件,即合约的元数据,其中包含了当前合约的相关信息。 它可以用于查询编译器版本,所使用的源代码,应用二进制接口Application Binary Interface(ABI) 和 以太坊标准说明格式Ethereum Nature Specification Format(natspec) 文档,以便更安全地与合约进行交互并验证其源代码。编译器会将...翻译 2018-07-11 22:30:24 · 505 阅读 · 0 评论 -
Solidity语言学习笔记————2、使用编译器
使用编译器使用命令行编译器Solidity的其中一个编译器是solc,即Solidity命令行编译器。使用solc --help提供对所有选项的阐述。编译器可以生成各种类型的输出,包括简单的二进制文件、抽象语法树(解析树)的汇编以及预计要花费的gas。如果仅仅想编译一个智能合约,可以用solc --bin sourceFile.sol命令print二进制数据。在部署合约之前,使用solc --op...转载 2018-06-22 08:56:03 · 775 阅读 · 0 评论 -
Solidity语言学习笔记————43、安全考量
安全考量尽管在通常情况下编写一个按照预期运行的软件很简单, 但想要确保没有人能够以出乎意料的方式使用它就困难多了。在 Solidity 中,这一点尤为重要,因为智能合约可以用来处理通证,甚至有可能是更有价值的东西。 除此之外,智能合约的每一次执行都是公开的,而且源代码也通常是容易获得的。当然,你总是需要考虑有多大的风险: 你可以将智能合约与公开的(当然也对恶意用户开放)、甚至是开源的网络服务相比较...翻译 2018-07-10 14:39:32 · 346 阅读 · 0 评论 -
Solidity语言学习笔记————19、函数可见性定义符、修饰符、保留字和语法
函数可见性定义符(Function Visibility Specifiers)function myFunction() <visibility specifier> returns (bool) { return true;}public:在外部和内部均可见(创建存储/状态变量的访问者函数)private:仅在当前合约中可见external: 只有外部可见(仅对函数)- ...翻译 2018-07-02 16:31:02 · 418 阅读 · 0 评论 -
Solidity语言学习笔记————5、全局变量
全局变量(Global Variables)abi.encode(...) returns (bytes):对给定的参数进行ABI编码。abi.encodePacked(...) returns (bytes): Performes packed encoding of the given argumentsabi.encodeWithSelector(bytes4 selector, ...) ...转载 2018-06-22 08:55:56 · 1288 阅读 · 0 评论 -
Solidity语言学习笔记————30、函数重载
函数重载(Function Overloading)合约可以有多个同名但不同输入参数的函数。这也适用于继承的函数。下面示例展示了合约A中对函数f的重载。pragma solidity ^0.4.16;contract A { function f(uint _in) public pure returns (uint out) { out = 1; } ...翻译 2018-07-03 22:05:24 · 335 阅读 · 0 评论 -
Solidity语言学习笔记————26、回退函数
回退函数(Fallback Function)一个合约可以有一个匿名函数。此函数不能有参数,不能返回任何值。如果没有其他函数与给定的函数标识符匹配,或者如果根本没有提供数据,将执行一个合约的调用。此外,每当合同接收没有数据的纯Ether时,会执行回退函数。此外,为了接收Ether,回退函数必须标记为payable。如果没有这样的函数,合约不能通过常规transactions接收Ether。在这种情...翻译 2018-07-02 16:32:47 · 540 阅读 · 0 评论 -
Solidity语言学习笔记————28、纯函数
纯函数(Pure Functions)当承诺不读取或修改状态时,函数可以声明为pure。除了上面解释的修改状态语句的列表之外,以下语句被认为是读取状态:从状态变量读取。访问this.balance或<address>.balance。访问block, tx, msg中的任何成员,除了msg.sig和msg.data之外。调用任何未标记为pure的函数。使用包含某些操作码的内联程序集。p...翻译 2018-07-02 16:33:10 · 322 阅读 · 0 评论 -
Solidity语言学习笔记————4、常量
常量(Constant State Variables)状态变量可以被定义为constant。这样的话,它必须在编译期间通过一个表达式赋值。 这种情况下,以下功能的表达式不被允许:访问storage访问区块链数据,如now,this.balance,block.number访问合约执行的中间数据,如msg.gas向外部合约发起调用。可能会造成内存分配副作用表达式是允许的,但对其它内存对象的产生副作...转载 2018-06-22 08:55:50 · 355 阅读 · 0 评论 -
Solidity语言学习笔记————23、函数调用和赋值
函数调用(Function Calls)内部函数调用(Internal Function Calls)当前合约的函数可以直接内部(Internal)调用,也可以递归地调用,比如这个古怪的例子:pragma solidity ^0.4.16;contract C { function g(uint a) public pure returns (uint ret) { return f(...翻译 2018-07-02 16:31:23 · 782 阅读 · 0 评论 -
Solidity语言学习笔记————21、函数的访问权限和可见性
在之前的文章中我们介绍了Solidity语言函数的一些基本语法。下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及Solidity提供的对函数调用时的可见性控制语法。调用方式Solidity封装了两种函数的调用方式internal和external。internalinternal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境...转载 2018-06-21 17:26:46 · 549 阅读 · 0 评论 -
Solidity语言学习笔记————18、字符串和函数
字符串:需要使用双引号“”或者单引号’’括起来,例如:定义一个字符串变量:string name=“jake”;string字符串不能通过length方法获得长度十六进制数据:以关键字hex打头,后面紧跟用单或双引号包裹的字符串。如hex"001122ff"。通过下面的例子来理解下是什么意思:contract HexLiteral{ function test() returns (st...转载 2018-06-21 17:17:06 · 579 阅读 · 0 评论 -
Solidity语言学习笔记————16、映射Mapping
solidity里的映射可以理解为python里的字典,建立键-值的对应关系,可以通过键来查找值,键必须是唯一的,但值可以重复。定义方式为:mapping(键类型=>值类型),例如mapping(address=>uint) public balances,这个映射的名字是balances,权限类型为public,键的类型是地址address,值的类型是整型uint,在solidi...转载 2018-06-21 17:12:00 · 1696 阅读 · 0 评论 -
Solidity语言学习笔记————15、结构体Struct
自定义结构体pragma solidity ^0.4.4;contract Students { struct Person { uint age; uint stuID; string name; }}Person就是我们自定义的一个新的结构体类型,结构体里面可以存放任意类型的值。怎么理解结构体:如果我们要描述一个人,需要...转载 2018-06-21 17:09:28 · 1046 阅读 · 0 评论 -
Solidity语言学习笔记————12、数组
固定长度的数组固定长度类型数组的声明pragma solidity ^0.4.4;contract test { // 数组的长度为5,数组里面的存储的值的类型为uint类型 uint [6] T = [1,2,3,4,5,6];}通过length方法获取数组长度遍历数组求总和pragma solidity ^0.4.4;contract test { /...转载 2018-06-21 17:01:36 · 798 阅读 · 0 评论 -
Solidity语言学习笔记————14、动态字节数组
构建大小可变的动态数组数组的大小即可以有固定的,也可以实现动态改变。在不同的场景使用不同的类型才是最正确的选择。其实我们经常见到的String类型的数据就可以认为是一个动态数组,其大小可变。...原创 2018-06-21 16:42:11 · 844 阅读 · 0 评论 -
Solidity语言学习笔记————13、固定大小字节数组
构建固定大小字节数组Solidity中固定大小的字节数组可以通过关键字“byte”来实现。例如:可以使用bytes1,bytes2,....bytes32来声明某一个数组具有多少字节的存储空间。需要注意的是我们经常看到的“byte”就是“bytes1”。实例如下:pragma solidity ^0.4.0;contract test{ //数据用十六进制表示为: 0x6a6675...原创 2018-06-21 13:19:55 · 433 阅读 · 0 评论 -
Solidity语言学习笔记————14、左值运算符
左值运算符(Operators Involving LValues)如果a是一个左值(LValues),即一个可以赋值给它的变量,可以使用以下的运算符:a += e相当于 a = a + e。 运算符- =,* =,/ =,% =,| =,& =和^ = 都有类似的定义。a++和a--相当于a+ = 1 /a - = 1,--a和++a对a有与上一条相同的效果,但是等值发生改变后才返回运算...转载 2018-06-22 08:58:46 · 295 阅读 · 0 评论 -
Solidity语言学习笔记————11、隐式转换和显式转换
隐式转换(Implicit Conversions)如果将一个运算符应用于多个不同类型,编译器会试图隐式地把其中一个操作数的类型转换为另一个操作数的类型。赋值操作在同样的情况下也会这样。一般来说,如果转换后不会造成信息会丢失,会自动进行隐式转换:unt8可转换成uint16, int128, int256int8不能转换成uint256,因为uint256放不下负数无符号整数可以转换成相同或更大的...转载 2018-06-22 08:58:38 · 708 阅读 · 0 评论 -
Solidity语言学习笔记————27、视图函数
视图函数(View Functions)当承诺不修改状态时,函数可以声明view。下面的语句被认为是修改状态:写入状态变量。发生事件。创建其他合约。使用自毁selfdestruct。通过调用发送Ether。调用任何未标记view或pure的函数。使用低级调用(low-level calls)。使用包含某些操作码的内联程序集。pragma solidity ^0.4.16;contract C ...翻译 2018-07-02 16:33:03 · 317 阅读 · 0 评论 -
Solidity语言学习笔记————20、函数修饰符
函数修饰符(Function Modifiers)修饰符可以用来轻松改变函数的行为,比如在执行的函数之前自动检查条件。他们可继承合约的属性,也可被派生的合约重写。pragma solidity ^0.4.11;contract owned { function owned() public { owner = msg.sender; } address owner; ...翻译 2018-07-02 16:31:08 · 406 阅读 · 0 评论 -
Solidity语言学习笔记————22、可见性和Getters
可见性和Getters(Visibility and Getters)Solidity可以理解两种函数调用:“内部调用”,不创建一个真实的EVM调用,也称为“消息调用”“外部调用”,要创建一个真实的EVM调用,有四种的函数和状态变量的可见性:函数可以被定义为external, public, internal 或 private,默认是 public。状态变量不能为 external,默认是 in...翻译 2018-07-02 16:31:14 · 290 阅读 · 0 评论 -
Solidity语言学习笔记————26、Assert, Require, Revert 和 Exceptions
Assert, Require, Revert 和 ExceptionsSolidity使用state-reverting异常来处理错误。 这种异常将回滚当前调用(及其所有子调用)状态的所有变化,并将错误标志给调用者。 函数assert和require可以用于检查条件,如果条件不满足则抛出异常。 assert函数只能用于测试内部错误,并检查不变量。 应该使用require函数来确认input或合约...翻译 2018-07-02 16:32:57 · 496 阅读 · 0 评论 -
Solidity语言学习笔记————25、作用域和声明
作用域和声明(Scoping and Declarations)已声明的变量将具有其字节表示为全0的初始值。变量的初始值是任何类型的典型“零状态”(“zero-state)。例如,bool的初始值为false。uint或int类型的默认值为0。对于静态大小的数组和bytes1到bytes32,每个单独的元素将被初始化为对应于其类型的初始值。对于动态大小的数组、bytes和string,初始值是空数...翻译 2018-07-02 16:31:36 · 365 阅读 · 0 评论