字符串类型
涉及英语
string 字符串
unicode 编码
关键字: string
字符串是UTF-8编码的字节序列,因此它们可以包含任何UTF-8字符。string类型在Solidity中是动态大小的,这意味着它们可以存储任意长度的字符串,但这也意味着处理字符串通常比处理固定大小的数据类型更昂贵,特别是在需要存储到Ethereum区块链上时。
使用方式
声明和初始化字符串变量的基本语法如下: 基本上和大多数语言一样
了解字符串基本声明方式
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract My {
string a = "hello";
string b = "word";
string c = unicode"哈喽 哈哈";
}
字符串操作
Solidity本身对字符串的内置操作非常有限
比如字符串拼接,下表总结了不同编程语言中字符串拼接的常用方法:
语言 |
拼接方法 |
Python |
|
JavaScript |
|
Java |
|
C# |
|
Ruby |
|
Swift |
|
Go |
|
Kotlin |
|
solidity |
使用abi.encodePacked(str1, str2) 或 bytes类型操作,新版可以使用string.concat |
可以例如,最简单的字符串操作,将 2 个字符串合并,在Solidity 中都没办法直接通过+号合并,甚至你都不能直接获取字符串的长度。
如果需要进行这些操作,通常需要将字符串转换为bytes类型,或者在合约外部处理字符串逻辑。
实现,获取字符串长度,以及,字符串拼接, 字符串对比
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract My {
string a = "hello";
string b = "word";
string c = unicode"哈喽 哈哈";
string d = "hello";
// 字符串拼接
function name() public view returns (string memory) {
return string(abi.encodePacked(a, " ", b));
}
// /获取字符串长度
function length() public view returns (uint256) {
return bytes(c).length;
}
//字符串对比
function isEq() public view returns (bool){
return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(d)) ;
}
}
由于字符串是动态大小的数据类型,处理它们(比如拼接、切片或比较)通常比处理固定大小的数据类型更复杂和更昂贵。
例如: 字符串拼接需要创建一个新的动态数组来存储结果,这个过程涉及到内存分配和多次复制操作,每一步都会消耗gas。
通过以上例子可见在寸土寸金的以太坊网络,处理字符串是多么昂贵
优化建议
- 对于复杂的字符串操作,考虑在应用层(比如使用JavaScript、Python等)而不是在智能合约中处理。
- 对于不需要永久存储在区块链上的数据,使用memory或calldata类型来减少存储成本。
- 在Ethereum智能合约中处理字符串可能会消耗较多的gas,特别是当字符串作为函数参数或者需要在区块链上存储时。
总的来说,虽然字符串操作在Solidity中是可行的,但应该谨慎使用,以避免不必要的高成本。
PS: string 并不是值类型, 他是属于数组后面数组哪里我们也会在讲、
放在这里讲,是为了认识 solidity 与其他语言的区别, 方便更好的学习
注意事项
●在Ethereum智能合约中处理字符串可能会消耗较多的gas,特别是当字符串作为函数参数或者需要在区块链上存储时。
●Solidity中的字符串是不可变的,这意味着一旦字符串被创建,你就不能修改它的内容。如果需要修改字符串,通常的做法是创建一个新的字符串变量。
●对于复杂的字符串操作,考虑在应用层(比如使用JavaScript、Python等)而不是在智能合约中处理。
通过了解这些基本概念和限制,你可以更有效地在Solidity合约中使用字符串类型。
布尔类型
涉及英语
bool 布尔
true 真
false 假
关键字: bool , 可能的取值为常数值 true 和 false。
支持的运算符,
-
- ! (逻辑非)
- && (逻辑与, "and")
- || (逻辑或, "or")
- == (等于)
- != (不等于)
运算符 || 和 && 都遵循同样的短路( short-circuiting )规则。
就是说在表达式 f(x) || g(y) 中, 如果 f(x) 的值为 true , 那么 g(y) 就不会被执行,即使会出现一些副作用。
布尔类型&#