數據類型
在 Solidity 中,類型系統非常豐富,主要分為 值類型(Value Types)和 引用類型(Reference Types)。此外,還有一些特殊類型和全局變量。
一.值類型
布爾型(bool)
bool isActive = true;
二. 整數型(int/uint)
int
:帶符號整數(可以是負數),uint
:無符號整數(只能是非負數)- 指定位寬:
int8
到int256
(步長為 8 位),默認int
等于int256
- 同理,
uint
默認等于uint256
int256 minValue = -1000;
uint256 maxValue = 1000;
三. 地址類型(address 和 address payable)
可以使用 balance
屬性查詢地址的余額,并使用 transfer
函數向可支付地址發送以太幣(以 wei 為單位)
address payable x = payable(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);
固定長度字節數組(bytes1 到 bytes32)
bytes32 data = "hello";
動態字節數組(bytes 和 string)
//bytes:動態長度的字節數組,適合存儲任意二進制數據
//string:動態長度的 UTF-8 字符串
bytes dynamicData = "Hello";
string greeting = "Hello, World!";
枚舉(enum)
enum Status { Pending, Shipped, Accepted, Rejected, Canceled }
Status public currentStatus = Status.Pending;
函數類型(function)
//分為 internal 和 external,表示合約內外的函數調用方式。function add(uint a, uint b) public pure returns (uint) {return a + b;
}
二.引用類型(Reference Types)
引用類型的數據存儲在內存(Memory)或存儲(Storage)中,傳遞時是「引用傳遞」,改變值會影響原數據。
數組(Array)
- 固定長度數組:
uint[5] arr;
- 動態長度數組:
uint[] dynamicArr;
- 可以使用
push()
、pop()
、length
等方法操作。
uint[] numbers;
numbers.push(1);
結構體(Struct)
自定義數據結構,用于封裝多種類型的變量
struct Person {string name;uint age;
}
Person public person = Person("Alice", 30);
映射(Mapping)
類似哈希表,key
映射到 value
,key
可以是任何基本類型,但 value
可以是任意類型。
mapping(address => uint) public balances;
存儲位置(Data Location)
memory
:函數調用時使用的臨時內存,函數返回后即丟棄。storage
:合約的持久存儲,狀態變量默認是storage
。calldata
:函數的參數存儲在calldata
中,無法修改,節省 Gas 費。
三、特殊類型和全局變量
合約類型(Contract)
可以定義合約類型,支持合約之間的交互。
contract MyContract {function greet() public pure returns (string memory) {return "Hello!";}
}
全局變量
提供區塊鏈信息和交易信息:
msg.sender
:調用合約的地址msg.value
:調用時發送的以太幣數量block.timestamp
:當前區塊的時間戳
address sender = msg.sender;
總結
- 值類型:
bool
、int/uint
、address
、bytes
、string
、enum
、function
- 引用類型:
array
、struct
、mapping
- 存儲位置:
memory
、storage
、calldata
- 特殊類型:
contract
、interface
、library