本倉(cāng)庫(kù)旨在為中文社區(qū)提供分析市場(chǎng)上智能合約應(yīng)用的架構(gòu)與實(shí)現(xiàn)的內(nèi)容。歡迎關(guān)注本開(kāi)源知識(shí)項(xiàng)目!
事件概要
2022年2月4日,一位中國(guó)深圳12歲小學(xué)生黃振(網(wǎng)傳名)在B站和Twitter上發(fā)布了他的Solidity教學(xué)視頻,同時(shí)公布了他的教學(xué)項(xiàng)目RandomDAO。由于一些大V的轉(zhuǎn)推,這個(gè)項(xiàng)目引起了幣民們的注意。至2022年2月8日,已經(jīng)有超過(guò)47000個(gè)地址領(lǐng)取了他發(fā)布的空投代幣RND,并且曾經(jīng)排名ETH消耗gas費(fèi)排行榜的第二。
事件分析
由于這是一個(gè)偏向技術(shù)的社群,因此我主要關(guān)注技術(shù)方面的特點(diǎn)。黃振同學(xué)(暫稱)發(fā)布的Random合約只是一個(gè)普通的ERC20合約加上一個(gè)空投邏輯,本來(lái)并不值得開(kāi)篇論述。然而,一個(gè)與之相關(guān)的突變?cè)趨^(qū)塊鏈網(wǎng)絡(luò)上發(fā)生了:https://github.com/33357/airdrop_multi_claim 這個(gè)合約實(shí)現(xiàn)了對(duì)Random合約的批量空投,并通過(guò)此獲得了大量收益:https://etherscan.io/tx/0xfc1d5688c18244764fe3678020b4821a8c215c7a7f42685814b3cf49557967ff(保守估計(jì)超過(guò)30個(gè)ETH)。這非常值得我們好好研究它的實(shí)現(xiàn)邏輯。
合約分析
操作原理
我們看到https://etherscan.io/address/0x1c7E83f8C581a967940DBfa7984744646AE46b29#code上的獲取空投函數(shù)是這樣寫(xiě)的:
function claim() external{ if((uint32(block.timestamp)-release_time) < waiting_time) return; require(!claimed[msg.sender] && balanceOf(msg.sender) > 0); claimed[msg.sender] = true; safeTransferFrom(owner(), msg.sender, amount); }
它的主要思路如下:
1. 首先檢查領(lǐng)取的時(shí)間是否超過(guò)了需要等待的時(shí)間(waiting_time),如果沒(méi)有則直接返回。
2. 然后檢查這個(gè)地址是否已經(jīng)領(lǐng)取過(guò)空投,如果已經(jīng)領(lǐng)取過(guò)則直接返回。
3. 檢查這個(gè)地址是否擁有RND代幣,如果沒(méi)有則直接返回。
4. 將claimed[msg.sender]標(biāo)記為T(mén)rue,表示這個(gè)地址已經(jīng)領(lǐng)取過(guò)空投。
5. 調(diào)用safeTransferFrom函數(shù),從owner()賬戶向msg.sender賬戶轉(zhuǎn)移代幣。
該函數(shù)實(shí)現(xiàn)了對(duì)于隨機(jī)空投的控制。可以看出,該合約遵循了ERC20標(biāo)準(zhǔn),并且使用了一定的防作弊措施。
然而,我們發(fā)現(xiàn)這個(gè)突變的核心在于https://github.com/33357/airdrop_multi_claim這個(gè)合約。這個(gè)合約使用了包括合約隨機(jī)數(shù)生成、合約內(nèi)部加密哈希、交易數(shù)據(jù)打包等技術(shù),在不影響合約安全的情況下,實(shí)現(xiàn)了批量獲取空投。
結(jié)論
這個(gè)事件給了我們一個(gè)很好的案例,展示了智能合約技術(shù)的能力和不斷創(chuàng)新的可能性。我們需要更多的技術(shù)思考和探索,以應(yīng)對(duì)未來(lái)更多的挑戰(zhàn)與機(jī)遇。