Solidity Weekly #17
token special issue
ERC827 的資安問題探討
警告: ERC827 規格還在討論中, 且已經發現容易造成資安問題. 本文僅供技術探討參考, 請勿 prod 使用! (若錯誤使用造成任何損失, 個人與專欄皆無法負擔賠償責任)
上面連結文章, 介紹 ERC827 寫法不對, 有可能造成 Reentrancy 攻擊.
ERC827 是一種 ERC20 的擴充, 它是希望 ERC20 介面以外, 再增加 approveAndCall()
, transferAndCall()
, 以及transferFromAndCall()
三種介面. 讓該合約在呼叫相對應 ERC20 的 approve(), transfer() 或 transferFrom() 功能之後, 能順便再呼叫 _to 參數的另一個合約地址 with _data 參數. 以 transferAndCall 為例, 定義如下: (截圖來自 ERC827 規格)
規格裡已經強調不可以搭配 fallback functions 使用, 所以使用時要替別注記!!!
ltdr: 為何 ERC827 有問題, 我還要介紹呢? 因為它讓不用 Ether 也能交易變成可能 (在這篇文章裡有介紹 Do not pay transaction fees in Ethereum), 裡面的 Feeless (警告: 沒有 reentery 保護, 有資安問題, 勿用), 就是使用了 ERC827 協定, 但 Save on fees, lose your tokens (ChainSecurity 的 CTO, https://medium.com/@HRitzdorf) 就馬上給他打臉.
雖然有問題, 但 OpenZeppelin 還是有 implement, 且加上嚴重警告, 希望它能繼續改良, 用大眾的力量來解決這個問題. 也讓 ERC20 能更 powerful, 且更為廣泛使用.
後記:
由於內容挑選不易, 造成出刊頻率不一, 雖然叫 “Solidity Weekly” 週刊, 但偶而會變成 bi-weekly, 深感抱歉. 我知道台灣非常多人在寫 Smart Contracts, 使用 Solidity 或寫 DApps 經驗都比我豐富, 希望大家能共同編輯 “Solidity Weekly”. 讓出刊頻率能像 blockchain 一樣(每個 block 挖到的平均速度是 14秒), 我們平均每一個禮拜一期. 只要是跟 Smart Contract 相關, 都歡迎加入”Taipei Ethereum Meetup” 編輯群, 我們可以自由加 Solidity Weekly #{issue++}. 我們沒有主編, 不必審核 (只內容要不要太離譜就好). (期待, 有人自告奮勇寫下一 期的 Solidity Weekly #18)
BTW, 我們的 Taipei Ethereum Meetup 專欄文章, 雖然以中文為主, 但已經發現有外國文章(The Best Way to Start Coding in Solidity) refer 到我們的文章, https://medium.com/taipei-ethereum-meetup/ethereum-dapp-tutorial-push-button-cae3810086a4 , 非常難得, 深感欣慰. 大家的努力, 世界都在看!