solidity学习笔记02-数据存储篇
Posted 一袋芋头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solidity学习笔记02-数据存储篇相关的知识,希望对你有一定的参考价值。
solidity学习笔记02-数据存储篇
最近在学习solidity语言,感谢b站先锋教育的视频和郑建勋老师的讲解,参考视频: https://www.bilibili.com/video/BV1St411a7Pk?p=11.
对应视频:P11-P23
(开始干活了,这个文章草稿箱扔了俩月,估计往后也没的空再写学习笔记了,鸽了鸽了,有缘再续)
这部分主要讲解的时solidity语言中各种数组的使用和转换,包括字节数组Bytes,字符串String,Array,二维数组,字面量,每种数据类型的数组都可分为两类,固定的和可变的。
1.ByteArray
- 定长字节数组是指一个所占空间固定的数组,每个元素都是一个字节。声明方式如下:
byte bt0;
bytes1 bt1 = 0x01;
bytes2 bt2 = "ab";
bytes3 bt3 = "vae";
- byte数组的关键字有为bytes1,bytes2,…,bytes32,步长为1,byte代表byte1,以八个位递增,即是对位的封装。
- 实际使用中,定长字节数组常被代替字符串(如声明中的bt2,bt3)
- 定长字节数组支持的运算符如下:
a.比较运算符:<=,>=,==,!=,<,>(返回布尔值)
b.位运算符:&,|,^(按位异或),~(按位取反),<<(左移位),>>(右移位)
c.索引(下标)访问:如果x时bytesN,当0<=k<N时,x[k]返回第k个字节。
注意:移位运算和整型类似,以为运算结果的政府取决于运算符左边的数,且不能进行负移位,例如可以-5<<1,但不能5<<-1.
- 定长字节数组有成员变量:.length,且不可修改
下面展示 ByteArray.sol
。
pragma solidity ^0.4.0;
contract ByteArray
//77 61 6E 67 68 75 61 6A 69 61 6E--wanghuajian
bytes1 public num1 = 0x77;
bytes2 public num2 = 0x7761;
bytes12 public num3 = 0x77616e676875616a69616e;
bytes1 public a =0x77;// 0111 0111 7*16+7=
bytes1 public b =0x61;// 0110 0001 6*16+1=
function getLength1() public returns(uint)
return num1.length;
function getLength2()public returns(uint)
return num2.length;
function getLength3() public returns(uint)
return num3.length;
//长度一旦确定,不能被修改;必须为lvalue才能被修改
/*
function setLength()
num2.length = 10;//长度一旦确定,不能被修改;必须为lvalue才能被修改
*/
//byte1也可以进行位运算,返回值也是byte1类型,但是不可修改其制定位置的元素
function bijiao() public view returns (bool,bool,bool,bool,bool)
return (a>=b,a<=b,a>b,a<b,a==b);
function and_B() view public returns(bytes1)
return a & b;
function or_B() view public returns(bytes1)
return a | b;
function no_B() view public returns(bytes1)
return ~b;
function yihuo_B() view public returns(bytes1)
return a ^ b;
function lm_B() view public returns(bytes1)
return a <<1;
function rm_B() view public returns(bytes1)
return a >>1;
//error:不可修改其制定位置的元素
/*
function changeContent()
num3[0]=2;
*/
2.DynamicBytes
- 初始化要用new
bytes public name = new bytes(2);
- 动态字节数组可改变指定位置的元素
name[0] = 0x66;
- 无论是增加长度(初始化为0)还是push元素,都是加在右边;减小长度也是右侧截断
function changeLength(uint newLength) public returns(uint)//right 0000
name.length = newLength;
return name.length;
function pushtest()
name.push(0x88);
下面展示 DynamicBytes.sol
。
pragma solidity ^0.4.0;
contract DynamicByte
//初始化要new
bytes public name = new bytes(2);
function initName()
name[0]=0x77;
name[1]=0x61;
function getLength() view returns(uint)
return name.length;
//动态字节数组可改变指定位置的元素
function changeName() public
name[0] = 0x66;
//无论是增加长度(初始化为0)还是push元素,都是加在右边;减小长度也是右侧截断
function changeLength(uint newLength) public returns(uint)//right 0000
name.length = newLength;
return name.length;
function pushtest()
name.push(0x88);
3.Math
下面展示 Math.sol
。
本代码讲解整型特性与运算、底层位运算、整数溢出与异常处理、整型字面量。
整型字面量:solidity在计算过程中的中间值,支持任意的精度,如小数。不会发生溢出操作。
只有在将计算结果赋值给特定类型的时候,才会发生截断溢出等操作。
pragma solidity ^0.4.0;
//本代码讲解整型特性与运算、底层位运算、整数溢出与异常处理、整型字面量
contract math
uint num1 = 3;//int256
uint num2 = 4;//uint256
function add(uint a,uint b) pure public returns(uint)
return a+b;
uint8 a=3;
uint8 b=4;
//位运算时a,b的二进制数进行位运算
function and_B() view public returns(uint)
return a & b;
function or_B() view public returns(uint)
return a | b;
function no_B() view public returns(uint)
return -b;
function yihuo_B() view public returns(uint)
return a ^ b;
function lm_B() view public returns(uint)
return a <<1;
function rm_B() view public returns(uint)
return a >>1;
//溢出
function flow(uint8 _a) pure public returns(uint8)
_a++;
return _a;
//整型字面量
function intergerTest() pure public returns(uint)//整形字面量
uint num = (2**900+1)-2**900;
return num;
再次感谢郑建勋老师的讲解。
以上是关于solidity学习笔记02-数据存储篇的主要内容,如果未能解决你的问题,请参考以下文章
solidity笔记——存储区域memory storage stack——2021.5.12
《solidity学习笔记》chapter 2-solidity基础知识