Skip to content

Commit 54c9fcb

Browse files
committed
Add study notes for 2025-08-15
1 parent 6336a7e commit 54c9fcb

1 file changed

Lines changed: 91 additions & 0 deletions

File tree

Sillyzhe.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,97 @@ timezone: UTC+8
1515
## Notes
1616

1717
<!-- Content_START -->
18+
# 2025-08-15
19+
20+
### 7 抽象合约和接口
21+
22+
如果一个智能合约里至少有一个未实现的函数,即某个函数缺少主体{}中的内容,则必须将该合约标为abstract,不然编译会报错;另外,未实现的函数需要加virtual,以便子合约重写。
23+
24+
拿我们之前的插入排序合约为例,如果我们还没想好具体怎么实现插入排序函数,那么可以把合约标为abstract,之后让别人补写上。
25+
26+
```solidity
27+
// SPDX-License-Identifier: MIT
28+
pragma solidity ^0.8.20;
29+
30+
import "@openzeppelin/contracts/interfaces/IERC165.sol";
31+
32+
abstract contract InsertionSort{
33+
function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
34+
}
35+
36+
```
37+
38+
接口是一种不能包含任何代码的合约,它只能包含函数声明,不能包含函数实现。例如:
39+
40+
```solidity
41+
42+
interface IERC721 is IERC165 {
43+
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
44+
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
45+
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
46+
47+
function balanceOf(address owner) external view returns (uint256 balance);
48+
49+
function ownerOf(uint256 tokenId) external view returns (address owner);
50+
51+
function safeTransferFrom(address from, address to, uint256 tokenId) external;
52+
53+
function transferFrom(address from, address to, uint256 tokenId) external;
54+
55+
function approve(address to, uint256 tokenId) external;
56+
57+
function getApproved(uint256 tokenId) external view returns (address operator);
58+
59+
function setApprovalForAll(address operator, bool _approved) external;
60+
61+
function isApprovedForAll(address owner, address operator) external view returns (bool);
62+
63+
function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data) external;
64+
}
65+
```
66+
67+
#### IERC721事件
68+
69+
`IERC721`包含3个事件,其中Transfer和Approval事件在ERC20中也有。
70+
71+
* Transfer事件:在转账时被释放,记录代币的发出地址from,接收地址to和tokenId。
72+
* Approval事件:在授权时被释放,记录授权地址owner,被授权地址approved和tokenId。
73+
* ApprovalForAll事件:在批量授权时被释放,记录批量授权的发出地址owner,被授权地址operator和授权与否的approved。
74+
75+
#### IERC721函数
76+
77+
* balanceOf:返回某地址的NFT持有量balance。
78+
* ownerOf:返回某tokenId的主人owner。
79+
* transferFrom:普通转账,参数为转出地址from,接收地址to和tokenId。
80+
* safeTransferFrom:安全转账(如果接收方是合约地址,会要求实现ERC721Receiver接口)。参数为转出地址from,接收地址to和tokenId。
81+
* approve:授权另一个地址使用你的NFT。参数为被授权地址approve和tokenId。
82+
* getApproved:查询tokenId被批准给了哪个地址。
83+
* setApprovalForAll:将自己持有的该系列NFT批量授权给某个地址operator。
84+
* isApprovedForAll:查询某地址的NFT是否批量授权给了另一个operator地址。
85+
* safeTransferFrom:安全转账的重载函数,参数里面包含了data。
86+
87+
什么时候使用接口呢?
88+
89+
* 当你想要定义一个标准的API,让其他合约实现这个API时,可以使用接口。
90+
91+
```solidity
92+
contract interactBAYC {
93+
// 利用BAYC地址创建接口合约变量(ETH主网)
94+
IERC721 BAYC = IERC721(0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D);
95+
96+
// 通过接口调用BAYC的balanceOf()查询持仓量
97+
function balanceOfBAYC(address owner) external view returns (uint256 balance){
98+
return BAYC.balanceOf(owner);
99+
}
100+
101+
// 通过接口调用BAYC的safeTransferFrom()安全转账
102+
function safeTransferFromBAYC(address from, address to, uint256 tokenId) external{
103+
BAYC.safeTransferFrom(from, to, tokenId);
104+
}
105+
}
106+
107+
```
108+
18109
# 2025-08-14
19110

20111
### 5 继承

0 commit comments

Comments
 (0)