网站首页 > 开源技术 正文
solidity数据类型
0. 状态变量vs局部变量
定义在合约之内,但是在函数之外的变量,我们叫做状态变量,这些变量是会上传到区块链上保存的。
下面这个合约中的message就是状态变量。
solidity语言没有main函数,只要合约部署到区块链上,就会永不停歇地执行。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Inbox{
//状态变量
string public message;
function setMessage(string memory newMessage) public {
//局部变量
string memory tmp = "hello";
message = newMessage;
}
function getMessage() public view returns(string memory){
return message;
}
}
1. 布尔
go语言: var flag bool , flag = true
bool flag1 ;
bool flag2 = false;
2. 整型
- int(有符号整型,有正有负)
- uint(无符号整型,无负数)
- 以8位为区间,支持int8,int16,int24 至 int256,uint同理。 int默认为int256,uint默认为uint256
3. 函数类型
函数类型也就是我们所说的函数,本身也是一个特殊的变量,它可以当做变量赋值,当做函数参数传递,当做返回值。
- 函数声明
函数名,函数签名(返回值,参数类型,修饰符)
- 几个非常非常非常重要的关键字
修饰符 | 说明 |
public | 公有,任何人(拥有以太坊账户的)都可以调用 |
private | 私有, 只有智能合约内部才可以调用 |
external | 仅合约外部可以调用,合约内部需使用this调用 |
internal | 仅合约内部和继承的合约可以调用 |
view/constant | 函数会读取但是不会修改任何contract的状态变量 |
pure(纯净的) | 函数不使用任何智能合约的状态变量 |
payable | 调用函数需要付钱,钱付给了智能合约的账户 |
returns | 返回值函数声明中使用 |
- 访问可见性
- public、private
修饰为public的状态变量会默认生成一个同名的public函数
- view,constant,pure讲解
- 如果一个函数里面,访问了状态变量,但是没有修改,我们使用view或者constant修饰。
- 如果访问了状态变量,而且修改了,那么就不能constant和view,否则会报错,不修饰即可。
- 如果没有使用过状态变量,我们要修饰为pure。
- 如果你修饰为constant,但是你在函数中修改了,效果是:不会报错,正常执行,但是值不会改变。
- payable
- 任何函数,只要修饰为payable,那么就可以在调用这个方法的时候,对value字段赋值,然后将价值value的钱转给合约。
- 若这个函数没有指定payable,但是对value赋值了,那么本次调用会报错。
- 匿名函数
- 用于转账
一个合约可以有且只有一个匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去执行一个合约上没有的函数时,那么合约就会执行这个匿名函数。
当合约在只收到以太币的时候,也会调用这个匿名函数,而且一般情况下会消耗很少的gas,所以当你接收到以太币后,想要执行一些操作的话,你尽可以把你想要的操作写到这个匿名函数里,因为这样做成本非常便宜。
//如果想向合约转账,在合约中添加如下函数即可
function() payable {
//函数体什么都不填
}
- 用于处理不存在的函数
- 合约之间调用,非js调用
contract Test {
function() { x = 1; }
uint x;
}
contract Caller {
function callTest(address testAddress) {
Test(testAddress).call('0xabcdefgh'); // hash does not exist
// results in Test(testAddress).x becoming == 1.
}
}
4. 地址(Address)
- 概述
以太坊地址的长度,大小为20个字节,20 * 8 = 160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,通过合约的地址串,调用合约内的函数。
- 余额(balance)
返回指定地址的余额
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
address public addr1 = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
address public addr2 = 0x617F2E2fD72FD9D5503197092aC168c91465E7f2;
receive() external payable {}
// 向合约账户转账
function transderToContract() payable public {
payable(address(this)).transfer(msg.value);
}
// 获取当前合约的余额
function getBalance1()public view returns(uint256){
return address(this).balance;
}
// 获取指定地址的余额
function getbalance(address addr) public view returns(uint256){
return addr.balance;
}
// 由合约向addr1地址转10 eth
function transfer() public {
payable(addr1).transfer(10*10**18);
}
}
5. 枚举类型(Enums)
- 枚举类型是在Solidity中的一种用户自定义类型。
- 枚举可以将显示的与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。
- 枚举类型应至少有一名成员,枚举元素默认为uint8,当元素数量足够多时,会自动变为uint16,第一个元素默认为0,使用超出范围的数值时会报错。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract test {
enum WeekDays {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
WeekDays currentDay;
WeekDays defaultday = WeekDays.Sunday;
function setDay(WeekDays _day) public {
currentDay = _day;
}
function getDay() public view returns(uint256) {
return uint256(currentDay);
}
function getDefaultDay() public view returns(uint256) {
return uint256(defaultday);
}
}
6. 字节数组
[]byte go -> bytes
- 定长的字节数组
solidity内置了一些数组的数据类型:(和go语言做一下对比, var b8 [8]byte),完全只读
- bytes1, ... ,bytes32,允许值以步长1递增。
- ==byte默认表示bytes1,byte是类型,bytes是类型,bytes1是内置数组==
- bytes1只能存储1个字节,即8位的内容,bytes2最多只能存储2个字节,即16位的内容。以此类推...
- 长度可以读取 length(返回bytes5类型的长度,而不是赋值的长度)
- 长度不可以修改
- 可以通过下标访问
- 内容不可修改
内置成员:length,返回数组长度
存储方式:16进制ascii码
猜你喜欢
- 2024-09-30 「链块技术39期」以太坊智能合约语言(四):Solidity函数(上)
- 2024-09-30 学习 Solidity 智能合约开发 02:合约
- 2024-09-30 「干货」区块链技术分享:Solidity语言(七)
- 2024-09-30 Solidity的整数(solid size)
- 2024-09-30 了解Solidity语言基础知识(sol语言有哪些特点)
- 2024-09-30 「链块技术36期」以太坊智能合约—Solidity概述和开发工具的使用
- 2024-09-30 区块链研究实验室 | 深入解析Solidity合约
- 2024-09-30 【干货】区块链技术分享:Solidity语言
- 2024-09-30 以太坊2.0进展:存款合约已经从Vyper重写为Solidity语言并重新验证
- 2024-09-30 Solidity教程——学习如何构建您的第一个智能合约
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)