区块链学习第十三期
Contracts解读
[toc] ---ERC1155 导读
什么是 ERC1155
这个提案创建一个标准方法以发布和检测智能合约实现了哪些接口
有哪些特点
- 接口如何识别
- 合约如何发布实现的接口
- 如何检测合约是否实现了 ERC-165
- 如何检测合约是否实现了某个接口
对于一些“标准的接口” ,如: ERC20 标准代币接口,有时查询合约是否支持接口以及是否支持接口的版本很有用,以便调整与合约的交互方式。 特别是对于 ERC-20,已经提出了版本标识符。
本提议标准化了接口的概念,并标准化了接口标识(命名)。
接口怎么得到
接口 ID(interface identifier)定义为接口中所有函数选择器的异或(XOR)。
如何检测合约是否实现了 ERC-165
在合约地址上使用附加数据(input data)
0x “01ffc9a7” ”01ffc9a7“ 0000000000000000000000000000000000000000
0000000000000000(前 4 函数选择器 后 4 位是 interfaceID interfaceID 由各函数的 selector 的结果异或算得)和 gas 30,000 进行 STATICCALL 调用,相当于 contract.supportsInterface(0x01ffc9a7)。如果调用失败或返回 false , 说明合约不兼容 ERC-165 标准
如果返回 true,则使用输入数据 0x“01ffc9a7”“ffffffff” 000000000000000000000000000000000000000000000000000000000000 进行第二次调用。
如果第二次调用失败或返回 true,则目标合约不会实现 ERC-165(不允许合约内出现接口 id 为 0xffffffff 的接口)。
若无 0xffffffff,则它实现了 ERC-165。
如何检测合约是否实现了某个接口
- 如果不确定合约是否实现 ERC-165,请使用上面的方法进行确认。
- 如果没有实现 ERC-165,那么你将不得不看看它采用哪种老式方法。
- 如果实现了 ERC-165,那么只需调用 supportsInterface(interfaceID) 来确定它是否实现了对应的接口。
如果我要检测某个合约是否实现了 ERC20 标准
应用场景:
一个项目实现了 ERC165 接口,并可以通过该接口查询该项目实现了哪些其他的接口,可以供其他人查询。(前提是这个合约需要配合,一般建立在小组/公司内部开发中)
1 | pragma solidity ^0.8.0; |
手写梳理(临时学习记录)
笔记 | 介绍 |
---|---|
合约安全事故 | |
经典攻击 1 | |
经典攻击 2 | |
经典攻击 3 |