內(nèi)容概要
粉絲反饋,他在opensea無gas免費(fèi)創(chuàng)建的NFT資產(chǎn),竟能出現(xiàn)在小狐貍錢包里,而opensea官方聲明的此NFT在正式交易前是未上鏈鑄造的,這就很奇怪,中心化應(yīng)用的資產(chǎn)出現(xiàn)在為去中心化應(yīng)用服務(wù)的錢包里,到底是官方代付gas上鏈還是烏龍,隨我一文揭曉!
目錄大綱
1. 背景簡(jiǎn)述
2. 破案歷程
????????2.1 小狐貍網(wǎng)絡(luò)抓包
?????????2.2 鏈上的交易統(tǒng)計(jì)
????????2.3 合約反編譯分
3. 破案總結(jié)
面向?qū)ο?/strong>
-
Web3新手,有無技術(shù)背景均可理解此文解密過程
背景簡(jiǎn)述
1.1 opensea 是什么?
全球最大的公鏈NFT交易平臺(tái),也是目前除以太坊鏈底層外營(yíng)收最大的web3平臺(tái),下文簡(jiǎn)述為os
?
1.2 NFT是什么?
????可見前文:【源碼解讀】你買的NFT到底是什么?
1.3 NFT鑄造是什么?
??????可見前文:當(dāng)奈飛的NFT忘記了web2的業(yè)務(wù)安全
????大意是,只有在鏈上Mint后的才能認(rèn)為是資產(chǎn),且一般用戶需要付gas
1.4?os的免費(fèi)創(chuàng)造NFT服務(wù)是什么?
NFT上鏈成本高,標(biāo)準(zhǔn)ERC721的mint需要8W的gas,約5刀
NFT定制合約難,雖有標(biāo)準(zhǔn)但頂級(jí)NFT項(xiàng)目會(huì)定制且部分強(qiáng)化功能,例如azuki(出品721A,降低批量mint成本)
因此,易用性一直就是市場(chǎng)的痛點(diǎn),畢竟藝術(shù)家不是合約工程師,需更低成本的試錯(cuò)來探索有價(jià)值的藝術(shù)品,官方也特別說明過(原文見附錄)
在opensea.io上create的NFT,符合ERC1155標(biāo)準(zhǔn),即使是它們存在于鏈上之前,這些 NFT 也可以在任何平臺(tái)上出售,在交易時(shí)才上鏈鑄造
破案歷程
2.1 案例來源
某粉絲很驚奇發(fā)現(xiàn),自己確實(shí)可以在os上按流程進(jìn)行create,但按官方說法此時(shí)是未上鏈的,但是他嘗試在小狐貍錢包里導(dǎo)入資產(chǎn)時(shí)發(fā)現(xiàn), 竟然已經(jīng)可見,甚至嘗試導(dǎo)入一個(gè)自己未create的NFTID時(shí)也能導(dǎo)入成功,因此反饋我尋找技術(shù)維度的全貌解讀
2.2 還原方式
1:os上 createNFT(附錄有官方教程)得到合約地址與ID
2:小狐貍上開啟NFT檢測(cè)后,再手動(dòng)添加收藏品,即出現(xiàn)Shared Storefront
?
2.3 調(diào)查不易
其實(shí)查詢資產(chǎn)是否上鏈?zhǔn)莻€(gè)非常容易的過程,用區(qū)塊鏈瀏覽器即可
見前文:當(dāng)我們?cè)诳碋therscan的時(shí)候,到底在看什么?
但是由于此os的NFT共享商店的合約并沒有做驗(yàn)證。所以無法直接看源碼查數(shù)據(jù)
但使用未經(jīng)開源以及安全審計(jì)的合約,著實(shí)讓我這從事多年安全行業(yè)的職業(yè)強(qiáng)迫癥有些難受
如果真存在風(fēng)險(xiǎn),其危害是巨大的
-
-
如果真未上鏈,小狐貍錢包去讀取中心化平臺(tái)數(shù)據(jù)?放在我的資產(chǎn)里?
-
如果真上了鏈,用戶無需gas,則可能官方付費(fèi)上鏈,雷同羊毛有被攻擊風(fēng)險(xiǎn)
-
未上鏈的資產(chǎn),如產(chǎn)生沖突風(fēng)險(xiǎn),那此NFT屬于誰的?
-
2.4 小狐貍app抓包
首先咱們通過對(duì)照實(shí)驗(yàn)做手機(jī)抓包,發(fā)現(xiàn)整體小狐貍會(huì)做的事情很多
拉取地址余額,交易,最新塊內(nèi)容,指定地址合約字節(jié)碼等等
?
對(duì)數(shù)百個(gè)網(wǎng)絡(luò)包逐個(gè)分析后,發(fā)現(xiàn)其小狐貍會(huì)使用infura(提供api接口同以太坊節(jié)點(diǎn)做交互的平臺(tái))的eth-call方法,功能是查詢指定NFT合約中標(biāo)準(zhǔn)的balanceof方法
為何我如此肯定?此請(qǐng)求包里沒有balanceof呀?
咱們用實(shí)驗(yàn)說話雙向校驗(yàn),標(biāo)準(zhǔn)的1155協(xié)議的標(biāo)準(zhǔn)函數(shù)名及參數(shù)為:
function balanceOf(address,uint256)
由于data構(gòu)建指定函數(shù)調(diào)用,其生成Mothod-ID的原理是名字+參數(shù)類型組合,因此他構(gòu)建的call方法,data字段的開頭必然為00fdd58e?
我輸 入的要添加資產(chǎn)是123號(hào),其data參數(shù)末尾對(duì)應(yīng)是7b=(7*16+11=123) 也對(duì)應(yīng)上。
同時(shí)發(fā)現(xiàn)其缺乏防重放的措施,所以我可以直接編輯參數(shù)
重發(fā)請(qǐng)求查詢其他NFT合約所有權(quán)來對(duì)比
-
azuki:721標(biāo)準(zhǔn),無得到0,有則非0
-
愛死機(jī):1155標(biāo)準(zhǔn),無得到0,有則得1
-
查os共享商店,修改參數(shù)尾數(shù)(剛才的123)確實(shí)會(huì)得到值但意義不明
所以這里我得出的一大驚奇猜想是(是錯(cuò)誤的):
鏈上可查得NFT所有權(quán)的值,難道真的上鏈了嗎?
2.5 鏈上交易統(tǒng)計(jì)
如果真上鏈其實(shí)也可以不由用戶支付gas,有種“元交易”的技術(shù)手法,就是交易發(fā)起方和gas支付者不同的形式,并且openzepplin里特地有個(gè)content?合約就是用于額外支持元交易產(chǎn)生的msg.sender?可能特殊化的問題
但是,我通過對(duì)此合約的鏈上交易數(shù)據(jù)統(tǒng)計(jì)(etherscan+dune),抽取23號(hào)一天出現(xiàn)的交易頻率可見下圖,都證明了好像并沒有固定由官方發(fā)起的元交易類型交易
?
2.6 破局得靠合約反編譯
由于官方?jīng)]有驗(yàn)證合約,導(dǎo)致分析起來費(fèi)勁多了,但可通過合約反編譯來大致摸清邏輯
如果只是openzepplin的標(biāo)準(zhǔn)1155庫(kù)進(jìn)行反編譯的話,行數(shù)是170行
但是此1155則反編譯后是1000行,因此必然有較多自定義實(shí)現(xiàn)
反編譯后整體是吻合1155的數(shù)據(jù)標(biāo)準(zhǔn)
mapping (uint256 => [uint256]) _balanceOf;
mapping (uint256 => [uint256]) _setApprovalForAll;
uint256[] _name;
uint256[] _symbol;
mapping (uint256 => [uint256]) _totalSupply;
但是也顯著有不是標(biāo)準(zhǔn)數(shù)據(jù)部分
mapping (uint256 => [uint256]) owner_a;
mapping (uint256 => [uint256]) _creator;
由于鏈上數(shù)據(jù)讀取返回了結(jié)果,所以重點(diǎn)分析balanceOf?函數(shù),他整體實(shí)現(xiàn)用了30多行,這是很明顯重寫了原先的標(biāo)準(zhǔn)函數(shù)
//此為標(biāo)準(zhǔn)1155協(xié)議的balanceOf 函數(shù)實(shí)現(xiàn),只是讀取指定id和地址的數(shù)值而已
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: balance query for the zero address");
return _balances[id][account];}
由于os他依舊是沿用標(biāo)準(zhǔn),所以他的兩個(gè)參數(shù)是固定的可以理解為:
- Varg0 = 待查詢NFTid所有權(quán)的用戶地址
- varg1 = 待查詢的NFTID 數(shù)字
從反編譯程序里看邏輯,他會(huì)讀取待查地址的_balanceOf總余額數(shù),以及此NFTID是否被_creator等等
//此為反編譯os合約的片段(太長(zhǎng)不粘來,反編譯網(wǎng)址在附錄)
function balanceOf(address varg0, uint256 varg1) public payable {
require(msg.data.length - 4 >= 64);
v0 = v1 = _balanceOf[varg0];
if (address(_creator[varg1]) == 0) {
v2 = v3 = address(varg1 >> 96) == varg0;
if (address(varg1 >> 96) != varg0) {
if (!(0xff & owner_a[varg0])) { 。。。
最關(guān)鍵的一句address(varg1 >> 96) != varg0
由于反編譯不會(huì)完全按照solidity的語(yǔ)法,所以原本不支持的位移運(yùn)算符就出現(xiàn)了
不講復(fù)雜的,總之這里將varg1?(NFTID)的其中一部分,和varg0(用戶地址)做比較
這也意味著,原來此NFT的ID包含了用戶的地址
我頓然醒悟,寫個(gè)進(jìn)制轉(zhuǎn)換,將我在os上create得到的NFTid傳入,解密得出
這個(gè)數(shù)值也和我在小狐貍抓包看到的data后半段內(nèi)容是一致
這里還可以繼續(xù)研讀代碼來挖掘細(xì)節(jié)
-
比如balanceOf?返回結(jié)果為2個(gè)值,會(huì)審計(jì)編號(hào)是否會(huì)超出_totalSupply?限定發(fā)行量
-
比如safeTransferFrom?專門設(shè)置_mint?防重放攻擊,在其中若未mint則進(jìn)行首次鑄造
在解讀出NFTID的組成后,我也頓時(shí)明白此合約的核心邏輯了
此ID由3部分構(gòu)成,用戶地址+系列編號(hào)+指定ID?,這也意味著無論我鑄造多少次,前xx位都是固定的,即我的錢包地址轉(zhuǎn)為10進(jìn)制而已,而他查詢的balanceof函數(shù)也因?yàn)槲仪熬Y統(tǒng)一,從而判別我是未鑄造前的所有者,因此理論上我的鑄造空間極其大。
因此小狐貍確實(shí)能導(dǎo)入,因?yàn)榍熬Y一致,balanceof?在沒有所有者的情況下,會(huì)默認(rèn)依據(jù)此NFTID對(duì)應(yīng)的空間的所有者返回結(jié)果,如果發(fā)生鑄造轉(zhuǎn)移,也有合約中配套的owner_a?和_creator?來證明這個(gè)創(chuàng)作者和當(dāng)前所有者的關(guān)系。
至于為何小狐貍能出現(xiàn)NFT圖,這點(diǎn)是他官方聲明過的設(shè)置,出于讀取更多維度的描述說明、稀有度、原圖uri等信息,且用戶可關(guān)閉這個(gè)錢包去查詢os中心化數(shù)據(jù)庫(kù)的功能。
破案總結(jié)
-
小狐貍是無辜的,他只是用標(biāo)準(zhǔn)方法走infura讀取鏈上數(shù)據(jù)而已,并沒有特別加工并修改返回?cái)?shù)據(jù)
-
os不去驗(yàn)證合約,有一定自我市場(chǎng)競(jìng)爭(zhēng)保護(hù)的目的,但是不能阻擋妙手玩家對(duì)合約分析,卻給不少用戶帶來無法證明資產(chǎn)所有的困境
-
最終,確實(shí)其NFT資產(chǎn)在交易轉(zhuǎn)移前未被鑄造上鏈,但由NFTID定義的空間已經(jīng)被特殊設(shè)計(jì)可查得余額結(jié)果,所以理論上其他交易平臺(tái)也可買賣此NFT
附錄:
gas價(jià)格圖:https://etherscan.io/gastracker
反編譯平臺(tái):https://library.dedaub.com/decompile
metamask的NFT檢測(cè)功能說明:
https://metamask.zendesk.com/hc/en-us/articles/360058238591-NFT-tokens-in-your-MetaMask-wallet
os共享商店合約地址:
0x495f947276749ce646f68ac8c248420045cb7b5e
OS官方聲明:
【ERC-1155 NFT 會(huì)出現(xiàn)在我的錢包中嗎?】
https://support.opensea.io/hc/en-us/articles/1500003082561-Will-ERC-1155-NFTs-appear-in-my-wallet-
【在 OpenSea 上免費(fèi)創(chuàng)建 NFT指南】
https://opensea.io/blog/announcements/introducing-the-collection-manager/
寫在最后:
前文回顧
【源碼解讀】你買的NFT到底是什么?
EIP-5058 能否防止NFT項(xiàng)目方提桶跑路?
當(dāng)我們?cè)诳碋therscan的時(shí)候,到底在看什么?
當(dāng)奈飛的NFT忘記了web2的業(yè)務(wù)安全
歡迎各位同學(xué)從后臺(tái)提交有趣的合約或交易哈希。
關(guān)注十四,用技術(shù)的眼光發(fā)現(xiàn)價(jià)值。文章來源:http://www.zghlxwxcb.cn/news/detail-445934.html
看到這里,帥氣的你不點(diǎn)個(gè)贊嗎?文章來源地址http://www.zghlxwxcb.cn/news/detail-445934.html
到了這里,關(guān)于【解密】OpenSea免費(fèi)創(chuàng)造的NFT都沒上鏈竟能出現(xiàn)在我的錢包里?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!