搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
出版时间 :
无库存
WTF Solidity智能合约教程(入门篇)
0.00     定价 ¥ 68.00
泸西县图书馆
此书还可采购1本,持证读者免费借回家
  • ISBN:
    9787030758880
  • 作      者:
    0xAA
  • 出 版 社 :
    科学出版社
  • 出版日期:
    2023-08-01
收藏
精彩书摘

第1讲 从Hello Web3开始
  1.1 Solidity简述
  Solidity是以太坊虚拟机(EVM) 智能合约的语言。同时,笔者认为Solidity是熟练操作区块链相关项目必备的技能:区块链项目大部分是开源的,用户如果能读懂代码,就可以规避很多质量较差的项目。
  Solidity具有如下两个特点:
  (1)面向智能合约:Solidity提供了丰富的智能合约功能,包括状态变量(用于存储合约状态)、函数(用于定义合约的行为),事件(用于与外部应用程序通信)和修饰器(用于修改函数的行为)等,这些功能使得开发人员能够编写强大的智能合约。
  (2)静态类型:Solidity是静态类型语言,每个变量的类型都需要在编译器确定,这有助于在编程阶段发现错误。
  1.2 开发工具:remix
  本教程中,笔者使用remix来运行Solidity合约。remix是以太坊官方推荐的智能合约开发IDE(集成开发环境),适合新手,可以在浏览器中快速开发和部署合约,而不需要在本地安装任何程序。remix的网址如下:
  https://remix.ethereum.org
  图1.1显示了remix开发环境的一部分面板。进入remix,我们可以看到最左边的菜单有一系列按钮,其中主要有“文件”(文件浏览器界面,在此添加和编写Solidity合约程序)、“编译”(将合约编译成可运行的格式)、“部署”(部署到区块链上)等按钮。
  图1.1 remix面板
  在文件浏览器界面点击“新建文件”(Create New File)按钮,就可以创建一个空白的Solidity合约文件。
  1.3 第一个Solidity程序
  很简单,只有1行注释+ 4行代码:
  1 // SPDX-License-Identifier: MIT
  2 pragma solidity ^0.8.4?
  3 contract HelloWeb3{
  4 string public _string = "Hello Web3!"?
  5 }
  我们拆开分析,学习Solidity代码源文件的结构:
  (1)第1行是注释,其中标明这个代码所用的软件许可证(license),这里用的是MIT许可证,也是Solidity合约默认使用的开源许可证。如果不写许可,编译时会警告(warning),但程序可以运行。Solidity的注释由“//”开头,后面跟注释的内容(不会被程序运行)。
  1 // SPDX-License-Identifier: MIT
  第1讲从Hello Web3开始3
  (2)第2行声明源文件所用的Solidity版本,因为不同版本语法有差别。这行代码的意思是源文件将不允许小于0.8.4版本或大于等于0.9.0的编译器编译(第二个条件由“^”提供)。Solidity语句以分号“?”结尾。
  2 pragma solidity ^0.8.4?
  (3)第3~5行是合约部分,第3行创建合约(contract),并声明合约的名字为HelloWeb3。第4 行是合约的内容,我们声明了一个string(字符串)类型的变量“_string”,并给它赋值“Hello Web3!”。
  3 contract HelloWeb3{
  4 string public _string = "Hello Web3!"?
  5 }
  在后面的内容中,我们将会详细介绍Solidity中的变量。
  1.4 编译并部署代码
  在remix 开发环境下,点击图1.1所示界面左侧的“编译”按钮,或者按Ctrl+S 就可以编译代码,非常方便。
  编译好之后,点击“部署”按钮进入部署界面,如图1.2所示。
  图1.2 Solidity合约的部署设置界面
  在默认情况下,remix会用JavaScript虚拟机来模拟以太坊区块链,运行智能合约,相当于在浏览器里直接运行一条测试链。另外,remix会分配若干个测试账户用于测试合约的运行,每个账户里面有额度为100 ETH的测试代币,供用户自由使用以测试合约代码(不会进入实际的交易流程)。点击图1.2所示界面中的“Deploy”(黄色按钮),就可以部署刚才写好的合约了。
  部署成功后,在部署界面的下方会看到名为HelloWeb3 的合约,如图1.3所示。点击“_string”,就能看到我们代码中写的“Hello Web3!”了。
  图1.3 部署成功后查看Solidity合约的运行结果
  1.5 总结
  作为全书的开篇,这一讲中我们简单介绍了Solidity和remix工具,并完成了第一个Solidity 程序——Hello Web3。下面我们将继续Solidity旅程!
  第2讲 值类型
  Solidity语言中的变量类型主要包括以下三种:
  (1)值类型(value type):包括布尔型和整型等。这类变量在赋值的时候直接传递数值。
  (2)引用类型(reference type):包括数组和结构体。这类变量占用的存储空间较大,在赋值的时候直接传递变量的地址(类似C语言中的指针)。
  (3)映射类型(mapping type):Solidity 中存储键值对的数据结构,可以理解为哈希表。
  这一讲我们将介绍值类型。
  2.1 布尔型
  布尔型是二元变量,取值为true 或false。
  1 //布尔值
  2 bool public _bool = true?
  布尔值的运算符包括如下几种:
  (1)!(逻辑非)。
  (2)&&(逻辑与,“and”)。
  (3)||(逻辑或,“or”)。
  (4)==(等于)。
  (5)!=(不等于)。
  例如,接着上一段代码,借助_bool变量定义一个新的布尔型变量_bool1,并进行运算:
  1 //布尔运算
  2 bool public _bool1 = !_bool? //取非
  3 bool public _bool2 = _bool && _bool1? //与
  4 bool public _bool3 = _bool || _bool1? //或
  5 bool public _bool4 = _bool == _bool1? //相等
  6 bool public _bool5 = _bool != _bool1? //不相等
  以上代码中,变量_bool的取值是true。_bool1是_bool进行逻辑非运算的结果,为false。_bool && _bool1的运算结果为false。_bool || _bool1的运算结果为true。_bool == _bool1的运算结果为false。_bool != _bool1的运算结果为false。
  读者可在部署合约后检验这些变量的结果,如图2.1所示。
  图2.1 Solidity中的布尔变量及其运算
  注意:&&和||两个运算符的机制和其他许多语言中的类似,遵循所谓“短路规则”。

展开
目录
目录
第1讲从HelloWeb3开始
1.1Solidity简述1
1.2开发工具:remix1
1.3第一个Solidity程序2
1.4编译并部署代码3
1.5总结4
第2讲值类型
2.1布尔型5
2.2整型7
2.3地址8
2.4字节数组9
2.5枚举9
2.6总结10
第3讲函数
3.1Solidity中的函数11
3.2到底什么是pure和view?12
3.3代码实现13
3.4测试payable关键字声明的函数15
3.5总结17
第4讲函数输出
4.1返回值关键字return和returns18
4.2命名式返回19
4.3解构式赋值19
4.4总结20
第5讲变量的数据存储和作用域
5.1Solidity中的引用类型21
5.2数据位置21
5.3变量的作用域24
5.4变量的单位和换算26
5.5总结30
第6讲数组和结构体
6.1数组31
6.2结构体34
6.3总结37
第7讲映射类型
7.1映射的声明38
7.2映射的规则38
7.3映射的底层机制40
7.4总结40
第8讲变量的初始值
8.1值类型的初始值41
8.2引用类型的初始值43
8.3delete操作符43
8.4总结44
第9讲常量和不变量
9.1constant关键字45
9.2immutable关键字46
9.3总结47
第10讲控制流及其实践
10.1控制流48
10.2实例:用Solidity实现插入排序50
10.3总结53
第11讲构造函数和修饰器
11.1构造函数54
11.2修饰器55
11.3onlyOwner修饰器的演示56
11.4总结57
第12讲事件
12.1事件58
12.2EVM日志59
12.3在remix上演示Solidity事件和日志60
12.4总结62
第13讲继承
13.1继承的基本概念63
13.2简单继承63
13.3多重继承65
13.4修饰器的继承66
13.5构造函数的继承68
13.6调用父合约的函数69
13.7钻石继承71
13.8总结73
第14讲抽象合约和接口
14.1抽象合约74
14.2接口75
14.3应用:ERC721标准接口的实现75
14.4总结79
第15讲异常
15.1异常80
15.2在remix上演示异常82
15.3三种方法的gas消耗比较83
15.4总结84
第16讲函数重载
16.1函数重载的例子85
16.2实参匹配(argument matching)86
16.3总结87
第17讲库合约
17.1库合约88
17.2示例:Strings库合约88
17.3使用库合约的方法91
17.4总结92
第18讲导入其他合约
18.1import关键字94
18.2测试导入结果95
18.3总结96
第19讲接收ETH
19.1接收ETH的回调函数receive()97
19.2回退函数fallback()98
19.3两种回调函数的区别99
19.4在remix上演示回调函数99
19.5总结101
第20讲发送ETH
20.1接收ETH的合约102
20.2发送ETH的合约103
20.3总结108
第21讲调用其他合约
21.1调用已部署合约109
21.2编写目标合约109
21.3调用目标合约110
21.4总结115
第22讲call函数
22.1call函数及其使用场景116
22.2准备目标合约117
22.3用call函数调用目标合约118
22.4总结122
第23讲delegatecall函数
23.1delegatecall函数123
23.2delegatecall的应用场景124
23.3delegatecall的用法示例125
23.4在remix上展示delegatecall的用法126
23.5总结129
第24讲在合约中创建新合约
24.1基于CREATE操作码生成合约130
24.2示例:一个简化版的Uniswap130
24.3在remix上演示合约的创建133
24.4总结134
第25讲CREATE2操作码
25.1CREATE操作码如何计算新合约地址135
25.2CREATE2操作码如何计算新合约地址135
25.3示例:一个简化版的Uniswap2136
25.4在remix上演示基于CREATE2创建合约140
25.5CREATE2操作码的实际应用场景141
25.6总结141
第26讲删除合约
26.1selfdestruct命令142
26.2示例:DeleteContract合约142
26.3在remix上演示删除合约143
26.4注意事项145
26.5总结145
第27讲ABI的编码和解码
27.1ABI编码146
27.2ABI解码149
27.3在remix上展示ABI编码和解码150
27.4ABI的使用场景150
27.5总结152
第28讲哈希函数
28.1哈希函数的性质和应用153
28.2keccak256函数154
28.3总结156
第29讲函数选择器
29.1函数选择器157
29.2总结160
第30讲捕获异常
30.1try-catch实战162
30.2总结167
附录AERC20代币标准和实现
A.1ERC20代币标准168
A.2IERC20接口合约168
A.3ERC20代币的实现171
A.4发行ERC20代币174
A.5总结175
附录B贡献者名单176
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

温馨提示:请使用泸西县图书馆的读者帐号和密码进行登录

点击获取验证码
登录