Skip to content

Commit

Permalink
button merge 9.28 lost
Browse files Browse the repository at this point in the history
  • Loading branch information
buttonwild committed Sep 29, 2024
2 parents a172119 + ac41824 commit 81849bc
Show file tree
Hide file tree
Showing 30 changed files with 1,274 additions and 24 deletions.
42 changes: 42 additions & 0 deletions 0xiaoyu.md
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,48 @@ struct Student {

选择哪种方法取决于具体需求、代码可读性和 gas 优化考虑。



### 2024.09.28

學習內容:

- [solidity-101 第七课 映射类型 mapping](https://www.wtf.academy/docs/solidity-101/Mapping/)

笔记


#### 映射(Mapping)的基本概念
- 通过键(`Key`)查询对应的值(`Value`
- 声明格式:`mapping(_KeyType => _ValueType)`
- 示例:
```solidity
mapping(uint => address) public idToAddress; // id映射到地址
mapping(address => address) public swapPair; // 币对的映射,地址到地址
```

#### 映射的规则
1. `_KeyType` 只能是 Solidity 内置的值类型(如 `uint``address`),不能用自定义结构体
2. 映射的存储位置必须是 `storage`
3. 声明为 `public` 时,Solidity 自动创建 getter 函数
4. 新增键值对语法:`_Var[_Key] = _Value`

#### 映射的原理
1. 不储存键(`Key`)的信息,没有 length 信息
2. 使用 `keccak256(abi.encodePacked(key, slot))` 作为 offset 存取 value
3. 未赋值的键初始值为该类型的默认值(如 uint 默认为 0)

#### 思考与解答
1. 为什么映射的 `_KeyType` 不能使用自定义结构体?
- 这可能是为了确保键的唯一性和哈希计算的效率。内置类型有固定的大小和明确的哈希方法,而自定义结构体可能导致复杂性和不确定性。

2. 映射为什么必须存储在 `storage` 中?
- 映射通常用于存储大量数据和持久化信息。`storage` 是区块链上的永久存储空间,适合存储这种需要长期保存的数据结构。

3. 映射不存储键信息会有什么影响?
- 这意味着我们无法直接获取所有的键或遍历映射。如果需要这些功能,通常需要额外维护一个数组来存储所有的键。


### 2024.09.28

學習內容:
Expand Down
14 changes: 12 additions & 2 deletions Ariel.md
Original file line number Diff line number Diff line change
Expand Up @@ -321,10 +321,20 @@ Solidity三种抛出异常的方法:error,require和assert
3. assert(检查条件),当检查条件不成立的时候,就会抛出异常。
4. error方法gas最少,其次是assert,require方法消耗gas最多!因此,error既可以告知用户抛出异常的原因,又能省gas
### 2024.09.
### 2024.09.29
學習內容:WTF #16
![image](https://github.com/user-attachments/assets/599163cf-49f6-4353-97d4-d1ab7528d376)
# 16:overloading
名字相同但输入参数类型不同的函数可以同时存在,他们被视为不同的函数(返回了不同的结果)。注意,Solidity不允许修饰器(modifier)重载,会把输入的实际参数和函数参数的变量类型做匹配。 如果出现多个匹配的重载函数(即一輸入可以進入不同overloding function 時),则会报错
### 2024.09.
學習內容:WTF #17
# 16:
# 17:
<!-- Content_END -->
49 changes: 49 additions & 0 deletions Aris.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,4 +277,53 @@ timezone: Asia/Shanghai
5. 第 07 节测验得分: 100, 答案: BADABB
---
### 2024.09.29
#### 学习内容 8. 变量初始值
在 solidity 中,声明但是没复制的变量都有默认值(初始值)
1. 值类型:
- boolean: fasle
- string: ""
- int: 0
- uint: 0
- enum: 第一个元素
- addres: 0x000000000000000000000000000000 (addres(0))
- function:
- internal: 空白函数
- external: 空白函数
2. 引用类型:
- 映射 mapping:其value值数据类型的默认值
- 结构体 struct:其成员值数据类型的默认值
- 静态数组: 定长,其成员值数据类型的默认值
- 动态数组: []
3. delete 操作符
- delete 操作符会让变量值变为其默认值
4. 合约部署
- ![image-20240929101542907](content/Aris/image-20240929101542907.png)
5. 第 08 节测验得分: 100, 答案: CBDDA
#### 学习内容 9. 常数 constant和immutable
1. constant(常量),immutable(不变量)
- 状态变量声明这两个变量以后,不能在初始化之后再更改;
- 提升合约安全性
- 节省 gas 费用
- 只有数值变量可以声明为 constant 和 immutable
- string 和 bytes 可以声明为 constant,不能为 immutable
2. constant
- constant 必须在声明的时候初始化,之后不可变
3. immutable
- immutable 变量可在声明时或者构造函数中初始化
4. 合约部署
- ![image-20240929104513664](content/Aris/image-20240929104513664.png)
5. 第 09 节测验得分: 100, 答案:ACDDC
---
<!-- Content_END -->
6 changes: 6 additions & 0 deletions CraigC.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,10 @@ timezone: Asia/Shanghai
<!-- Content_END -->


### 2024.09.29
[WTF Academy Solidity 101 09 Note](content/CraigC/09.md)

<!-- Content_END -->


<!-- Content_END -->
27 changes: 27 additions & 0 deletions Dida.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,33 @@ function <function name>(<parameter types>) {internal|external|public|private} [



### 2024.09.28

#### 函式輸出

Solidity 有兩個關鍵字 `return``returns` 差別在
- `returns`: 用來定義函式的回傳值的型態及名稱
- `return`: 在函式內,用於在設定回傳值
```
// 對回傳參數進行命名
function returnNamed() public pure returns(unit256 _number, bool _bool, unit256[3] memory _array) {
return(1, true, [unit256(1),2,5])
}
```

#### 解賦值
- 讀取所有返回值
```
uint256 _number;
bool _bool;
uint256[3] memory _array;
(_number, _bool, _array) = returnNamed();
```
- 讀取部份返回值
```
// 不讀取的留空,單存只設定要讀取返回值的變量
(, _bool2, ) = returnNamed();
```

<!-- Content_END -->

Expand Down
39 changes: 39 additions & 0 deletions FFFFourwood.md
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,45 @@ Solidity的合约可以继承多个合约。规则:

另外,接口与合约 ABI(Application Binary Interface)等价,可以相互转换:编译接口可以得到合约的 ABI,利用 `abi-to-sol` 工具,也可以将 ABI json 文件转换为接口 sol 文件。

### 2024.09.29



抽象合约
如果智能合约中至少有一个未实现的函数(即函数没有主体`{}`),该合约必须标为`abstract`,否则编译时会报错。未实现的函数需要加`virtual`关键字,以便子合约可以重写它。


接口
接口类似于抽象合约,但它不实现任何功能,且有以下规则:
- 不能包含状态变量。
- 不能包含构造函数。
- 不能继承除接口外的其他合约。
- 所有函数都必须是`external`且不能有函数体。
- 非抽象合约继承接口后,必须实现接口定义的所有功能。

接口定义了合约的功能及如何与之交互。如果一个合约实现了某个接口(如ERC20或ERC721),其他Dapps和合约就知道如何与它交互。接口提供两个关键信息:
1. 每个函数的`bytes4`选择器及函数签名。
2. 接口ID(EIP165标准)。

接口和合约ABI等价,接口可以转换为ABI,ABI也可用工具转为接口。


IERC721事件
- **Transfer**:转账时释放,记录发出地址`from`,接收地址`to``tokenId`
- **Approval**:授权时释放,记录授权地址`owner`,被授权地址`approved``tokenId`
- **ApprovalForAll**:批量授权时释放,记录发出地址`owner`,授权地址`operator`和授权状态。

IERC721函数
- `balanceOf`:返回某地址的NFT持有量。
- `ownerOf`:返回指定`tokenId`的持有人地址。
- `transferFrom`:普通转账,参数为转出地址、接收地址和`tokenId`
- `safeTransferFrom`:安全转账,要求接收方(合约地址)实现ERC721Receiver接口。
- `approve`:授权另一个地址使用NFT。
- `getApproved`:查询指定`tokenId`授权给了哪个地址。
- `setApprovalForAll`:将自己持有的NFT批量授权给某个地址。
- `isApprovedForAll`:查询某地址的NFT是否已批量授权给另一个地址。
- `safeTransferFrom`:带有额外`data`参数的安全转账函数。



<!-- Content_END -->
22 changes: 22 additions & 0 deletions He​len.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,28 @@ timezone: Asia/Shanghai
## Notes

<!-- Content_START -->
### 2024.09.28
進度:短路規則(Short-Circuiting)

1. 短路規則(Short-Circuiting)在邏輯運算中為`優化`作用, `condition`
例:
對於 `&&`(邏輯與),當左邊的條件為 `false` 時,右邊的條件不再被計算,因為無論右邊的條件是什麼,結果必然是 `false`

範例:
```
bool condition = false && expensiveFunction();
// `expensiveFunction()` 不會被執行
```
2. 對於 ||(邏輯或),當左邊的條件為 true 時,右邊的條件不會再被計算,因為結果已經是 true

範例:
```
bool condition = true || expensiveFunction();
// `expensiveFunction()` 不會被執行
```
`Sum`
這種短路行為可以避免不必要的計算,特別是在運算代價``的情況下(例如調用一個耗時的函數時),提高效率。

### 2024.09.26
進度:值类型

Expand Down
51 changes: 50 additions & 1 deletion JB.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,8 @@ contract array_struct {

总结:对语法不熟悉,对数组修饰符之间的变量赋值影响理解不够深刻。

##2024/09/27
### 2024.09.27

学习了mapping的映射。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
Expand All @@ -316,6 +317,54 @@ contract Map{

}

### 2024.09.28
学习了变量初始值的,以及如何使用delete方法恢复变量的初始值。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract initValue {

bool public _bool;
string public _string;
int public _int;
uint public _uint;
address public _address;

enum Action {Buy, Hold, Sell}

Action public _enum;

struct Student {
uint score;
uint id;
}

Student private _tom;

function fi() internal {}

function gi() external {}

uint256 [5] _static;
uint [] _dynamic;

function test_bool() public {
_bool = true;
}

function call() external returns(bool ) {
this.test_bool();
return _bool;

}

function call_delete() external {
_bool = this.call();
delete _bool;
}
}

![image](https://github.com/user-attachments/assets/f72bb525-5f6d-4143-9449-f1a69d8ed252)

### 2024.09.29
学习了常量constant和不可变量 immutable
// SPDX-License-Identifier: MIT
Expand Down
10 changes: 7 additions & 3 deletions JLsgl.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,13 @@ timezone: Asia/Shanghai
以及Solidity中,時間單位會是一個重要的概念,
又吸收新資訊,太好了。
### 2024.09.28
奇怪?昨天我有上傳?
而且下午更新今天學習內容時,也還有看到紀錄...
我再找找看是不是放錯地方了
06章節裡,
看到有,數組Array和結構體Struct等內容
目前不是很理解今天的段落,
應該就先硬記起來,
往後續章節看過學習後,
再來回顧複習好了。

### 2024.09.29
07內容,下午寫得不見了,
再簡單寫一次,
Expand Down
23 changes: 23 additions & 0 deletions Johnny.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,4 +205,27 @@ function reset() external {
contract A is B, C
```

### 2024.09.28

#### 14. Interface

`interface` 的規則如下:
1. 不能包含狀態變量
2. 不能包含構造函數
3. 不能繼承除了接口之外的其他合約
4. 所有函數必須是 `external` 且不能有函數體
5. 繼承 `interface` 的非抽象(`abstract`)合約必須實現 `interface` 定義的所有功能

`interface` 提供了兩個重要的訊息:

合約中每個函數的 `bytes4` 選擇器,以及函數簽名 `函數名稱(參數類型)`

例如:`function transfer(address recipient, uint256 amount) external returns (bool);`

`bytes4` 選擇器為 `bytes4 selector = bytes4(keccak256("transfer(address,uint256)"));`

其函數簽名為 `transfer(address,uint256)`

標記為 abstract 的合約可以被編譯,但是不能被部署,這是因為在部署時,必須實踐所有函數。

<!-- Content_END -->
6 changes: 6 additions & 0 deletions MaggieS.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,10 @@ Modifiers are like rules that we can apply to functions. They allow us to add ex
8. Events
Events allow contracts to communicate with external applications. They are like messages that can be logged on the blockchain and listened to by other programs.

It's the first time to write Step2 QA,

using too much time to choose questions,it's little hard.

I need more time to oganize today's two questions' answer.

<!-- Content_END -->
Loading

0 comments on commit 81849bc

Please sign in to comment.