疑问:读书时不太懂的。
一、编程基础
1 基本
// 单行注释 |
2 库
- 库不能有:
fallback函数
、paybale
关键字、storage
变量、日志; - 库可以:修改和他们相联的合约的storage变量;分发事件
类比:函数传入C指针 – 库处理合约storage
web3库开发dapp监听eventemittercontract.emit 收到库函数触发事件,但是监听eventemitterLib.emit事件,什么也收不到。
3 合约文件结构
- 状态变量:state variables
- 结构定义:structure definitions
- 修饰符定义:modifier definitions
- 事件声明:event definitions
- 枚举定义:enumeration definitions
- 函数定义:function definitions
4. 变量类型
- 基础类型(int、uint、struct)、数组类型、映射
- 固定变量static、动态变量dynamic
4.1 值类型
- 布尔类型:true\false; 不能和整数隐式转换
- 整型:int\uint;默认256;包含uint8\16\24\32..;默认为十进制
- 地址:长度20B、160bit,可以用uint160编码
- 定长字节数组:?? 疑问;
- 有理数和整型字面量:literal 本身是值 疑问;
- 枚举类型:enums 不能和整数隐式转换
- 函数:可以将函数赋值给变量;函数作为参数;返回函数;
4.2 引用类型
为了避免空间占用太大,采用引用类型:
- 不定长字节数组:bytes;
- 字符串:string; 没有\0结尾,”test”就是4个字节
- 数组:array: memory不可以更改数组长度,storage可以根据.lengthg更改
- 结构体:struct: 自定义数据结构
4.3 字典、映射
key的类型允许除【字典】以外的所有类型,数组、合约、枚举、结构体
mapping(keyType ->valueType)
4.4 特殊情况
变量放在栈上,只能容纳16层
5 操作符
用到再说吧
6 语句
不支持switch goto
单行语句中的大括号可以删除
if (condition) { |
7 修饰符
- 函数修饰符:external、internal<默认>、public<默认>、private
- 针对状态变量:constant、view、pure、paybale
- internal
- internal 不能从外部访问,不是接口的一部分
- 只能内部调用、或继承的合约中调用;
- 不能加this, this代表以外部形式调用
- external
- 外部函数是合约的一部分,可以从其他合约或通过交易发起调用
- this.f()
- public
- 公开函数为合约接口的一部分
- public 的状态变量,会自动创建一个访问器
- private
- 函数和变量仅仅在当前合约可以访问
- 继承中不能访问
- 是接口的一部分
- constant
- 不能改变状态,只能获取状态返回
- 似乎没啥用
- view
- 不能修改状态变量,等同 constant
- pure
- 更多的限制;
- 不能读写状态量,函数不能读写当前的状态和交易变量
- paybale
- 声明的函数可以从调用者那里接受ether;
- 一个函数如果声明了payable,说明只能接受ether;
- 如果调用者没有eth就报错
external & public 🚩🚩
- 可见度:都可以被其他合约通过调用、交易的方式调用
- 不同
- internal 消耗最少,用jump命令,参数是以内存指针传递
- public因为不知道调用者是 external | internal; public就会像处理internal一样将参数复制到memory,这样操作很贵
- 如果可以确信函数只能外部调用,则用external
- 大多数情况,this.f() 调用方式没有意义,他会调用
call()
internal & external
pragma solidity >=0.8.0 <0.9.0; |
8 自定义修饰符
修饰符可以改变函数的行为,类似装饰器。
- 执行函数前检查条件
- 修饰符可以继承
- 可以被派生合约重载
|
9 数据位置
evm提供四种数据结构来存储变量;
- storage
- 链上永久存储;
- 可以被所有函数访问的全局变量
- memory
- 合约本地内存变量
- 生命周期很短,函数执行结束就销毁
- calldata
- 所有函数调用你的数据,包含函数参数的保存位置
- 不可修改的内存位置
- stack
- EVM 维护了个1024级的栈,用来导入变量和以太坊的机器、汇编指令代码交互;
数据结构-总结
- memory:默认的函数参数、返回的参数
- storage: 默认的局部变量、默认的状态变量<合约声明的公有变量>
- 外部函数的参数<不包含返回参数> 被强制指定为calldata