区块链类型
Sway 本质上是一种面向区块链的语言,它提供了一系列针对区块链应用场景优化的类型。
这些类型通过标准库(lib-std
)提供,既增加了类型安全程度,也使得开发者的意图更加明确。
Address
类型
Address
类型是对原始 b256
类型的类型安全封装。与 EVM 不同,Address
从不 指向已部署的智能合约(见下文的 ContractId
类型)。Address
可以是公钥的哈希(相当于外部所有账户)或 谓词 的哈希。地址拥有 UTXOs。
Address
的实现如下:
sway
pub struct Address {
value: b256,
}
必须显式地在 b256
和 Address
类型之间进行转换:
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,
}
b256
和 ContractId
类型间的转换同样需要显式操作:
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
类型是一个枚举,允许处理 Address
和 ContractId
类型。这在可以接受任一类型的场合非常有用,例如,从已识别的发送者那里接收资金,但不关心发送者是地址还是合约。
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
语句可以根据情况分别处理 Address
或 ContractId
,并处理它们执行逻辑不同的情况。
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
,可以同时允许 ContractId
和 Address
独立地进行访问控制。
sway
let sender = msg_sender().unwrap();
require(
sender == storage
.owner
.read(),
MyError::UnauthorizedUser(sender),
);