合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
/**
* @dev String operations.
*/
library Strings {
/// @dev 比较2个字符类型是否相等
function isEqual(string memory strLeft, string memory strRight) internal pure returns(bool) {
bytes32 hashLeft = keccak256(abi.encode(strLeft));
bytes32 hashRight = keccak256(abi.encode(strRight));
return ( hashLeft == hashRight );
}
}
/// @dev 测试
contract TestStringGas {
string name;
using Strings for string;
/// @dev 使用hash值判断字符串是否为空
function StringsEqual(string memory _name) external {
require(!_name.isEqual(""), "The value is empty.");
name = _name;
}
/// @dev 使用字符串的字节长度判断是否为空
function bytesEqual(string memory _name) external {
require(bytes(_name).length != 0, "The value is empty.");
name = _name;
}
}
测试结果
使用Remix浏览器及MetaMask进行测试得出的结果,比较结果整体来看是使用hash值方法判断字符串比较省gas,如下所示:
| 输入字符(字符数) |
lib Strings (Total) | gas used |
bytes(string).length (Total) | gas used |
|---|---|---|---|---|
| 1 (1) | 0.00006928(少) |
27710 (少) | 0.00011136 | 44543 |
| tracy (5) | 0.0000694(少) | 27758
(少) | 0.00007435 | 29740 |
| "hi, i am tracy" (14) | 0.00006967(少) | 27866
(少) | 0.00007462 | 29848 |
| "hi, i am tracy. Today is summy"(30) | 0.00007015(少) | 28058
(少) | 0.0000751 | 30040 |
| "hi, i am tracy. Today is summy. We are going to play games"(57) |
0.00007731 (少) | 30925
(少) | 0.00018158 | 72633 |
| "hi, i am tracy. Today is summy. We are fine"(42) | 0.00007686(少) | 30745
(少) | 0.0000886 | 35439 |
| 1 (1) | 0.00006928(少) | 27710
(少) | 0.00007506 | 30022 |
| 0x5B9cb96fE1088F87D49a206B2cb50b70dD0A0cf9 (42) | 0.00007683(少) | 30733
(少) | 0.0001811 | 72441 |
| 0x56dcb5e2883913947914f158a2df8c50ea297b7aa355e3bc8885f27de3e3da38(66) | 0.00008378(少) | 33513(少) | 0.00015205 | 60819 |
| "中文" | 0.00006943(少) | 27770(少) | 0.00011151 | 44603 |
| "南京票据证券印刷有限公司" | 0.00007665(少) | 30661(少) | 0.00018092 | 72369 |
本文探讨了在以太坊智能合约中,通过`Strings`库实现字符串相等性和空值判断的两种方法——基于哈希和字节长度,分析了不同长度字符串的 gas 消耗,揭示了使用哈希值判断更节省gas。
1万+

被折叠的 条评论
为什么被折叠?



