Solidity基础数据类型
以下是Solidity基础数据类型的表格,包含示例和说明:
数据类型 | 示例 | 说明 |
---|
bool
| bool isActive = true;
| 布尔类型,值为 true 或 false 。 |
int
| int count = -10;
| 有符号整数类型,可以表示正数、负数和0,默认为 int256 ,表示范围从 -2^255 到 2^255 - 1 。 |
uint
| uint age = 25;
| 无符号整数类型,只能表示非负整数,默认为 uint256 ,表示范围从 0 到 2^256 - 1 。 |
address
| address owner = msg.sender;
| 地址类型,存储以太坊账户或智能合约的20字节地址。 |
bytes
| bytes data = "abc";
| 动态大小的字节数组。 |
bytes1 - bytes32
| bytes32 hash = keccak256(abi.encodePacked("abc"));
| 固定大小的字节数组,如 bytes1 表示1个字节,bytes32 表示32个字节。 |
string
| string name = "Alice";
| 字符串类型,用于存储文本。 |
enum
| enum Status { Pending, Shipped, Delivered }
| 枚举类型,定义一组命名值。 |
struct
| struct User { string name; uint age; }
| 结构体类型,定义自定义数据类型,将多个变量组合在一起。 |
mapping
| mapping(address => uint) balances;
| 映射类型,类似于哈希表,存储键值对。 |
array
| uint[] numbers = [1, 2, 3];
| 数组类型,可以是固定大小或动态大小的元素集合。 |
示例代码
pragma solidity ^0.8.0;
contract Example {
bool public isActive = true;
int public count = -10;
uint public age = 25;
address public owner = msg.sender;
bytes32 public hash = keccak256(abi.encodePacked("abc"));
string public name = "Alice";
enum Status { Pending, Shipped, Delivered }
Status public orderStatus = Status.Pending;
struct User {
string name;
uint age;
}
User public user = User("Bob", 30);
mapping(address => uint) public balances;
uint[] public numbers = [1, 2, 3];
}
Solidity关键字
以下是Solidity中常用关键字的表格,包含示例和说明:
关键字 | 示例 | 说明 |
---|
pragma
| pragma solidity ^0.8.0;
| 编译指令,用于指定编译器版本。 |
import
| import "./MyContract.sol";
| 导入外部文件或库。 |
contract
| contract MyContract {}
| 定义一个智能合约。 |
interface
| interface IERC20 {}
| 定义一个接口,声明函数但不实现,要求合约遵循特定标准。 |
library
| library Math {}
| 定义一个库,提供复用代码的集合,可以被合约调用。 |
function
| function transfer(address recipient, uint amount) public {}
| 定义一个函数,包含函数名、参数、访问控制等。 |
modifier
| modifier onlyOwner { require(msg.sender == owner); _; }
| 定义一个函数修饰符,用于修改函数行为,常用于访问控制。 |
constructor
| constructor() { owner = msg.sender; }
| 定义构造函数,在合约部署时执行。 |
event
| event Transfer(address indexed from, address indexed to, uint value);
| 定义事件,用于日志记录。 |
emit
| emit Transfer(msg.sender, recipient, amount);
| 触发事件,将日志记录到区块链上。 |
require
| require(amount > 0, "Amount must be greater than 0");
| 条件判断,如果条件不满足则抛出异常。 |
assert
| assert(balance >= amount);
| 断言条件为真,通常用于不应当失败的检查。 |
revert
| revert("Transaction failed");
| 手动触发异常并回滚交易。 |
if
| if (x > 0) {}
| 条件语句,用于执行分支逻辑。 |
else
| else {}
| 与 if 配合使用,处理条件不满足时的逻辑。 |
for
| for (uint i = 0; i < 10; i++) {}
| 循环语句,用于迭代执行。 |
while
| while (i < 10) {}
| 循环语句,满足条件时重复执行。 |
do
| do { i++; } while (i < 10);
| 循环语句,先执行再检查条件。 |
break
| break;
| 提前终止循环。 |
continue
| continue;
| 跳过当前循环,继续下一次迭代。 |
return
| return amount;
| 返回函数执行结果。 |
mapping
| mapping(address => uint) public balances;
| 定义一个映射(类似哈希表),用于存储键值对。 |
struct
| struct User { string name; uint age; }
| 定义一个结构体,用于将多个数据组合成一个类型。 |
enum
| enum Status { Pending, Shipped, Delivered }
| 定义一个枚举类型,包含一组常量值。 |
payable
| function deposit() public payable {}
| 定义函数或地址可以接收以太币。 |
this
| address(this)
| 当前合约的地址。 |
super
| super._transfer(from, to, value);
| 调用父合约中的函数。 |
msg
| msg.sender
| 全局变量,包含与交易相关的信息,如发送者地址、交易数据等。 |
tx
| tx.gasprice
| 全局变量,包含与交易相关的详细信息,如交易的 gas 价格。 |
block
| block.timestamp
| 全局变量,包含区块相关信息,如区块时间戳和区块号。 |
new
| new MyContract();
| 创建新的合约实例。 |
delete
| delete users[addr];
| 删除变量或重置其值。 |
selfdestruct
| selfdestruct(payable(owner));
| 销毁合约并发送剩余资金给指定地址。 |
示例代码
pragma solidity ^0.8.0;
contract MyContract {
address public owner;
// 定义事件
event Deposit(address indexed from, uint amount);
// 定义构造函数
constructor() {
owner = msg.sender;
}
// 修饰符,检查调用者是否为合约所有者
modifier onlyOwner() {
require(msg.sender == owner, "Not the owner");
_;
}
// 接收以太币的函数
function deposit() public payable {
emit Deposit(msg.sender, msg.value);
}
// 转账函数,只有合约所有者可以调用
function transfer(address payable recipient, uint amount) public onlyOwner {
require(amount <= address(this).balance, "Insufficient balance");
recipient.transfer(amount);
}
// 销毁合约并发送剩余资金给所有者
function destroy() public onlyOwner {
selfdestruct(payable(owner));
}
}