Skip to content

区块链类型

Sway 本质上是一种面向区块链的语言,它提供了一系列针对区块链应用场景优化的类型。

这些类型通过标准库(lib-std)提供,既增加了类型安全程度,也使得开发者的意图更加明确。

Address 类型

Address 类型是对原始 b256 类型的类型安全封装。与 EVM 不同,Address 从不 指向已部署的智能合约(见下文的 ContractId 类型)。Address 可以是公钥的哈希(相当于外部所有账户)或 谓词 的哈希。地址拥有 UTXOs。

Address 的实现如下:

sway
pub struct Address {
    value: b256,
}

必须显式地在 b256Address 类型之间进行转换:

sway
let my_number: b256 = 0x000000000000000000000000000000000000000000000000000000000000002A;
let my_address: Address = Address::from(my_number);
let forty_two: b256 = my_address.into();

ContractId 类型

ContractId 类型也是对原始 b256 类型的类型安全封装。合约ID是一个唯一的、确定性的标识符,类似于 EVM 中合约地址。合约不能拥有 UTXOs,但可以拥有资产。

ContractId 的实现如下:

sway
pub struct ContractId {
    value: b256,
}

b256ContractId 类型间的转换同样需要显式操作:

sway
let my_number: b256 = 0x000000000000000000000000000000000000000000000000000000000000002A;
let my_contract_id: ContractId = ContractId::from(my_number);
let forty_two: b256 = my_contract_id.into();

Identity 类型

Identity 类型是一个枚举,允许处理 AddressContractId 类型。这在可以接受任一类型的场合非常有用,例如,从已识别的发送者那里接收资金,但不关心发送者是地址还是合约。

Identity 的实现如下:

sway
pub enum Identity {
    Address: Address,
    ContractId: ContractId,
}

必须显式地转换为 Identity

sway
let raw_address: b256 = 0xddec0e7e6a9a4a4e3e57d08d080d71a299c628a46bc609aab4627695679421ca;
let my_identity: Identity = Identity::Address(Address::from(raw_address));

使用 match 语句可以根据情况分别处理 AddressContractId,并处理它们执行逻辑不同的情况。

sway
let my_contract_id: ContractId = match my_identity {
    Identity::ContractId(identity) => identity,
    _ => revert(0),
};
sway
match my_identity {
    Identity::Address(address) => transfer_to_address(address, asset_id, amount),
    Identity::ContractId(contract_id) => force_transfer_to_contract(contract_id, asset_id, amount),
};

Identity 类型的一个常见应用场景是访问控制。通过使用 Identity,可以同时允许 ContractIdAddress 独立地进行访问控制。

sway
let sender = msg_sender().unwrap();
require(
    sender == storage
        .owner
        .read(),
    MyError::UnauthorizedUser(sender),
);