这一章讲一下 solidity
的数组。
声明 T[K]
T
元素类型K
数组长度「可选」uint [10] tens
uint [] us
uint [] public c = [1,2,3]
// public 数组状态会自动生成一个对应变量的函数
- 使用
new
关键字uint [] c = new uint[](7);
// storage- 这种方式必须要指定长度
通过下标访问
tens[0] = 10
多维数组
solidity 多维数组和其他数组不一样的是
- solidity:uint[2][3] 它是列前行后,即是 3 行 2 列的数组
- python: [2][3] 是 2 行 3 列
uint[][5] a
// 5 个数组都是变长数组
数组成员
.length
- 数组长度
storage
的变长数组,可以通过.length
赋值调整数组长度memory
数组一旦创建,无法改变长度
push()
- 添加新元素,返回新长度
- 仅针对变长数组
memory
数组不支持
案例
基本功能
1 | // SPDX-License-Identifier: MIT |
- getList
- getList(1)
- [3,4]
- getList(1)
- getLength
- 3
- getListLength
- getListLength(1)
- 2
- getListLength(1)
- getElement
- getElement(2,1)
- 6
- getElement(0,1)
- 2
- getElement(2,1)
- initB
- 这个是变长初始化,如果要给定具体的数值,那么,必须都是定长的,下面这个是错误的
- B = [[1],[2,3]]
- 综合状态
- initB() -> getB()
- [[1,2],[2,3]]
- initB() -> getB()
- add
- add() -> getB()
- [[1,2],[1,2,3]]
- add() -> getB()
- 综合操作
- initB() -> add() -> getB()
- [[1,2],[2,3],[1,2],[1,2,3]]
- initB() -> add() -> getB()
上面总结了定长、变长等数组的初始化以及返回。
互动
ganache
的启动方式是
ganache-cli --fork.url wss://bsc-mainnet.nodereal.io/ws/v1/63ef*** --miner.blockTime 1
必须要加 miner.blockTime
让其自动出块,否则进行写区块操作的时候,会出现
transaction can't be replaced, mining has already started
python
代码
1 | from web3 import Web3 |
上面的输出
- add
- data
- 就是 tx 获取,没什么可以用的
- 可能是目前我还不知道怎么读取
- data
- getB
- data
- 就是 2 维数组
- data
其他
1 | // SPDX-License-Identifier: MIT |
进行浏览器部署后
- get
- 1,[[1,2],[3,4,5],[7]]
- 返回 [3,4,5]
数组间的传值
1 | pragma solidity ^0.8.4; |
分别进行运行,「下面函数,每运行一次,都要重新部署一次,用来隔离参数,防止被污染」
- getStorage()
- [1,2,3]
- storage2Memory() -> getStorage()
- [1,2,3] # 不变
- memory2Storage() -> getStorage()
- [10,20,30] # 变化
- storage2Storage() -> getStorage()
- [99,2,3] # 变化
- memory2Memory() -> getStorage()
- [1,2,3] # 不变
字节数组
字节数组 bytes
类似 byte[]
,不过 bytes
作为外部函数的参数空间更小,所以,优先使用 bytes
bytes bs;
bytes bs = "123bh";
字符串
字符串也是数组
string st0;
string st1 = "等链学院"
- 没有
.length
属性- 通过
bytes(s).length
获得字节数组 bytes(s)[k]
获取下标K
的utf-8
的编码
- 通过
bytes
存储任意长度的字节数据 「utf-8
编码」string
用来存储utf-8
编码的字符串数据
1 | pragma solidity ^0.4.18; |
get_len
- 获得的是
6
,因为,一个汉字有3
个字节
- 获得的是
- 如果要获取下标,那么,获取的也是编码
stringutils
这个是第三方库,用来处理字符串。
使用前需要把字符串转化成一个个切片,再进行使用
主要功能有
- 字符长度
- 匹配字符串
find()
startsWith()
endsWith()
- …
- 字符串拼接
- …
1 | pragma solidity ^0.4.18; |
这里说一下几点要注意的
- 我是
remix
编写的代码import "github.com/Arachnid/solidity-stringutils/strings.sol";
- 会在线上目录中,创建相应的文件夹,会把
github
中的strings.sol
文件内容copy
到这个文件中 - 但是,
github
线上的这个文件是一个路径,而不是strings.sol
的内容,于是,我把strings.sol
的内容直接copy
到remix
创建的文件中 - 就可以正常运行了
- 如果是本地
- 建议
copy
上面第三方库的合约内容到本地文件,然后引用
- 建议
上面的图是你引入 import
后 remix
自己创建的。
因为,该库 github
的文件内容是一个引用「现在可能已经修改了」,所以,我们需要自己把该库的 strings.sol
内容 copy
到 remix
的 string.sol
里面。