---
title: 'Solidity WTF 101 1 ~ 4 單元'
lang: zh-tw
---
Solidity WTF 101 1 ~ 4 單元
===
:::info
:date: 2024/09/23
:::
[TOC]
## 型別
#### 1. 整數
* int 整數包括負數
* uint 無符號 只有正整數
* uint256 無符號且有256位
#### 2. 地址類型
* address: 普通地址,可儲存20字節的值(以太坊地址的大小)
* payable address: 多加上了payable的語法,比普通地址多了 **transfer** 和 **send**,用於接收或轉帳
#### 3. ENUM
* 不只Solidity,在Angular中也有存在enum,用於提高可讀型與維護,分配名稱之用途。
```xml
// 用enum将uint 0, 1, 2表示为Buy, Hold, Sell
enum ActionSet { Buy, Hold, Sell }
// 创建enum变量 action
ActionSet action = ActionSet.Buy;
```
## Remix
#### 介紹
* 是一個相對其他IDE來說,較為簡單的開發工具,適合Solidity使用,能夠更值觀的部屬與查看compiler後的情況。

## 函數
這應該算是 `重中之重` 任何的邏輯都離不開function,每個語言的funciton特性都不一樣,先上範例程式碼(不是正規,重點在先瞭解)
```xml
function <function name>(<types parameter>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
```
1. `function` : 宣告為函數
2. `function name` : 函數名稱
3. `<types parameter>` : 函數帶入的參數為先行別後名稱 EX:`uint8 test`
4. `{internal|external|public|private}`
* `internal` : 只能從合約內部使用,意思是如果在A合約內宣告一個B fun,那我只能在A合約內使用,只要與A合約有繼承關係也皆可使用。
* `external` : 只能從合約外部使用,與 `internal` 相反。
* `public` : 共有,大家都可以使用。
* `private` : 只能合約內部使用,與 `internal` 類似,但差別是繼承關係的無法使用。
:::info
:bulb: **Tips** : public | private | internal 也可用于修饰状态变量。public变量会自动生成同名的getter函数,用于查询数值。未标明可见性类型的状态变量,默认为internal
:::
5. `[pure|view|payable]`
* `pure` : 不能讀取鏈上也不能寫入。
* `view` : 只能讀取鏈上,不會對鏈上有人和寫入的動作。
* `payable` : 意思是此function是一個可以轉入ETH的,能進行接收與轉帳。
:::info
:bulb: **Tips** : pure|view pure與view的差別在於能不能讀取鏈上資訊,為何需要這兩個?
因為在鏈上任何操作都是需要gas fee的,下方是大致需要費用的使用。
:::
---
5-1. 寫入狀態到鏈上。
5-2. 釋放事件。
5-3. 創建合约。
5-4. 使用 selfdestruct.
5-5. 通过调用发送以太币。
5-6. 调用任何未标记 view 或 pure 的函数。
5-7. 使用低级调用(low-level calls)。
5-8. 使用包含某些操作码的内联汇编。
---
6. `[returns ()]` : 規定函數返回的型別,下方例子代表只能返回為uint8的參數。
```xml
returns (uint8)
```
* 命名式返回
```xml
function returnNamed() public pure returns(uint256 _number, bool _bool, uint256[3] memory _array){
_number = 2;
_bool = false;
_array = [uint256(3),2,1];
}
```
這樣就不需要在內部邏輯加上return也可以返回值。
* 結構式賦值
* 使用`,`隔開,會自動辨別傳入得值
```xml
uint256 _number;
bool _bool;
uint256[3] memory _array;
(_number, _bool, _array) = returnNamed();
```
* 若為空白,就不讀取空白處返回的值
```xml
(, _bool2, ) = returnNamed();
```
下方是執行結果,那`(, _bool2, )`的情況,他只會把false帶入給_bool2。
