区块链
Ethereum 标签描述

这一讲,我们介绍solidity三种抛出异常的方法:error,require和assert,并比较三种方法的gas消耗。 异常 写智能合约经常会出bug,solidity中的异常命令帮助我们debug。 Error error是solidity0.8.4版本新加的内容,方便且高效(省gas)地向用户解释操作失败的原因,同时还可以在抛出异常的同时携带参数,帮助开发者更好地调试。人们可以在contract之外定义异常。下面,我们定义一个TransferNotOwner异常,当用户不是代币owner的时候尝试转账,会抛出错误: errorTransferNotOwner();//自定义err...

汇编相关知识介绍 什么是汇编? 任何以高级语言(例如C,Go或Java)编写的程序,在执行之前都将先编译为“汇编语言”。但是什么是汇编? 汇编(也称为汇编语言)是指可使用​​汇编器​​转换为机器代码的低级编程语言。汇编语言与物理机或虚拟机绑定,因为它们实现了指令集。一条指令告诉CPU执行一些基本任务,例如将两个数字相加。 这里示例的处理器是​​Intelx86​​或ARM。英特尔x86大约有​​1503​​条机器指令。它们是通常称为操作码。 理解虚拟机和栈 ETH虚拟机EVM有自己的指令集,该指令集中目前包含了144个操作码,详情参考​​Geth代码​​ 这些指令被Solidity语言&nbs...

这一讲,我们介绍solidity中的继承(inheritance),包括简单继承,多重继承,以及修饰器(modifier)和构造函数(constructor)的继承。 继承 继承是面向对象编程很重要的组成部分,可以显著减少重复代码。如果把合约看作是对象的话,solidity也是面向对象的编程,也支持继承。 规则 virtual:父合约中的函数,如果希望子合约重写,需要加上virtual关键字。 override:子合约重写了父合约中的函数,需要加上override关键字。 注意:用override修饰public变量,会重写与变量同名的getter函数,例如: mapping(add...

这一讲,我们将用合约权限控制(Ownable)的例子介绍solidity语言中构造函数(constructor)和独有的修饰器(modifier)。 构造函数 构造函数(constructor)是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数,例如初始化合约的owner地址: addressowner;//定义owner变量//构造函数constructor(){owner=msg.sender;//在部署合约的时候,将owner设置为部署者的地址} 注意⚠️:构造函数在不同的solidity版本中的语法并不一致,在Soli...

这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量)。状态变量声明这个两个关键字之后,不能在合约后更改数值;并且还可以节省gas。另外,只有数值变量可以声明constant和immutable;string和bytes可以声明为constant,但不能为immutable。 constant和immutable constant constant变量必须在声明的时候初始化,之后再也不能改变。尝试改变的话,编译不通过。 //constant变量必须在声明的时候初始化,之后不能改变uint256constantCONSTANT_NUM=10;s...

这一讲,我们用转账ERC20代币为例来介绍solidity中的事件(event)。 事件 Solidity中的事件(event)是EVM上日志的抽象,它具有两个特点: 响应:应用程序(​​ethers.js​​)可以通过RPC接口订阅和监听这些事件,并在前端做响应。 经济:事件是EVM上比较经济的存储数据的方式,每个大概消耗2,000gas;相比之下,链上存储一个新变量至少需要20,000gas。 声明事件 事件的声明由event关键字开头,接着是事件名称,括号里面写好事件需要记录的变量类型和变量名。以ERC20代币合约的Transfer事件为例: eventTransfer(add...

在区块链中,每一笔智能合约的运行,都要根据复杂度消耗一笔GAS费;如果你要将值写入存储,则需要花费很多。如果你只是使用堆栈,它的成本会低一些;智能合约solidity语言的编写,不仅要考虑安全,也要考虑语言的优化,在Ethereum上的交易gas是有上限的,特别是针对一些复杂业务的处理,有可能会导致gas超高,严重者导致此笔交易失败。 0、Struct结构    如果一个struct中有多个uint,则尽可能使用较小的uint,solidity会将这些uint打包在一起,从而占用较小的存储空间 1、选择变量数据类型    &nbsp...

  6WDFuiiGwNIX   2023年11月02日   55   0   0 SolidityEthereumGas智能合约web3

变量初始值 在solidity中,声明但没赋值的变量都有它的初始值或默认值。这一讲,我们将介绍常用变量的初始值。 值类型初始值 boolean:false string:"" int:0 uint:0 enum:枚举中的第一个元素 address:0x0000000000000000000000000000000000000000(或address(0)) function internal:空白方程 external:空白方程 可以用public变量的getter函数验证上面写的初始值是否正确: boolpublic_bool;//falsestringpublic_strin...

调用已部署合约 开发者写智能合约来调用其他合约,这让Ethereum网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yieldfarming)。这一讲,我们介绍如何在已知合约代码(或接口)和地址情况下调用目标合约的函数。 目标合约 我们先写一个简单的合约OtherContract来调用。 contractOtherContract{uint256private_x=0;//状态变量_x//收到eth的事件,记录amount和gaseventLog(uintamount,uintgas);//返回合约ETH余额functiongetBalance...

这一讲,我们将介绍solidity中的哈希表:映射(Mapping)类型。 映射Mapping 在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。 声明映射的格式为mapping(_KeyType=>_ValueType),其中_KeyType和_ValueType分别是Key和Value的变量类型。例子: mapping(uint=>address)publicidToAddress;//id映射到地址mapping(address=>address)publicswapPair;//币对的映射,地址到地址 ...

Solidity中的引用类型 引用类型(ReferenceType):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。 数据位置 solidity数据存储位置有三类:storage,memory和calldata。不同存储位置的gas成本不同。storage类型的数据存在链上,类似计算机的硬盘,消耗gas多;memory和calldata类型的临时存在内存里,消耗gas少。大致用法: storage:合约里的状态变量默认都是storage,存...

Solidity支持两种特殊的回调函数,receive()和fallback(),他们主要在两种情况下被使用: 接收ETH 处理合约中不存在的函数调用(代理合约proxycontract) 注意⚠️:在solidity0.6.x版本之前,语法上只有fallback()函数,用来接收用户发送的ETH时调用以及在被调用函数签名没有匹配到时,来调用。0.6版本之后,solidity才将fallback()函数拆分成receive()和fallback()两个函数。 我们这一讲主要讲接收ETH的情况。 接收ETH函数receive receive()只用于处理接收ETH。一个合约最多有一个rece...

这一讲,我们将介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。 数组array 数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种: 固定长度数组:在声明时指定数组的长度。用T[k]的格式声明,其中T是元素的类型,k是长度,例如: //固定长度Arrayuint[8]array1;bytes1[5]array2;address[100]array3; 可变长度数组(动态数组):在声明时不指定数组的长度。用T[]的格式声明,其中T是元素的类型,例如: ...

Solidity中的函数 solidity官方文档里把函数归到数值类型,但我觉得差别很大,所以单独分一类。我们先看一下solidity中函数的形式: function<functionname>(<parametertypes>){internal|external|public|private}[pure|view|payable][returns(<returntypes>)] 看着些复杂,咱们从前往后一个一个看(方括号中的是可写可不写的关键字): function:声明函数时的固定用法,想写函数,就要以function关键字开头。 &lt...

solidity支持利用import关键字导入其他源代码中的合约,让开发更加模块化。 import用法 通过源文件相对位置导入,例子: 文件结构├──Import.sol└──Yeye.sol//通过文件相对位置importimport'./Yeye.sol'; 通过源文件网址导入网上的合约,例子: //通过网址引用import'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol'; 通过npm的目录导入,例子: i...

这一讲,我们将介绍Solidity函数输出,包括:返回多种变量,命名式返回,以及利用解构式赋值读取全部和部分返回值。 返回值return和returns Solidity有两个关键字与函数输出相关:return和returns,他们的区别在于: returns加在函数名后面,用于声明返回的变量类型及变量名; return用于函数主体中,返回指定的变量。 //返回多个变量functionreturnMultiple()publicpurereturns(uint256,bool,uint256[3]memory){return(1,true,[uint256(1),2,5]);} ...

Solidity简述 Solidity是Ethereum虚拟机(EVM)智能合约的语言。同时,我认为solidity是玩链上项目必备的技能:区块链项目大部分是开源的,如果你能读懂代码,就可以规避很多亏钱项目。 Solidity具有两个特点: 基于对象:学会之后,能帮你挣钱找对象。 高级:不会solidity,在圈内显得很low。 开发工具:remix 本教程中,我会用remix来跑solidity合约。remix是Ethereum官方推荐的智能合约开发IDE(集成开发环境),适合新手,可以在浏览器中快速部署测试智能合约,你不需要在本地安装任何程序。 网址:​​remix.ethereum....

Solidity中的变量类型 数值类型(ValueType):包括布尔型,整数型等等,这类变量赋值时候直接传递数值。 引用类型(ReferenceType):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。 映射类型(MappingType):Solidity里的哈希表。 函数类型(FunctionType):Solidity文档里把函数归到数值类型,但我觉得他跟其他类型差别很大,所以单独分一类。 我们只介绍一些常用的类型,不常用的不讲。这篇介绍数值类型,第3讲介绍函数类型,第4讲介绍引用和映射。 数值类型 1.布尔型 布尔型是二值变量,取值为true或false。 ...

这一讲,我们将介绍solidity中的控制流,然后讲如何用solidity实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出bug的程序。 控制流 Solidity的控制流与其他语言类似,主要包含以下几种: if-else functionifElseTest(uint256_number)publicpurereturns(bool){if(_number0){return(true);}else{return(false);}} for循环 functionforLoopTest()publicpurereturns(uint256){...

这一讲,我们用ERC721的引用的库合约String为例介绍solidity中的库合约(library),并总结了常用的库函数。 库函数 库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而存在。库合约一般都是一些好用的函数合集(库函数),由大神或者项目方创作,咱们站在巨人的肩膀上,会用就行了。 他和普通合约主要有以下几点不同: 不能存在状态变量 不能够继承或被继承 不能接收以太币 不可以被销毁 String库合约 String库合约是将uint256类型转换为相应的string类型的代码库,样例代码如下: libraryStrings{bytes16priv...

  6WDFuiiGwNIX   2023年11月02日   110   0   0 SolidityEthereum区块链智能合约web3