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

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

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

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

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

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

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

这一讲,我们用ERC721的接口合约为例介绍solidity中的抽象合约(abstract)和接口(interface),帮助大家更好的理解ERC721标准。 抽象合约 如果一个智能合约里至少有一个未实现的函数,即某个函数缺少主体{}中的内容,则必须将该合约标为abstract,不然编译会报错;另外,未实现的函数需要加virtual,以便子合约重写。拿我们之前的第十讲:插入排序合约为例,如果我们还没想好具体怎么实现插入排序函数,那么可以把合约标为abstract,之后让别人补写上。 abstractcontractInsertionSort{functioninsertionSort(...

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

重载 ​​solidity​​中允许函数进行重载(​​overloading​​),即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。注意,​​solidity​​不允许修饰器(​​modifier​​)重载。 函数重载 举个例子,我们可以定义两个都叫saySomething()的函数,一个没有任何参数,输出"​​Nothing​​";另一个接收一个​​string​​参数,输出这个​​string​​。 functionsaySomething()publicpurereturns(stringmemory){return("Nothing");}functions...

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

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

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

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

我们曾在第20讲:发送ETH那一讲介绍过利用call来发送ETH,这一讲我们将介绍如何利用它调用合约。 Call call是address类型的低级成员函数,它用来与其他合约交互。它的返回值为(bool,data),分别对应call是否成功以及目标函数的返回值。 call是solidity官方推荐的通过触发fallback或receive函数发送ETH的方法。 不推荐用call来调用另一个合约,因为当你调用不安全合约的函数时,你就把主动权交给了它。推荐的方法仍是声明合约变量后调用函数,见第21讲:调用其他合约 当我们不知道对方合约的源代码或ABI,就没法生成合约变量;这时,我们仍可以通过ca...

delegatecall delegatecall与call类似,是solidity中地址类型的低级成员函数。delegate中是委托/代表的意思,那么delegatecall委托了什么? 当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境(Context,可以理解为包含变量和状态的环境)也是合约C的:​​msg.sender​​是B的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约C的变量上。 而当用户A通过合约B来delegatecall合约C的时候,执行的是合约C的函数,但是语境仍是合约B的:msg.sender是A的地址,并且如果函数改变一些状态变量,产生...

在Ethereum链上,用户(外部账户,EOA)可以创建智能合约,智能合约同样也可以创建新的智能合约。去中心化交易所uniswap就是利用工厂合约(Factory)创建了无数个币对合约(Pair)。这一讲,我会用简化版的uniswap讲如何通过合约创建合约。 create和create2 有两种方法可以在合约中创建新合约,create和create2,这里我们讲create,下一讲会介绍create2。 create的用法很简单,就是new一个合约,并传入新合约构造函数所需的参数: Contractx=newContract{value:_value}(params) 其中Cont...

ABI(ApplicationBinaryInterface,应用二进制接口)是与Ethereum智能合约交互的标准。数据基于他们的类型编码;并且由于编码后不包含类型信息,解码时需要注明它们的类型。 Solidity中,ABI编码有4个函数:​​abi.encode​​,​​abi.encodePacked​​,soli,​​abi.encodeWithSelector​​。而ABI解码有1个函数:​​abi.decode​​,用于解码abi.encode的数据。这一讲,我们将学习如何使用这些函数。 ABI编码 我们将用编码4个变量,他们的类型分别是uint256,address,string...

哈希函数(hashfunction)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在solidity的应用 Hash的性质 一个好的哈希函数应该具有以下几个特性: 单向性:从输入的消息到它的哈希的正向运算简单且唯一确定,而反过来非常难,只能靠暴力枚举。 灵敏性:输入的消息改变一点对它的哈希改变很大。 高效性:从输入的消息到哈希的运算高效。 均一性:每个哈希值被取到的概率应该基本相等。 抗碰撞性: 弱抗碰撞性:给定一个消息x,找到另一个消息x'使得hash(x)=hash(x')是困难的。 强抗碰撞性:找到任...

  6WDFuiiGwNIX   2023年11月02日   41   0   0 Ethereum区块链智能合约web3solidit

selector 当我们调用智能合约时,本质上是向目标合约发送了一段calldata,在remix中发送一次交易后,可以在详细信息中看见input即为此次交易的calldata 发送的calldata中前4个字节是selector(函数选择器)。这一讲,我们将介绍selector是什么,以及如何使用。 msg.data msg.data是solidity中的一个全局变量,值为完整的calldata(调用函数时传入的数据)。 在下面的代码中,我们可以通过Log事件来输出调用mint函数的calldata: //event返回msg.dataeventLog(bytesdata);func...

关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~