liujie
liujie
Published on 2024-09-10 / 9 Visits
0
0

Solidity -基础数据类型和关键字

Solidity基础数据类型

以下是Solidity基础数据类型的表格,包含示例和说明:

数据类型

示例

说明

bool

bool isActive = true;

布尔类型,值为 truefalse

int

int count = -10;

有符号整数类型,可以表示正数、负数和0,默认为 int256,表示范围从 -2^2552^255 - 1

uint

uint age = 25;

无符号整数类型,只能表示非负整数,默认为 uint256,表示范围从 02^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));
    }
}


Comment