慢雾创始人余弦:3分钟了
慢雾创始人余弦:3分钟了解CryptoPunks V1 (wrapped) ——漏洞导致的分叉文化
注:原文来自慢雾创始人余弦发布长推,MarsBit整理如下:
今天看到这篇文章科普了 Wrapped CryptoPunks:
https://m.marsbit.cc/newsdetailShare/20230423094035639766.html…
正好之前有一些笔记,也顺便分享出来,方便大家对早年分叉存在的 CryptoPunks V1 (wrapped) @v1punks 也有个对比了解;-)
Punks 目前存在的主要形态有:
- CryptoPunks - ERC20 版本,早于 NFT 721 标准
- Wrapped CryptoPunks - CryptoPunks 的 Wrapper 版本,兼容了 721 标准,方便交易
- CryptoPunks V1 (wrapped) - 也称 V1 Punks,早年分叉且兼容 721 标准
分别对应如图,前两者都是 Yuga Labs 认可。
为什么会出现这种情况,尤其是 V1 Punks 的出现,是因为最早缘起 2017 年 CryptoPunks 的一个漏洞: https://etherscan.io/address/0x6ba6f2207e343923ba692e5cae646fb0f566db8d#code…
简单来说就是买家买一个 Punk,花的 ETH 不会给到卖家,会回到自己的口袋,等于是空手套白狼了。代码上的核心在于:
struct Offer {
bool isForSale;
uint punkIndex;
address seller;
uint minValue; // in ether
address onlySellTo; // specify to sell only to a specific person
}
buyPunk 函数:
punkNoLongerForSale(punkIndex); // 这里面将 msg.sender 覆盖了 offer.seller,导致下面的 offer.seller 引用实际上是指向 msg.sender(即买家):
pendingWithdrawals[offer.seller] += msg.value;
修复的核心是:
address seller = offer.seller; // 每次 buyPunk 都会初始化这个 seller,这样就确保 seller 不会被覆盖。
好,这是起源。后来 Larva Labs 2017 年就修复了。万万没想到,2022.1.17,V1 Punks 基于最早这个漏洞代码搞了所谓的真正的 CryptoPunks,采用 ERC721 全新封装: https://v1punks.io https://etherscan.io/address/0x282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d#code… 搞得有模有样,可能 Larva Labs 最不该的就是卖了 V1 Punks,然后再踩一脚,导致 V1 Punks 更知名了。参考:
The Two CryptoPunks, V1 and V2: Can V1 and V2 CryptoPunks Coexist or Will Copyright Tear Them Apart?
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4032777
期间,因为 Larva Labs 打官司,OpenSea 一度下了 V1 Punks,不过后来又恢复了: https://opensea.io/collection/official-v1-punks… 至此,V1 Punks 的文化诞生。Larva Labs 正统的 CryptoPunks 等卖给了 BAYC 的公司 Yuga Labs(这个成为了 CryptoPunks 当前的“官方”)。
这段历史挺有意思,对于安全研究来说也很有意义,一个漏洞导致的分叉文化。