1、2022年7月6日,一個普通得不能再普通的週三。程序員小三終於做完了最後的合約測試,在人工學椅上轉了一圈,興奮地伸了個懶腰。「好了,接下來是今天的另一個任務——搭建和部署一個以太坊質押節點。」兩個月後,以太坊即將迎來Merge,小三的錢包裏足足有289個ETH,打算把它們拿去質押理理財。「不過今天ledger錢包好像有點bug?算了,先轉到我部署合約的那個賬號去吧,反正到時候發佈和測試合約也要消耗一些Gas。」在敲下了轉賬腳本之後,小三去衝了一杯咖啡。一杯普通的拿鐵,跟這個普通的週三一樣平淡無奇。衝完咖啡回來,小三一邊喝一邊開始在Etherscan上刷新,看看剛剛發出的交易確認了沒有。「嗯?好像收款賬號不太對?」突然,小三心裏咯噔一下,手裏的咖啡滑落到地上,手腳冰涼的感覺一下子涌了上來:「完蛋了!我把289個ETH發到Hardhat測試賬號裏了!」2、Hardhat是以太坊最主流和常用的開發框架,它提供了一系列工具和功能,方便開發者在以太坊平臺上進行智能合約的開發、測試和部署。對於開發人員來說,Hardhat有一個最重要的功能,就是在本地創建或者Fork一套以太坊環境,用來做合約的本地測試。當你在本地執行npx hardhat node命令時,Hardhat會在本地創建一個模擬網絡,同時生成20個固定的測試EOA賬號及對應的私鑰。與此同時,Hardhat還會給這20個EOA賬號初始化配置10000ETH餘額,方便開發者用這些賬號發佈本地合約進行測試。(坐擁20個「價值上億」的賬號,I'm the king of localhost!)注意,這個本地的模擬網絡和以太坊主網沒有任何關係,這20個EOA賬號上的10000ETH餘額也只是在本地上的。但是,由於生成的這20個賬號是固定的,並且私鑰是公開的,所以在以太坊主網上,任何人都可以用這些私鑰提走這些賬號裏面的資產。假如一個工程師在做完合約測試之後,忘記切換環境,把測試環境當成了主網環境,並且往這20個測試賬號發送了ETH,那麼慘案就發生了......3、正如前面描述的那樣,去年7月6日,一筆289ETH被 threepvault.eth這位朋友,發送到了Hardhat測試賬號0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266爲什麼是0xf39F這個賬號呢?它是 Hardhat生成的第一個測試賬號,因此最爲常用。所以推測是這位倒黴的程序員,把第一個測試賬號複製過來做完測試,結果忘記切換配置,在主網上把289ETH發送到這個測試賬號的地址裏去了。如果按當時的幣價計算,289ETH價值34萬美元,放到現在的話價值50多萬美元,300萬人民幣的慘案。接下來發生了什麼?我們看一下鏈上數據:這筆錯誤的轉賬,發生在15086827區塊,當時還是以太坊的POW時代。這個區塊是一個Flashbots塊,一個MEV Searcher幸運地捕捉到了這個Backrun「機會」。這筆錯誤的轉賬被打進了一個MEV包,套利交易緊隨其後,在支付了4.8ETH的Gas費之後,把Hardhat測試賬號0xf39F裏剩餘的大約284ETH,轉移到了0x043D這個賬號中。從100ETH到10ETH再到1ETH,最後連0.1ETH都沒有放過:至此,這筆價值200~300萬人民幣的資產應該算是泥牛入海,有去無回了。4、慘案發生40分鐘後,我們的苦主就上線了。他給黑客發送了一個NFT,這個NFT叫Message In a Bottle,可以把一段文本包裝成圖片鑄造成NFT。他在這個NFT裏,描述了他的心路歷程:hello I was tring to stake a validator nodetonight. Had to send eth to a hot wallet due to a ledger bug.Thought I was sending it to my contract deployer wallet.. turns out it was a public hardhat test account.I'm typically pretty careful (hw wallet, send small test transactions) but was careless tonight. Feels bad man.On the off chance you see this, I'd love to try to negotiate a bounty or something similar. I made a really stupid mistake翻譯一下:你好,今晚我想質押一個驗證節點。由於ledger有bug,不得不將eth 發送到熱錢包。我以爲我是將它發送到了我的合同部署錢包..(轉完之後才)發現這是一個公開的Hardhat測試賬號。我通常非常小心(硬件錢包,發送小的測試交易等)但今晚很粗心。感覺很糟糕。如果你看到這個,我很樂意嘗試談判賞金或類似的東西。我犯了一個非常愚蠢的錯誤5、不過黑客並沒有理會苦主。慘案發生5個小時後,0x043D賬號的所有者一一也就是這個MEVSearcher黑客上線了,它熟練地開始轉移資產,把這284個ETH拆散,大大小小一筆一筆轉移到了Tornado當中6、不過,故事到這裏並未結束。慘案發生後15小時,我們的苦主再次上線了。在丟了289ETH之後,不知道這15小時,苦主是怎麼過來的。現在他應該已經接受了失去289ETH這個現實,但又沒有完全接受。苦主購買了一個ENS域名,叫willpay100ethiffundsarereturnedtothreepvault.eth(如果你把錢還給我threepvault,我會支付你100個 ETH),並且把這個域名發給了黑客,提出了他的 Offer。也許他想通過這種方式傳達信息,希望黑客能良心發現或者大發慈悲,轉回給他189ETH吧。2023年3月,距離慘案發生已經過去了大半年,黑客的地址至今沒有任何動作,也沒有任何交易發出,苦主的賬號也沒有任何來自Tornado的入賬。我想這個故事到這裏就完結了,應該不會有後續了。這就是黑暗森林,沒有人會爲你的失誤買單,所有人能相信的只有自己。