@@ -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