一、基本变量类型
solidity 中的基本变量类型与一般编程中类似:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract Hello{string public say="Hello 1_bit";int public ival=-1;uint public uval=1;address public aval=0xd9145CCE52D386f254917e481eB44e9943F39138;bool public isTrue=false;
}
从以上代码中可以看出,比较特殊的数据类型为 address,address 是一个地址类型,表示地址。
常量
一些不可改动的值可以定义为常量,通过合理的编写方式可使代码的 Gas 消耗降低,定义常量也将会降低 Gas,常量的定义使用 constant 例如以下代码:
uint public constant U_val=1
在solidity 中,定义常量时对常量名有一种规范,大写开头,下划线做连接。
二、函数
函数类型
在 solidity 中函数分为内部函数和外部函数,顾名思义 内部函数只能在当前合约内被调用 而 外部函数可以在外部调用;外部函数使用 external 标记 而 内部函数使用 internal 标记。下面是一个外部函数例子:
function testfun() external returns (int){return 1;
}
函数格式
以上代码中 function 表示创建一个函数,testfun 是函数名,external 表示一个外部函数,returns 则表示返回值内容其 int 表示返回的类型。
在以上代码中,花括号内为函数体代码,在此用作演示,返回一个 1;但在编译后会发生一个警告:
pure 不读取、改变状态变量
此时警告为当前 function 的状态可以设置为 pure,这个pure 为一个修饰符,表示当前函数不改变也不读取状态变量(状态变量即永久存储在合约中的变量,不是局部或说一些即时销毁的变量),不需要矿工进行验证,这样函数就可以不用消耗 Gas ,那么此时直接加上 pure 即可:
此时部署合约后点击 testfun 即可得到对应的返回值:
view 读取但改变状态变量
此时若修改代码,返回对应的 ival 值将会发生报错:
因为 pure 表示不读取也不修改,那么此时已经读取了 ival就不能使用 pure了,应该改写为 view(view 也不消耗 Gas):
三、变量类型
在第二点中我们有说过什么是状态变量,除了状态变量还包括局部变量以及全局变量。
局部变量是指在某一个局部中的变量,例如在函数中创建一个变量,该变量在函数使用时才会占用内存,函数调用完毕后即该变量的内存销毁。
在 solidity 中全局变量值不用定义及有某值的变量,或者可以理解为“系统变量”,例如msg.sender、block.timestamp或者是block.number,其中msg.sender是当前合约中上一个上一个调用当前合约的对象、block.timestamp为当前区块时间戳、block.number为当前区块的号。
如下代码示例:
function osVal() external view returns(address,uint,uint){address sender=msg.sender;uint number=block.number;uint timestamp = block.timestamp;return (sender,number,timestamp);
}
调用后其结果如下: