【区块链】
文章平均质量分 87
FLy_鹏程万里
国内网络安全研究员,专注于Web渗透、移动安全、代码审计、应急响应、内网渗透、区块链安全、云安全等研究方向,擅长渗透测试、红蓝对抗、内网渗透、云安全、区块链安全。
展开
-
UniSwap V3协议浅析(下)
文章前言本篇文章我们继续接着之前的UniSwap V3协议浅析(上)来进行分析Uniswap v3设计源码分析UniswapV3FactoryUniswapV3Factory的主要功能是提供创建pool的接口并且跟踪所有的pool,完整代码如下所示:// SPDX-License-Identifier: BUSL-1.1pragma solidity =0.7.6;import './interfaces/IUniswapV3Factory.sol';import './Un原创 2021-06-23 14:03:23 · 15163 阅读 · 2 评论 -
UniSwap V3协议浅析(上)
文章前言本篇文章主要对Uniswap V3协议的新特性、工作原理、项目构成、源码实现等部分进行详细解读。协议简介Uniswap v1版本于2018年11月面世,其本质上是一个运行在以太坊区块链上的基于"恒定乘积"算法的"自动化流动性"协议,我们可以将其看做是一个建立在以太坊上的去中心化数字货币交易所(DEX),在该交易所上的所有交易(代币互换)都由智能合约来执行且免信任。Uniswap v2版本于2020年5月面世,相较于Uniswap v1最主要的变化是在原先只支持ERC-20/ETH流动原创 2021-06-23 13:44:20 · 2243 阅读 · 2 评论 -
Ethernaut闯关录(上)
简介Ethernaut是一个类似于CTF的智能合约平台,集成了不少的智能合约相关的安全问题,这对于安全审计人员来说是一个很不错的学习平台,本篇文章将通过该平台来学习智能合约相关的各种安全问题,由于关卡较多,而且涉及合约的分析、攻击流程的演示所以篇幅较长,经过缩减最终定为两篇文章来分享,原文章已经发布于先知平台,目录如下:文章链接:https://xz.aliyun.com/t/7173...原创 2020-02-10 14:34:01 · 1637 阅读 · 0 评论 -
MetaMask安装使用指南
前言MetaMask是一个以太坊钱包插件,虽然只能在Chrome浏览器中使用,但作为以太坊钱包的metamask却很受以太坊开发者欢迎。MetaMask除了是一个简单的钱包,它主要卖点是让使用者可以很容易跟以太坊的智能合约互动,或者说说MetaMask可以用来参加ICO,大家可能会感觉更爽些。 跟大部份钱包一样,MetaMask也不会存钱包资料,所有钱包的私钥和密码都由使用者本身持有,...原创 2020-01-30 15:08:00 · 63236 阅读 · 5 评论 -
Solidity语言学习笔记————3、Remix的基本使用
Remix介绍工欲善其事,必先利其器!每一种语言在有了一系列的编程规范以及一个IDE、外加一个优秀的编程开发人员将会变得very perfect!而对于我们本系列介绍的Solidity语言也自然有它的开发的IDE——Remix。Remix有在线版本和离线版本两种,离线版本需要你自我搭建环境自我安装(推荐使用Ubuntu进行安装),至于安装方法可以自我Baidu,非常多,这里就不再介绍了。本小节,我...原创 2018-06-21 11:18:16 · 1672 阅读 · 0 评论 -
Solidity语言学习笔记————13、固定大小字节数组
构建固定大小字节数组Solidity中固定大小的字节数组可以通过关键字“byte”来实现。例如:可以使用bytes1,bytes2,....bytes32来声明某一个数组具有多少字节的存储空间。需要注意的是我们经常看到的“byte”就是“bytes1”。实例如下:pragma solidity ^0.4.0;contract test{ //数据用十六进制表示为: 0x6a6675...原创 2018-06-21 13:19:55 · 407 阅读 · 0 评论 -
Solidity语言学习笔记————14、动态字节数组
构建大小可变的动态数组数组的大小即可以有固定的,也可以实现动态改变。在不同的场景使用不同的类型才是最正确的选择。其实我们经常见到的String类型的数据就可以认为是一个动态数组,其大小可变。...原创 2018-06-21 16:42:11 · 813 阅读 · 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 · 788 阅读 · 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 · 1024 阅读 · 0 评论 -
Solidity语言学习笔记————16、映射Mapping
solidity里的映射可以理解为python里的字典,建立键-值的对应关系,可以通过键来查找值,键必须是唯一的,但值可以重复。定义方式为:mapping(键类型=>值类型),例如mapping(address=>uint) public balances,这个映射的名字是balances,权限类型为public,键的类型是地址address,值的类型是整型uint,在solidi...转载 2018-06-21 17:12:00 · 1676 阅读 · 0 评论 -
Solidity语言学习笔记————18、字符串和函数
字符串:需要使用双引号“”或者单引号’’括起来,例如:定义一个字符串变量:string name=“jake”;string字符串不能通过length方法获得长度十六进制数据:以关键字hex打头,后面紧跟用单或双引号包裹的字符串。如hex"001122ff"。通过下面的例子来理解下是什么意思:contract HexLiteral{ function test() returns (st...转载 2018-06-21 17:17:06 · 559 阅读 · 0 评论 -
Solidity语言学习笔记————21、函数的访问权限和可见性
在之前的文章中我们介绍了Solidity语言函数的一些基本语法。下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及Solidity提供的对函数调用时的可见性控制语法。调用方式Solidity封装了两种函数的调用方式internal和external。internalinternal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境...转载 2018-06-21 17:26:46 · 542 阅读 · 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 · 759 阅读 · 0 评论 -
Solidity语言学习笔记————4、常量
常量(Constant State Variables)状态变量可以被定义为constant。这样的话,它必须在编译期间通过一个表达式赋值。 这种情况下,以下功能的表达式不被允许:访问storage访问区块链数据,如now,this.balance,block.number访问合约执行的中间数据,如msg.gas向外部合约发起调用。可能会造成内存分配副作用表达式是允许的,但对其它内存对象的产生副作...转载 2018-06-22 08:55:50 · 344 阅读 · 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 · 279 阅读 · 0 评论 -
Solidity语言学习笔记————11、隐式转换和显式转换
隐式转换(Implicit Conversions)如果将一个运算符应用于多个不同类型,编译器会试图隐式地把其中一个操作数的类型转换为另一个操作数的类型。赋值操作在同样的情况下也会这样。一般来说,如果转换后不会造成信息会丢失,会自动进行隐式转换:unt8可转换成uint16, int128, int256int8不能转换成uint256,因为uint256放不下负数无符号整数可以转换成相同或更大的...转载 2018-06-22 08:58:38 · 682 阅读 · 0 评论 -
Solidity语言学习笔记————9、左值运算符
左值运算符(Operators Involving LValues)如果a是一个左值(LValues),即一个可以赋值给它的变量,可以使用以下的运算符:a += e相当于 a = a + e。 运算符- =,* =,/ =,% =,| =,& =和^ = 都有类似的定义。a++和a--相当于a+ = 1 /a - = 1,--a和++a对a有与上一条相同的效果,但是等值发生改变后才返回运算...转载 2018-06-22 08:57:06 · 464 阅读 · 0 评论 -
Solidity语言学习笔记————7、单位和全局变量
货币单位(Ether Units)wei,finney,szabo或ether可以在Solidity中作为货币单位并可以进行相互转换。没有单位的数字默认是Wei。单位之间的转化规则如下:1 ether == 10^3 finney1 ether == 10^6 szabo1 ether == 10^18 wei例如,表达式2 ether == 2000 finney返回值为true时间单位(Tim...转载 2018-06-22 08:56:14 · 693 阅读 · 0 评论 -
Solidity语言学习笔记————24、输入输出参数
输入参数和输出参数(Input Parameters and Output Parameters)与JavaScript一样,函数可以将多个参数作为输入,但与Javascript和C不同的是,Solidity的函数可以返回任意数量的参数作为输出。输入参数(Input Parameters)输入参数的声明方式与变量相同。不过有一个不同之处:输入参数中未使用的参数可以省略变量名。例如,假设我们希望我们...翻译 2018-07-02 16:31:30 · 621 阅读 · 0 评论 -
Solidity语言学习笔记————32、创建合约
Solidity的合约类似于面向对象语言中的类。它们包含存放持久化数据的状态变量和可修改这些变量的函数。调用不同的合约实例上的函数将执行EVM函数调用,从而切换上下文,使得状态变量不可访问。创建合约(Creating Contracts)合约可以从“外部”创建,也可以由Solidity合约创立。像Remix这类IDE,可以用UI界面使创建过程无缝连接。最好在Ethereum上以编程方式通过Web3...翻译 2018-07-03 22:05:31 · 370 阅读 · 0 评论 -
Solidity语言学习笔记————25、作用域和声明
作用域和声明(Scoping and Declarations)已声明的变量将具有其字节表示为全0的初始值。变量的初始值是任何类型的典型“零状态”(“zero-state)。例如,bool的初始值为false。uint或int类型的默认值为0。对于静态大小的数组和bytes1到bytes32,每个单独的元素将被初始化为对应于其类型的初始值。对于动态大小的数组、bytes和string,初始值是空数...翻译 2018-07-02 16:31:36 · 349 阅读 · 0 评论 -
Solidity语言学习笔记————26、Assert, Require, Revert 和 Exceptions
Assert, Require, Revert 和 ExceptionsSolidity使用state-reverting异常来处理错误。 这种异常将回滚当前调用(及其所有子调用)状态的所有变化,并将错误标志给调用者。 函数assert和require可以用于检查条件,如果条件不满足则抛出异常。 assert函数只能用于测试内部错误,并检查不变量。 应该使用require函数来确认input或合约...翻译 2018-07-02 16:32:57 · 479 阅读 · 0 评论 -
Solidity语言学习笔记————22、可见性和Getters
可见性和Getters(Visibility and Getters)Solidity可以理解两种函数调用:“内部调用”,不创建一个真实的EVM调用,也称为“消息调用”“外部调用”,要创建一个真实的EVM调用,有四种的函数和状态变量的可见性:函数可以被定义为external, public, internal 或 private,默认是 public。状态变量不能为 external,默认是 in...翻译 2018-07-02 16:31:14 · 279 阅读 · 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 · 395 阅读 · 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 · 301 阅读 · 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 · 306 阅读 · 0 评论 -
Solidity语言学习笔记————26、回退函数
回退函数(Fallback Function)一个合约可以有一个匿名函数。此函数不能有参数,不能返回任何值。如果没有其他函数与给定的函数标识符匹配,或者如果根本没有提供数据,将执行一个合约的调用。此外,每当合同接收没有数据的纯Ether时,会执行回退函数。此外,为了接收Ether,回退函数必须标记为payable。如果没有这样的函数,合约不能通过常规transactions接收Ether。在这种情...翻译 2018-07-02 16:32:47 · 534 阅读 · 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 · 326 阅读 · 0 评论 -
Solidity语言学习笔记————33、事件(Events)
事件(Events)事件是使用EVM日志内置功能的方便工具,在dapp的接口中,它可以反过来调用Javascript的监听事件的回调。事件在合约中可被继承。当被调用时,会使参数存储到交易的日志中——一种区块链上的特殊数据结构。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在。日志和事件在合约内不可直接被访问,即使是创建日志的合约。日志的简单支付验证(SPV)是可能的,如果一个...翻译 2018-07-08 00:08:13 · 583 阅读 · 0 评论 -
Solidity语言学习笔记————34、继承
继承Solidity通过复制包括多态性的代码来支持多重继承。 除非合约是显式给出的,所有的函数调用都是虚拟的,绝大多数派生函数可被调用。 当一个合约继承自多个合约时,只会在区块链上创建单个合约,并将所有父合约中的代码复制到创建的合约中。 Solidity的继承与Python非常相似,特别是多继承。 以下是个例子:pragma solidity ^0.4.16;contract owned {...翻译 2018-07-03 22:05:36 · 314 阅读 · 0 评论 -
Solidity语言学习笔记————35、抽象合约和接口
抽象合约(Abstract Contracts)合约函数可以缺少实现(请注意,函数声明头被;终止),见下面的例子:pragma solidity ^0.4.0;contract Feline { function utterance() public returns (bytes32);}这样的合约不能被编译(即使它们同时包含具体函数和抽象函数),但它们可以用作父合约:pragma ...翻译 2018-07-08 00:08:19 · 433 阅读 · 0 评论 -
Solidity语言学习笔记————36、 库
库(Libraries)库与合约类似,但它的目的是在一个指定的地址,且仅部署一次,然后通过EVM的特性DELEGATECALL(Homestead之前是用CALLCODE)来复用代码。这意味着库函数调用时,它的代码是在调用合约的上下文中执行。使用this将会指向到调用合约,而且可以访问调用合约的storage。因为一个合约是一个独立的代码块,它仅可以访问调用合约明确提供的状态变量,否则除此之外,没...翻译 2018-07-08 00:08:28 · 257 阅读 · 0 评论 -
Solidity语言学习笔记————37、Using for
指令using A for B;用来附着库里定义的函数(从库A)到任意类型B。这些函数将会默认接收调用函数对象的实例作为第一个参数。语法类似,python中的self变量一样。using A for *的效果是,库A中的函数被附着在做任意的类型上。在这两种情形中,所有函数,即使那些第一个参数的类型与调用函数的对象类型不匹配的,也被附着上了。类型检查是在函数被真正调用时,函数重载检查也会执行。usi...翻译 2018-07-08 00:08:33 · 383 阅读 · 0 评论 -
Solidity语言学习笔记————39、独立汇编
独立汇编(Standalone Assembly)上面介绍的在Solidity中嵌入的内联汇编语言也可以单独使用。实际上,它是被计划用来作为编译器的一种中间语言。在这个目的下,它尝试达到下述的目标:使用它编写的代码要可读,即使代码是从Solidity编译得到的。从汇编语言转为字节码应该尽可能的少坑。控制流应该容易检测来帮助进行形式验证与优化。为了达到第一条和最后一条的目标,Solidity汇编语言...翻译 2018-07-08 00:08:49 · 292 阅读 · 0 评论 -
Solidity语言学习笔记————40、存储中状态变量的布局
存储中状态变量的布局(Layout of State Variables in Storage)静态尺寸大小的变量(除了映射和动态尺寸大小的数组类型(的其他类型变量))在存储中,是从位置0连续存储。如果可能的话,不足32个字节的多个条目被紧凑排列在一个单一的存储块,参见以下规则:在存储块中的第一项是存储低阶对齐的。基本类型只使用了正好存储它们的字节数。如果一个基本类型不适合存储块的剩余部分,则移动...翻译 2018-07-08 00:08:54 · 352 阅读 · 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 · 441 阅读 · 0 评论 -
Solidity语言学习笔记————17、源文件映射
源文件映射(Source Mappings)作为AST输出的一部分,编译器会提供AST某个节点以应的源代码的范围。这可以被用来做基于AST的静态代码错误分析,可以高亮本地变量,和他们对应使用的调试工具。此外,编译器也可以生成字节码到生成指令源代码的范围映射。这对静态分析工具来说非常重要,它们在字节码级别分析,可以来在调试工具内显示对应代码位置,或支持断点操作。这两种源映射都使用整数标识符来引用源文...转载 2018-06-22 08:59:10 · 272 阅读 · 0 评论 -
Solidity语言学习笔记————42、提示和技巧
提示和技巧在数组中使用delete,就是删除数组中的所有元素。使用较短的类型和结构元素,短类型分组在一起进行排序。SSTORE操作可能合并成一个单一的SSTORE,这可以降低gas的成本(sstore消耗5000或20000 gas,所以这是你必须优化的原因)。使用天gas的价格估算功能(优化器 enable)进行检查!让你的状态变量为public-编译器会自动创建 getters 。如果你结束了...翻译 2018-07-08 00:09:04 · 388 阅读 · 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 · 483 阅读 · 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 · 1277 阅读 · 0 评论