Solidity极简入门
文章平均质量分 75
在区块链世界中,智能合约是不可缺少的一部分,而
作为一种真正意义上运行在去中心化网络上的合约,Solidity在智能合约的编写中占据了非常大的份额,学习solidity属于入门区块链的必须项。
今天我整理了solidity的最强攻略,希望能带大家以最快的速度学习掌握solidity。
sleep-go
专注于web3领域的技术研究
展开
-
Solidity极简入门: 1. HelloWeb3 (三行代码)
这一讲,我们简单介绍了solidity,remix工具,并完成了第一个solidity程序--HelloWeb3。下面我们将继续solidity旅程!原创 2023-01-30 12:10:32 · 304 阅读 · 0 评论 -
Solidity极简入门#2. 数值类型
Solidity中的变量类型数值类型(Value Type):包括布尔型,整数型等等,这类变量赋值时候直接传递数值。引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似指针)。映射类型(Mapping Type): Solidity里的哈希表。函数类型(Function ...原创 2023-01-30 16:35:59 · 267 阅读 · 0 评论 -
Solidity极简入门#3. 函数类型
我刚开始学solidity的时候,一直不理解pure跟view关键字,因为别的语言没有类似的关键字。solidity加入这两个关键字,我认为是因为gas fee。合约的状态变量存储在链上,gas fee很贵,如果不改变链上状态,就不用付gas。包含pure跟view关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的(合约中非pure/view函数调用它们则会改写链上状态,需要付gas)。在以太坊中,以下语句被视为修改链上状态:写入状态变量。释放事件。创建其他合约。原创 2023-02-03 19:05:36 · 377 阅读 · 0 评论 -
Solidity极简入门#4. 函数输出
这一讲,我们将介绍Solidity函数输出,包括:返回多种变量,命名式返回,以及利用解构式赋值读取全部和部分返回值。返回值 return和returnsSolidity有两个关键字与函数输出相关:return和returns,他们的区别在于:returns加在函数名后面,用于声明返回的变量类型及变量名;return用于函数...原创 2023-01-30 17:10:39 · 233 阅读 · 0 评论 -
Solidity极简入门#5. 变量数据存储和作用域
Solidity中的引用类型引用类型(Reference Type):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。数据位置solidity数据存储位置有三类:stora...原创 2023-01-31 09:26:35 · 358 阅读 · 0 评论 -
Solidity极简入门#6. 引用类型
这一讲,我们将介绍solidity中的两个重要变量类型:数组(array)和结构体(struct)。数组 array数组(Array)是solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种:固定长度数组:在声明时指定数组的长度。用T[k]的格式声明,其中T是元...原创 2023-01-31 09:31:23 · 295 阅读 · 0 评论 -
Solidity极简入门#7. 映射类型
这一讲,我们将介绍solidity中的哈希表:映射(Mapping)类型。映射Mapping在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。声明映射的格式为mapping(_KeyType => _ValueType),其中_KeyType和_ValueTyp...原创 2023-02-01 16:53:54 · 378 阅读 · 0 评论 -
Solidity极简入门#8. 变量初始值
变量初始值在solidity中,声明但没赋值的变量都有它的初始值或默认值。这一讲,我们将介绍常用变量的初始值。值类型初始值boolean: falsestring: ""int: 0uint: 0enum: 枚举中的第一个元素address: 0x00000000000000000000000000000000000000...原创 2023-02-01 16:54:49 · 195 阅读 · 0 评论 -
Solidity极简入门#9. 常数
这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量)。并且还可以节省gas。你可以使用全局变量例如address(this),block.number ,或者自定义的函数给immutable变量初始化。这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量),让不应该变的变量保持不变。constant变量必须在声明的时候初始化,之后再也不能改变。immutable变量可以在声明时或构造函数中初始化,因此更加灵活。原创 2023-02-03 19:09:10 · 190 阅读 · 0 评论 -
Solidity极简入门#10. 控制流
这一讲,我们将介绍solidity中的控制流,然后讲如何用solidity实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出bug的程序。控制流Solidity的控制流与其他语言类似,主要包含以下几种:if-elsefunction ifElseTest(uint256 _number) pub...原创 2023-02-06 00:23:55 · 255 阅读 · 0 评论 -
Solidity极简入门#11. 构造函数和修饰器
这一讲,我们将用合约权限控制(Ownable)的例子介绍solidity语言中构造函数(constructor)和独有的修饰器(modifier)。构造函数构造函数(constructor)是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数,例如初始化合约的owner地址...原创 2023-02-09 21:53:21 · 592 阅读 · 0 评论 -
Solidity极简入门#12. 事件
这一讲,我们用转账ERC20代币为例来介绍solidity中的事件(event)。事件Solidity中的事件(event)是EVM上日志的抽象,它具有两个特点:响应:应用程序(ethers.js)可以通过RPC接口订阅和监听这些事件,并在前端做响应。经济:事件是EVM上比较经济的存储数据的方式,每个大概消耗2,0...原创 2023-02-10 01:36:55 · 341 阅读 · 0 评论 -
Solidity极简入门#13. 继承
这一讲,我们介绍了solidity继承的基本用法,包括简单继承,多重继承,修饰器和构造函数的继承、调用父合约中的函数,以及多重继承中的菱形继承问题。原创 2023-02-17 21:50:50 · 1797 阅读 · 0 评论 -
Solidity极简入门#14. 抽象合约和接口
这一讲,我介绍了solidity中的抽象合约(abstract)和接口(interface),他们都可以写模版并且减少代码冗余。我们还讲了ERC721接口合约IERC721,以及如何利用它与无聊猿BAYC合约进行交互。原创 2023-02-17 21:50:54 · 1026 阅读 · 0 评论 -
Solidity极简入门#15. 异常
这一讲,我们介绍solidity三种抛出异常的方法:error,require和assert,并比较了三种方法的gas消耗。结论:error既可以告知用户抛出异常的原因,又能省gas。原创 2023-02-17 21:53:33 · 320 阅读 · 0 评论 -
Solidity极简入门#16. 函数重载
重载solidity中允许函数进行重载(overloading),即名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数。注意,solidity不允许修饰器(modifier)重载。函数重载举个例子,我们可以定义两个都叫saySomething()的函数,一个没有任何参数,输出...原创 2023-02-15 01:25:35 · 336 阅读 · 0 评论 -
Solidity极简入门#17. 库合约
这一讲,我们用ERC721的引用的库合约String为例介绍solidity中的库合约(library),并总结了常用的库函数。库函数库函数是一种特殊的合约,为了提升solidity代码的复用性和减少gas而存在。库合约一般都是一些好用的函数合集(库函数),由大神或者项目方创作,咱们站在巨人的肩膀上,会用就行了。他和普通合...原创 2023-02-17 21:45:51 · 464 阅读 · 0 评论 -
Solidity极简入门#18. Import
这一讲,我们介绍了利用import关键字导入外部源代码的方法。通过import关键字,可以引用我们写的其他文件中的合约或者函数,也可以直接导入别人写好的代码,非常方便。solidity支持利用import关键字导入其他源代码中的合约,让开发更加模块化。原创 2023-02-19 01:17:35 · 488 阅读 · 0 评论 -
Solidity极简入门#19. 接收ETH
这一讲,我介绍了Solidity中的两种特殊函数,receive()和fallback(),他们主要在两种情况下被使用,他们主要用于处理接收ETH和代理合约proxy contract。原创 2023-02-24 01:15:04 · 519 阅读 · 0 评论 -
Solidity极简入门#20. 发送ETH
这一讲,我们介绍solidity三种发送ETH的方法:transfer,send和call。call没有gas限制,最为灵活,是最提倡的方法;transfer有2300 gas限制,但是发送失败会自动revert交易,是次优选择;send有2300 gas限制,而且发送失败不会自动revert交易,几乎没有人用它。原创 2023-02-22 17:07:57 · 632 阅读 · 0 评论 -
Solidity极简入门#21. 调用其他合约
调用已部署合约开发者写智能合约来调用其他合约,这让Ethereum网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yield farming)。这一讲,我们介绍如何在已知合约代码(或接口)和地址情况下调用目标合约的函数。目标合约我们先写一个简单的合约OtherContract来调...原创 2023-02-22 17:05:31 · 1144 阅读 · 0 评论 -
Solidity极简入门#22. Call
我们曾在第20讲:发送ETH那一讲介绍过利用call来发送ETH,这一讲我们将介绍如何利用它调用合约。Callcall 是address类型的低级成员函数,它用来与其他合约交互。它的返回值为(bool, data),分别对应call是否成功以及目标函数的返回值。call是solidity官方推荐的通过触发fallback或...原创 2023-02-24 01:09:22 · 347 阅读 · 0 评论 -
Solidity极简入门#23.代理合约Delegatecall
与上面的callSetVars函数相同,有两个参数_addr和_num,分别对应合约C的地址和setVars的参数。而当用户A通过合约B来delegatecall合约C的时候,执行的是合约C的函数,但是语境仍是合约B的:msg.sender是A的地址,并且如果函数改变一些状态变量,产生的效果会作用于合约B的变量上。执行的是VC的函数,但是改变的是富商的状态。当用户A通过合约B来call合约C的时候,执行的是合约C的函数,语境(Context,可以理解为包含变量和状态的环境)也是合约C的:。原创 2023-02-25 03:52:47 · 795 阅读 · 0 评论 -
Solidity极简入门#24. 在合约中创建新合约
在Ethereum链上,用户(外部账户,EOA)可以创建智能合约,智能合约同样也可以创建新的智能合约。这一讲,我会用简化版的uniswap讲如何通过合约创建合约。其中Contract是要创建的合约名,x是合约对象(地址),如果构造函数是payable,可以创建时转入_value数量的ETH,params是新合约构造函数的参数。下面我们用create方法实现一个极简版的Uniswap:Pair币对合约负责管理币对地址,PairFactory工厂合约用于创建新的币对,并管理币对地址。2.查看Pair合约变量。原创 2023-02-28 02:35:01 · 533 阅读 · 0 评论 -
Solidity极简入门#25. Create2创建合约
这一讲,我们介绍了CREATE2操作码的原理,使用方法,并用它完成了极简版的Uniswap并提前计算Pair合约地址。CREATE2让我们可以在部署合约前确定它的合约地址,这也是 一些layer2项目的基础。原创 2023-03-02 20:12:06 · 1374 阅读 · 3 评论 -
Solidity极简入门#26. 删除合约
selfdestruct是智能合约的紧急按钮,销毁合约并将剩余ETH转移到指定账户。当著名的The DAO攻击发生时,以太坊的创始人们一定后悔过没有在合约里加入selfdestruct来停止黑客的攻击吧。原创 2023-03-09 00:52:57 · 524 阅读 · 0 评论 -
Solidity极简入门#27. ABI编码解码
当你想省空间,并且不与合约交互的时候,可以使用abi.encodePacked,例如算一些数据的hash时。ABI被设计出来跟智能合约交互,他将每个参数填充为32字节的数据,并拼接在一起。abi.decode用于解码abi.encode生成的二进制编码,将它还原成原本的参数。功能类似,只不过第一个参数为函数选择器,为函数签名Keccak哈希的前4个字节。,用于解码abi.encode的数据。对编码进行了压缩,长度比abi.encode短很多。功能类似,只不过第一个参数为函数签名,比如"。原创 2023-03-02 20:15:05 · 1391 阅读 · 0 评论 -
Solidity极简入门#28. Hash
哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在solidity的应用Hash的性质一个好的哈希函数应该具有以下几个特性:单向性:从输入的消息到它的哈希的正向运算简单且唯一确定,而反过来非常难,只能靠暴力...原创 2023-03-03 04:45:04 · 1640 阅读 · 0 评论 -
Solidity极简入门#29. 函数选择器Selector
method id定义为函数签名的Keccak哈希后的前4个字节,当selector与method id相匹配时,即表示调用该函数,那么函数签名是什么?其实在第21讲中,我们简单介绍了函数签名,为"函数名(逗号分隔的参数类型)"。这一讲,我们介绍了什么是函数选择器(selector),它和msg.data、函数签名的关系,以及如何使用它调用目标函数。在同一个智能合约中,不同的函数有不同的函数签名,因此我们可以通过函数签名来确定要调用哪个函数。我们写一个函数,来验证mint函数的method id是否为。原创 2023-03-09 00:29:48 · 657 阅读 · 0 评论 -
Solidity极简入门#30. Try Catch
try-catch是现代编程语言几乎都有的处理异常的一种标准方式,solidity0.6版本也添加了它。这一讲,我们将介绍如何利用try-catch处理智能合约中的异常。try-catch在solidity中,try-catch只能被用于external函数或创建合约时constructor(被视为external函数)的...原创 2023-03-10 12:40:04 · 480 阅读 · 0 评论 -
DApp实战:开发属于你的第一个DApp - 我的日记本
项目的视频教程部分已经发布到了b站https://space.bilibili.com/391924926/channel/seriesdetail?sid=2745034安装依赖库npm 安装 elementUI,web3jsSolidity编写智能合约注意点:删除数组的练习, 我们发现数组元素不会真正删除 只会置为0值1,2,3,5 => 1,2,0,5数组无法直接将某个元素删除,只能从后向前逐个删除。基于这个特性,我需要通过把把元素从右往左移动从而删除元素原创 2022-12-08 09:45:33 · 997 阅读 · 0 评论