前言:我的学习路线是先搭建第一个联盟链,紧接着是学习soildiity的基本语法,因为对于初学者而言连solidity的基本语法都搞不明白,搭建第一个Dapp(去中心化合约)也会非常的蒙。
上篇博客我们刚刚编写了第一个搭建单群组FISCO BCOS联盟
(6条消息) FISCO BCOS入门——搭建单机四节点联盟链(不熟悉Linux的同学看过来)_小彬爱吃香菜的博客-CSDN博客
这篇博客我来教大家soildity的基本语法 ,首先建议大家先收藏2个网站
1,我们将来大多数时候都是在这个网站里面编译我们的(solidity)智能合约,而且这个网络编译器都是有自动补全的功能的;
这就是他的主界面了
2,这个网站是写了solidity的一些案例,非常适合大家参考。当然也是可以直接复制粘贴到上面那个网站里面运行的。
一,solidity的语法解释
1,solidity文件的后缀名是sql,;
2,每个文件的开头我们都要写有// SPDX-License-Identifier: MIT这样一段注解,用于指定合约许可证的信息。合约的许可证类型是MIT许可证,表示该合约采用MIT许可证进行授权和分发。
3,下面这段代码主要意思就是定义一些数据类型;
4,pragma solodity ^0.8.13:表示适配0.8.13版本以前的所有版本;
5,contract:可以看作是一个类,其中包含了变量、函数和事件等。通过部署智能合约,我们可以在区块链上创建一个独立的实体,并在该实体上执行操作和交互。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract HelloWorld{
bool cheak = false;
//bool 布尔类型表示真true和假false
int num1 = 1;
uint num2 = 2;
//整数类型 ,int是有符合,uint是无符号整型(其中int相当于int256,uint用的比较多)。
//在定义类型的时候,他们后面都是可以接数字的;例如uint8,int256代表不同的范围
address add = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
//地址类型,用来存放以太坊网络上的地址这些地址都是20个字符表示
string public strs = "helloworld";
//字符串类型,默认是null
bytes num3 = 4;
//字节数组类型,用于存储原始字节数据
}
二,solidity的权限和一些方法
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
//constant修饰符代表这个变量是不能被修改的,这样存储的数据可以减少gas的消耗;
address public constant newadd = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
//immutable说明他只能被construct初始化函数修改,修改这一次以后就不能再被其他修改了。
address public immutable addr ;
uint public immutable number ;
//初始化函数,每个合约首先执行的函数;
constructor(){
addr = msg.sender;
number = 520;
}
//使用pubilc修饰时,表示该状态变量,函数,事件都可以被合约内部以及以太坊所有人访问和调用;
//事件我们到后面再讲,因为这个比较难理解
contract Permission{
uint public numb1 = 100;
//function 用于定义函数(方法);
function add() public {
numb1++;
}
//定义一个有返回值的函数
function get() public view returns (uint){
return numb1;
}
//定义一个返回2个参数的函数
function dosome() public view returns(uint , address){
return ( age , addr );
}
}
还有一些其他权限的修饰:
-
external
:表示函数只能从合约外部调用,不能从合约内部调用。这种函数通常用于与其他合约进行交互或处理外部交易。 -
internal
:表示函数只能从当前合约内部或继承合约内部调用。这种函数通常用于内部逻辑的封装和复用。 -
private
:表示函数只能在当前合约内部调用,不能被其他合约或外部用户调用。这种函数通常用于实现内部细节和辅助功能。 -
view
:表示函数只读取合约的状态,不会修改任何状态。这种函数通常用于查询和读取数据,而不会改变合约的状态。 -
pure
:表示函数不读取合约的状态,也不修改任何状态。这种函数通常用于执行纯粹的计算操作,不涉及合约的状态。
三,solidity的一些常用方法。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Functions{
//获得int类型的最大值和最小值。
int public max = type(int).max;
int public min = type(int).min;
//获取当前合约的调用者的地址
address public newadd = msg.sender;
//获取当前时间戳,1970年到现在的秒数也可以用new代替
uint public newtime = block.timestamp;
//用于获取当前区块的区块号。它可以用于跟踪智能合约的执行次数或对区块进行计数。
uint public newytf = block.number;
//用于获取当前交易消息所附带的以太币价值。它可用于处理合约中的以太币支付和价值转移。
uint public newgas = msg.value;
// uint public totalAmount;
// function pay() public payable {
// 使用require断言,确保发送的以太币的价值大于0
// require(msg.value > 0, "Payment amount must be greater than 0");
// 将接收到的以太币的价值累加到合约维护的totalAmount变量中
// totalAmount += msg.value;
// 进行其他的支付逻辑...
// }
}
四,修改数据的方法
//SPDX-License-Identifier:MIT
pragma solidity ^0.8.13;
contract Setnumber{
uint public num;
function set(uint sets) public{
num = sets;
}
}
我们num初始是0 ,只需要在set变成输入数字,然后点击set按钮,num的值就变成了123;
五,智能合约中的单位
在区块链中每次运行程序都会消耗一定的Gas(尤其是运行改变参数的方法),他们的单位分别有Gas、Wei 和 Ether ;其中1 Ether 等于 10^18 Wei。而Gas和Wei之间转换要看Gas的价格;
在solitidy语法中(1e18 = 10**18 = 100000000000000000)都是一样的
关于 if. . .else,whlie,for,do . . . while以及三目运算符(?: )的语法和Java,C++都是一样;