区块链学习第十三期

myBlog

Contracts解读

[toc] ---

ERC1155 导读

什么是 ERC1155

这个提案创建一个标准方法以发布和检测智能合约实现了哪些接口

有哪些特点

  • 接口如何识别
  • 合约如何发布实现的接口
  • 如何检测合约是否实现了 ERC-165
  • 如何检测合约是否实现了某个接口

对于一些“标准的接口” ,如: ERC20 标准代币接口,有时查询合约是否支持接口以及是否支持接口的版本很有用,以便调整与合约的交互方式。 特别是对于 ERC-20,已经提出了版本标识符。
本提议标准化了接口的概念,并标准化了接口标识(命名)。

接口怎么得到

接口 ID(interface identifier)定义为接口中所有函数选择器的异或(XOR)。

如何检测合约是否实现了 ERC-165

  1. 在合约地址上使用附加数据(input data)
    0x “01ffc9a7” ”01ffc9a7“ 0000000000000000000000000000000000000000
    0000000000000000(前 4 函数选择器 后 4 位是 interfaceID interfaceID 由各函数的 selector 的结果异或算得)和 gas 30,000 进行 STATICCALL 调用,相当于 contract.supportsInterface(0x01ffc9a7)。

  2. 如果调用失败或返回 false , 说明合约不兼容 ERC-165 标准

  3. 如果返回 true,则使用输入数据 0x“01ffc9a7”“ffffffff” 000000000000000000000000000000000000000000000000000000000000 进行第二次调用。

  4. 如果第二次调用失败或返回 true,则目标合约不会实现 ERC-165(不允许合约内出现接口 id 为 0xffffffff 的接口)。

  5. 若无 0xffffffff,则它实现了 ERC-165。

如何检测合约是否实现了某个接口

  1. 如果不确定合约是否实现 ERC-165,请使用上面的方法进行确认。
  2. 如果没有实现 ERC-165,那么你将不得不看看它采用哪种老式方法。
  3. 如果实现了 ERC-165,那么只需调用 supportsInterface(interfaceID) 来确定它是否实现了对应的接口。

如果我要检测某个合约是否实现了 ERC20 标准

应用场景

一个项目实现了 ERC165 接口,并可以通过该接口查询该项目实现了哪些其他的接口,可以供其他人查询。(前提是这个合约需要配合,一般建立在小组/公司内部开发中)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
pragma solidity ^0.8.0;

contract ERC165 {
bytes4 private constant _InterfaceId_ERC165 = 0x01ffc9a7;
mapping(bytes4 => bool) private _supportedInterfaces;
constructor() {
_registerInterface(_InterfaceId_ERC165); // 本合约实现了ERC165
}
function supportsInterface(bytes4 interfaceId) external view returns (bool) {
return _supportedInterfaces[interfaceId];
}
function _registerInterface(bytes4 interfaceId) internal {
require(interfaceId != 0xffffffff, "Can't register 0xffffffff");
_supportedInterfaces[interfaceId] = true;
}
}

contract Example is ERC165 {
// 继承了上文的函数,但是没有继承他们的数据
// 因此这个合约中可以使用supportInterface()
bytes4 public interfaceImplemented = 0x11111111; //若本项目/合约实现了某接口,且id为0x11111111,则可以直接设置为true
constructor() public {
_registerInterface(interfaceImplemented);
}
}


手写梳理(临时学习记录)

笔记 介绍
合约安全事故
经典攻击 1
经典攻击 2
经典攻击 3