本次测试的合约地址:
https://rinkeby.etherscan.io/address/0x376f029b4ed9096c845453306731d14e9886d79a
本次实践课考察点:
1,如何在合约未开源情况下 Mint NFT 和交易复制
2,如何破除 mint 的数量限制
3,如何直接通过 HEX Data 进行链上交互
Q1. 指出此次合约因为缺乏什么的部件无法直接在 ethscan 交互:#
A
Q2: 写出你进行交互时使用的 HEX DATA(16 进制数据),要求:按照参数的顺序排列,一个参数一行。#
A:
mint:
0x1b2ef1ca (Method ID)
0000000000000000000000000000000000000000000000000000000000000000 (uint256 id)
0000000000000000000000000000000000000000000000000000000000000001 (uint256 amount)
原型为 mint(uint256 id, uint256 amount)
使用 keccak256(“mint(uint256,uint256)”)
可以得到函数的 hash 值 (1b2ef1ca104ec753c817f038e7e2a0c7cb28cc3c0877c7c2b78e5a14a407a623) , 取前四个字节即可得到函数的 ID 0x1b2ef1ca 。
safeTransferFrom:
0xf242432a (Method ID)
address from
address to
0000000000000000000000000000000000000000000000000000000000000000 (uint256 id)
0000000000000000000000000000000000000000000000000000000000000001 (uint256 amount)
00000000000000000000000000000000000000000000000000000000000000a0 (bytes data)
0000000000000000000000000000000000000000000000000000000000000000 (bytes data)
原型为:
safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data)
https://docs.openzeppelin.com/contracts/3.x/api/token/erc1155#IERC1155-safeTransferFrom-address-address-uint256-uint256-bytes-
此为 1155 的标准接口,不再做过多解释,具体内容可以看上面的 OZ 官方文档。
Q: 附加题:指出为何合约可以通过 16 进制交互,以及问题 1 中缺失的文件在用户与合约交互中拥有什么意义。#
A3上的交互本身就是通过 bytecode 进行的,正如第二题所示,你完全可以通过手写 HEX data 来定位函数 ID,组合函数参数。
ABI 全称 Application Binary Interface,字面意思是应用程序二进制接口,记录的是已经编译成 bytecode 的合约中各个对外开放的变量与接口等所对应的定义时的原型,可以通俗的理解为合约的接口说明。
从第二题可以看出,合约编译时,是通过keccak256(”functionName(parameterType…)”)
计算 hash,得到 Method ID。而众所周知 Hash 计算是不可逆的,我们没法通过计算来反向得出函数 ID 所代表的函数定义。
实际部署到链上的合约,是只包含 bytecode 的,因此如果你没有编译时所生成的 ABI 文件的话,便只能通过自行组织 HEX data 进行互动。
所以 ABI,实际上就是用来记录函数定义,方便在其他地方可以更清晰可读性更高的手段,以避免通过难以辨别的 bytecode 与合约进行交互。
结语:
所谓 “科学家 mint” 一些比较基础的常用手段都在本次的试题中覆盖到了。
合约未开源,项目方的 mint 前端又因为流量太大瘫痪的情况下,可以考虑直接复制别人的交易数据,手动通过 HEX Data 进行 mint。
在只允许一个账号 mint 固定数量个的情况下如何超过限制 mint 多个,只需要多个账号 mint 然后归结到一个账号里就行。最近的可以免费 mint 一个的各种图狗就有很多这种 bot 进行多账号,然后归结到同一个账号里进行售出。而如果是白名单限制了可以 mint 的帐户的情况,可以 mint 后将 nft 转出到别的账号,然后继续 mint,之后再归结回来。
以上的例子看上去似乎很蠢,但都是实际项目中发生过的。
可以看出,在你学习了一些开发的基础知识之后,这些所谓 “科学家手段” 都并没有什么高深之处。将以上行为通过自己开发的脚本进行自动执行后,你也就成为了所谓 “科学家”(也就是传统开发领域里所说的脚本小子)。
我们的推特: