try-catch是现代编程语言几乎都有的处理异常的一种标准方式,solidity0.6版本也添加了它。这一讲,我们将介绍如何利用try-catch处理智能合约中的异常。try-catch在solidity中,try-catch只能被用于external函数或创建合约时constructor(被视为external函数)的调用。基本语法如下:try externalContract.f() {
哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在solidity的应用Hash的性质一个好的哈希函数应该具有以下几个特性:单向性:从输入的消息到它的哈希的正向运算简单且唯一确定,而反过来非常难,只能靠暴力枚举。灵敏性:输入的消息改变一点对它的哈希改变很大。高效性:从输入的消息到哈
ABI (Application Binary Interface,应用二进制接口)是与Ethereum智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。Solidity中,ABI编码有4个函数:abi.encode, abi.encodePacked, soli, abi.encodeWithSelector。而ABI解码
在Ethereum链上,用户(外部账户,EOA)可以创建智能合约,智能合约同样也可以创建新的智能合约。去中心化交易所uniswap就是利用工厂合约(Factory)创建了无数个币对合约(Pair)。这一讲,我会用简化版的uniswap讲如何通过合约创建合约。create和create2有两种方法可以在合约中创建新合约,create和create2,这里我们讲create,下一讲会介绍create2
delegatecalldelegatecall与call类似,是solidity中地址类型的低级成员函数。delegate中是委托/代表的意思,那么delegatecall委托了什么?当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境(Context,可以理解为包含变量和状态的环境)也是合约C的:msg.sender是B的地址,并且如果函数改变一些状态变量,产生的效果会
我们曾在第20讲:发送ETH那一讲介绍过利用call来发送ETH,这一讲我们将介绍如何利用它调用合约。Callcall 是address类型的低级成员函数,它用来与其他合约交互。它的返回值为(bool, data),分别对应call是否成功以及目标函数的返回值。call是solidity官方推荐的通过触发fallback或receive函数发送ETH的方法。不推荐用call来调用另一个合约,因为当
调用已部署合约开发者写智能合约来调用其他合约,这让Ethereum网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yield farming)。这一讲,我们介绍如何在已知合约代码(或接口)和地址情况下调用目标合约的函数。目标合约我们先写一个简单的合约OtherContract来调用。contract OtherContract { uint256 pr
Solidity支持两种特殊的回调函数,receive()和fallback(),他们主要在两种情况下被使用:接收ETH处理合约中不存在的函数调用(代理合约proxy contract)注意⚠️:在solidity 0.6.x版本之前,语法上只有 fallback() 函数,用来接收用户发送的ETH时调用以及在被调用函数签名没有匹配到时,来调用。 0.6版本之后,solidity才将 fallba
solidity支持利用import关键字导入其他源代码中的合约,让开发更加模块化。import用法通过源文件相对位置导入,例子:文件结构├── Import.sol└── Yeye.sol// 通过文件相对位置importimport './Yeye.sol';通过源文件网址导入网上的合约,例子:// 通过网址引用import 'https://github.com/OpenZeppelin/o
这一讲,我们用ERC721的引用的库合约String为例介绍solidity中的库合约(library),并总结了常用的库函数。库函数库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而存在。库合约一般都是一些好用的函数合集(库函数),由大神或者项目方创作,咱们站在巨人的肩膀上,会用就行了。他和普通合约主要有以下几点不同:不能存在状态变量不能够继承或被继承不能接收以太币不可以
重载solidity中允许函数进行重载(overloading),即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。注意,solidity不允许修饰器(modifier)重载。函数重载举个例子,我们可以定义两个都叫saySomething()的函数,一个没有任何参数,输出"Nothing";另一个接收一个string参数,输出这个
这一讲,我们介绍solidity三种抛出异常的方法:error,require和assert,并比较三种方法的gas消耗。异常写智能合约经常会出bug,solidity中的异常命令帮助我们debug。Errorerror是solidity 0.8.4版本新加的内容,方便且高效(省gas)地向用户解释操作失败的原因,同时还可以在抛出异常的同时携带参数,帮助开发者更好地调试。人们可以在contract
这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor)的继承。继承继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的编程,也支持继承。规则virtual: 父合约中的函数,如果希望子合约重写,需要加上virtual关键字。overr
这一讲,我们将用合约权限控制(Ownable)的例子介绍solidity语言中构造函数(constructor)和独有的修饰器(modifier)。构造函数构造函数(constructor)是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数,例如初始化合约的owner地址:address owner; // 定义owner变量// 构造函数con
这一讲,我们将介绍solidity中的控制流,然后讲如何用solidity实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出bug的程序。控制流Solidity的控制流与其他语言类似,主要包含以下几种:if-elsefunction ifElseTest(uint256 _number) public pure returns(bool){ if(_number ==
这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量)。状态变量声明这个两个关键字之后,不能在合约后更改数值;并且还可以节省gas。另外,只有数值变量可以声明constant和immutable;string和bytes可以声明为constant,但不能为immutable。constant和immutableconstantconstant变量必须在
变量初始值在solidity中,声明但没赋值的变量都有它的初始值或默认值。这一讲,我们将介绍常用变量的初始值。值类型初始值boolean: falsestring: ""int: 0uint: 0enum: 枚举中的第一个元素address: 0x0000000000000000000000000000000000000000 (或 address(0))functioninternal: 空白方
这一讲,我们将介绍solidity中的哈希表:映射(Mapping)类型。映射Mapping在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。声明映射的格式为mapping(_KeyType => _ValueType),其中_KeyType和_ValueType分别是Key和Value的变量类型。例子:mapping(uint =&g
这一讲,我们将介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。数组 array数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种:固定长度数组:在声明时指定数组的长度。用T[k]的格式声明,其中T是元素的类型,k是长度,例如:// 固定长度 Arrayuint[8] arra
Solidity中的引用类型引用类型(Reference Type):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。数据位置solidity数据存储位置有三类:storage,memory和calldata。不同存储位置的gas成本不同。stor
这一讲,我们将介绍Solidity函数输出,包括:返回多种变量,命名式返回,以及利用解构式赋值读取全部和部分返回值。返回值 return和returnsSolidity有两个关键字与函数输出相关:return和returns,他们的区别在于:returns加在函数名后面,用于声明返回的变量类型及变量名;return用于函数主体中,返回指定的变量。// 返回多个变量function returnMu
Solidity中的函数solidity官方文档里把函数归到数值类型,但我觉得差别很大,所以单独分一类。我们先看一下solidity中函数的形式:function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<re
Solidity中的变量类型数值类型(Value Type):包括布尔型,整数型等等,这类变量赋值时候直接传递数值。引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。映射类型(Mapping Type): Solidity里的哈希表。函数类型(Function Type):Solidity文档里把函数归到数值类型,但我觉得他跟其他类型差
Solidity简述Solidity是Ethereum虚拟机(EVM)智能合约的语言。同时,我认为solidity是玩链上项目必备的技能:区块链项目大部分是开源的,如果你能读懂代码,就可以规避很多亏钱项目。Solidity具有两个特点:基于对象:学会之后,能帮你挣钱找对象。高级:不会solidity,在圈内显得很low。开发工具:remix本教程中,我会用remix来跑solidity合约。rem
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号