solidity8.0的基本语法

本文详细介绍了Solidity 8.0的基本语法,包括值类型和引用类型、变长数组操作、整型溢出处理、引用传递和值拷贝的区别、纯函数与视图函数的使用、常量定义、结构控制与循环、错误处理机制require/revert/assert、自定义错误、函数修饰器、结构体赋值、映射操作、枚举类型、存储位置、事件和继承等内容,旨在帮助开发者掌握最新版Solidity的关键特性。

solidity基本语法:

1、值类型和引用类型

值类型:基础数据类型,int,bool,address,func。

引用类型:复杂数据类型,struct,mapping,数组[]。

2、变长数组的成员方法

变长数组的方法:只能在一端操作。(定长数组不可以操作)

.length获取数组长度

.push(),向末尾添加元素。

.pop(),删除末尾的元素。

另外,变长数组要注意,如果for循环影响到数组的取值,可能会因为太大,导致超出gaslimit最终没法执行。

另外,删除数组中的元素,如何弄?

3、地址的成员方法

<address>.balance:获取地址的以太币余额

<address (payable)>.transfer:合约向该地址转账

3、整型溢出

整数溢出:在老版本中,如果整数溢出,不会报错,就很容易出错,而新版本会报错,无法编译通过,所以防止整型溢出的办法就是,用新版本的solidity编译器。

4、引用类型于值类型

引用类型占用空间巨大,值拷贝开销很大。

引用类型数据的三种存储位置:

1、memory,内存,生命周期仅存在于函数调用期间。

2、storage,状态变量的保存位置,开销最大

3、calldata,调用数据,用于函数参数不可变存储区域。

5、引用传递和值拷贝

在solidity中,基础数据类型,比如bool,int,address,他们的赋值传参都是值拷贝,所有复杂数据类型,比如:struct,mapping,数组类型[],他们的赋值传参的时候,到底是值拷贝还是引用传递,要看两者的数据类型是否一致。

在使用引用类型的数据时,我们必须使用存储位置关键字(memory,storage,calldata)来指定数据存储位置,有且只有类成员变量无需指定(其实就是指合约,因为合约就是solidity中的类),因为他们默认是storage。我们的合约是不需要指定存储关键字的,因为默认就是storage(其实等同于上一句话,合约中的成员变量的存储位置无需指定,自动默认)。

引用类型的传参到底是值拷贝还是引用传递:

如果相同类型的赋值时引用传递,其余是值拷贝,其中特殊的是,storage与storage之间是值拷贝。

具体来说,memory与memory之间传值是引用传递

storage与local storage之间是引用传递。

以下是值拷贝

storage与memory之间是值拷贝,但是memory向storage是不可以传值的,否则会报错。

storage与storage之间是值拷贝。

花不花gas,只取决于两个层面:

1、是否修改了storage参数

2、你函数 调用有没有声明pure或者view

如果两个条件都满足,即没有修改storage状态变量,而且你调用的函数声明了pure或者view,就可以不用花gas,否则,哪怕是查询函数调用一次就要花一次gas。

6、pure和view

pure对状态变量不可读不可写,只对局部变量进行操作。

view,对状态变量可读,不可写。

7、常量的定义和全局变量

用constant + 大写变量名,可以节省gas。

只读方法,难道不是不要gas吗?其实不是的,因为在写入函数中读取变量的时候,要按照是否是常量来收取gas,所以,我们需要把不需要修改的变量定义为constant。

全局变量

区块和交易有关的:

block.number (uint)当前区块号

 block.timestample, (uint)  从开始到当前区块按秒计的时间戳

msg.sender:(address)当前消息的调用者

msg.value:(uint)随消息发送的wei

tx.orign:(address payable) 交易的发起者   

abi有关的接口

abi.encode(),等abi相关的内置函数

错误处理

require(),revert()

类型信息

type()

type(T).max,type(T).min

地址和合约相关

 

8、结构控制与三元运算符

结构控制:

If(条件){}

else if (条件){}

else{}

原本这样的代码:

if(x>10)
{return a;}
return b;

三元运算符:

return x>10 ? a :b ;(?相当于前面的输出结果,:相当于else).

8、循环

Solidity是一种面向智能合约的编程语言,用于在以太坊平台上开发去中心化应用(DApp)。它的基本语法结构包括以下几个方面: 1. 声明:使用关键字`contract`来声明一个合约,类似于面向对象编程中的类。例如:`contract MyContract { ... }` 2. 状态变量:在合约中声明的变量称为状态变量,它们存储在以太坊区块链上。可以使用关键字`uint`、`bool`、`address`等来声明不同类型的变量。例如:`uint public myNumber;` 3. 函数:合约中的函数用于定义合约的行为。可以使用关键字`function`来声明函数,并指定函数的可见性(如`public`、`private`等)。例如:`function myFunction() public { ... }` 4. 事件:事件用于在合约中触发和记录特定的操作。可以使用关键字`event`来声明事件,并定义事件的参数。例如:`event MyEvent(address indexed _from, uint _value);` 5. 修饰器:修饰器用于修改函数的行为或者检查函数的前置条件。可以使用关键字`modifier`来声明修饰器,并在函数定义时使用修饰器。例如:`modifier onlyOwner() { ... }` 6. 构造函数:构造函数在合约创建时执行,并用于初始化合约的状态变量。构造函数与合约同名,并且没有返回类型。例如:`constructor() { ... }` 7. 继承:Solidity支持合约之间的继承关系,可以使用关键字`is`来实现继承。例如:`contract MyContract is BaseContract { ... }` 8. 异常处理:Solidity提供了异常处理机制,可以使用关键字`try`和`catch`来捕获和处理异常。例如:`try { ... } catch { ... }` 以上是Solidity基本语法结构,通过这些基本元素可以编写出功能丰富的智能合约。如果你还有其他问题,请继续提问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值